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