common_service_unittest.cc revision b3fa53bf760bd0a6fd1ef9df28cb425586d733f6
1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2014 The Android Open Source Project
3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License");
5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License.
6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at
7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//      http://www.apache.org/licenses/LICENSE-2.0
9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software
11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS,
12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and
14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License.
15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
16b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
17a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin#include "update_engine/common_service.h"
18b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
19b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo#include <gtest/gtest.h>
20b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo#include <string>
21b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
223f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/errors/error.h>
23b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo#include <policy/libpolicy.h>
24b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo#include <policy/mock_device_policy.h>
25b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
26b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo#include "update_engine/common/fake_prefs.h"
27b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo#include "update_engine/fake_system_state.h"
28b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo#include "update_engine/omaha_utils.h"
29b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
30b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymousing std::string;
31b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymousing testing::Return;
32b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymousing testing::SetArgumentPointee;
33b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymousing testing::_;
34b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
35b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymonamespace chromeos_update_engine {
36b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
37b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymoclass UpdateEngineServiceTest : public ::testing::Test {
38b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo protected:
39b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  UpdateEngineServiceTest()
40b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo      : mock_update_attempter_(fake_system_state_.mock_update_attempter()),
41a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin        common_service_(&fake_system_state_) {}
42b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
43b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  void SetUp() override {
44b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo    fake_system_state_.set_device_policy(nullptr);
45b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  }
46b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
47b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  // Fake/mock infrastructure.
48b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  FakeSystemState fake_system_state_;
49b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  policy::MockDevicePolicy mock_device_policy_;
50b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
51b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  // Shortcut for fake_system_state_.mock_update_attempter().
52b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  MockUpdateAttempter* mock_update_attempter_;
53b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
543f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::ErrorPtr error_;
55a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  UpdateEngineService common_service_;
56b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo};
57b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
58b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, AttemptUpdate) {
59b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(*mock_update_attempter_, CheckForUpdate(
60b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo      "app_ver", "url", false /* interactive */));
61b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  // The update is non-interactive when we pass the non-interactive flag.
62a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(common_service_.AttemptUpdate(
63d6deb1d0357f47d5525bfaeffa6c201b19abd3e7Alex Deymo      &error_, "app_ver", "url",
64a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin      UpdateEngineService::kAttemptUpdateFlagNonInteractive));
65b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_EQ(nullptr, error_);
66b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}
67b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
68b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// SetChannel is allowed when there's no device policy (the device is not
69b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// enterprise enrolled).
70b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, SetChannelWithNoPolicy) {
71b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(*mock_update_attempter_, RefreshDevicePolicy());
72b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  // If SetTargetChannel is called it means the policy check passed.
73b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(*fake_system_state_.mock_request_params(),
74d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo              SetTargetChannel("stable-channel", true, _))
75b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo      .WillOnce(Return(true));
76a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(common_service_.SetChannel(&error_, "stable-channel", true));
77b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  ASSERT_EQ(nullptr, error_);
78b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}
79b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
80b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// When the policy is present, the delegated value should be checked.
81b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, SetChannelWithDelegatedPolicy) {
82b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  policy::MockDevicePolicy mock_device_policy;
83b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  fake_system_state_.set_device_policy(&mock_device_policy);
84b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(mock_device_policy, GetReleaseChannelDelegated(_))
85b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo      .WillOnce(DoAll(SetArgumentPointee<0>(true), Return(true)));
86b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(*fake_system_state_.mock_request_params(),
87d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo              SetTargetChannel("beta-channel", true, _))
88b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo      .WillOnce(Return(true));
89b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
90a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(common_service_.SetChannel(&error_, "beta-channel", true));
91b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  ASSERT_EQ(nullptr, error_);
92b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}
93b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
94b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// When passing an invalid value (SetTargetChannel fails) an error should be
95b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// raised.
96b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, SetChannelWithInvalidChannel) {
97b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(*mock_update_attempter_, RefreshDevicePolicy());
98b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(*fake_system_state_.mock_request_params(),
99d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo              SetTargetChannel("foo-channel", true, _)).WillOnce(Return(false));
100b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
101a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_FALSE(common_service_.SetChannel(&error_, "foo-channel", true));
102b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  ASSERT_NE(nullptr, error_);
103a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(error_->HasError(UpdateEngineService::kErrorDomain,
104a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin                               UpdateEngineService::kErrorFailed));
105b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}
106b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
107b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, GetChannel) {
108b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  fake_system_state_.mock_request_params()->set_current_channel("current");
109b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  fake_system_state_.mock_request_params()->set_target_channel("target");
110b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  string channel;
111a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(common_service_.GetChannel(
112b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo      &error_, true /* get_current_channel */, &channel));
113b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_EQ(nullptr, error_);
114b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_EQ("current", channel);
115b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
116a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(common_service_.GetChannel(
117b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo      &error_, false /* get_current_channel */, &channel));
118b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_EQ(nullptr, error_);
119b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_EQ("target", channel);
120b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}
121b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
122b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, ResetStatusSucceeds) {
123b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(*mock_update_attempter_, ResetStatus()).WillOnce(Return(true));
124a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(common_service_.ResetStatus(&error_));
125b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_EQ(nullptr, error_);
126b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}
127b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
128b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, ResetStatusFails) {
129b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(*mock_update_attempter_, ResetStatus()).WillOnce(Return(false));
130a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_FALSE(common_service_.ResetStatus(&error_));
131b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  ASSERT_NE(nullptr, error_);
132a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(error_->HasError(UpdateEngineService::kErrorDomain,
133a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin                               UpdateEngineService::kErrorFailed));
134b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}
135b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
136b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex DeymoTEST_F(UpdateEngineServiceTest, GetEolStatusTest) {
137b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  FakePrefs fake_prefs;
138b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  fake_system_state_.set_prefs(&fake_prefs);
139b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  // The default value should be "supported".
140b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  int32_t eol_status = static_cast<int32_t>(EolStatus::kEol);
141b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  EXPECT_TRUE(common_service_.GetEolStatus(&error_, &eol_status));
142b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  EXPECT_EQ(nullptr, error_);
143b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  EXPECT_EQ(EolStatus::kSupported, static_cast<EolStatus>(eol_status));
144b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo
145b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  fake_prefs.SetString(kPrefsOmahaEolStatus, "security-only");
146b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  EXPECT_TRUE(common_service_.GetEolStatus(&error_, &eol_status));
147b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  EXPECT_EQ(nullptr, error_);
148b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  EXPECT_EQ(EolStatus::kSecurityOnly, static_cast<EolStatus>(eol_status));
149b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo}
150b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo
151b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}  // namespace chromeos_update_engine
152