| // 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(std::string src_bytes, std::string tgt_bytes) const; |
| |
| void PeEnsemble() const; |
| void Pe64Ensemble() const; |
| void Elf32Ensemble() const; |
| }; |
| |
| void EnsembleTest::TestEnsemble(std::string src_bytes, |
| 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(); |
| } |