cld_component_installer_unittest.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <vector>
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/file_util.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/file_path.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/scoped_temp_dir.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/macros.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_util.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/values.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/version.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/component_updater/cld_component_installer.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/translate/content/browser/browser_cld_data_provider.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "testing/platform_test.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using component_updater::CldComponentInstallerTraits;
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This has to match what's in cld_component_installer.cc.
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst base::FilePath::CharType kTestCldDataFileName[] =
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    FILE_PATH_LITERAL("cld2_data.bin");
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace component_updater {
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class CldComponentInstallerTest : public PlatformTest {
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CldComponentInstallerTest() {}
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PlatformTest::SetUp();
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // ScopedTempDir automatically does a recursive delete on the entire
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // directory in its destructor, so no cleanup is required in TearDown.
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Note that all files created by this test case are created within the
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // directory that is created here, so even though they are not explicitly
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // created *as temp files*, they will still get cleaned up automagically.
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // The "latest CLD data file" is a static piece of information, and thus
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // for correctness we empty it before each test.
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    CldComponentInstallerTraits::SetLatestCldDataFile(base::FilePath());
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::FilePath path_now =
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        CldComponentInstallerTraits::GetLatestCldDataFile();
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_TRUE(path_now.empty());
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ScopedTempDir temp_dir_;
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CldComponentInstallerTraits traits_;
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(CldComponentInstallerTest);
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(CldComponentInstallerTest, SetLatestCldDataFile) {
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::FilePath expected(FILE_PATH_LITERAL("test/foo.test"));
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CldComponentInstallerTraits::SetLatestCldDataFile(expected);
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::FilePath result =
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      CldComponentInstallerTraits::GetLatestCldDataFile();
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(expected, result);
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(CldComponentInstallerTest, VerifyInstallation) {
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // All files are created within a ScopedTempDir, which deletes all
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // children when its destructor is called (at the end of each test).
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_FALSE(traits_.VerifyInstallation(temp_dir_.path()));
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::FilePath data_file_dir =
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      temp_dir_.path().Append(FILE_PATH_LITERAL("_platform_specific")).Append(
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          FILE_PATH_LITERAL("all"));
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(data_file_dir));
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const base::FilePath data_file = data_file_dir.Append(kTestCldDataFileName);
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string test_data("fake cld2 data file content here :)");
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(static_cast<int32>(test_data.length()),
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            base::WriteFile(data_file, test_data.c_str(), test_data.length()));
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(traits_.VerifyInstallation(temp_dir_.path()));
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(CldComponentInstallerTest, OnCustomInstall) {
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::DictionaryValue manifest;
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::FilePath install_dir;
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Sanity: shouldn't crash.
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(traits_.OnCustomInstall(manifest, install_dir));
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(CldComponentInstallerTest, GetInstalledPath) {
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::FilePath base_dir;
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::FilePath result =
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CldComponentInstallerTraits::GetInstalledPath(base_dir);
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(EndsWith(result.value(), kTestCldDataFileName, true));
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(CldComponentInstallerTest, GetBaseDirectory) {
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const base::FilePath result = traits_.GetBaseDirectory();
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_FALSE(result.empty());
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(CldComponentInstallerTest, GetHash) {
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<uint8> hash;
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  traits_.GetHash(&hash);
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(32), hash.size());
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(CldComponentInstallerTest, GetName) {
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_FALSE(traits_.GetName().empty());
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(CldComponentInstallerTest, ComponentReady) {
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> manifest;
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::FilePath install_dir(FILE_PATH_LITERAL("/foo"));
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const base::Version version("1.2.3.4");
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  traits_.ComponentReady(version, install_dir, manifest.Pass());
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::FilePath result =
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      CldComponentInstallerTraits::GetLatestCldDataFile();
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(StartsWith(result.AsUTF16Unsafe(),
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         install_dir.AsUTF16Unsafe(),
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         true));
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(EndsWith(result.value(), kTestCldDataFileName, true));
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace component_updater
127