common_service_unittest.cc revision 672c1f54a499a825cc0bb9bc4f240bf1887550d9
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; 32672c1f54a499a825cc0bb9bc4f240bf1887550d9Ben Chanusing testing::SetArgPointee; 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(_)) 85672c1f54a499a825cc0bb9bc4f240bf1887550d9Ben Chan .WillOnce(DoAll(SetArgPointee<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