55using System . Text ;
66using System . Threading ;
77using Xamarin . Tools . Zip ;
8+ using Unix = Mono . Unix ;
89
910namespace Tests {
1011
@@ -20,7 +21,7 @@ void AssertEntryIsValid (ZipEntry e, string expectedArchivePath,
2021 }
2122
2223 const string TEXT = "oijoihaofiehfeafewufn e;fau 9ubre9wurew9;ru9;0oewubewa9ru bawpeu;9fberbf oiewrf" ;
23-
24+
2425
2526 [ Test ]
2627 public void CanCreateZipFile ( )
@@ -73,6 +74,38 @@ public void CanExtractZipFile ()
7374 }
7475 }
7576
77+ #if ! WINDOWS
78+ [ Test ]
79+ public void CheckExtractedFilePermissions ( )
80+ {
81+ if ( Environment . OSVersion . Platform != PlatformID . Unix )
82+ Assert . Ignore ( "Skipping. Test invalid on windows." ) ;
83+ string root = Path . Combine ( Path . GetDirectoryName ( typeof ( ZipTests ) . Assembly . Location ) , "CheckExtractedFilePermissions" ) ;
84+ Directory . CreateDirectory ( root ) ;
85+ string extractedDir = Path . Combine ( root , "Extracted" ) ;
86+ string file = Path . Combine ( root , "script" ) ;
87+ string zip = Path . Combine ( root , "foo.zip" ) ;
88+ if ( File . Exists ( zip ) )
89+ File . Delete ( zip ) ;
90+ if ( File . Exists ( file ) )
91+ File . Delete ( file ) ;
92+ File . WriteAllText ( file , "#!/bin/bash" + Environment . NewLine + "echo foo" ) ;
93+ using ( var archive = ZipArchive . Open ( zip , FileMode . Create ) ) {
94+ ZipEntry entry = archive . AddFile ( file , archivePath : "script" , permissions : EntryPermissions . OwnerAll | EntryPermissions . GroupAll | EntryPermissions . WorldAll ) ;
95+ }
96+ using ( var archive = ZipArchive . Open ( zip , FileMode . Open ) ) {
97+ archive . ExtractAll ( extractedDir ) ;
98+ string script = Path . Combine ( extractedDir , "script" ) ;
99+ FileAssert . Exists ( script ) ;
100+ var ufi = new Unix . UnixFileInfo ( script ) ;
101+ Assert . IsTrue ( ufi . FileAccessPermissions . HasFlag ( Unix . FileAccessPermissions . UserExecute ) ) ;
102+ Assert . IsTrue ( ufi . FileAccessPermissions . HasFlag ( Unix . FileAccessPermissions . GroupExecute ) ) ;
103+ Assert . IsTrue ( ufi . FileAccessPermissions . HasFlag ( Unix . FileAccessPermissions . OtherExecute ) ) ;
104+ }
105+
106+ }
107+ #endif
108+
76109 static DateTime WithoutMilliseconds ( DateTime t ) =>
77110 new DateTime ( t . Year , t . Month , t . Day , t . Hour , t . Minute , t . Second , t . Kind ) ;
78111
@@ -114,7 +147,7 @@ public void DateTimeConversion ()
114147 var unixTime = ( ulong ) dateTimeOffset . ToUnixTimeSeconds ( ) ;
115148 DateTime c = DateTimeOffset . FromUnixTimeSeconds ( ( long ) unixTime ) . UtcDateTime ;
116149 Assert . AreEqual ( WithoutMilliseconds ( dt ) , WithoutMilliseconds ( c ) ) ;
117-
150+
118151 }
119152 }
120153
0 commit comments