ensemble_unittest.cc 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // Copyright (c) 2011 The Chromium 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. #include "build/build_config.h"
  5. #include "courgette/base_test_unittest.h"
  6. #include "courgette/courgette.h"
  7. #include "courgette/streams.h"
  8. #if BUILDFLAG(IS_WIN) && !defined(NDEBUG)
  9. // Ensemble tests still take too long on Debug Windows so disabling for now
  10. // TODO(dgarrett) http://code.google.com/p/chromium/issues/detail?id=101614
  11. #define MAYBE_PE DISABLED_PE
  12. #define MAYBE_PE64 DISABLED_PE64
  13. #define MAYBE_Elf32 DISABLED_Elf32
  14. #else
  15. #define MAYBE_PE PE
  16. #define MAYBE_PE64 PE64
  17. #define MAYBE_Elf32 Elf32
  18. #endif
  19. class EnsembleTest : public BaseTest {
  20. public:
  21. void TestEnsemble(const std::string& src_bytes,
  22. const std::string& tgt_bytes) const;
  23. void PeEnsemble() const;
  24. void Pe64Ensemble() const;
  25. void Elf32Ensemble() const;
  26. };
  27. void EnsembleTest::TestEnsemble(const std::string& src_bytes,
  28. const std::string& tgt_bytes) const {
  29. courgette::SourceStream source;
  30. courgette::SourceStream target;
  31. source.Init(src_bytes);
  32. target.Init(tgt_bytes);
  33. courgette::SinkStream patch_sink;
  34. courgette::Status status;
  35. status = courgette::GenerateEnsemblePatch(&source, &target, &patch_sink);
  36. EXPECT_EQ(courgette::C_OK, status);
  37. courgette::SourceStream patch_source;
  38. patch_source.Init(patch_sink.Buffer(), patch_sink.Length());
  39. courgette::SinkStream patch_result;
  40. status = courgette::ApplyEnsemblePatch(&source, &patch_source, &patch_result);
  41. EXPECT_EQ(courgette::C_OK, status);
  42. EXPECT_EQ(target.OriginalLength(), patch_result.Length());
  43. EXPECT_FALSE(memcmp(target.Buffer(),
  44. patch_result.Buffer(),
  45. target.OriginalLength()));
  46. }
  47. void EnsembleTest::Elf32Ensemble() const {
  48. std::list<std::string> src_ensemble;
  49. std::list<std::string> tgt_ensemble;
  50. src_ensemble.push_back("elf-32-1");
  51. tgt_ensemble.push_back("elf-32-2");
  52. std::string src_bytes = FilesContents(src_ensemble);
  53. std::string tgt_bytes = FilesContents(tgt_ensemble);
  54. src_bytes = "aaabbbccc" + src_bytes + "dddeeefff";
  55. tgt_bytes = "aaagggccc" + tgt_bytes + "dddeeefff";
  56. TestEnsemble(src_bytes, tgt_bytes);
  57. }
  58. void EnsembleTest::PeEnsemble() const {
  59. std::list<std::string> src_ensemble;
  60. std::list<std::string> tgt_ensemble;
  61. src_ensemble.push_back("en-US.dll");
  62. src_ensemble.push_back("setup1.exe");
  63. tgt_ensemble.push_back("en-US.dll");
  64. tgt_ensemble.push_back("setup2.exe");
  65. std::string src_bytes = FilesContents(src_ensemble);
  66. std::string tgt_bytes = FilesContents(tgt_ensemble);
  67. src_bytes = "aaabbbccc" + src_bytes + "dddeeefff";
  68. tgt_bytes = "aaagggccc" + tgt_bytes + "dddeeefff";
  69. TestEnsemble(src_bytes, tgt_bytes);
  70. }
  71. void EnsembleTest::Pe64Ensemble() const {
  72. std::list<std::string> src_ensemble;
  73. std::list<std::string> tgt_ensemble;
  74. src_ensemble.push_back("en-US-64.dll");
  75. src_ensemble.push_back("chrome64_1.exe");
  76. src_ensemble.push_back("pe-64.exe");
  77. tgt_ensemble.push_back("en-US-64.dll");
  78. tgt_ensemble.push_back("chrome64_2.exe");
  79. tgt_ensemble.push_back("pe-64.exe");
  80. std::string src_bytes = FilesContents(src_ensemble);
  81. std::string tgt_bytes = FilesContents(tgt_ensemble);
  82. src_bytes = "aaabbbccc" + src_bytes + "dddeeefff";
  83. tgt_bytes = "aaagggccc" + tgt_bytes + "dddeeefff";
  84. TestEnsemble(src_bytes, tgt_bytes);
  85. }
  86. TEST_F(EnsembleTest, MAYBE_PE) {
  87. PeEnsemble();
  88. }
  89. TEST_F(EnsembleTest, MAYBE_PE64) {
  90. Pe64Ensemble();
  91. }
  92. TEST_F(EnsembleTest, MAYBE_Elf32) {
  93. Elf32Ensemble();
  94. }