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