xref: /aosp_15_r20/external/bsdiff/fake_patch_writer.h (revision a3a45f308bd90ef1a6e6a5e8fb92fe449b895909)
1*a3a45f30SXin Li // Copyright 2017 The Chromium OS Authors. All rights reserved.
2*a3a45f30SXin Li // Use of this source code is governed by a BSD-style license that can be
3*a3a45f30SXin Li // found in the LICENSE file.
4*a3a45f30SXin Li 
5*a3a45f30SXin Li #ifndef _BSDIFF_FAKE_PATCH_WRITER_H_
6*a3a45f30SXin Li #define _BSDIFF_FAKE_PATCH_WRITER_H_
7*a3a45f30SXin Li 
8*a3a45f30SXin Li #include <gtest/gtest.h>
9*a3a45f30SXin Li #include <vector>
10*a3a45f30SXin Li 
11*a3a45f30SXin Li #include "bsdiff/patch_writer_interface.h"
12*a3a45f30SXin Li 
13*a3a45f30SXin Li namespace bsdiff {
14*a3a45f30SXin Li 
15*a3a45f30SXin Li // A fake PatchWriterInterface derived class with easy access to the data passed
16*a3a45f30SXin Li // to it.
17*a3a45f30SXin Li class FakePatchWriter : public PatchWriterInterface {
18*a3a45f30SXin Li  public:
19*a3a45f30SXin Li   FakePatchWriter() = default;
20*a3a45f30SXin Li   ~FakePatchWriter() override = default;
21*a3a45f30SXin Li 
22*a3a45f30SXin Li   // PatchWriterInterface overrides.
Init(size_t new_size)23*a3a45f30SXin Li   bool Init(size_t new_size) override {
24*a3a45f30SXin Li     EXPECT_FALSE(initialized_);
25*a3a45f30SXin Li     initialized_ = true;
26*a3a45f30SXin Li     new_size_ = new_size;
27*a3a45f30SXin Li     return true;
28*a3a45f30SXin Li   }
29*a3a45f30SXin Li 
AddControlEntry(const ControlEntry & entry)30*a3a45f30SXin Li   bool AddControlEntry(const ControlEntry& entry) override {
31*a3a45f30SXin Li     EXPECT_TRUE(initialized_);
32*a3a45f30SXin Li     EXPECT_FALSE(closed_);
33*a3a45f30SXin Li     entries_.push_back(entry);
34*a3a45f30SXin Li     return true;
35*a3a45f30SXin Li   }
36*a3a45f30SXin Li 
WriteDiffStream(const uint8_t * data,size_t size)37*a3a45f30SXin Li   bool WriteDiffStream(const uint8_t* data, size_t size) override {
38*a3a45f30SXin Li     diff_stream_.insert(diff_stream_.end(), data, data + size);
39*a3a45f30SXin Li     return true;
40*a3a45f30SXin Li   }
41*a3a45f30SXin Li 
WriteExtraStream(const uint8_t * data,size_t size)42*a3a45f30SXin Li   bool WriteExtraStream(const uint8_t* data, size_t size) override {
43*a3a45f30SXin Li     extra_stream_.insert(extra_stream_.end(), data, data + size);
44*a3a45f30SXin Li     return true;
45*a3a45f30SXin Li   }
46*a3a45f30SXin Li 
Close()47*a3a45f30SXin Li   bool Close() override {
48*a3a45f30SXin Li     EXPECT_FALSE(closed_) << "Close() already called";
49*a3a45f30SXin Li     closed_ = true;
50*a3a45f30SXin Li     return true;
51*a3a45f30SXin Li   }
52*a3a45f30SXin Li 
53*a3a45f30SXin Li   // Fake getter methods.
entries()54*a3a45f30SXin Li   const std::vector<ControlEntry>& entries() const { return entries_; }
diff_stream()55*a3a45f30SXin Li   const std::vector<uint8_t>& diff_stream() const { return diff_stream_; }
extra_stream()56*a3a45f30SXin Li   const std::vector<uint8_t>& extra_stream() const { return extra_stream_; }
new_size()57*a3a45f30SXin Li   size_t new_size() const { return new_size_; }
58*a3a45f30SXin Li 
59*a3a45f30SXin Li  private:
60*a3a45f30SXin Li   // The list of ControlEntry passed to this class.
61*a3a45f30SXin Li   std::vector<ControlEntry> entries_;
62*a3a45f30SXin Li   std::vector<uint8_t> diff_stream_;
63*a3a45f30SXin Li   std::vector<uint8_t> extra_stream_;
64*a3a45f30SXin Li 
65*a3a45f30SXin Li   // The size of the new file for the patch we are writing.
66*a3a45f30SXin Li   size_t new_size_{0};
67*a3a45f30SXin Li 
68*a3a45f30SXin Li   // Whether this class was initialized.
69*a3a45f30SXin Li   bool initialized_{false};
70*a3a45f30SXin Li 
71*a3a45f30SXin Li   // Whether the patch was closed.
72*a3a45f30SXin Li   bool closed_{false};
73*a3a45f30SXin Li };
74*a3a45f30SXin Li 
75*a3a45f30SXin Li }  // namespace bsdiff
76*a3a45f30SXin Li 
77*a3a45f30SXin Li #endif  // _BSDIFF_FAKE_PATCH_WRITER_H_
78