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