duplicate_tree_detector_unittest.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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 5#include <windows.h> 6 7#include <fstream> 8 9#include "base/file_util.h" 10#include "base/files/scoped_temp_dir.h" 11#include "base/strings/string16.h" 12#include "base/strings/string_util.h" 13#include "chrome/installer/util/duplicate_tree_detector.h" 14#include "chrome/installer/util/installer_util_test_common.h" 15#include "testing/gtest/include/gtest/gtest.h" 16 17namespace { 18 19class DuplicateTreeDetectorTest : public testing::Test { 20 protected: 21 virtual void SetUp() { 22 ASSERT_TRUE(temp_source_dir_.CreateUniqueTempDir()); 23 ASSERT_TRUE(temp_dest_dir_.CreateUniqueTempDir()); 24 } 25 26 // Simple function to dump some text into a new file. 27 void CreateTextFile(const std::string& filename, 28 const string16& contents) { 29 std::wofstream file; 30 file.open(filename.c_str()); 31 ASSERT_TRUE(file.is_open()); 32 file << contents; 33 file.close(); 34 } 35 36 // Creates a two level deep source dir with a file in each in |first_root| and 37 // copy it (files properties will be identical) in |second_root|. 38 void CreateTwoIdenticalHierarchies(const base::FilePath& first_root, 39 const base::FilePath& second_root) { 40 base::FilePath d1(first_root); 41 d1 = d1.AppendASCII("D1"); 42 file_util::CreateDirectory(d1); 43 ASSERT_TRUE(base::PathExists(d1)); 44 45 base::FilePath f1(d1); 46 f1 = f1.AppendASCII("F1"); 47 CreateTextFile(f1.MaybeAsASCII(), text_content_1_); 48 ASSERT_TRUE(base::PathExists(f1)); 49 50 base::FilePath d2(d1); 51 d2 = d2.AppendASCII("D2"); 52 file_util::CreateDirectory(d2); 53 ASSERT_TRUE(base::PathExists(d2)); 54 55 base::FilePath f2(d2); 56 f2 = f2.AppendASCII("F2"); 57 CreateTextFile(f2.MaybeAsASCII(), text_content_2_); 58 ASSERT_TRUE(base::PathExists(f2)); 59 60 ASSERT_TRUE(installer::test::CopyFileHierarchy(d1, second_root)); 61 } 62 63 base::ScopedTempDir temp_source_dir_; 64 base::ScopedTempDir temp_dest_dir_; 65 66 static const wchar_t text_content_1_[]; 67 static const wchar_t text_content_2_[]; 68 static const wchar_t text_content_3_[]; 69}; 70 71const wchar_t DuplicateTreeDetectorTest::text_content_1_[] = 72 L"Gooooooooooooooooooooogle"; 73const wchar_t DuplicateTreeDetectorTest::text_content_2_[] = 74 L"Overwrite Me"; 75const wchar_t DuplicateTreeDetectorTest::text_content_3_[] = 76 L"I'd rather see your watermelon and raise you ham and a half."; 77 78}; // namespace 79 80// Test the DuplicateTreeChecker's definition of identity on two identical 81// directory structures. 82TEST_F(DuplicateTreeDetectorTest, TestIdenticalDirs) { 83 CreateTwoIdenticalHierarchies(temp_source_dir_.path(), temp_dest_dir_.path()); 84 85 EXPECT_TRUE(installer::IsIdenticalFileHierarchy(temp_source_dir_.path(), 86 temp_dest_dir_.path())); 87} 88 89// Test when source entirely contains dest but contains other files as well. 90// IsIdenticalTo should return false in this case. 91TEST_F(DuplicateTreeDetectorTest, TestSourceContainsDest) { 92 CreateTwoIdenticalHierarchies(temp_source_dir_.path(), temp_dest_dir_.path()); 93 94 base::FilePath new_file(temp_source_dir_.path()); 95 new_file = new_file.AppendASCII("FNew"); 96 CreateTextFile(new_file.MaybeAsASCII(), text_content_1_); 97 ASSERT_TRUE(base::PathExists(new_file)); 98 99 EXPECT_FALSE(installer::IsIdenticalFileHierarchy(temp_source_dir_.path(), 100 temp_dest_dir_.path())); 101} 102 103// Test when dest entirely contains source but contains other files as well. 104// IsIdenticalTo should return true in this case. 105TEST_F(DuplicateTreeDetectorTest, TestDestContainsSource) { 106 CreateTwoIdenticalHierarchies(temp_source_dir_.path(), temp_dest_dir_.path()); 107 108 base::FilePath new_file(temp_dest_dir_.path()); 109 new_file = new_file.AppendASCII("FNew"); 110 CreateTextFile(new_file.MaybeAsASCII(), text_content_1_); 111 ASSERT_TRUE(base::PathExists(new_file)); 112 113 EXPECT_TRUE(installer::IsIdenticalFileHierarchy(temp_source_dir_.path(), 114 temp_dest_dir_.path())); 115} 116 117// Test when the file hierarchies are the same but one of the files is changed. 118TEST_F(DuplicateTreeDetectorTest, TestIdenticalDirsDifferentFiles) { 119 CreateTwoIdenticalHierarchies(temp_source_dir_.path(), temp_dest_dir_.path()); 120 121 base::FilePath existing_file(temp_dest_dir_.path()); 122 existing_file = existing_file.AppendASCII("D1") 123 .AppendASCII("D2") 124 .AppendASCII("F2"); 125 CreateTextFile(existing_file.MaybeAsASCII(), text_content_3_); 126 127 EXPECT_FALSE(installer::IsIdenticalFileHierarchy(temp_source_dir_.path(), 128 temp_dest_dir_.path())); 129} 130 131// Test when both file hierarchies are empty. 132TEST_F(DuplicateTreeDetectorTest, TestEmptyDirs) { 133 EXPECT_TRUE(installer::IsIdenticalFileHierarchy(temp_source_dir_.path(), 134 temp_dest_dir_.path())); 135} 136 137// Test on single files. 138TEST_F(DuplicateTreeDetectorTest, TestSingleFiles) { 139 // Create a source file. 140 base::FilePath source_file(temp_source_dir_.path()); 141 source_file = source_file.AppendASCII("F1"); 142 CreateTextFile(source_file.MaybeAsASCII(), text_content_1_); 143 144 // This file should be the same. 145 base::FilePath dest_file(temp_dest_dir_.path()); 146 dest_file = dest_file.AppendASCII("F1"); 147 ASSERT_TRUE(installer::test::CopyFileHierarchy(source_file, dest_file)); 148 149 // This file should be different. 150 base::FilePath other_file(temp_dest_dir_.path()); 151 other_file = other_file.AppendASCII("F2"); 152 CreateTextFile(other_file.MaybeAsASCII(), text_content_2_); 153 154 EXPECT_TRUE(installer::IsIdenticalFileHierarchy(source_file, dest_file)); 155 EXPECT_FALSE(installer::IsIdenticalFileHierarchy(source_file, other_file)); 156} 157