1// Copyright 2014 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 "component_cld_data_harness.h" 6 7#include "base/base_paths.h" 8#include "base/files/file_util.h" 9#include "base/logging.h" 10#include "base/path_service.h" 11#include "chrome/browser/component_updater/cld_component_installer.h" 12#include "chrome/common/chrome_paths.h" 13#include "testing/gtest/include/gtest/gtest.h" 14 15namespace { 16 17// This has to match what's in cld_component_installer.cc. 18const base::FilePath::CharType kComponentDataFileName[] = 19 FILE_PATH_LITERAL("cld2_data.bin"); 20 21} // namespace 22 23namespace test { 24 25ComponentCldDataHarness::ComponentCldDataHarness() { 26 // Constructor does nothing in all cases. See Init() for initialization. 27} 28 29ComponentCldDataHarness::~ComponentCldDataHarness() { 30 VLOG(1) << "Tearing down CLD data harness"; 31 // Dynamic data mode is enabled and we are using the component updater. 32 component_updater::CldComponentInstallerTraits::SetLatestCldDataFile( 33 base::FilePath()); 34 ClearComponentDataFileState(); 35 DeleteComponentTree(); 36} 37 38void ComponentCldDataHarness::Init() { 39 VLOG(1) << "Initializing CLD data harness"; 40 // Dynamic data mode is enabled and we are using the component updater. 41 ASSERT_NO_FATAL_FAILURE(CopyComponentTree()); 42 base::FilePath data_file; 43 GetComponentDataFileDestination(&data_file); 44 component_updater::CldComponentInstallerTraits::SetLatestCldDataFile( 45 data_file); 46} 47 48void ComponentCldDataHarness::ClearComponentDataFileState() { 49 VLOG(1) << "Clearing component CLD data file state"; 50 base::FilePath nothing; 51 component_updater::CldComponentInstallerTraits::SetLatestCldDataFile(nothing); 52} 53 54// DIR_COMPONENT_CLD2 is also defined as being relative to USER_DATA_DIR, so 55// like GetStandaloneDataFileDestination, this is safe to run in multiple 56// parallel test processes. 57void ComponentCldDataHarness::GetExtractedComponentDestination( 58 base::FilePath* out_path) { 59 ASSERT_TRUE(PathService::Get(chrome::DIR_COMPONENT_CLD2, out_path)); 60} 61 62void ComponentCldDataHarness::GetComponentDataFileDestination( 63 base::FilePath* out_path) { 64 GetExtractedComponentDestination(out_path); 65 *out_path = out_path->Append(CldDataHarness::GetTestDataSourceCrxVersion()) 66 .Append(FILE_PATH_LITERAL("_platform_specific")) 67 .Append(FILE_PATH_LITERAL("all")) 68 .Append(kComponentDataFileName); 69} 70 71void ComponentCldDataHarness::DeleteComponentTree() { 72 base::FilePath tree_path; 73 ASSERT_NO_FATAL_FAILURE(GetExtractedComponentDestination(&tree_path)); 74 VLOG(1) << "Deleting CLD component test files from " << tree_path.value(); 75 base::DeleteFile(tree_path, true); 76} 77 78void ComponentCldDataHarness::CopyComponentTree() { 79 DeleteComponentTree(); // sanity: blow away any old copies. 80 base::FilePath target_dir; 81 GetExtractedComponentDestination(&target_dir); 82 base::FilePath source_dir; 83 CldDataHarness::GetTestDataSourceDirectory(&source_dir); 84 VLOG(1) << "Copying CLD component test files from " << source_dir.value() 85 << " to " << target_dir.value(); 86 ASSERT_TRUE(base::CreateDirectoryAndGetError(target_dir, NULL)); 87 ASSERT_TRUE(base::CopyDirectory(source_dir, target_dir, true)); 88 ASSERT_TRUE(base::PathExists(target_dir)); 89 base::FilePath check_path; 90 GetComponentDataFileDestination(&check_path); 91 ASSERT_TRUE(base::PathExists(check_path)); 92} 93 94scoped_ptr<CldDataHarness> CreateCldDataHarness() { 95 scoped_ptr<CldDataHarness> result(new ComponentCldDataHarness()); 96 return result.Pass(); 97} 98 99} // namespace test 100