summaryrefslogtreecommitdiffstats
path: root/chrome/browser/component_updater/cld_component_installer_unittest.cc
blob: 97ceb443741306cbba1e97dffbe99fd8e0f9fdb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/component_updater/cld_component_installer.h"

#include <stddef.h>
#include <stdint.h>
#include <utility>
#include <vector>

#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "base/version.h"
#include "components/translate/content/browser/browser_cld_data_provider.h"
#include "components/translate/content/common/cld_data_source.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"

using component_updater::CldComponentInstallerTraits;

namespace {

// This has to match what's in cld_component_installer.cc.
const base::FilePath::CharType kTestCldDataFileName[] =
    FILE_PATH_LITERAL("cld2_data.bin");

}  // namespace

namespace component_updater {

class CldComponentInstallerTest : public PlatformTest {
 public:
  CldComponentInstallerTest() {}
  void SetUp() override {
    PlatformTest::SetUp();
    translate::CldDataSource::DisableSanityChecksForTest();

    // ScopedTempDir automatically does a recursive delete on the entire
    // directory in its destructor, so no cleanup is required in TearDown.
    // Note that all files created by this test case are created within the
    // directory that is created here, so even though they are not explicitly
    // created *as temp files*, they will still get cleaned up automagically.
    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());

    // The "latest CLD data file" is a static piece of information, and thus
    // for correctness we empty it before each test.
    CldComponentInstallerTraits::SetLatestCldDataFile(base::FilePath());
    base::FilePath path_now =
        CldComponentInstallerTraits::GetLatestCldDataFile();
    ASSERT_TRUE(path_now.empty());
  }

  void TearDown() override {
    // Restore sanity checks.
    translate::CldDataSource::EnableSanityChecksForTest();
  }

 protected:
  base::ScopedTempDir temp_dir_;
  CldComponentInstallerTraits traits_;

 private:
  DISALLOW_COPY_AND_ASSIGN(CldComponentInstallerTest);
};

TEST_F(CldComponentInstallerTest, SetLatestCldDataFile) {
  const base::FilePath expected(FILE_PATH_LITERAL("test/foo.test"));
  CldComponentInstallerTraits::SetLatestCldDataFile(expected);
  base::FilePath result = CldComponentInstallerTraits::GetLatestCldDataFile();
  ASSERT_EQ(expected, result);
}

TEST_F(CldComponentInstallerTest, VerifyInstallation) {
  // All files are created within a ScopedTempDir, which deletes all
  // children when its destructor is called (at the end of each test).
  const base::DictionaryValue manifest;
  ASSERT_FALSE(traits_.VerifyInstallation(manifest, temp_dir_.path()));
  const base::FilePath data_file_dir =
      temp_dir_.path()
          .Append(FILE_PATH_LITERAL("_platform_specific"))
          .Append(FILE_PATH_LITERAL("all"));
  ASSERT_TRUE(base::CreateDirectory(data_file_dir));
  const base::FilePath data_file = data_file_dir.Append(kTestCldDataFileName);
  const std::string test_data("fake cld2 data file content here :)");
  ASSERT_EQ(static_cast<int32_t>(test_data.length()),
            base::WriteFile(data_file, test_data.c_str(), test_data.length()));
  ASSERT_TRUE(traits_.VerifyInstallation(manifest, temp_dir_.path()));
}

TEST_F(CldComponentInstallerTest, OnCustomInstall) {
  const base::DictionaryValue manifest;
  const base::FilePath install_dir;
  // Sanity: shouldn't crash.
  ASSERT_TRUE(traits_.OnCustomInstall(manifest, install_dir));
}

TEST_F(CldComponentInstallerTest, GetInstalledPath) {
  const base::FilePath base_dir;
  const base::FilePath result =
      CldComponentInstallerTraits::GetInstalledPath(base_dir);
  ASSERT_TRUE(base::EndsWith(result.value(), kTestCldDataFileName,
                             base::CompareCase::SENSITIVE));
}

TEST_F(CldComponentInstallerTest, GetBaseDirectory) {
  const base::FilePath result = traits_.GetBaseDirectory();
  ASSERT_FALSE(result.empty());
}

TEST_F(CldComponentInstallerTest, GetHash) {
  std::vector<uint8_t> hash;
  traits_.GetHash(&hash);
  ASSERT_EQ(static_cast<size_t>(32), hash.size());
}

TEST_F(CldComponentInstallerTest, GetName) {
  ASSERT_FALSE(traits_.GetName().empty());
}

TEST_F(CldComponentInstallerTest, ComponentReady) {
  scoped_ptr<base::DictionaryValue> manifest;
  const base::FilePath install_dir(FILE_PATH_LITERAL("/foo"));
  const base::Version version("1.2.3.4");
  traits_.ComponentReady(version, install_dir, std::move(manifest));
  base::FilePath result = CldComponentInstallerTraits::GetLatestCldDataFile();
  ASSERT_TRUE(base::StartsWith(result.AsUTF16Unsafe(),
                               install_dir.AsUTF16Unsafe(),
                               base::CompareCase::SENSITIVE));
  ASSERT_TRUE(base::EndsWith(result.value(), kTestCldDataFileName,
                             base::CompareCase::SENSITIVE));
}

}  // namespace component_updater