From f8dd2a1064154e5e8223c4d52e123b582497a40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Anic=CC=81?= Date: Sun, 7 Apr 2024 01:21:10 +0200 Subject: [PATCH] fetch: add executable bit test --- src/Package/Fetch.zig | 52 ++++++++++++++++++ src/Package/Fetch/testdata/executables.tar.gz | Bin 0 -> 430 bytes 2 files changed, 52 insertions(+) create mode 100644 src/Package/Fetch/testdata/executables.tar.gz diff --git a/src/Package/Fetch.zig b/src/Package/Fetch.zig index 9e91c0e029..c72ebc4a1e 100644 --- a/src/Package/Fetch.zig +++ b/src/Package/Fetch.zig @@ -2010,6 +2010,58 @@ test "tarball without root folder" { try fb.expectPackageFiles(expected_files); } +test "set executable bit based on file content" { + if (!std.fs.has_executable_bit) return error.SkipZigTest; + const gpa = std.testing.allocator; + var tmp = std.testing.tmpDir(.{}); + defer tmp.cleanup(); + + const tarball_name = "executables.tar.gz"; + try saveEmbedFile(tarball_name, tmp.dir); + const tarball_path = try std.fmt.allocPrint(gpa, "zig-cache/tmp/{s}/{s}", .{ tmp.sub_path, tarball_name }); + defer gpa.free(tarball_path); + + // $ tar -tvf executables.tar.gz + // drwxrwxr-x 0 executables/ + // -rwxrwxr-x 170 executables/hello + // lrwxrwxrwx 0 executables/hello_ln -> hello + // -rw-rw-r-- 0 executables/file1 + // -rw-rw-r-- 17 executables/script_with_shebang_without_exec_bit + // -rwxrwxr-x 7 executables/script_without_shebang + // -rwxrwxr-x 17 executables/script + + var fb: TestFetchBuilder = undefined; + var fetch = try fb.build(gpa, tmp.dir, tarball_path); + defer fb.deinit(); + + try fetch.run(); + try std.testing.expectEqualStrings( + "1220fecb4c06a9da8673c87fe8810e15785f1699212f01728eadce094d21effeeef3", + &Manifest.hexDigest(fetch.actual_hash), + ); + + var out = try fb.packageDir(); + defer out.close(); + const S = std.posix.S; + // expect executable bit not set + try std.testing.expect((try out.statFile("file1")).mode & S.IXUSR == 0); + try std.testing.expect((try out.statFile("script_without_shebang")).mode & S.IXUSR == 0); + // expect executable bit set + try std.testing.expect((try out.statFile("hello")).mode & S.IXUSR != 0); + try std.testing.expect((try out.statFile("script")).mode & S.IXUSR != 0); + try std.testing.expect((try out.statFile("script_with_shebang_without_exec_bit")).mode & S.IXUSR != 0); + try std.testing.expect((try out.statFile("hello_ln")).mode & S.IXUSR != 0); + + // + // $ ls -al zig-cache/tmp/OCz9ovUcstDjTC_U/zig-global-cache/p/1220fecb4c06a9da8673c87fe8810e15785f1699212f01728eadce094d21effeeef3 + // -rw-rw-r-- 1 0 Apr file1 + // -rwxrwxr-x 1 170 Apr hello + // lrwxrwxrwx 1 5 Apr hello_ln -> hello + // -rwxrwxr-x 1 17 Apr script + // -rw-rw-r-- 1 7 Apr script_without_shebang + // -rwxrwxr-x 1 17 Apr script_with_shebang_without_exec_bit +} + fn saveEmbedFile(comptime tarball_name: []const u8, dir: fs.Dir) !void { //const tarball_name = "duplicate_paths_excluded.tar.gz"; const tarball_content = @embedFile("Fetch/testdata/" ++ tarball_name); diff --git a/src/Package/Fetch/testdata/executables.tar.gz b/src/Package/Fetch/testdata/executables.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..abc650801ea6d416ad3cef2b87a6df205c71663b GIT binary patch literal 430 zcmb2|=3oE==C{)?`ZXJfwCz^i9hvk@`AWs=$Y_nPhi2T(*z-Y_+PEBH?#brq|r^L-msr9nk|(}nz|&_zTLCk`Z#%>sNmc6 zhcEfm7*0R^yuIel<$3#fs!j(NPv6H^wOalY$9eVO(!2lvZD+ii^W%Q_$#vOl{_1ag z@qbQm+Mo5e8JuTay*eQ$>Ro;G|Jf0qQO>-|8=mise(5h^_;>!x`wYM8nQ#1B{y4K{ z`p?f6-G59bB~G}rZqiAe&u1;{dp6I%vf@g7ckH|WF?;qSV*W zu6}0L(>c3;9Ql9jQziG0+TK^6=WG1+@3j2SSc5+6{f%Guzv_Sf gH_j^$3;yM^Mf_(3#|V^o@c$EAK)2ou1`P%V0E5QW<^TWy literal 0 HcmV?d00001