| // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "courgette/base_test_unittest.h" | |
| #include "courgette/courgette.h" | |
| #include "courgette/streams.h" | |
| #if defined(OS_WIN) && !defined(NDEBUG) | |
| // Ensemble tests still take too long on Debug Windows so disabling for now | |
| // TODO(dgarrett) http://code.google.com/p/chromium/issues/detail?id=101614 | |
| #define MAYBE_PE DISABLED_PE | |
| #define MAYBE_PE64 DISABLED_PE64 | |
| #define MAYBE_Elf32 DISABLED_Elf32 | |
| #else | |
| #define MAYBE_PE PE | |
| #define MAYBE_PE64 PE64 | |
| #define MAYBE_Elf32 Elf32 | |
| #endif | |
| class EnsembleTest : public BaseTest { | |
| public: | |
| void TestEnsemble(const std::string& src_bytes, | |
| const std::string& tgt_bytes) const; | |
| void PeEnsemble() const; | |
| void Pe64Ensemble() const; | |
| void Elf32Ensemble() const; | |
| }; | |
| void EnsembleTest::TestEnsemble(const std::string& src_bytes, | |
| const std::string& tgt_bytes) const { | |
| courgette::SourceStream source; | |
| courgette::SourceStream target; | |
| source.Init(src_bytes); | |
| target.Init(tgt_bytes); | |
| courgette::SinkStream patch_sink; | |
| courgette::Status status; | |
| status = courgette::GenerateEnsemblePatch(&source, &target, &patch_sink); | |
| EXPECT_EQ(courgette::C_OK, status); | |
| courgette::SourceStream patch_source; | |
| patch_source.Init(patch_sink.Buffer(), patch_sink.Length()); | |
| courgette::SinkStream patch_result; | |
| status = courgette::ApplyEnsemblePatch(&source, &patch_source, &patch_result); | |
| EXPECT_EQ(courgette::C_OK, status); | |
| EXPECT_EQ(target.OriginalLength(), patch_result.Length()); | |
| EXPECT_FALSE(memcmp(target.Buffer(), | |
| patch_result.Buffer(), | |
| target.OriginalLength())); | |
| } | |
| void EnsembleTest::Elf32Ensemble() const { | |
| std::list<std::string> src_ensemble; | |
| std::list<std::string> tgt_ensemble; | |
| src_ensemble.push_back("elf-32-1"); | |
| tgt_ensemble.push_back("elf-32-2"); | |
| std::string src_bytes = FilesContents(src_ensemble); | |
| std::string tgt_bytes = FilesContents(tgt_ensemble); | |
| src_bytes = "aaabbbccc" + src_bytes + "dddeeefff"; | |
| tgt_bytes = "aaagggccc" + tgt_bytes + "dddeeefff"; | |
| TestEnsemble(src_bytes, tgt_bytes); | |
| } | |
| void EnsembleTest::PeEnsemble() const { | |
| std::list<std::string> src_ensemble; | |
| std::list<std::string> tgt_ensemble; | |
| src_ensemble.push_back("en-US.dll"); | |
| src_ensemble.push_back("setup1.exe"); | |
| tgt_ensemble.push_back("en-US.dll"); | |
| tgt_ensemble.push_back("setup2.exe"); | |
| std::string src_bytes = FilesContents(src_ensemble); | |
| std::string tgt_bytes = FilesContents(tgt_ensemble); | |
| src_bytes = "aaabbbccc" + src_bytes + "dddeeefff"; | |
| tgt_bytes = "aaagggccc" + tgt_bytes + "dddeeefff"; | |
| TestEnsemble(src_bytes, tgt_bytes); | |
| } | |
| void EnsembleTest::Pe64Ensemble() const { | |
| std::list<std::string> src_ensemble; | |
| std::list<std::string> tgt_ensemble; | |
| src_ensemble.push_back("en-US-64.dll"); | |
| src_ensemble.push_back("chrome64_1.exe"); | |
| src_ensemble.push_back("pe-64.exe"); | |
| tgt_ensemble.push_back("en-US-64.dll"); | |
| tgt_ensemble.push_back("chrome64_2.exe"); | |
| tgt_ensemble.push_back("pe-64.exe"); | |
| std::string src_bytes = FilesContents(src_ensemble); | |
| std::string tgt_bytes = FilesContents(tgt_ensemble); | |
| src_bytes = "aaabbbccc" + src_bytes + "dddeeefff"; | |
| tgt_bytes = "aaagggccc" + tgt_bytes + "dddeeefff"; | |
| TestEnsemble(src_bytes, tgt_bytes); | |
| } | |
| TEST_F(EnsembleTest, MAYBE_PE) { | |
| PeEnsemble(); | |
| } | |
| TEST_F(EnsembleTest, MAYBE_PE64) { | |
| Pe64Ensemble(); | |
| } | |
| TEST_F(EnsembleTest, MAYBE_Elf32) { | |
| Elf32Ensemble(); | |
| } |