blob: 6bd128d98c9b449541d03bf92c76d68ff3319746 [file] [log] [blame]
Alex Deymoa5cff222015-04-08 14:10:30 -07001// Copyright 2015 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Alex Deymoddf9db52017-03-02 16:10:41 -08005#include "bsdiff/bsdiff.h"
Alex Deymoa5cff222015-04-08 14:10:30 -07006
7#include <gtest/gtest.h>
Alex Deymofb3b6322017-09-27 14:28:54 +02008#include <algorithm>
9#include <random>
Alex Deymoa5cff222015-04-08 14:10:30 -070010#include <string>
11#include <vector>
12
Alex Deymofb3b6322017-09-27 14:28:54 +020013#include "bsdiff/fake_patch_writer.h"
Alex Deymoa5cff222015-04-08 14:10:30 -070014
Alex Deymofb3b6322017-09-27 14:28:54 +020015namespace {
16
17// Generate deterministic random data in the output buffer. The buffer must be
18// already allocated with the desired size. The data generated depends on the
19// selected size.
20void GenerateRandomBuffer(std::vector<uint8_t>* buffer) {
21 std::minstd_rand prng(1234 + buffer->size());
22 std::generate(buffer->begin(), buffer->end(), prng);
23}
24
25} // namespace
Alex Deymoa5cff222015-04-08 14:10:30 -070026
Alex Deymo20891f92015-10-12 17:28:04 -070027namespace bsdiff {
28
Alex Deymoa5cff222015-04-08 14:10:30 -070029class BsdiffTest : public testing::Test {
30 protected:
Alex Deymofb3b6322017-09-27 14:28:54 +020031 BsdiffTest() = default;
32 ~BsdiffTest() override = default;
Alex Deymoa5cff222015-04-08 14:10:30 -070033
Alex Deymofb3b6322017-09-27 14:28:54 +020034 void RunBsdiff() {
35 EXPECT_EQ(0, bsdiff(old_file_.data(), old_file_.size(), new_file_.data(),
36 new_file_.size(), &patch_writer_, nullptr));
37 }
38
39 std::vector<uint8_t> old_file_;
40 std::vector<uint8_t> new_file_;
41 FakePatchWriter patch_writer_;
Alex Deymoa5cff222015-04-08 14:10:30 -070042};
43
44// Check that a file with no changes has a very small patch (no extra data).
45TEST_F(BsdiffTest, EqualEmptyFiles) {
46 // Empty old and new files.
Alex Deymofb3b6322017-09-27 14:28:54 +020047 RunBsdiff();
Alex Deymoa5cff222015-04-08 14:10:30 -070048
Alex Deymofb3b6322017-09-27 14:28:54 +020049 // No entries should be generated on an empty new file.
50 EXPECT_TRUE(patch_writer_.entries().empty());
Alex Deymoa5cff222015-04-08 14:10:30 -070051}
52
53TEST_F(BsdiffTest, EqualSmallFiles) {
Alex Deymoc0461f02017-09-22 15:05:42 +020054 std::string some_text = "Hello world!";
Alex Deymofb3b6322017-09-27 14:28:54 +020055 old_file_.insert(old_file_.begin(), some_text.begin(), some_text.end());
56 new_file_.insert(new_file_.begin(), some_text.begin(), some_text.end());
57 RunBsdiff();
Alex Deymoa5cff222015-04-08 14:10:30 -070058
Alex Deymofb3b6322017-09-27 14:28:54 +020059 EXPECT_EQ(1U, patch_writer_.entries().size());
60 ControlEntry entry = patch_writer_.entries()[0];
61 EXPECT_EQ(some_text.size(), entry.diff_size);
62 EXPECT_EQ(0U, entry.extra_size);
63}
64
65TEST_F(BsdiffTest, FileWithSmallErrorsTest) {
66 old_file_.resize(100);
67 GenerateRandomBuffer(&old_file_);
68 new_file_ = old_file_;
69 // Break a few bytes somewhere in the middle.
70 new_file_[20]++;
71 new_file_[30] += 2;
72 new_file_[31] += 2;
73
74 RunBsdiff();
75
76 // We expect that the result has only one entry with all in the diff stream
77 // since the two files are very similar.
78 EXPECT_EQ(1U, patch_writer_.entries().size());
79 ControlEntry entry = patch_writer_.entries()[0];
80 EXPECT_EQ(100U, entry.diff_size);
81 EXPECT_EQ(0U, entry.extra_size);
Alex Deymoa5cff222015-04-08 14:10:30 -070082}
Alex Deymo20891f92015-10-12 17:28:04 -070083
84} // namespace bsdiff