@@ -236,3 +236,87 @@ DEFINE_TEST(test_write_disk_appledouble)
236
236
assertEqualFile ("hfscmp/file3" , "nocmp/file3" );
237
237
#endif
238
238
}
239
+
240
+ /* Test writing apple doubles to disk from zip format */
241
+ DEFINE_TEST (test_write_disk_appledouble_zip )
242
+ {
243
+ #if !defined(__APPLE__ ) || !defined(UF_COMPRESSED ) || !defined(HAVE_SYS_XATTR_H )\
244
+ || !defined(HAVE_ZLIB_H )
245
+ skipping ("MacOS-specific AppleDouble test" );
246
+ #else
247
+ const char * refname = "test_write_disk_appledouble_zip.zip" ;
248
+ struct archive * ad , * a ;
249
+ struct archive_entry * ae ;
250
+ struct stat st ;
251
+
252
+ extract_reference_file (refname );
253
+
254
+ /*
255
+ * Extract an archive to disk.
256
+ */
257
+ assert ((ad = archive_write_disk_new ()) != NULL );
258
+ assertEqualIntA (ad , ARCHIVE_OK ,
259
+ archive_write_disk_set_standard_lookup (ad ));
260
+ assertEqualIntA (ad , ARCHIVE_OK ,
261
+ archive_write_disk_set_options (ad ,
262
+ ARCHIVE_EXTRACT_TIME |
263
+ ARCHIVE_EXTRACT_SECURE_SYMLINKS |
264
+ ARCHIVE_EXTRACT_SECURE_NODOTDOT ));
265
+
266
+ assert ((a = archive_read_new ()) != NULL );
267
+ assertEqualIntA (a , ARCHIVE_OK , archive_read_support_filter_all (a ));
268
+ assertEqualIntA (a , ARCHIVE_OK , archive_read_support_format_all (a ));
269
+ assertEqualIntA (a , ARCHIVE_OK , archive_read_open_filename (a ,
270
+ refname , 512 * 20 ));
271
+
272
+ /* Skip The top level directory */
273
+ assertEqualIntA (a , ARCHIVE_OK , archive_read_next_header (a , & ae ));
274
+ assertEqualString ("apple_double_dir/" , archive_entry_pathname (ae ));
275
+
276
+ /* Extract apple_double_test */
277
+ assertEqualIntA (a , ARCHIVE_OK , archive_read_next_header (a , & ae ));
278
+ assertEqualString ("apple_double_dir/apple_double_dir_test/" , archive_entry_pathname (ae ));
279
+ assertEqualIntA (a , ARCHIVE_OK , archive_read_extract2 (a , ae , ad ));
280
+
281
+ /* Extract ._apple_double_dir_test which will be merged into apple_double_dir_test as metadata. */
282
+ assertEqualIntA (a , ARCHIVE_OK , archive_read_next_header (a , & ae ));
283
+ assertEqualString ("apple_double_dir/._apple_double_dir_test" , archive_entry_pathname (ae ));
284
+ assertEqualIntA (a , ARCHIVE_OK , archive_read_extract2 (a , ae , ad ));
285
+
286
+ /* Extract test_file */
287
+ assertEqualIntA (a , ARCHIVE_OK , archive_read_next_header (a , & ae ));
288
+ assertEqualString ("apple_double_dir/test_file" , archive_entry_pathname (ae ));
289
+ assertEqualIntA (a , ARCHIVE_OK , archive_read_extract2 (a , ae , ad ));
290
+
291
+ /* Extract ._test_file which will be merged into test_file as metadata. */
292
+ assertEqualIntA (a , ARCHIVE_OK , archive_read_next_header (a , & ae ));
293
+ assertEqualString ("apple_double_dir/._test_file" , archive_entry_pathname (ae ));
294
+ assertEqualIntA (a , ARCHIVE_OK , archive_read_extract2 (a , ae , ad ));
295
+
296
+ assertEqualIntA (a , ARCHIVE_EOF , archive_read_next_header (a , & ae ));
297
+ assertEqualIntA (a , ARCHIVE_OK , archive_read_close (a ));
298
+ assertEqualInt (ARCHIVE_OK , archive_read_free (a ));
299
+ assertEqualIntA (ad , ARCHIVE_OK , archive_write_free (ad ));
300
+
301
+ /* Test test_file */
302
+ assertEqualInt (0 , stat ("apple_double_dir/test_file" , & st ));
303
+ assertFileSize ("apple_double_dir/test_file" , 5 );
304
+ failure ("'%s' should have Resource Fork" , "test_file" );
305
+ assertEqualInt (1 , has_xattr ("apple_double_dir/test_file" , "com.apple.ResourceFork" ));
306
+
307
+ /* Test apple_double_dir_test */
308
+ failure ("'%s' should have quarantine xattr" , "apple_double_dir_test" );
309
+ assertEqualInt (1 , has_xattr ("apple_double_dir/apple_double_dir_test" , "com.apple.quarantine" ));
310
+
311
+ /* Test ._test_file. */
312
+ failure ("'apple_double_dir/._test_file' should be merged and removed" );
313
+ assertFileNotExists ("apple_double_dir/._test_file" );
314
+
315
+ /* Test ._apple_double_dir_test */
316
+ failure ("'apple_double_dir/._._apple_double_dir_test' should be merged and removed" );
317
+ assertFileNotExists ("apple_double_dir/._apple_double_dir_test" );
318
+
319
+ assertChdir (".." );
320
+
321
+ #endif
322
+ }
0 commit comments