1 // 2 // IsolatedStorageFileTest.cs 3 // - Unit Tests for abstract IsolatedStorageFile class 4 // 5 // Author: 6 // Sebastien Pouliot <sebastien@ximian.com> 7 // 8 // Copyright (C) 2005 Novell Inc. (http://www.novell.com) 9 // Copyright 2011 Xamarin Inc (http://www.xamarin.com). 10 // 11 // Permission is hereby granted, free of charge, to any person obtaining 12 // a copy of this software and associated documentation files (the 13 // "Software"), to deal in the Software without restriction, including 14 // without limitation the rights to use, copy, modify, merge, publish, 15 // distribute, sublicense, and/or sell copies of the Software, and to 16 // permit persons to whom the Software is furnished to do so, subject to 17 // the following conditions: 18 // 19 // The above copyright notice and this permission notice shall be 20 // included in all copies or substantial portions of the Software. 21 // 22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 29 // 30 31 using System; 32 using System.Collections; 33 using System.IO; 34 using System.IO.IsolatedStorage; 35 using System.Reflection; 36 using System.Security; 37 using System.Security.Permissions; 38 using System.Security.Policy; 39 40 using NUnit.Framework; 41 42 namespace MonoTests.System.IO.IsolatedStorageTest { 43 44 [TestFixture] 45 public class IsolatedStorageFileTest { 46 47 private const string dirname = "mono-unit-test"; 48 CheckEnumerated(int n, IsolatedStorageScope scope, IsolatedStorageFile isf)49 private void CheckEnumerated (int n, IsolatedStorageScope scope, IsolatedStorageFile isf) 50 { 51 string prefix = n.ToString () + " - " + scope.ToString () + " - "; 52 Assert.IsNotNull (isf, prefix + "IsolatedStorageFile"); 53 Assert.IsTrue (((scope & isf.Scope) != 0), prefix + "Scope"); 54 55 if ((isf.Scope & IsolatedStorageScope.Assembly) != 0) 56 Assert.IsNotNull (isf.AssemblyIdentity, prefix + "AssemblyIdentity"); 57 if ((isf.Scope & IsolatedStorageScope.Domain) != 0) 58 Assert.IsNotNull (isf.DomainIdentity, prefix + "DomainIdentity"); 59 if ((isf.Scope & IsolatedStorageScope.Application) != 0) 60 Assert.IsNotNull (isf.ApplicationIdentity, prefix + "ApplicationIdentity"); 61 } 62 GetEnumerator(IsolatedStorageScope scope)63 private void GetEnumerator (IsolatedStorageScope scope) 64 { 65 IEnumerator e = IsolatedStorageFile.GetEnumerator (scope); 66 int n = 0; 67 while (e.MoveNext ()) 68 { 69 IsolatedStorageFile isf = (IsolatedStorageFile)e.Current; 70 CheckEnumerated (++n, scope, isf); 71 } 72 } 73 74 [Test] GetEnumerator_User()75 public void GetEnumerator_User () 76 { 77 GetEnumerator (IsolatedStorageScope.User); 78 } 79 80 [Test] 81 [ExpectedException (typeof (ArgumentException))] GetEnumerator_User_Details()82 public void GetEnumerator_User_Details () 83 { 84 // giving more details is bad 85 GetEnumerator (IsolatedStorageScope.User | IsolatedStorageScope.Assembly | IsolatedStorageScope.Domain); 86 } 87 88 [Test] GetEnumerator_UserRoaming()89 public void GetEnumerator_UserRoaming () 90 { 91 GetEnumerator (IsolatedStorageScope.User | IsolatedStorageScope.Roaming); 92 } 93 94 [Test] 95 [ExpectedException (typeof (ArgumentException))] GetEnumerator_UserRoaming_Details()96 public void GetEnumerator_UserRoaming_Details () 97 { 98 // giving more details is bad 99 GetEnumerator (IsolatedStorageScope.User | IsolatedStorageScope.Assembly | IsolatedStorageScope.Domain | IsolatedStorageScope.Roaming); 100 } 101 [Test] GetEnumerator_Machine()102 public void GetEnumerator_Machine () 103 { 104 GetEnumerator (IsolatedStorageScope.Machine); 105 } 106 107 [Test] 108 [ExpectedException (typeof (ArgumentException))] GetEnumerator_Machine_Details()109 public void GetEnumerator_Machine_Details () 110 { 111 GetEnumerator (IsolatedStorageScope.Machine | IsolatedStorageScope.Assembly); 112 } 113 114 [Test] 115 [ExpectedException (typeof (ArgumentException))] GetEnumerator_Application()116 public void GetEnumerator_Application () 117 { 118 // we can't enum application 119 GetEnumerator (IsolatedStorageScope.Application); 120 } 121 [Test] GetUserStoreForAssembly()122 public void GetUserStoreForAssembly () 123 { 124 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 125 Assert.AreEqual (Int64.MaxValue, isf.MaximumSize, "MaximumSize"); 126 Assert.AreEqual (IsolatedStorageScope.User | IsolatedStorageScope.Assembly, isf.Scope, "Scope"); 127 #if !MOBILE 128 Assert.IsTrue ((isf.AssemblyIdentity is Url), "AssemblyIdentity"); 129 // note: mono transforms the CodeBase into uppercase 130 // for net 1.1 which uses file:// and not file:/// 131 string codebase = Assembly.GetExecutingAssembly ().CodeBase.ToUpper ().Substring (8); 132 Assert.IsTrue ((isf.AssemblyIdentity.ToString ().ToUpper ().IndexOf (codebase) > 0), "Url"); 133 Assert.IsTrue ((isf.AssemblyIdentity.ToString ().ToUpper ().IndexOf (codebase) > 0), "Url"); 134 #endif 135 Assert.IsTrue ((isf.CurrentSize >= 0), "CurrentSize"); 136 } 137 138 [Test] 139 [ExpectedException (typeof (InvalidOperationException))] GetUserStoreForAssembly_DomainIdentity()140 public void GetUserStoreForAssembly_DomainIdentity () 141 { 142 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 143 object o = isf.DomainIdentity; 144 } 145 146 [Test] 147 [ExpectedException (typeof (InvalidOperationException))] GetUserStoreForAssembly_ApplicationIdentity()148 public void GetUserStoreForAssembly_ApplicationIdentity () 149 { 150 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 151 object o = isf.ApplicationIdentity; 152 } 153 154 [Test] GetUserStoreForDomain()155 public void GetUserStoreForDomain () 156 { 157 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForDomain (); 158 Assert.AreEqual (Int64.MaxValue, isf.MaximumSize, "MaximumSize"); 159 Assert.AreEqual (IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly, isf.Scope, "Scope"); 160 #if !MOBILE 161 Assert.IsTrue ((isf.AssemblyIdentity is Url), "AssemblyIdentity"); 162 // note: mono transforms the CodeBase into uppercase 163 // for net 1.1 which uses file:// and not file:/// 164 string codebase = Assembly.GetExecutingAssembly ().CodeBase.ToUpper ().Substring (8); 165 Assert.IsTrue ((isf.AssemblyIdentity.ToString ().ToUpper ().IndexOf (codebase) > 0), "Url"); 166 Assert.IsTrue ((isf.DomainIdentity is Url), "DomainIdentity"); 167 // note: with MS Assembly.GetEntryAssembly () only works in the default (first) AppDomain 168 // so we're using the first parameter to GetCommandLineArgs 169 string exe = Environment.GetCommandLineArgs ()[0].Replace ("\\", "/").ToUpper (); 170 Assert.IsTrue ((isf.DomainIdentity.ToString ().ToUpper ().IndexOf (exe) > 0), exe + "\n" + isf.DomainIdentity.ToString ().ToUpper ()); //"Url - Domain"); 171 #endif 172 Assert.IsTrue ((isf.CurrentSize >= 0), "CurrentSize"); 173 } 174 175 [Test] 176 [ExpectedException (typeof (InvalidOperationException))] GetUserStoreForDomain_ApplicationIdentity()177 public void GetUserStoreForDomain_ApplicationIdentity () 178 { 179 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForDomain (); 180 object o = isf.ApplicationIdentity; 181 } 182 183 [Test] 184 #if !MOBILE 185 [ExpectedException (typeof (IsolatedStorageException))] 186 #endif GetUserStoreForApplication_WithoutApplicationIdentity()187 public void GetUserStoreForApplication_WithoutApplicationIdentity () 188 { 189 // note: a manifest is required 190 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication (); 191 } 192 193 [Test] 194 #if !MOBILE 195 [ExpectedException (typeof (IsolatedStorageException))] 196 #endif GetUserStoreForApplication()197 public void GetUserStoreForApplication () 198 { 199 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication (); 200 Assert.AreEqual (Int64.MaxValue, isf.MaximumSize, "MaximumSize"); 201 #if !MOBILE 202 Assert.AreEqual (IsolatedStorageScope.User | IsolatedStorageScope.Assembly, isf.Scope, "Scope"); 203 Assert.IsTrue ((isf.AssemblyIdentity is Url), "AssemblyIdentity"); 204 Assert.IsTrue ((isf.AssemblyIdentity.ToString ().IndexOf (Assembly.GetExecutingAssembly ().CodeBase) > 0), "Url"); 205 #endif 206 Assert.IsTrue ((isf.CurrentSize >= 0), "CurrentSize"); 207 } 208 209 #if !MOBILE 210 [Test] 211 [ExpectedException (typeof (IsolatedStorageException))] GetUserStoreForApplication_AssemblyIdentity()212 public void GetUserStoreForApplication_AssemblyIdentity () 213 { 214 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication (); 215 object o = isf.AssemblyIdentity; 216 } 217 218 [Test] 219 [ExpectedException (typeof (IsolatedStorageException))] GetUserStoreForApplication_DomainIdentity()220 public void GetUserStoreForApplication_DomainIdentity () 221 { 222 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication (); 223 object o = isf.DomainIdentity; 224 } 225 #endif 226 227 // This is supposed to be working only in SL. 228 [Test] 229 [ExpectedException (typeof (NotSupportedException))] GetUserStoreForSite()230 public void GetUserStoreForSite () 231 { 232 IsolatedStorageFile.GetUserStoreForSite (); 233 } 234 235 [Test] GetStore_Domain_Zone()236 public void GetStore_Domain_Zone () 237 { 238 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly; 239 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, typeof (Zone), typeof (Zone)); 240 Assert.AreEqual (Int64.MaxValue, isf.MaximumSize, "MaximumSize"); 241 #if !MOBILE 242 Assert.AreEqual (IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly, isf.Scope, "Scope"); 243 Assert.IsTrue ((isf.AssemblyIdentity is Zone), "AssemblyIdentity"); 244 Assert.IsTrue ((isf.AssemblyIdentity.ToString ().IndexOf ("MyComputer") > 0), "Zone - Assembly"); 245 Assert.IsTrue ((isf.DomainIdentity is Zone), "DomainIdentity"); 246 Assert.IsTrue ((isf.DomainIdentity.ToString ().IndexOf ("MyComputer") > 0), "Zone - Domain"); 247 #endif 248 Assert.IsTrue ((isf.CurrentSize >= 0), "CurrentSize"); 249 } 250 251 [Test] 252 #if !MOBILE 253 [ExpectedException (typeof (IsolatedStorageException))] 254 #endif GetStore_Domain_NonPresentEvidences()255 public void GetStore_Domain_NonPresentEvidences () 256 { 257 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly; 258 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, typeof (StrongName), typeof (Publisher)); 259 } 260 261 [Test] GetStore_Assembly_NonPresentDomainEvidences()262 public void GetStore_Assembly_NonPresentDomainEvidences () 263 { 264 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Assembly; 265 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, typeof (StrongName), typeof (Url)); 266 Assert.AreEqual (Int64.MaxValue, isf.MaximumSize, "MaximumSize"); 267 Assert.AreEqual (scope, isf.Scope, "Scope"); 268 #if !MOBILE 269 Assert.IsTrue ((isf.AssemblyIdentity is Url), "AssemblyIdentity"); 270 // note: mono transforms the CodeBase into uppercase 271 // for net 1.1 which uses file:// and not file:/// 272 string codebase = Assembly.GetExecutingAssembly ().CodeBase.ToUpper ().Substring (8); 273 Assert.IsTrue ((isf.AssemblyIdentity.ToString ().ToUpper ().IndexOf (codebase) > 0), "Url"); 274 // DomainIdentity throws a InvalidOperationException 275 #endif 276 Assert.IsTrue ((isf.CurrentSize >= 0), "CurrentSize"); 277 } 278 279 #if !MOBILE 280 [Test] 281 [ExpectedException (typeof (ArgumentNullException))] GetStore_Domain_DomainNullObject()282 public void GetStore_Domain_DomainNullObject () 283 { 284 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly; 285 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, (object)null, new Zone (SecurityZone.MyComputer)); 286 } 287 288 [Test] 289 [ExpectedException (typeof (ArgumentNullException))] GetStore_Domain_AssemblyNullObject()290 public void GetStore_Domain_AssemblyNullObject () 291 { 292 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly; 293 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, new Zone (SecurityZone.MyComputer), (object)null); 294 } 295 296 [Test] GetStore_Assembly_DomainNullObject()297 public void GetStore_Assembly_DomainNullObject () 298 { 299 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Assembly; 300 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, (object)null, new Zone (SecurityZone.Internet)); 301 Assert.AreEqual (Int64.MaxValue, isf.MaximumSize, "MaximumSize"); 302 Assert.AreEqual (scope, isf.Scope, "Scope"); 303 Assert.IsTrue ((isf.AssemblyIdentity is Zone), "AssemblyIdentity"); 304 Assert.IsTrue ((isf.AssemblyIdentity.ToString ().IndexOf ("Internet") > 0), "Zone - Assembly"); 305 Assert.IsTrue ((isf.CurrentSize >= 0), "CurrentSize"); 306 } 307 308 [Test] 309 [ExpectedException (typeof (ArgumentNullException))] GetStore_Assembly_AssemblyNullObject()310 public void GetStore_Assembly_AssemblyNullObject () 311 { 312 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Assembly; 313 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, new Zone (SecurityZone.MyComputer), (object)null); 314 } 315 316 [Test] GetStore_Domain_ZoneObjectZoneObject()317 public void GetStore_Domain_ZoneObjectZoneObject () 318 { 319 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly; 320 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, new Zone (SecurityZone.Internet), new Zone (SecurityZone.Internet)); 321 Assert.AreEqual (Int64.MaxValue, isf.MaximumSize, "MaximumSize"); 322 Assert.AreEqual (scope, isf.Scope, "Scope"); 323 Assert.IsTrue ((isf.AssemblyIdentity is Zone), "AssemblyIdentity"); 324 Assert.IsTrue ((isf.AssemblyIdentity.ToString ().IndexOf ("Internet") > 0), "Zone - Assembly"); 325 Assert.IsTrue ((isf.DomainIdentity is Zone), "DomainIdentity"); 326 Assert.IsTrue ((isf.DomainIdentity.ToString ().IndexOf ("Internet") > 0), "Zone - Domain"); 327 Assert.IsTrue ((isf.CurrentSize >= 0), "CurrentSize"); 328 } 329 #endif 330 331 [Test] 332 [ExpectedException (typeof (ArgumentNullException))] GetStore_Application_NullObject()333 public void GetStore_Application_NullObject () 334 { 335 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Application; 336 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, (object)null); 337 } 338 339 [Test] 340 #if !MOBILE 341 [ExpectedException (typeof (IsolatedStorageException))] 342 #endif GetStore_Application_NullType()343 public void GetStore_Application_NullType () 344 { 345 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Application; 346 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, (Type)null); 347 // again it's the lack of a manifest 348 } 349 350 #if !MOBILE 351 [Test] GetStore_DomainScope_Evidences()352 public void GetStore_DomainScope_Evidences () 353 { 354 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly; 355 356 Evidence de = new Evidence (); 357 de.AddHost (new Zone (SecurityZone.Internet)); 358 Evidence ae = new Evidence (); 359 ae.AddHost (new Zone (SecurityZone.Intranet)); 360 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, de, typeof (Zone), ae, typeof (Zone)); 361 362 // Maximum size for Internet isn't (by default) Int64.MaxValue 363 Assert.AreEqual (scope, isf.Scope, "Scope"); 364 #if !MOBILE 365 Assert.IsTrue ((isf.AssemblyIdentity is Zone), "AssemblyIdentity"); 366 Assert.IsTrue ((isf.AssemblyIdentity.ToString ().IndexOf ("Intranet") > 0), "Zone - Assembly"); 367 Assert.IsTrue ((isf.DomainIdentity is Zone), "DomainIdentity"); 368 Assert.IsTrue ((isf.DomainIdentity.ToString ().IndexOf ("Internet") > 0), isf.DomainIdentity.ToString ()); //"Zone - Domain"); 369 #endif 370 Assert.IsTrue ((isf.CurrentSize >= 0), "CurrentSize"); 371 } 372 373 [Test] 374 [ExpectedException (typeof (ArgumentNullException))] GetStore_DomainScope_Evidence_NullAssemblyEvidence()375 public void GetStore_DomainScope_Evidence_NullAssemblyEvidence () 376 { 377 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly; 378 379 Evidence de = new Evidence (); 380 de.AddHost (new Zone (SecurityZone.Internet)); 381 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, de, typeof (Zone), null, null); 382 } 383 384 [Test] 385 [ExpectedException (typeof (ArgumentNullException))] GetStore_DomainScope_Evidence_NullDomainEvidence()386 public void GetStore_DomainScope_Evidence_NullDomainEvidence () 387 { 388 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly; 389 390 Evidence ae = new Evidence (); 391 ae.AddHost (new Zone (SecurityZone.Internet)); 392 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, null, null, ae, typeof (Zone)); 393 } 394 395 [Test] 396 [ExpectedException (typeof (ArgumentNullException))] GetStore_AssemblyScope_Evidence_NullAssemblyEvidence()397 public void GetStore_AssemblyScope_Evidence_NullAssemblyEvidence () 398 { 399 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Assembly; 400 401 Evidence de = new Evidence (); 402 de.AddHost (new Zone (SecurityZone.Internet)); 403 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, de, typeof (Zone), null, null); 404 } 405 406 [Test] GetStore_AssemblyScope_Evidence_NullDomainEvidence()407 public void GetStore_AssemblyScope_Evidence_NullDomainEvidence () 408 { 409 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Assembly; 410 411 Evidence ae = new Evidence (); 412 ae.AddHost (new Zone (SecurityZone.Internet)); 413 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, null, null, ae, typeof (Zone)); 414 } 415 #endif 416 417 [Test] RegressionBNC354539()418 public void RegressionBNC354539 () 419 { 420 string filename = "test-bnc-354539"; 421 byte[] expected = new byte[] { 0x01, 0x42, 0x00 }; 422 byte[] actual = new byte [expected.Length]; 423 424 using (IsolatedStorageFile file = IsolatedStorageFile.GetStore (IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null)) { 425 using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream (filename, FileMode.Create, FileAccess.Write, FileShare.None, file)) { 426 stream.Write (expected, 0, expected.Length); 427 } 428 } 429 430 using (IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForAssembly ()) { 431 using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream (filename, FileMode.Open, FileAccess.Read, FileShare.Read, file)) { 432 stream.Read (actual, 0, actual.Length); 433 } 434 435 file.DeleteFile (filename); 436 } 437 438 Assert.AreEqual (expected, actual); 439 } 440 441 [Test] 442 [ExpectedException (typeof (ArgumentNullException))] CreateDirectory_Null()443 public void CreateDirectory_Null () 444 { 445 IsolatedStorageFile.GetUserStoreForAssembly ().CreateDirectory (null); 446 } 447 448 [Test] CreateDirectory_FileWithSameNameExists()449 public void CreateDirectory_FileWithSameNameExists () 450 { 451 string path = "bug374377"; 452 using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForDomain ()) { 453 using (IsolatedStorageFileStream fs = new IsolatedStorageFileStream (path, FileMode.OpenOrCreate, isf)) { 454 } 455 try { 456 isf.CreateDirectory (path); 457 } 458 catch (IsolatedStorageException ex) { 459 Assert.IsFalse (ex.Message.IndexOf (path) >= 0, "Message"); 460 Assert.IsNull (ex.InnerException, "InnerException"); 461 } 462 } 463 } 464 465 [Test] CreateDirectory_DirectoryWithSameNameExists()466 public void CreateDirectory_DirectoryWithSameNameExists () 467 { 468 string dir = "new-dir"; 469 string file = Path.Combine (dir, "new-file"); 470 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 471 try { 472 isf.CreateDirectory (dir); 473 using (IsolatedStorageFileStream isfs = new IsolatedStorageFileStream (file, FileMode.OpenOrCreate, isf)) { 474 isfs.WriteByte (0); 475 } 476 string pattern = Path.Combine (dir, "*"); 477 Assert.AreEqual (1, isf.GetFileNames (file).Length, "file exists"); 478 479 // create again directory 480 isf.CreateDirectory (dir); 481 Assert.AreEqual (1, isf.GetFileNames (file).Length, "file still exists"); 482 } 483 finally { 484 isf.DeleteFile (file); 485 isf.DeleteDirectory (dir); 486 } 487 } 488 489 [Test] 490 [ExpectedException (typeof (ArgumentException))] GetFilesInSubdirs()491 public void GetFilesInSubdirs () 492 { 493 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 494 string pattern = Path.Combine ("..", "*"); 495 isf.GetFileNames (pattern); 496 } 497 498 499 [Test] 500 [ExpectedException (typeof (ArgumentException))] GetDirsInSubDirs()501 public void GetDirsInSubDirs () 502 { 503 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 504 isf.CreateDirectory ("subdir"); 505 string [] dir_names = isf.GetDirectoryNames ("subdir/../*"); 506 } 507 508 [Test] // https://bugzilla.novell.com/show_bug.cgi?id=376188 CreateSubDirectory()509 public void CreateSubDirectory () 510 { 511 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 512 isf.CreateDirectory ("subdir"); 513 isf.CreateDirectory ("subdir/subdir2"); 514 Assert.AreEqual (1, isf.GetDirectoryNames ("*").Length, "subdir"); 515 Assert.AreEqual (1, isf.GetDirectoryNames ("subdir/*").Length, "subdir/subdir2"); 516 isf.DeleteDirectory ("subdir/subdir2"); 517 isf.DeleteDirectory ("subdir"); 518 } 519 520 [Test] 521 [ExpectedException (typeof (IsolatedStorageException))] DeleteDirectory_NonEmpty()522 public void DeleteDirectory_NonEmpty () 523 { 524 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 525 isf.CreateDirectory ("subdir"); 526 isf.CreateDirectory ("subdir/subdir2"); 527 isf.DeleteDirectory ("subdir"); 528 } 529 530 [Test] DeleteFile()531 public void DeleteFile () 532 { 533 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 534 535 try { 536 isf.DeleteFile (null); 537 Assert.Fail ("#Exc0"); 538 } catch (ArgumentNullException) { 539 } 540 541 // We are getting an internal IndexOutOfRangeException in 2.0 542 // Not sure we want to mimic that one. 543 try { 544 isf.DeleteFile (String.Empty); 545 Assert.Fail ("#Exc1"); 546 } catch (IsolatedStorageException) { 547 } 548 549 try { 550 isf.DeleteFile ("idontexist"); 551 Assert.Fail ("#Exc2"); 552 } catch (IsolatedStorageException) { 553 } 554 555 try { 556 isf.DeleteFile ("../../file"); 557 Assert.Fail ("#Exc3"); 558 } catch (IsolatedStorageException) { 559 } 560 561 try { 562 isf.DeleteFile ("subdir/file"); 563 Assert.Fail ("#Exc4"); 564 } catch (IsolatedStorageException) { 565 } 566 567 isf.CreateDirectory ("subdir"); 568 try { 569 isf.DeleteFile ("subdir"); 570 Assert.Fail ("#Exc5"); 571 } catch (IsolatedStorageException) { 572 } 573 } 574 575 [Test] GetStore_NullTypes()576 public void GetStore_NullTypes () 577 { 578 IsolatedStorageScope scope = IsolatedStorageScope.User | IsolatedStorageScope.Roaming | IsolatedStorageScope.Assembly | IsolatedStorageScope.Domain; 579 IsolatedStorageFile isf = IsolatedStorageFile.GetStore (scope, null, null); 580 #if !MOBILE 581 Assert.AreEqual (typeof (Url), isf.AssemblyIdentity.GetType (), "AssemblyIdentity"); 582 Assert.AreEqual (typeof (Url), isf.DomainIdentity.GetType (), "DomainIdentity"); 583 #endif 584 } 585 586 [Test] RemoveFromOtherInstance()587 public void RemoveFromOtherInstance () 588 { 589 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 590 IsolatedStorageFile isf2 = IsolatedStorageFile.GetUserStoreForAssembly (); 591 592 isf.Remove (); 593 try { 594 isf2.Remove (); 595 Assert.Fail ("#Exc1"); 596 } catch (IsolatedStorageException) { 597 } 598 } 599 600 [Test] Remove()601 public void Remove () 602 { 603 // Test that we can call Remove several times 604 IsolatedStorageFile.Remove (IsolatedStorageScope.User); 605 IsolatedStorageFile.Remove (IsolatedStorageScope.User); 606 607 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 608 isf.Remove (); 609 610 // The second call to Remove should cause an InvalidOperationException, due to 611 // marking itself as closed. 612 try { 613 isf.Remove (); 614 Assert.Fail ("#Exc1"); 615 } catch (InvalidOperationException) { 616 } 617 618 // Open, Close and try to Remove 619 isf = IsolatedStorageFile.GetUserStoreForAssembly (); 620 isf.Close (); 621 try { 622 isf.Remove (); 623 Assert.Fail ("#Exc2"); 624 } catch (InvalidOperationException) { 625 } 626 } 627 628 [Test] UsedSize()629 public void UsedSize () 630 { 631 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 632 IsolatedStorageFileStream isfs = isf.CreateFile ("file"); 633 StreamWriter writer = new StreamWriter (isfs); 634 writer.WriteLine ("hello mono"); 635 writer.Close (); 636 637 Assert.AreEqual (true, isf.UsedSize > 0, "#A0"); 638 639 isf.Close (); 640 try { 641 Console.WriteLine (isf.UsedSize); 642 Assert.Fail ("#Exc1"); 643 } catch (InvalidOperationException) { 644 } 645 646 isf.Dispose (); 647 try { 648 Console.WriteLine (isf.UsedSize); 649 Assert.Fail ("#Exc2"); 650 } catch (ObjectDisposedException) { 651 } 652 } 653 654 [Test] IncreateQuotaTo()655 public void IncreateQuotaTo () 656 { 657 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 658 659 try { 660 isf.IncreaseQuotaTo (-2); 661 Assert.Fail ("#Exc1"); 662 } catch (ArgumentException) { 663 } 664 665 // I wonder how this behaves on some systems 666 try { 667 isf.IncreaseQuotaTo (100); 668 Assert.Fail ("#Exc2"); 669 } catch (ArgumentException) { 670 } 671 672 // Since 'Quota' seems to be returning Int64.MaxValue, we cannot truly test against a value 673 // larger than that. 674 } 675 676 [Test] DirectoryExists()677 public void DirectoryExists () 678 { 679 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 680 isf.CreateDirectory ("subdir"); 681 isf.CreateDirectory ("subdir/subdir2"); 682 isf.CreateDirectory ("subdir3"); 683 684 Assert.AreEqual (true, isf.DirectoryExists ("subdir/"), "#A0"); 685 Assert.AreEqual (true, isf.DirectoryExists ("subdir/subdir2/"), "#A1"); 686 Assert.AreEqual (true, isf.DirectoryExists ("subdir3"), "#A2"); 687 Assert.AreEqual (true, isf.DirectoryExists (String.Empty), "#A3"); // Weird 688 Assert.AreEqual (false, isf.DirectoryExists ("subdir99"), "#A4"); 689 Assert.AreEqual (false, isf.DirectoryExists ("../../subdir"), "#A5"); 690 Assert.AreEqual (false, isf.DirectoryExists ("*"), "#A5"); 691 Assert.AreEqual (false, isf.DirectoryExists ("subdir*"), "#A6"); 692 693 isf.DeleteDirectory ("subdir3"); 694 Assert.AreEqual (false, isf.DirectoryExists ("subdir3"), "#B0"); 695 696 isf.DeleteDirectory ("subdir/subdir2"); 697 isf.DeleteDirectory ("subdir"); 698 699 try { 700 isf.DirectoryExists (null); 701 Assert.Fail ("#Exc1"); 702 } catch (ArgumentNullException) { 703 } 704 705 isf.Close (); 706 try { 707 isf.DirectoryExists ("subdir"); 708 Assert.Fail ("#Exc2"); 709 } catch (InvalidOperationException) { 710 } 711 712 isf.Dispose (); 713 try { 714 isf.DirectoryExists ("subdir"); 715 Assert.Fail ("#Exc3"); 716 } catch (ObjectDisposedException) { 717 } 718 719 // We want to be sure that if not closing but disposing 720 // should fire ObjectDisposedException instead of InvalidOperationException 721 isf = IsolatedStorageFile.GetUserStoreForAssembly (); 722 isf.Dispose (); 723 724 try { 725 isf.DirectoryExists ("subdir"); 726 Assert.Fail ("#Exc4"); 727 } catch (ObjectDisposedException) { 728 } 729 } 730 731 [Test] FileExists()732 public void FileExists () 733 { 734 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 735 IsolatedStorageFileStream file_a = new IsolatedStorageFileStream ("file-a", FileMode.Create, isf); 736 IsolatedStorageFileStream file_b = new IsolatedStorageFileStream ("file-b", FileMode.Create, isf); 737 file_a.Close (); 738 file_b.Close (); 739 740 Assert.AreEqual (true, isf.FileExists ("file-a"), "#A0"); 741 Assert.AreEqual (true, isf.FileExists ("file-b"), "#A1"); 742 Assert.AreEqual (false, isf.FileExists (String.Empty), "#A2"); 743 Assert.AreEqual (false, isf.FileExists ("file-"), "#A3"); 744 Assert.AreEqual (false, isf.FileExists ("file-*"), "#A4"); 745 Assert.AreEqual (false, isf.FileExists ("../../file-a"), "#A5"); 746 747 isf.CreateDirectory ("subdir"); 748 Assert.AreEqual (false, isf.FileExists ("subdir"), "#B0"); 749 750 try { 751 isf.FileExists (null); 752 Assert.Fail ("#Exc1"); 753 } catch (ArgumentNullException) { 754 } 755 756 isf.Close (); 757 try { 758 isf.FileExists ("file-a"); 759 Assert.Fail ("#Exc2"); 760 } catch (InvalidOperationException) { 761 } 762 763 isf.Dispose (); 764 try { 765 isf.FileExists ("file-a"); 766 Assert.Fail ("#Exc3"); 767 } catch (ObjectDisposedException) { 768 } 769 } 770 771 [Test] CreateFile()772 public void CreateFile () 773 { 774 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 775 // Make sure we are actually creating it, by first removing it in case it already exists 776 if (isf.FileExists ("file-a")) 777 isf.DeleteFile ("file-a"); 778 779 IsolatedStorageFileStream isf_stream = isf.CreateFile ("file-a"); 780 isf_stream.Close (); 781 Assert.AreEqual (true, isf.FileExists ("file-a"), "#A0"); 782 783 // Re-open the file that is already created, so we make sure we are passing 784 // the proper FileOpen 785 isf_stream = isf.CreateFile ("file-a"); 786 isf_stream.Close (); 787 788 try { 789 isf.CreateFile (null); 790 Assert.Fail ("#Exc1"); 791 } catch (ArgumentNullException) { 792 } 793 794 try { 795 isf.CreateFile ("random-dir/fileb"); 796 Assert.Fail ("#Exc2"); 797 } catch (DirectoryNotFoundException) { 798 } 799 800 isf.Close (); 801 try { 802 isf.CreateFile ("file-b"); 803 Assert.Fail ("#Exc3"); 804 } catch (InvalidOperationException) { 805 } 806 807 isf.Dispose (); 808 try { 809 isf.CreateFile ("file-a"); 810 Assert.Fail ("#Exc4"); 811 } catch (ObjectDisposedException) { 812 } 813 } 814 815 [Test] GetCreationTime()816 public void GetCreationTime () 817 { 818 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 819 820 // This is not causing an exception 821 isf.GetCreationTime ("doesntexist"); 822 isf.GetCreationTime ("dir/doesntexist"); 823 824 try { 825 isf.GetCreationTime (String.Empty); 826 Assert.Fail ("#Exc1"); 827 } catch (ArgumentException) { 828 } 829 830 try { 831 isf.GetCreationTime (" "); 832 Assert.Fail ("#Exc2"); 833 } catch (ArgumentException) { 834 } 835 836 isf.Close (); 837 try { 838 isf.GetCreationTime ("doesntexist"); 839 Assert.Fail ("#Exc3"); 840 } catch (InvalidOperationException) { 841 } 842 843 isf.Dispose (); 844 try { 845 isf.GetCreationTime ("doesntexist"); 846 Assert.Fail ("#Exc4"); 847 } catch (ObjectDisposedException) { 848 } 849 } 850 851 [Test] MoveDirectory()852 public void MoveDirectory () 853 { 854 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 855 // Mare sure to remove them if they exist already 856 if (isf.DirectoryExists ("subdir")) 857 isf.DeleteDirectory ("subdir"); 858 if (isf.DirectoryExists ("subdir-new")) 859 isf.DeleteDirectory ("subdir-new"); 860 861 isf.CreateDirectory ("subdir"); 862 Assert.AreEqual (true, isf.DirectoryExists ("subdir"), "#A0"); 863 864 isf.MoveDirectory ("subdir", "subdir-new"); 865 Assert.AreEqual (false, isf.DirectoryExists ("subdir"), "#A1"); 866 Assert.AreEqual (true, isf.DirectoryExists ("subdir-new"), "#A2"); 867 868 try { 869 isf.MoveDirectory (String.Empty, "subdir-new-new"); 870 Assert.Fail ("#Exc1"); 871 } catch (ArgumentException) { 872 } 873 874 try { 875 isf.MoveDirectory (" ", "subdir-new-new"); 876 Assert.Fail ("#Exc2"); 877 } catch (ArgumentException) { 878 } 879 880 try { 881 isf.MoveDirectory ("doesntexist", "subdir-new-new"); 882 Assert.Fail ("#Exc3"); 883 } catch (DirectoryNotFoundException) { 884 } 885 886 try { 887 isf.MoveDirectory ("doesnexist/doesntexist", "subdir-new-new"); 888 Assert.Fail ("#Exc4"); 889 } catch (DirectoryNotFoundException) { 890 } 891 892 try { 893 isf.MoveDirectory ("subdir-new", "doesntexist/doesntexist"); 894 Assert.Fail ("#Exc5"); 895 } catch (DirectoryNotFoundException) { 896 } 897 898 // Out of storage dir 899 try { 900 isf.MoveDirectory ("subdir-new", "../../subdir-new"); 901 Assert.Fail ("#Exc6"); 902 } catch (IsolatedStorageException) { 903 } 904 905 isf.Remove (); 906 isf.Close (); 907 isf.Dispose (); 908 } 909 910 [Test] CopyFile()911 public void CopyFile () 912 { 913 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 914 if (isf.FileExists ("file")) 915 isf.DeleteFile ("file"); 916 if (isf.FileExists ("file-new")) 917 isf.DeleteFile ("file-new"); 918 919 isf.CreateFile ("file").Close (); 920 isf.CopyFile ("file", "file-new"); 921 Assert.AreEqual (true, isf.FileExists ("file"), "#A0"); 922 Assert.AreEqual (true, isf.FileExists ("file-new"), "#A1"); 923 924 // At this point 'file-exists' already exists. 925 isf.CopyFile ("file", "file-new", true); 926 Assert.AreEqual (true, isf.FileExists ("file"), "#B0"); 927 Assert.AreEqual (true, isf.FileExists ("file-new"), "#B1"); 928 929 isf.CreateDirectory ("subdir"); 930 isf.CreateFile ("subdir/subfile").Close (); 931 isf.CopyFile ("subdir/subfile", "subdir/subfile-new"); 932 Assert.AreEqual (true, isf.FileExists ("subdir/subfile"), "#C0"); 933 Assert.AreEqual (true, isf.FileExists ("subdir/subfile-new"), "#C1"); 934 935 try { 936 isf.CopyFile ("file", "file-new"); 937 Assert.Fail ("#Exc0"); 938 } catch (IsolatedStorageException) { 939 } 940 941 // Using the same file name is failing for even when passing override=true. 942 try { 943 isf.CopyFile ("file-new", "file-new", true); 944 Assert.Fail ("#Exc1"); 945 } catch (IsolatedStorageException) { 946 } 947 948 try { 949 isf.CopyFile ("file-new", "file-new", false); 950 Assert.Fail ("#Exc2"); 951 } catch (IsolatedStorageException) { 952 } 953 954 // Remove 'file-new' for cleaness purposes. 955 isf.DeleteFile ("file-new"); 956 957 try { 958 isf.CopyFile ("doesntexist", "file-new", false); 959 Assert.Fail ("#Exc3"); 960 } catch (FileNotFoundException) { 961 } 962 963 try { 964 isf.CopyFile ("doesnexist/doesntexist", "file-new", false); 965 Assert.Fail ("#Exc4"); 966 } catch (DirectoryNotFoundException) { 967 } 968 969 // I'd have expected a DirectoryNotFoundException here. 970 try { 971 isf.CopyFile ("file", "doesntexist/doesntexist"); 972 Assert.Fail ("#Exc5"); 973 } catch (IsolatedStorageException) { 974 } 975 976 // Out of storage dir 977 try { 978 isf.CopyFile ("file", "../../file"); 979 Assert.Fail ("#Exc6"); 980 } catch (IsolatedStorageException) { 981 } 982 983 try { 984 isf.CopyFile ("../file", "file-new"); 985 Assert.Fail ("#Exc7"); 986 } catch (IsolatedStorageException) { 987 } 988 989 // We are creating a subdirectory and files within it, so remove it just in case. 990 isf.Remove (); 991 992 isf.Close (); 993 isf.Dispose (); 994 } 995 996 [Test] MoveFile()997 public void MoveFile () 998 { 999 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 1000 // Mare sure to remove them if they exist already 1001 if (isf.FileExists ("file")) 1002 isf.DeleteFile ("file"); 1003 if (isf.FileExists ("file-new")) 1004 isf.DeleteFile ("file-new"); 1005 if (isf.FileExists ("subdir/subfile")) 1006 isf.DeleteFile ("subdir/subfile"); 1007 if (isf.FileExists ("subdir/subfile-new")) 1008 isf.DeleteFile ("subdir/subfile-new"); 1009 1010 isf.CreateFile ("file").Close (); 1011 Assert.AreEqual (true, isf.FileExists ("file"), "#A0"); 1012 1013 // Same file 1014 isf.MoveFile ("file", "file"); 1015 Assert.AreEqual (true, isf.FileExists ("file"), "#A0-1"); 1016 1017 isf.MoveFile ("file", "file-new"); 1018 Assert.AreEqual (false, isf.FileExists ("file"), "#A1"); 1019 Assert.AreEqual (true, isf.FileExists ("file-new"), "#A2"); 1020 1021 isf.CreateDirectory ("subdir"); 1022 isf.CreateFile ("subdir/subfile").Close (); 1023 isf.MoveFile ("subdir/subfile", "subdir/subfile-new"); 1024 Assert.AreEqual (false, isf.FileExists ("subdir/subfile"), "#B0"); 1025 Assert.AreEqual (true, isf.FileExists ("subdir/subfile-new"), "#B1"); 1026 1027 try { 1028 isf.MoveFile (String.Empty, "file-new-new"); 1029 Assert.Fail ("#Exc1"); 1030 } catch (ArgumentException) { 1031 } 1032 1033 try { 1034 isf.MoveFile (" ", "file-new-new"); 1035 Assert.Fail ("#Exc2"); 1036 } catch (ArgumentException e) { 1037 } 1038 1039 try { 1040 isf.MoveFile ("doesntexist", "file-new-new"); 1041 Assert.Fail ("#Exc3"); 1042 } catch (FileNotFoundException) { 1043 } 1044 1045 // CopyFile is throwing a DirectoryNotFoundException here. 1046 try { 1047 isf.MoveFile ("doesnexist/doesntexist", "file-new-new"); 1048 Assert.Fail ("#Exc4"); 1049 } catch (FileNotFoundException) { 1050 } 1051 1052 // I'd have expected a DirectoryNotFoundException here. 1053 try { 1054 isf.MoveFile ("file-new", "doesntexist/doesntexist"); 1055 Assert.Fail ("#Exc5"); 1056 } catch (IsolatedStorageException) { 1057 } 1058 1059 // Out of storage dir 1060 try { 1061 isf.MoveFile ("file-new", "../../file-new"); 1062 Assert.Fail ("#Exc6"); 1063 } catch (IsolatedStorageException) { 1064 } 1065 1066 isf.Remove (); 1067 isf.Close (); 1068 isf.Dispose (); 1069 } 1070 1071 [Test] MultiLevel()1072 public void MultiLevel () 1073 { 1074 // see bug #4101 1075 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 1076 try { 1077 isf.CreateDirectory ("dir1"); 1078 string [] dirs = isf.GetDirectoryNames ("*"); 1079 Assert.AreEqual (dirs.Length, 1, "1a"); 1080 Assert.AreEqual (dirs [0], "dir1", "1b"); 1081 1082 isf.CreateDirectory ("dir1/test"); 1083 dirs = isf.GetDirectoryNames ("dir1/*"); 1084 Assert.AreEqual (dirs.Length, 1, "2a"); 1085 Assert.AreEqual (dirs [0], "test", "2b"); 1086 1087 isf.CreateDirectory ("dir1/test/test2a"); 1088 isf.CreateDirectory ("dir1/test/test2b"); 1089 dirs = isf.GetDirectoryNames ("dir1/test/*"); 1090 Assert.AreEqual (dirs.Length, 2, "3a"); 1091 Assert.AreEqual (dirs [0], "test2a", "3b"); 1092 Assert.AreEqual (dirs [1], "test2b", "3c"); 1093 } 1094 finally { 1095 isf.DeleteDirectory ("dir1/test/test2a"); 1096 isf.DeleteDirectory ("dir1/test/test2b"); 1097 isf.DeleteDirectory ("dir1/test"); 1098 isf.DeleteDirectory ("dir1"); 1099 } 1100 } 1101 [Test] RootedDirectory()1102 public void RootedDirectory () 1103 { 1104 IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForAssembly (); 1105 try { 1106 isf.CreateDirectory ("test/nested/directory/structure/without/root"); 1107 isf.CreateDirectory ("/test/nested/directory/structure/with/root"); 1108 } 1109 finally { 1110 isf.DeleteDirectory ("test/nested/directory/structure/without/root"); 1111 isf.DeleteDirectory ("test/nested/directory/structure/without"); 1112 1113 isf.DeleteDirectory ("/test/nested/directory/structure/with/root"); 1114 isf.DeleteDirectory ("/test/nested/directory/structure/with"); 1115 isf.DeleteDirectory ("/test/nested/directory/structure"); 1116 isf.DeleteDirectory ("/test/nested/directory"); 1117 isf.DeleteDirectory ("/test/nested"); 1118 isf.DeleteDirectory ("/test"); 1119 } 1120 } 1121 } 1122 } 1123