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;
31224dfc23caf524ef5e3661010c694781e2d9d819Aaron Woodusing testing::_;
32b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymousing testing::Return;
33672c1f54a499a825cc0bb9bc4f240bf1887550d9Ben Chanusing testing::SetArgPointee;
34224dfc23caf524ef5e3661010c694781e2d9d819Aaron Woodusing update_engine::UpdateAttemptFlags;
35b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
36b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymonamespace chromeos_update_engine {
37b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
38b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymoclass UpdateEngineServiceTest : public ::testing::Test {
39b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo protected:
40b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  UpdateEngineServiceTest()
41b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo      : mock_update_attempter_(fake_system_state_.mock_update_attempter()),
42a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin        common_service_(&fake_system_state_) {}
43b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
44b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  void SetUp() override {
45b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo    fake_system_state_.set_device_policy(nullptr);
46b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  }
47b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
48b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  // Fake/mock infrastructure.
49b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  FakeSystemState fake_system_state_;
50b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  policy::MockDevicePolicy mock_device_policy_;
51b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
52b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  // Shortcut for fake_system_state_.mock_update_attempter().
53b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  MockUpdateAttempter* mock_update_attempter_;
54b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
553f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::ErrorPtr error_;
56a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  UpdateEngineService common_service_;
57b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo};
58b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
59b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, AttemptUpdate) {
603a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood  EXPECT_CALL(
613a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood      *mock_update_attempter_,
623a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood      CheckForUpdate("app_ver", "url", UpdateAttemptFlags::kFlagNonInteractive))
633a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood      .WillOnce(Return(true));
643a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood
653a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood  // The non-interactive flag needs to be passed through to CheckForUpdate.
663a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood  bool result = false;
673a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood  EXPECT_TRUE(
683a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood      common_service_.AttemptUpdate(&error_,
693a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood                                    "app_ver",
703a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood                                    "url",
713a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood                                    UpdateAttemptFlags::kFlagNonInteractive,
723a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood                                    &result));
733a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood  EXPECT_EQ(nullptr, error_);
743a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood  EXPECT_TRUE(result);
753a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood}
763a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood
773a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron WoodTEST_F(UpdateEngineServiceTest, AttemptUpdateReturnsFalse) {
783a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood  EXPECT_CALL(*mock_update_attempter_,
793a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood              CheckForUpdate("app_ver", "url", UpdateAttemptFlags::kNone))
803a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood      .WillOnce(Return(false));
813a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood  bool result = true;
82a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(common_service_.AttemptUpdate(
833a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood      &error_, "app_ver", "url", UpdateAttemptFlags::kNone, &result));
84b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_EQ(nullptr, error_);
853a9c9623f2ffbe256f2d4d8897939f3d48b3cf52Aaron Wood  EXPECT_FALSE(result);
86b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}
87b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
88b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// SetChannel is allowed when there's no device policy (the device is not
89b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// enterprise enrolled).
90b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, SetChannelWithNoPolicy) {
91b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(*mock_update_attempter_, RefreshDevicePolicy());
92b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  // If SetTargetChannel is called it means the policy check passed.
93b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(*fake_system_state_.mock_request_params(),
94d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo              SetTargetChannel("stable-channel", true, _))
95b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo      .WillOnce(Return(true));
96a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(common_service_.SetChannel(&error_, "stable-channel", true));
97b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  ASSERT_EQ(nullptr, error_);
98b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}
99b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
100b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// When the policy is present, the delegated value should be checked.
101b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, SetChannelWithDelegatedPolicy) {
102b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  policy::MockDevicePolicy mock_device_policy;
103b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  fake_system_state_.set_device_policy(&mock_device_policy);
104b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(mock_device_policy, GetReleaseChannelDelegated(_))
105672c1f54a499a825cc0bb9bc4f240bf1887550d9Ben Chan      .WillOnce(DoAll(SetArgPointee<0>(true), Return(true)));
106b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(*fake_system_state_.mock_request_params(),
107d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo              SetTargetChannel("beta-channel", true, _))
108b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo      .WillOnce(Return(true));
109b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
110a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(common_service_.SetChannel(&error_, "beta-channel", true));
111b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  ASSERT_EQ(nullptr, error_);
112b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}
113b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
114b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// When passing an invalid value (SetTargetChannel fails) an error should be
115b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// raised.
116b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, SetChannelWithInvalidChannel) {
117b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(*mock_update_attempter_, RefreshDevicePolicy());
118b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(*fake_system_state_.mock_request_params(),
119d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo              SetTargetChannel("foo-channel", true, _)).WillOnce(Return(false));
120b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
121a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_FALSE(common_service_.SetChannel(&error_, "foo-channel", true));
122b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  ASSERT_NE(nullptr, error_);
123a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(error_->HasError(UpdateEngineService::kErrorDomain,
124a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin                               UpdateEngineService::kErrorFailed));
125b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}
126b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
127b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, GetChannel) {
128b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  fake_system_state_.mock_request_params()->set_current_channel("current");
129b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  fake_system_state_.mock_request_params()->set_target_channel("target");
130b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  string channel;
131a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(common_service_.GetChannel(
132b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo      &error_, true /* get_current_channel */, &channel));
133b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_EQ(nullptr, error_);
134b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_EQ("current", channel);
135b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
136a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(common_service_.GetChannel(
137b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo      &error_, false /* get_current_channel */, &channel));
138b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_EQ(nullptr, error_);
139b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_EQ("target", channel);
140b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}
141b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
142b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, ResetStatusSucceeds) {
143b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(*mock_update_attempter_, ResetStatus()).WillOnce(Return(true));
144a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(common_service_.ResetStatus(&error_));
145b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_EQ(nullptr, error_);
146b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}
147b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
148b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, ResetStatusFails) {
149b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  EXPECT_CALL(*mock_update_attempter_, ResetStatus()).WillOnce(Return(false));
150a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_FALSE(common_service_.ResetStatus(&error_));
151b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo  ASSERT_NE(nullptr, error_);
152a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin  EXPECT_TRUE(error_->HasError(UpdateEngineService::kErrorDomain,
153a93cd53c4f8ab8cb926ed9223373567ebbf45cb6Casey Dahlin                               UpdateEngineService::kErrorFailed));
154b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}
155b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo
156b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex DeymoTEST_F(UpdateEngineServiceTest, GetEolStatusTest) {
157b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  FakePrefs fake_prefs;
158b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  fake_system_state_.set_prefs(&fake_prefs);
159b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  // The default value should be "supported".
160b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  int32_t eol_status = static_cast<int32_t>(EolStatus::kEol);
161b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  EXPECT_TRUE(common_service_.GetEolStatus(&error_, &eol_status));
162b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  EXPECT_EQ(nullptr, error_);
163b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  EXPECT_EQ(EolStatus::kSupported, static_cast<EolStatus>(eol_status));
164b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo
165b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  fake_prefs.SetString(kPrefsOmahaEolStatus, "security-only");
166b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  EXPECT_TRUE(common_service_.GetEolStatus(&error_, &eol_status));
167b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  EXPECT_EQ(nullptr, error_);
168b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo  EXPECT_EQ(EolStatus::kSecurityOnly, static_cast<EolStatus>(eol_status));
169b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo}
170b3fa53bf760bd0a6fd1ef9df28cb425586d733f6Alex Deymo
171b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}  // namespace chromeos_update_engine
172