@@ -1138,5 +1138,234 @@ public void UnreferencedZipFileClosingPartialStream()
11381138
11391139 s . ReadByte ( ) ;
11401140 }
1141+
1142+ /// <summary>
1143+ /// Check that input stream is closed when IsStreamOwner is true (default), or leaveOpen is false
1144+ /// </summary>
1145+ [ Test ]
1146+ [ Category ( "Zip" ) ]
1147+ public void StreamClosedWhenOwner ( )
1148+ {
1149+ var ms = new MemoryStream ( ) ;
1150+ MakeZipFile ( ms , false , "StreamClosedWhenOwner" , 1 , 10 , "test" ) ;
1151+ ms . Seek ( 0 , SeekOrigin . Begin ) ;
1152+ var zipData = ms . ToArray ( ) ;
1153+
1154+ // Stream should be closed when leaveOpen is unspecified
1155+ {
1156+ var inMemoryZip = new TrackedMemoryStream ( zipData ) ;
1157+ Assert . IsFalse ( inMemoryZip . IsClosed , "Input stream should NOT be closed" ) ;
1158+
1159+ using ( var zipFile = new ZipFile ( inMemoryZip ) )
1160+ {
1161+ Assert . IsTrue ( zipFile . IsStreamOwner , "Should be stream owner by default" ) ;
1162+ }
1163+
1164+ Assert . IsTrue ( inMemoryZip . IsClosed , "Input stream should be closed by default" ) ;
1165+ }
1166+
1167+ // Stream should be closed when leaveOpen is false
1168+ {
1169+ var inMemoryZip = new TrackedMemoryStream ( zipData ) ;
1170+ Assert . IsFalse ( inMemoryZip . IsClosed , "Input stream should NOT be closed" ) ;
1171+
1172+ using ( var zipFile = new ZipFile ( inMemoryZip , false ) )
1173+ {
1174+ Assert . IsTrue ( zipFile . IsStreamOwner , "Should be stream owner when leaveOpen is false" ) ;
1175+ }
1176+
1177+ Assert . IsTrue ( inMemoryZip . IsClosed , "Input stream should be closed when leaveOpen is false" ) ;
1178+ }
1179+ }
1180+
1181+ /// <summary>
1182+ /// Check that input stream is not closed when IsStreamOwner is false;
1183+ /// </summary>
1184+ [ Test ]
1185+ [ Category ( "Zip" ) ]
1186+ public void StreamNotClosedWhenNotOwner ( )
1187+ {
1188+ var ms = new TrackedMemoryStream ( ) ;
1189+ MakeZipFile ( ms , false , "StreamNotClosedWhenNotOwner" , 1 , 10 , "test" ) ;
1190+ ms . Seek ( 0 , SeekOrigin . Begin ) ;
1191+
1192+ Assert . IsFalse ( ms . IsClosed , "Input stream should NOT be closed" ) ;
1193+
1194+ // Stream should not be closed when leaveOpen is true
1195+ {
1196+ using ( var zipFile = new ZipFile ( ms , true ) )
1197+ {
1198+ Assert . IsFalse ( zipFile . IsStreamOwner , "Should NOT be stream owner when leaveOpen is true" ) ;
1199+ }
1200+
1201+ Assert . IsFalse ( ms . IsClosed , "Input stream should NOT be closed when leaveOpen is true" ) ;
1202+ }
1203+
1204+ ms . Seek ( 0 , SeekOrigin . Begin ) ;
1205+
1206+ // Stream should not be closed when IsStreamOwner is set to false after opening
1207+ {
1208+ using ( var zipFile = new ZipFile ( ms , false ) )
1209+ {
1210+ Assert . IsTrue ( zipFile . IsStreamOwner , "Should be stream owner when leaveOpen is false" ) ;
1211+ zipFile . IsStreamOwner = false ;
1212+ Assert . IsFalse ( zipFile . IsStreamOwner , "Should be able to set IsStreamOwner to false" ) ;
1213+ }
1214+
1215+ Assert . IsFalse ( ms . IsClosed , "Input stream should NOT be closed when IsStreamOwner is false" ) ;
1216+ }
1217+ }
1218+
1219+ /// <summary>
1220+ /// Check that input file is closed when IsStreamOwner is true (default), or leaveOpen is false
1221+ /// </summary>
1222+ [ Test ]
1223+ [ Category ( "Zip" ) ]
1224+ public void FileStreamClosedWhenOwner ( )
1225+ {
1226+ string tempFile = GetTempFilePath ( ) ;
1227+ Assert . IsNotNull ( tempFile , "No permission to execute this test?" ) ;
1228+
1229+ tempFile = Path . Combine ( tempFile , "SharpZipFileStreamClosedWhenOwnerTest.Zip" ) ;
1230+ if ( File . Exists ( tempFile ) )
1231+ {
1232+ File . Delete ( tempFile ) ;
1233+ }
1234+
1235+ MakeZipFile ( tempFile , "FileStreamClosedWhenOwner" , 2 , 10 , "test" ) ;
1236+
1237+ // Stream should be closed when leaveOpen is unspecified
1238+ {
1239+ var fileStream = new TrackedFileStream ( tempFile ) ;
1240+ Assert . IsFalse ( fileStream . IsClosed , "Input file should NOT be closed" ) ;
1241+
1242+ using ( var zipFile = new ZipFile ( fileStream ) )
1243+ {
1244+ Assert . IsTrue ( zipFile . IsStreamOwner , "Should be stream owner by default" ) ;
1245+ }
1246+
1247+ Assert . IsTrue ( fileStream . IsClosed , "Input stream should be closed by default" ) ;
1248+ }
1249+
1250+ // Stream should be closed when leaveOpen is false
1251+ {
1252+ var fileStream = new TrackedFileStream ( tempFile ) ;
1253+ Assert . IsFalse ( fileStream . IsClosed , "Input stream should NOT be closed" ) ;
1254+
1255+ using ( var zipFile = new ZipFile ( fileStream , false ) )
1256+ {
1257+ Assert . IsTrue ( zipFile . IsStreamOwner , "Should be stream owner when leaveOpen is false" ) ;
1258+ }
1259+
1260+ Assert . IsTrue ( fileStream . IsClosed , "Input stream should be closed when leaveOpen is false" ) ;
1261+ }
1262+
1263+ File . Delete ( tempFile ) ;
1264+ }
1265+
1266+ /// <summary>
1267+ /// Check that input file is not closed when IsStreamOwner is false;
1268+ /// </summary>
1269+ [ Test ]
1270+ [ Category ( "Zip" ) ]
1271+ public void FileStreamNotClosedWhenNotOwner ( )
1272+ {
1273+ string tempFile = GetTempFilePath ( ) ;
1274+ Assert . IsNotNull ( tempFile , "No permission to execute this test?" ) ;
1275+
1276+ tempFile = Path . Combine ( tempFile , "SharpZipFileStreamNotClosedWhenNotOwner.Zip" ) ;
1277+ if ( File . Exists ( tempFile ) )
1278+ {
1279+ File . Delete ( tempFile ) ;
1280+ }
1281+
1282+ MakeZipFile ( tempFile , "FileStreamClosedWhenOwner" , 2 , 10 , "test" ) ;
1283+
1284+ // Stream should not be closed when leaveOpen is true
1285+ {
1286+ using ( var fileStream = new TrackedFileStream ( tempFile ) )
1287+ {
1288+ Assert . IsFalse ( fileStream . IsClosed , "Input file should NOT be closed" ) ;
1289+
1290+ using ( var zipFile = new ZipFile ( fileStream , true ) )
1291+ {
1292+ Assert . IsFalse ( zipFile . IsStreamOwner , "Should NOT be stream owner when leaveOpen is true" ) ;
1293+ }
1294+
1295+ Assert . IsFalse ( fileStream . IsClosed , "Input stream should NOT be closed when leaveOpen is true" ) ;
1296+ }
1297+ }
1298+
1299+ // Stream should not be closed when IsStreamOwner is set to false after opening
1300+ {
1301+ using ( var fileStream = new TrackedFileStream ( tempFile ) )
1302+ {
1303+ Assert . IsFalse ( fileStream . IsClosed , "Input file should NOT be closed" ) ;
1304+
1305+ using ( var zipFile = new ZipFile ( fileStream , false ) )
1306+ {
1307+ Assert . IsTrue ( zipFile . IsStreamOwner , "Should be stream owner when leaveOpen is false" ) ;
1308+ zipFile . IsStreamOwner = false ;
1309+ Assert . IsFalse ( zipFile . IsStreamOwner , "Should be able to set IsStreamOwner to false" ) ;
1310+ }
1311+
1312+ Assert . IsFalse ( fileStream . IsClosed , "Input stream should NOT be closed when leaveOpen is true" ) ;
1313+ }
1314+ }
1315+
1316+ File . Delete ( tempFile ) ;
1317+ }
1318+
1319+ /// <summary>
1320+ /// Check that input stream is closed when construction fails and leaveOpen is false
1321+ /// </summary>
1322+ [ Test ]
1323+ public void StreamClosedOnError ( )
1324+ {
1325+ var ms = new TrackedMemoryStream ( new byte [ 32 ] ) ;
1326+
1327+ Assert . IsFalse ( ms . IsClosed , "Underlying stream should NOT be closed initially" ) ;
1328+ bool blewUp = false ;
1329+ try
1330+ {
1331+ using ( var zipFile = new ZipFile ( ms , false ) )
1332+ {
1333+ Assert . Fail ( "Exception not thrown" ) ;
1334+ }
1335+ }
1336+ catch
1337+ {
1338+ blewUp = true ;
1339+ }
1340+
1341+ Assert . IsTrue ( blewUp , "Should have failed to load the file" ) ;
1342+ Assert . IsTrue ( ms . IsClosed , "Underlying stream should be closed" ) ;
1343+ }
1344+
1345+ /// <summary>
1346+ /// Check that input stream is not closed when construction fails and leaveOpen is true
1347+ /// </summary>
1348+ [ Test ]
1349+ public void StreamNotClosedOnError ( )
1350+ {
1351+ var ms = new TrackedMemoryStream ( new byte [ 32 ] ) ;
1352+
1353+ Assert . IsFalse ( ms . IsClosed , "Underlying stream should NOT be closed initially" ) ;
1354+ bool blewUp = false ;
1355+ try
1356+ {
1357+ using ( var zipFile = new ZipFile ( ms , true ) )
1358+ {
1359+ Assert . Fail ( "Exception not thrown" ) ;
1360+ }
1361+ }
1362+ catch
1363+ {
1364+ blewUp = true ;
1365+ }
1366+
1367+ Assert . IsTrue ( blewUp , "Should have failed to load the file" ) ;
1368+ Assert . IsFalse ( ms . IsClosed , "Underlying stream should NOT be closed" ) ;
1369+ }
11411370 }
11421371}
0 commit comments