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