common_service_unittest.cc revision 3a9c9623f2ffbe256f2d4d8897939f3d48b3cf52
1//
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//
16
17#include "update_engine/common_service.h"
18
19#include <gtest/gtest.h>
20#include <string>
21
22#include <brillo/errors/error.h>
23#include <policy/libpolicy.h>
24#include <policy/mock_device_policy.h>
25
26#include "update_engine/common/fake_prefs.h"
27#include "update_engine/fake_system_state.h"
28#include "update_engine/omaha_utils.h"
29
30using std::string;
31using testing::_;
32using testing::Return;
33using testing::SetArgumentPointee;
34using update_engine::UpdateAttemptFlags;
35
36namespace chromeos_update_engine {
37
38class UpdateEngineServiceTest : public ::testing::Test {
39 protected:
40  UpdateEngineServiceTest()
41      : mock_update_attempter_(fake_system_state_.mock_update_attempter()),
42        common_service_(&fake_system_state_) {}
43
44  void SetUp() override {
45    fake_system_state_.set_device_policy(nullptr);
46  }
47
48  // Fake/mock infrastructure.
49  FakeSystemState fake_system_state_;
50  policy::MockDevicePolicy mock_device_policy_;
51
52  // Shortcut for fake_system_state_.mock_update_attempter().
53  MockUpdateAttempter* mock_update_attempter_;
54
55  brillo::ErrorPtr error_;
56  UpdateEngineService common_service_;
57};
58
59TEST_F(UpdateEngineServiceTest, AttemptUpdate) {
60  EXPECT_CALL(
61      *mock_update_attempter_,
62      CheckForUpdate("app_ver", "url", UpdateAttemptFlags::kFlagNonInteractive))
63      .WillOnce(Return(true));
64
65  // The non-interactive flag needs to be passed through to CheckForUpdate.
66  bool result = false;
67  EXPECT_TRUE(
68      common_service_.AttemptUpdate(&error_,
69                                    "app_ver",
70                                    "url",
71                                    UpdateAttemptFlags::kFlagNonInteractive,
72                                    &result));
73  EXPECT_EQ(nullptr, error_);
74  EXPECT_TRUE(result);
75}
76
77TEST_F(UpdateEngineServiceTest, AttemptUpdateReturnsFalse) {
78  EXPECT_CALL(*mock_update_attempter_,
79              CheckForUpdate("app_ver", "url", UpdateAttemptFlags::kNone))
80      .WillOnce(Return(false));
81  bool result = true;
82  EXPECT_TRUE(common_service_.AttemptUpdate(
83      &error_, "app_ver", "url", UpdateAttemptFlags::kNone, &result));
84  EXPECT_EQ(nullptr, error_);
85  EXPECT_FALSE(result);
86}
87
88// SetChannel is allowed when there's no device policy (the device is not
89// enterprise enrolled).
90TEST_F(UpdateEngineServiceTest, SetChannelWithNoPolicy) {
91  EXPECT_CALL(*mock_update_attempter_, RefreshDevicePolicy());
92  // If SetTargetChannel is called it means the policy check passed.
93  EXPECT_CALL(*fake_system_state_.mock_request_params(),
94              SetTargetChannel("stable-channel", true, _))
95      .WillOnce(Return(true));
96  EXPECT_TRUE(common_service_.SetChannel(&error_, "stable-channel", true));
97  ASSERT_EQ(nullptr, error_);
98}
99
100// When the policy is present, the delegated value should be checked.
101TEST_F(UpdateEngineServiceTest, SetChannelWithDelegatedPolicy) {
102  policy::MockDevicePolicy mock_device_policy;
103  fake_system_state_.set_device_policy(&mock_device_policy);
104  EXPECT_CALL(mock_device_policy, GetReleaseChannelDelegated(_))
105      .WillOnce(DoAll(SetArgumentPointee<0>(true), Return(true)));
106  EXPECT_CALL(*fake_system_state_.mock_request_params(),
107              SetTargetChannel("beta-channel", true, _))
108      .WillOnce(Return(true));
109
110  EXPECT_TRUE(common_service_.SetChannel(&error_, "beta-channel", true));
111  ASSERT_EQ(nullptr, error_);
112}
113
114// When passing an invalid value (SetTargetChannel fails) an error should be
115// raised.
116TEST_F(UpdateEngineServiceTest, SetChannelWithInvalidChannel) {
117  EXPECT_CALL(*mock_update_attempter_, RefreshDevicePolicy());
118  EXPECT_CALL(*fake_system_state_.mock_request_params(),
119              SetTargetChannel("foo-channel", true, _)).WillOnce(Return(false));
120
121  EXPECT_FALSE(common_service_.SetChannel(&error_, "foo-channel", true));
122  ASSERT_NE(nullptr, error_);
123  EXPECT_TRUE(error_->HasError(UpdateEngineService::kErrorDomain,
124                               UpdateEngineService::kErrorFailed));
125}
126
127TEST_F(UpdateEngineServiceTest, GetChannel) {
128  fake_system_state_.mock_request_params()->set_current_channel("current");
129  fake_system_state_.mock_request_params()->set_target_channel("target");
130  string channel;
131  EXPECT_TRUE(common_service_.GetChannel(
132      &error_, true /* get_current_channel */, &channel));
133  EXPECT_EQ(nullptr, error_);
134  EXPECT_EQ("current", channel);
135
136  EXPECT_TRUE(common_service_.GetChannel(
137      &error_, false /* get_current_channel */, &channel));
138  EXPECT_EQ(nullptr, error_);
139  EXPECT_EQ("target", channel);
140}
141
142TEST_F(UpdateEngineServiceTest, ResetStatusSucceeds) {
143  EXPECT_CALL(*mock_update_attempter_, ResetStatus()).WillOnce(Return(true));
144  EXPECT_TRUE(common_service_.ResetStatus(&error_));
145  EXPECT_EQ(nullptr, error_);
146}
147
148TEST_F(UpdateEngineServiceTest, ResetStatusFails) {
149  EXPECT_CALL(*mock_update_attempter_, ResetStatus()).WillOnce(Return(false));
150  EXPECT_FALSE(common_service_.ResetStatus(&error_));
151  ASSERT_NE(nullptr, error_);
152  EXPECT_TRUE(error_->HasError(UpdateEngineService::kErrorDomain,
153                               UpdateEngineService::kErrorFailed));
154}
155
156TEST_F(UpdateEngineServiceTest, GetEolStatusTest) {
157  FakePrefs fake_prefs;
158  fake_system_state_.set_prefs(&fake_prefs);
159  // The default value should be "supported".
160  int32_t eol_status = static_cast<int32_t>(EolStatus::kEol);
161  EXPECT_TRUE(common_service_.GetEolStatus(&error_, &eol_status));
162  EXPECT_EQ(nullptr, error_);
163  EXPECT_EQ(EolStatus::kSupported, static_cast<EolStatus>(eol_status));
164
165  fake_prefs.SetString(kPrefsOmahaEolStatus, "security-only");
166  EXPECT_TRUE(common_service_.GetEolStatus(&error_, &eol_status));
167  EXPECT_EQ(nullptr, error_);
168  EXPECT_EQ(EolStatus::kSecurityOnly, static_cast<EolStatus>(eol_status));
169}
170
171}  // namespace chromeos_update_engine
172