15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "courgette/base_test_unittest.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "courgette/courgette.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "courgette/streams.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VersioningTest : public BaseTest {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestApplyingOldPatch(const char* src_file,
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const char* patch_file,
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const char* expected_file) const;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VersioningTest::TestApplyingOldPatch(const char* src_file,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const char* patch_file,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const char* expected_file) const {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string old_buffer = FileContents(src_file);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string new_buffer = FileContents(patch_file);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string expected_buffer = FileContents(expected_file);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  courgette::SourceStream old_stream;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  courgette::SourceStream patch_stream;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  old_stream.Init(old_buffer);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  patch_stream.Init(new_buffer);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  courgette::SinkStream generated_stream;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  courgette::Status status =
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      courgette::ApplyEnsemblePatch(&old_stream,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &patch_stream,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &generated_stream);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(status, courgette::C_OK);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t expected_length = expected_buffer.size();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t generated_length = generated_stream.Length();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(generated_length, expected_length);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(generated_stream.Buffer(),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      expected_buffer.c_str(),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      expected_length));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(VersioningTest, All) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestApplyingOldPatch("setup1.exe", "setup1-setup2.v1.patch", "setup2.exe");
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  TestApplyingOldPatch("chrome64_1.exe", "chrome64-1-2.v1.patch",
5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                       "chrome64_2.exe");
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We also need a way to test that newly generated patches are appropriately
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // applicable by older clients... not sure of the best way to do that.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59