blob: 8f7de72b7259db9d956316108cac896313883f25 [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
5#ifndef _BSDIFF_TEST_UTILS_H_
6#define _BSDIFF_TEST_UTILS_H_
7
Jed Estep9abc2042016-02-19 11:12:14 -08008#include <gtest/gtest.h>
Alex Deymoa5cff222015-04-08 14:10:30 -07009#include <string>
10#include <vector>
11
Amin Hassani1106bf72017-11-15 17:26:03 -080012#include "bsdiff/logging.h"
13
14#define TEST_AND_RETURN_FALSE(_x) \
15 do { \
16 if (!static_cast<bool>(_x)) { \
17 LOG(ERROR) << #_x " failed."; \
18 return false; \
19 } \
Alex Deymoa5cff222015-04-08 14:10:30 -070020 } while (0)
21
22namespace test_utils {
23
Jed Estep9abc2042016-02-19 11:12:14 -080024class BsdiffTestEnvironment : public ::testing::Environment {
25 public:
26 virtual void SetUp();
27};
28
Alex Deymoa5cff222015-04-08 14:10:30 -070029// Reads all the contents of the file |path| into |out|. Returns whether it
30// read up to the end of file.
31bool ReadFile(const std::string& path, std::vector<uint8_t>* out);
32
33// Overrides the file |path| with the contents passed in |out|. Returns whether
34// the operation succeeded.
35bool WriteFile(const std::string& path, std::vector<uint8_t> contents);
36
37// Utility class to create and delete a temp file.
38class ScopedTempFile {
39 public:
40 // Creates a temp file with the passed |pattern|. The pattern should end with
41 // "XXXXXX", that will be replaced with a random string. The file will be
42 // removed when this instance is destroyed.
43 explicit ScopedTempFile(const std::string& pattern);
44 ~ScopedTempFile();
45
46 std::string filename() const { return filename_; }
47 const char* c_str() const { return filename_.c_str(); }
48
49 // Releases the temporary file. It will not be deleted when this instance is
50 // destroyed.
51 void release() { filename_.clear(); }
52
53 private:
54 std::string filename_;
55};
56
57// This struct representes a parsed BSDIFF40 file.
58struct BsdiffPatchFile {
59 static const size_t kHeaderSize = 32;
60
61 // Parses a BSDIFF40 file and stores the contents in the local methods.
62 bool LoadFromFile(const std::string& filename);
63
64 // Returns wheter the patch file is valid.
65 bool IsValid() const;
66
67 // The magic string in the header file. Normally "BSDIFF40".
68 std::string magic;
69
70 // The length of the first (ctrl) bzip2 stream. Negative values are invalid.
71 int64_t ctrl_len = -1;
72
73 // The length of the first (diff) bzip2 stream. Negative values are invalid.
74 int64_t diff_len = -1;
75
76 // The length of the first (diff) bzip2 stream. This value is not stored in
77 // the file, but generated based on the |file_size|.
78 uint64_t extra_len = 0;
79
80 // The length of the new file after applying the patch. Negative values are
81 // invalid.
82 int64_t new_file_len = -1;
83
84 // The three compressed streams.
85 std::vector<uint8_t> bz2_ctrl;
86 std::vector<uint8_t> bz2_diff;
87 std::vector<uint8_t> bz2_extra;
88
89 uint64_t file_size = 0;
90};
91
92
93} // namespace test_utils
94
95
96#endif // _BSDIFF_TEST_UTILS_H_