common_service_unittest.cc revision b7ca096f98a43ebbf412f1b2d3d15bb184f871f8
1b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// Copyright 2014 The Chromium OS Authors. All rights reserved. 2b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// Use of this source code is governed by a BSD-style license that can be 3b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// found in the LICENSE file. 4b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 5b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo#include "update_engine/dbus_service.h" 6b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 7b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo#include <gtest/gtest.h> 8b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo#include <string> 9b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 10b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo#include <chromeos/errors/error.h> 11b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo#include <policy/libpolicy.h> 12b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo#include <policy/mock_device_policy.h> 13b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 14b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo#include "update_engine/dbus_constants.h" 15b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo#include "update_engine/fake_system_state.h" 16b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 17b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymousing std::string; 18b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymousing testing::Return; 19b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymousing testing::SetArgumentPointee; 20b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymousing testing::_; 21b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 22b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymousing chromeos::errors::dbus::kDomain; 23b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 24b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymonamespace chromeos_update_engine { 25b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 26b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymoclass UpdateEngineServiceTest : public ::testing::Test { 27b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo protected: 28b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo UpdateEngineServiceTest() 29b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo : mock_update_attempter_(fake_system_state_.mock_update_attempter()), 30b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo dbus_service_(&fake_system_state_) {} 31b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 32b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo void SetUp() override { 33b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo fake_system_state_.set_device_policy(nullptr); 34b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo } 35b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 36b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo // Fake/mock infrastructure. 37b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo FakeSystemState fake_system_state_; 38b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo policy::MockDevicePolicy mock_device_policy_; 39b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 40b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo // Shortcut for fake_system_state_.mock_update_attempter(). 41b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo MockUpdateAttempter* mock_update_attempter_; 42b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 43b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo chromeos::ErrorPtr error_; 44b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo UpdateEngineService dbus_service_; 45b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo}; 46b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 47b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, AttemptUpdate) { 48b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo // Simple test to ensure that the default is an interactive check. 49b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_CALL(*mock_update_attempter_, 50b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo CheckForUpdate("app_ver", "url", true /* interactive */)); 51b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_TRUE(dbus_service_.AttemptUpdate(&error_, "app_ver", "url")); 52b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_EQ(nullptr, error_); 53b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo} 54b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 55b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, AttemptUpdateWithFlags) { 56b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_CALL(*mock_update_attempter_, CheckForUpdate( 57b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo "app_ver", "url", false /* interactive */)); 58b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo // The update is non-interactive when we pass the non-interactive flag. 59b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_TRUE(dbus_service_.AttemptUpdateWithFlags( 60b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo &error_, "app_ver", "url", kAttemptUpdateFlagNonInteractive)); 61b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_EQ(nullptr, error_); 62b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo} 63b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 64b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// SetChannel is allowed when there's no device policy (the device is not 65b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// enterprise enrolled). 66b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, SetChannelWithNoPolicy) { 67b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_CALL(*mock_update_attempter_, RefreshDevicePolicy()); 68b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo // If SetTargetChannel is called it means the policy check passed. 69b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_CALL(*fake_system_state_.mock_request_params(), 70b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo SetTargetChannel("stable-channel", true)) 71b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo .WillOnce(Return(true)); 72b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_TRUE(dbus_service_.SetChannel(&error_, "stable-channel", true)); 73b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo ASSERT_EQ(nullptr, error_); 74b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo} 75b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 76b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// When the policy is present, the delegated value should be checked. 77b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, SetChannelWithDelegatedPolicy) { 78b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo policy::MockDevicePolicy mock_device_policy; 79b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo fake_system_state_.set_device_policy(&mock_device_policy); 80b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_CALL(mock_device_policy, GetReleaseChannelDelegated(_)) 81b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo .WillOnce(DoAll(SetArgumentPointee<0>(true), Return(true))); 82b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_CALL(*fake_system_state_.mock_request_params(), 83b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo SetTargetChannel("beta-channel", true)) 84b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo .WillOnce(Return(true)); 85b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 86b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_TRUE(dbus_service_.SetChannel(&error_, "beta-channel", true)); 87b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo ASSERT_EQ(nullptr, error_); 88b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo} 89b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 90b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// When passing an invalid value (SetTargetChannel fails) an error should be 91b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo// raised. 92b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, SetChannelWithInvalidChannel) { 93b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_CALL(*mock_update_attempter_, RefreshDevicePolicy()); 94b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_CALL(*fake_system_state_.mock_request_params(), 95b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo SetTargetChannel("foo-channel", true)).WillOnce(Return(false)); 96b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 97b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_FALSE(dbus_service_.SetChannel(&error_, "foo-channel", true)); 98b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo ASSERT_NE(nullptr, error_); 99b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_TRUE(error_->HasError(kDomain, kUpdateEngineServiceErrorFailed)); 100b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo} 101b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 102b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, GetChannel) { 103b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo fake_system_state_.mock_request_params()->set_current_channel("current"); 104b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo fake_system_state_.mock_request_params()->set_target_channel("target"); 105b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo string channel; 106b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_TRUE(dbus_service_.GetChannel( 107b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo &error_, true /* get_current_channel */, &channel)); 108b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_EQ(nullptr, error_); 109b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_EQ("current", channel); 110b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 111b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_TRUE(dbus_service_.GetChannel( 112b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo &error_, false /* get_current_channel */, &channel)); 113b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_EQ(nullptr, error_); 114b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_EQ("target", channel); 115b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo} 116b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 117b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, ResetStatusSucceeds) { 118b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_CALL(*mock_update_attempter_, ResetStatus()).WillOnce(Return(true)); 119b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_TRUE(dbus_service_.ResetStatus(&error_)); 120b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_EQ(nullptr, error_); 121b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo} 122b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 123b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex DeymoTEST_F(UpdateEngineServiceTest, ResetStatusFails) { 124b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_CALL(*mock_update_attempter_, ResetStatus()).WillOnce(Return(false)); 125b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_FALSE(dbus_service_.ResetStatus(&error_)); 126b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo ASSERT_NE(nullptr, error_); 127b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo EXPECT_TRUE(error_->HasError(kDomain, kUpdateEngineServiceErrorFailed)); 128b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo} 129b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo 130b7ca096f98a43ebbf412f1b2d3d15bb184f871f8Alex Deymo} // namespace chromeos_update_engine 131