1b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang//
2b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang// Copyright (C) 2017 The Android Open Source Project
3b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang//
4b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang// Licensed under the Apache License, Version 2.0 (the "License");
5b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang// you may not use this file except in compliance with the License.
6b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang// You may obtain a copy of the License at
7b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang//
8b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang//      http://www.apache.org/licenses/LICENSE-2.0
9b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang//
10b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang// Unless required by applicable law or agreed to in writing, software
11b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang// distributed under the License is distributed on an "AS IS" BASIS,
12b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang// See the License for the specific language governing permissions and
14b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang// limitations under the License.
15b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang//
16b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang
17b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang#include "update_engine/image_properties.h"
18b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang
19b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang#include <string>
20b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang
21b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang#include <base/files/file_util.h>
22b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang#include <base/files/scoped_temp_dir.h>
23b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang#include <gtest/gtest.h>
24b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang
25b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang#include "update_engine/common/constants.h"
26740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang#include "update_engine/common/fake_prefs.h"
27b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang#include "update_engine/common/test_utils.h"
28b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang#include "update_engine/fake_system_state.h"
29b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang
30b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiangusing chromeos_update_engine::test_utils::WriteFileString;
31b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiangusing std::string;
32b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang
33b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiangnamespace chromeos_update_engine {
34b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang
35b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiangclass ImagePropertiesTest : public ::testing::Test {
36b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang protected:
37b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  void SetUp() override {
38b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang    // Create a uniquely named test directory.
39b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang    ASSERT_TRUE(tempdir_.CreateUniqueTempDir());
4084bc564b5fbe28c9166836a2b6932930e39c58f5Sen Jiang    osrelease_dir_ = tempdir_.GetPath().Append("etc/os-release.d");
41b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang    EXPECT_TRUE(base::CreateDirectory(osrelease_dir_));
4284bc564b5fbe28c9166836a2b6932930e39c58f5Sen Jiang    test::SetImagePropertiesRootPrefix(tempdir_.GetPath().value().c_str());
43b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  }
44b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang
45b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  void WriteOsRelease(const string& key, const string& value) {
46b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang    ASSERT_TRUE(WriteFileString(osrelease_dir_.Append(key).value(), value));
47b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  }
48b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang
49740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  void WriteChannel(const string& channel) {
50740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang    string misc(2080, '\0');
51740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang    misc += channel;
52740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang    misc.resize(4096);
53740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang    ASSERT_TRUE(
54740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang        WriteFileString(tempdir_.GetPath().Append("misc").value(), misc));
55740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  }
56740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang
57b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  FakeSystemState fake_system_state_;
58b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang
59b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  base::ScopedTempDir tempdir_;
60b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  base::FilePath osrelease_dir_;
61b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang};
62b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang
63b56fe9f1071c1506d996f8c8e1da780b607fea78Sen JiangTEST_F(ImagePropertiesTest, SimpleTest) {
64b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  WriteOsRelease("product_id", "abc");
65b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  WriteOsRelease("system_id", "def");
66b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  WriteOsRelease("product_version", "1.2.3.4");
67b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  WriteOsRelease("system_version", "5.6.7.8");
68b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  ImageProperties props = LoadImageProperties(&fake_system_state_);
69b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  EXPECT_EQ("abc", props.product_id);
70b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  EXPECT_EQ("def", props.system_id);
71b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  EXPECT_EQ("1.2.3.4", props.version);
72b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  EXPECT_EQ("5.6.7.8", props.system_version);
73b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  EXPECT_EQ("stable-channel", props.current_channel);
74b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  EXPECT_EQ(constants::kOmahaDefaultProductionURL, props.omaha_url);
75b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang}
76b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang
77b56fe9f1071c1506d996f8c8e1da780b607fea78Sen JiangTEST_F(ImagePropertiesTest, IDPrefixTest) {
78b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  WriteOsRelease("product_id", "abc:def");
79b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  WriteOsRelease("system_id", "foo:bar");
80b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  ImageProperties props = LoadImageProperties(&fake_system_state_);
81b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  EXPECT_EQ("abc:def", props.product_id);
82b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  EXPECT_EQ("abc:bar", props.system_id);
83b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang}
84b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang
85b56fe9f1071c1506d996f8c8e1da780b607fea78Sen JiangTEST_F(ImagePropertiesTest, IDInvalidPrefixTest) {
86b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  WriteOsRelease("product_id", "def");
87b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  WriteOsRelease("system_id", "foo:bar");
88b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  ImageProperties props = LoadImageProperties(&fake_system_state_);
89b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  EXPECT_EQ("def", props.product_id);
90b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  EXPECT_EQ("foo:bar", props.system_id);
91b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang
92b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  WriteOsRelease("product_id", "abc:def");
93b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  WriteOsRelease("system_id", "bar");
94b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  props = LoadImageProperties(&fake_system_state_);
95b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  EXPECT_EQ("abc:def", props.product_id);
96b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang  EXPECT_EQ("bar", props.system_id);
97b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang}
98b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang
99740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen JiangTEST_F(ImagePropertiesTest, LoadChannelTest) {
100740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  WriteChannel("unittest-channel");
101740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  ImageProperties props = LoadImageProperties(&fake_system_state_);
102740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  EXPECT_EQ("unittest-channel", props.current_channel);
103740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang}
104740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang
105740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen JiangTEST_F(ImagePropertiesTest, DefaultStableChannelTest) {
106740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  WriteChannel("");
107740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  ImageProperties props = LoadImageProperties(&fake_system_state_);
108740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  EXPECT_EQ("stable-channel", props.current_channel);
109740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang}
110740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang
111740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen JiangTEST_F(ImagePropertiesTest, StoreLoadMutableChannelTest) {
112740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  FakePrefs prefs;
113740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  fake_system_state_.set_prefs(&prefs);
114740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  WriteChannel("previous-channel");
115740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  MutableImageProperties props;
116740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  props.target_channel = "new-channel";
117740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  EXPECT_TRUE(StoreMutableImageProperties(&fake_system_state_, props));
118740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  MutableImageProperties loaded_props =
119740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang      LoadMutableImageProperties(&fake_system_state_);
120740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang  EXPECT_EQ(props.target_channel, loaded_props.target_channel);
121740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang}
122740c2fcf62d17c04b7e3f9520a360b789fa0dfccSen Jiang
123b56fe9f1071c1506d996f8c8e1da780b607fea78Sen Jiang}  // namespace chromeos_update_engine
124