blob: 8c8993a3b981e045bdbd698160815b2e6a500171 [file] [log] [blame]
// Copyright 2024 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "patchmaker/patch_util.h"
#include <cstdint>
#include <optional>
#include <base/files/file_util.h>
#include <brillo/secure_blob.h>
#include <gtest/gtest.h>
static const char test_data_old[] =
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim "
"veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea "
"commodo consequat. Duis aute irure dolor in reprehenderit in voluptate ";
// Almost identical to the above, but with one more line. While it isn't binary
// data, it should still allow a patch to be generated that is smaller than the
// original file.
static const char test_data_new[] =
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim "
"veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea "
"commodo consequat. Duis aute irure dolor in reprehenderit in voluptate "
"velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint ";
TEST(Patch, CompressionEfficacy) {
base::FilePath old_path, new_path, patch_path;
base::CreateTemporaryFile(&old_path);
base::CreateTemporaryFile(&new_path);
base::CreateTemporaryFile(&patch_path);
base::WriteFile(old_path, test_data_old);
base::WriteFile(new_path, test_data_new);
ASSERT_TRUE(util::DoBsDiff(old_path, new_path, patch_path));
std::optional<int64_t> file_size_new = base::GetFileSize(new_path);
std::optional<int64_t> file_size_patch = base::GetFileSize(patch_path);
ASSERT_TRUE(file_size_new.has_value());
ASSERT_TRUE(file_size_patch.has_value());
// Confirm that compressed data is smaller than the original data
ASSERT_TRUE(file_size_patch.value() < file_size_new.value());
}
TEST(Patch, ReversiblePatch) {
base::FilePath old_path, new_path, patch_path, reconstructed_path;
base::CreateTemporaryFile(&old_path);
base::CreateTemporaryFile(&new_path);
base::CreateTemporaryFile(&patch_path);
base::CreateTemporaryFile(&reconstructed_path);
base::WriteFile(old_path, test_data_old);
base::WriteFile(new_path, test_data_new);
ASSERT_TRUE(util::DoBsDiff(old_path, new_path, patch_path));
ASSERT_TRUE(util::DoBsPatch(old_path, reconstructed_path, patch_path));
ASSERT_TRUE(base::ContentsEqual(new_path, reconstructed_path));
}