blob: 064464325577f09adb20847e650d36ec2c83ac87 [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2014 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
Alex Deymob7ca0962014-10-01 17:58:07 -070016
Amin Hassaniec7bc112020-10-29 16:47:58 -070017#include "update_engine/cros/common_service.h"
Alex Deymob7ca0962014-10-01 17:58:07 -070018
19#include <gtest/gtest.h>
20#include <string>
Xiaochu Liu88d90382018-08-29 16:09:11 -070021#include <vector>
Alex Deymob7ca0962014-10-01 17:58:07 -070022
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070023#include <brillo/errors/error.h>
Alex Deymob7ca0962014-10-01 17:58:07 -070024#include <policy/libpolicy.h>
25#include <policy/mock_device_policy.h>
26
Amin Hassaniec7bc112020-10-29 16:47:58 -070027#include "update_engine/cros/fake_system_state.h"
28#include "update_engine/cros/omaha_utils.h"
Alex Deymob7ca0962014-10-01 17:58:07 -070029
30using std::string;
Xiaochu Liu88d90382018-08-29 16:09:11 -070031using std::vector;
Aaron Woodbf5a2522017-10-04 10:58:36 -070032using testing::_;
Alex Deymob7ca0962014-10-01 17:58:07 -070033using testing::Return;
Ben Chan672c1f52017-10-23 15:41:39 -070034using testing::SetArgPointee;
Aaron Woodbf5a2522017-10-04 10:58:36 -070035using update_engine::UpdateAttemptFlags;
Alex Deymob7ca0962014-10-01 17:58:07 -070036
37namespace chromeos_update_engine {
38
39class UpdateEngineServiceTest : public ::testing::Test {
40 protected:
Amin Hassani538bd592020-11-04 20:46:08 -080041 UpdateEngineServiceTest() = default;
Alex Deymob7ca0962014-10-01 17:58:07 -070042
Amin Hassani538bd592020-11-04 20:46:08 -080043 void SetUp() override {
44 FakeSystemState::CreateInstance();
45 FakeSystemState::Get()->set_device_policy(nullptr);
46 mock_update_attempter_ = FakeSystemState::Get()->mock_update_attempter();
47 }
Alex Deymob7ca0962014-10-01 17:58:07 -070048
Alex Deymob7ca0962014-10-01 17:58:07 -070049 MockUpdateAttempter* mock_update_attempter_;
50
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070051 brillo::ErrorPtr error_;
Casey Dahlina93cd532016-01-14 16:55:11 -080052 UpdateEngineService common_service_;
Alex Deymob7ca0962014-10-01 17:58:07 -070053};
54
55TEST_F(UpdateEngineServiceTest, AttemptUpdate) {
Aaron Wood081c0232017-10-19 17:14:58 -070056 EXPECT_CALL(
57 *mock_update_attempter_,
58 CheckForUpdate("app_ver", "url", UpdateAttemptFlags::kFlagNonInteractive))
59 .WillOnce(Return(true));
60
61 // The non-interactive flag needs to be passed through to CheckForUpdate.
62 bool result = false;
63 EXPECT_TRUE(
64 common_service_.AttemptUpdate(&error_,
65 "app_ver",
66 "url",
67 UpdateAttemptFlags::kFlagNonInteractive,
68 &result));
Alex Deymob7ca0962014-10-01 17:58:07 -070069 EXPECT_EQ(nullptr, error_);
Aaron Wood081c0232017-10-19 17:14:58 -070070 EXPECT_TRUE(result);
71}
72
73TEST_F(UpdateEngineServiceTest, AttemptUpdateReturnsFalse) {
74 EXPECT_CALL(*mock_update_attempter_,
75 CheckForUpdate("app_ver", "url", UpdateAttemptFlags::kNone))
76 .WillOnce(Return(false));
77 bool result = true;
78 EXPECT_TRUE(common_service_.AttemptUpdate(
79 &error_, "app_ver", "url", UpdateAttemptFlags::kNone, &result));
80 EXPECT_EQ(nullptr, error_);
81 EXPECT_FALSE(result);
Alex Deymob7ca0962014-10-01 17:58:07 -070082}
83
Xiaochu Liu88d90382018-08-29 16:09:11 -070084TEST_F(UpdateEngineServiceTest, AttemptInstall) {
85 EXPECT_CALL(*mock_update_attempter_, CheckForInstall(_, _))
86 .WillOnce(Return(true));
87
88 EXPECT_TRUE(common_service_.AttemptInstall(&error_, "", {}));
89 EXPECT_EQ(nullptr, error_);
90}
91
92TEST_F(UpdateEngineServiceTest, AttemptInstallReturnsFalse) {
93 EXPECT_CALL(*mock_update_attempter_, CheckForInstall(_, _))
94 .WillOnce(Return(false));
95
96 EXPECT_FALSE(common_service_.AttemptInstall(&error_, "", {}));
97}
98
Andrewa8d7df32020-03-15 20:10:01 -070099TEST_F(UpdateEngineServiceTest, SetDlcActiveValue) {
100 EXPECT_CALL(*mock_update_attempter_, SetDlcActiveValue(_, _))
101 .WillOnce(Return(true));
102
103 EXPECT_TRUE(common_service_.SetDlcActiveValue(&error_, true, "dlc0"));
104}
105
106TEST_F(UpdateEngineServiceTest, SetDlcActiveValueReturnsFalse) {
107 EXPECT_CALL(*mock_update_attempter_, SetDlcActiveValue(_, _))
108 .WillOnce(Return(false));
109
110 EXPECT_FALSE(common_service_.SetDlcActiveValue(&error_, true, "dlc0"));
111}
112
Alex Deymob7ca0962014-10-01 17:58:07 -0700113// SetChannel is allowed when there's no device policy (the device is not
114// enterprise enrolled).
115TEST_F(UpdateEngineServiceTest, SetChannelWithNoPolicy) {
116 EXPECT_CALL(*mock_update_attempter_, RefreshDevicePolicy());
117 // If SetTargetChannel is called it means the policy check passed.
Amin Hassani538bd592020-11-04 20:46:08 -0800118 EXPECT_CALL(*FakeSystemState::Get()->mock_request_params(),
Alex Deymod942f9d2015-11-06 16:11:50 -0800119 SetTargetChannel("stable-channel", true, _))
Alex Deymob7ca0962014-10-01 17:58:07 -0700120 .WillOnce(Return(true));
Casey Dahlina93cd532016-01-14 16:55:11 -0800121 EXPECT_TRUE(common_service_.SetChannel(&error_, "stable-channel", true));
Alex Deymob7ca0962014-10-01 17:58:07 -0700122 ASSERT_EQ(nullptr, error_);
123}
124
125// When the policy is present, the delegated value should be checked.
126TEST_F(UpdateEngineServiceTest, SetChannelWithDelegatedPolicy) {
127 policy::MockDevicePolicy mock_device_policy;
Amin Hassani538bd592020-11-04 20:46:08 -0800128 FakeSystemState::Get()->set_device_policy(&mock_device_policy);
Alex Deymob7ca0962014-10-01 17:58:07 -0700129 EXPECT_CALL(mock_device_policy, GetReleaseChannelDelegated(_))
Ben Chan672c1f52017-10-23 15:41:39 -0700130 .WillOnce(DoAll(SetArgPointee<0>(true), Return(true)));
Amin Hassani538bd592020-11-04 20:46:08 -0800131 EXPECT_CALL(*FakeSystemState::Get()->mock_request_params(),
Alex Deymod942f9d2015-11-06 16:11:50 -0800132 SetTargetChannel("beta-channel", true, _))
Alex Deymob7ca0962014-10-01 17:58:07 -0700133 .WillOnce(Return(true));
134
Casey Dahlina93cd532016-01-14 16:55:11 -0800135 EXPECT_TRUE(common_service_.SetChannel(&error_, "beta-channel", true));
Alex Deymob7ca0962014-10-01 17:58:07 -0700136 ASSERT_EQ(nullptr, error_);
137}
138
139// When passing an invalid value (SetTargetChannel fails) an error should be
140// raised.
141TEST_F(UpdateEngineServiceTest, SetChannelWithInvalidChannel) {
142 EXPECT_CALL(*mock_update_attempter_, RefreshDevicePolicy());
Amin Hassani538bd592020-11-04 20:46:08 -0800143 EXPECT_CALL(*FakeSystemState::Get()->mock_request_params(),
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800144 SetTargetChannel("foo-channel", true, _))
145 .WillOnce(Return(false));
Alex Deymob7ca0962014-10-01 17:58:07 -0700146
Casey Dahlina93cd532016-01-14 16:55:11 -0800147 EXPECT_FALSE(common_service_.SetChannel(&error_, "foo-channel", true));
Alex Deymob7ca0962014-10-01 17:58:07 -0700148 ASSERT_NE(nullptr, error_);
Casey Dahlina93cd532016-01-14 16:55:11 -0800149 EXPECT_TRUE(error_->HasError(UpdateEngineService::kErrorDomain,
150 UpdateEngineService::kErrorFailed));
Alex Deymob7ca0962014-10-01 17:58:07 -0700151}
152
153TEST_F(UpdateEngineServiceTest, GetChannel) {
Amin Hassani538bd592020-11-04 20:46:08 -0800154 FakeSystemState::Get()->mock_request_params()->set_current_channel("current");
155 FakeSystemState::Get()->mock_request_params()->set_target_channel("target");
Alex Deymob7ca0962014-10-01 17:58:07 -0700156 string channel;
Casey Dahlina93cd532016-01-14 16:55:11 -0800157 EXPECT_TRUE(common_service_.GetChannel(
Alex Deymob7ca0962014-10-01 17:58:07 -0700158 &error_, true /* get_current_channel */, &channel));
159 EXPECT_EQ(nullptr, error_);
160 EXPECT_EQ("current", channel);
161
Casey Dahlina93cd532016-01-14 16:55:11 -0800162 EXPECT_TRUE(common_service_.GetChannel(
Alex Deymob7ca0962014-10-01 17:58:07 -0700163 &error_, false /* get_current_channel */, &channel));
164 EXPECT_EQ(nullptr, error_);
165 EXPECT_EQ("target", channel);
166}
167
168TEST_F(UpdateEngineServiceTest, ResetStatusSucceeds) {
169 EXPECT_CALL(*mock_update_attempter_, ResetStatus()).WillOnce(Return(true));
Casey Dahlina93cd532016-01-14 16:55:11 -0800170 EXPECT_TRUE(common_service_.ResetStatus(&error_));
Alex Deymob7ca0962014-10-01 17:58:07 -0700171 EXPECT_EQ(nullptr, error_);
172}
173
174TEST_F(UpdateEngineServiceTest, ResetStatusFails) {
175 EXPECT_CALL(*mock_update_attempter_, ResetStatus()).WillOnce(Return(false));
Casey Dahlina93cd532016-01-14 16:55:11 -0800176 EXPECT_FALSE(common_service_.ResetStatus(&error_));
Alex Deymob7ca0962014-10-01 17:58:07 -0700177 ASSERT_NE(nullptr, error_);
Casey Dahlina93cd532016-01-14 16:55:11 -0800178 EXPECT_TRUE(error_->HasError(UpdateEngineService::kErrorDomain,
179 UpdateEngineService::kErrorFailed));
Alex Deymob7ca0962014-10-01 17:58:07 -0700180}
181
Alex Deymob7ca0962014-10-01 17:58:07 -0700182} // namespace chromeos_update_engine