blob: ff45187690f4f4cce240df9dea116c9bde944a92 [file] [log] [blame]
Fabien Sanglard0f29f542020-10-22 17:58:12 -07001#include "gmock/gmock.h"
2#include "gtest/gtest.h"
3
4#include "ZipAlign.h"
5
weisueae45312021-12-13 17:56:12 +00006#include <filesystem>
Fabien Sanglard0f29f542020-10-22 17:58:12 -07007#include <stdio.h>
Fabien Sanglard6dfc6fb2020-10-22 17:58:12 -07008#include <string>
9
10#include <android-base/file.h>
Fabien Sanglard0f29f542020-10-22 17:58:12 -070011
12using namespace android;
Fabien Sanglarddf73d1b2021-09-14 14:18:31 -070013using namespace base;
Fabien Sanglard0f29f542020-10-22 17:58:12 -070014
Fabien Sanglard6dfc6fb2020-10-22 17:58:12 -070015static std::string GetTestPath(const std::string& filename) {
16 static std::string test_data_dir = android::base::GetExecutableDirectory() + "/tests/data/";
17 return test_data_dir + filename;
18}
19
weisueae45312021-12-13 17:56:12 +000020static std::string GetTempPath(const std::string& filename) {
21 std::filesystem::path temp_path = std::filesystem::path(testing::TempDir());
22 temp_path += filename;
23 return temp_path.string();
24}
25
Fabien Sanglard0f29f542020-10-22 17:58:12 -070026TEST(Align, Unaligned) {
Fabien Sanglard6dfc6fb2020-10-22 17:58:12 -070027 const std::string src = GetTestPath("unaligned.zip");
weisueae45312021-12-13 17:56:12 +000028 const std::string dst = GetTempPath("unaligned_out.zip");
Fabien Sanglard6dfc6fb2020-10-22 17:58:12 -070029
Fabien Sanglard4b4b4952020-11-05 18:36:56 -080030 int processed = process(src.c_str(), dst.c_str(), 4, true, false, 4096);
31 ASSERT_EQ(0, processed);
32
33 int verified = verify(dst.c_str(), 4, true, false);
34 ASSERT_EQ(0, verified);
Fabien Sanglard0f29f542020-10-22 17:58:12 -070035}
Fabien Sanglarda7206352020-10-20 15:47:10 -070036
Fabien Sanglarddf73d1b2021-09-14 14:18:31 -070037TEST(Align, DoubleAligment) {
38 const std::string src = GetTestPath("unaligned.zip");
weisueae45312021-12-13 17:56:12 +000039 const std::string tmp = GetTempPath("da_aligned.zip");
40 const std::string dst = GetTempPath("da_d_aligner.zip");
Fabien Sanglarddf73d1b2021-09-14 14:18:31 -070041
42 int processed = process(src.c_str(), tmp.c_str(), 4, true, false, 4096);
43 ASSERT_EQ(0, processed);
44
45 int verified = verify(tmp.c_str(), 4, true, false);
46 ASSERT_EQ(0, verified);
47
48 // Align the result of the previous run. Essentially double aligning.
49 processed = process(tmp.c_str(), dst.c_str(), 4, true, false, 4096);
50 ASSERT_EQ(0, processed);
51
52 verified = verify(dst.c_str(), 4, true, false);
53 ASSERT_EQ(0, verified);
54
55 // Nothing should have changed between tmp and dst.
56 std::string tmp_content;
57 ASSERT_EQ(true, ReadFileToString(tmp, &tmp_content));
58
59 std::string dst_content;
60 ASSERT_EQ(true, ReadFileToString(dst, &dst_content));
61
62 ASSERT_EQ(tmp_content, dst_content);
63}
64
Fabien Sanglarda7206352020-10-20 15:47:10 -070065// Align a zip featuring a hole at the beginning. The
66// hole in the archive is a delete entry in the Central
67// Directory.
68TEST(Align, Holes) {
69 const std::string src = GetTestPath("holes.zip");
weisueae45312021-12-13 17:56:12 +000070 const std::string dst = GetTempPath("holes_out.zip");
Fabien Sanglarda7206352020-10-20 15:47:10 -070071
72 int processed = process(src.c_str(), dst.c_str(), 4, true, false, 4096);
73 ASSERT_EQ(0, processed);
74
75 int verified = verify(dst.c_str(), 4, false, true);
76 ASSERT_EQ(0, verified);
77}
78
79// Align a zip where LFH order and CD entries differ.
80TEST(Align, DifferenteOrders) {
81 const std::string src = GetTestPath("diffOrders.zip");
weisueae45312021-12-13 17:56:12 +000082 const std::string dst = GetTempPath("diffOrders_out.zip");
Fabien Sanglarda7206352020-10-20 15:47:10 -070083
84 int processed = process(src.c_str(), dst.c_str(), 4, true, false, 4096);
85 ASSERT_EQ(0, processed);
86
87 int verified = verify(dst.c_str(), 4, false, true);
88 ASSERT_EQ(0, verified);
89}