blob: ff45187690f4f4cce240df9dea116c9bde944a92 [file] [log] [blame]
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "ZipAlign.h"
#include <filesystem>
#include <stdio.h>
#include <string>
#include <android-base/file.h>
using namespace android;
using namespace base;
static std::string GetTestPath(const std::string& filename) {
static std::string test_data_dir = android::base::GetExecutableDirectory() + "/tests/data/";
return test_data_dir + filename;
}
static std::string GetTempPath(const std::string& filename) {
std::filesystem::path temp_path = std::filesystem::path(testing::TempDir());
temp_path += filename;
return temp_path.string();
}
TEST(Align, Unaligned) {
const std::string src = GetTestPath("unaligned.zip");
const std::string dst = GetTempPath("unaligned_out.zip");
int processed = process(src.c_str(), dst.c_str(), 4, true, false, 4096);
ASSERT_EQ(0, processed);
int verified = verify(dst.c_str(), 4, true, false);
ASSERT_EQ(0, verified);
}
TEST(Align, DoubleAligment) {
const std::string src = GetTestPath("unaligned.zip");
const std::string tmp = GetTempPath("da_aligned.zip");
const std::string dst = GetTempPath("da_d_aligner.zip");
int processed = process(src.c_str(), tmp.c_str(), 4, true, false, 4096);
ASSERT_EQ(0, processed);
int verified = verify(tmp.c_str(), 4, true, false);
ASSERT_EQ(0, verified);
// Align the result of the previous run. Essentially double aligning.
processed = process(tmp.c_str(), dst.c_str(), 4, true, false, 4096);
ASSERT_EQ(0, processed);
verified = verify(dst.c_str(), 4, true, false);
ASSERT_EQ(0, verified);
// Nothing should have changed between tmp and dst.
std::string tmp_content;
ASSERT_EQ(true, ReadFileToString(tmp, &tmp_content));
std::string dst_content;
ASSERT_EQ(true, ReadFileToString(dst, &dst_content));
ASSERT_EQ(tmp_content, dst_content);
}
// Align a zip featuring a hole at the beginning. The
// hole in the archive is a delete entry in the Central
// Directory.
TEST(Align, Holes) {
const std::string src = GetTestPath("holes.zip");
const std::string dst = GetTempPath("holes_out.zip");
int processed = process(src.c_str(), dst.c_str(), 4, true, false, 4096);
ASSERT_EQ(0, processed);
int verified = verify(dst.c_str(), 4, false, true);
ASSERT_EQ(0, verified);
}
// Align a zip where LFH order and CD entries differ.
TEST(Align, DifferenteOrders) {
const std::string src = GetTestPath("diffOrders.zip");
const std::string dst = GetTempPath("diffOrders_out.zip");
int processed = process(src.c_str(), dst.c_str(), 4, true, false, 4096);
ASSERT_EQ(0, processed);
int verified = verify(dst.c_str(), 4, false, true);
ASSERT_EQ(0, verified);
}