blob: cebd3e6ab20537901eda32fee592c476c3afb8e4 [file] [log] [blame]
Xiaochu Liuc2b65f52018-07-20 12:47:05 -07001// Copyright 2018 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 <utility>
Jae Hoon Kim80075fb2019-07-24 12:35:58 -07006#include <vector>
Xiaochu Liuc2b65f52018-07-20 12:47:05 -07007
8#include <base/files/file_path.h>
9#include <base/files/file_util.h>
Amin Hassanif656f292020-06-08 16:20:01 -070010#include <base/test/simple_test_clock.h>
Jae Hoon Kimb2baf582019-11-12 17:00:57 -080011#include <brillo/message_loops/message_loop_utils.h>
Jae Hoon Kimfdaa53a2020-03-13 11:28:36 -070012#include <dbus/dlcservice/dbus-constants.h>
Xiaochu Liud0184e32018-10-19 17:21:33 -070013#include <dlcservice/proto_bindings/dlcservice.pb.h>
Amin Hassani7be4da42019-06-21 16:36:15 -070014#include <update_engine/proto_bindings/update_engine.pb.h>
Andrew6a55cf42020-01-02 15:01:36 -080015#include <gmock/gmock.h>
Xiaochu Liuc2b65f52018-07-20 12:47:05 -070016#include <gtest/gtest.h>
Xiaochu Liuc2b65f52018-07-20 12:47:05 -070017
Amin Hassani86649982020-03-31 16:03:37 -070018#include "dlcservice/dlc.h"
Amin Hassanic4cc1ee2019-11-14 11:51:35 -080019#include "dlcservice/dlc_service.h"
Jae Hoon Kim7d0001e2021-07-07 13:04:40 -070020#include "dlcservice/mock_dlc_manager.h"
Jae Hoon Kim9a27d152020-04-10 12:50:14 -070021#include "dlcservice/prefs.h"
Amin Hassani10c8c6c2020-04-06 12:28:59 -070022#include "dlcservice/test_utils.h"
Xiaochu Liu6da17272018-11-06 14:04:01 -080023#include "dlcservice/utils.h"
Xiaochu Liuc2b65f52018-07-20 12:47:05 -070024
Jae Hoon Kimc98e3a32020-03-13 09:40:48 -070025using brillo::ErrorPtr;
Andrew0a534ed2020-05-06 09:59:17 -070026using dlcservice::metrics::InstallResult;
Andrew2eb95542020-06-24 14:51:49 -070027using dlcservice::metrics::UninstallResult;
Jae Hoon Kimc7beafd2019-07-22 18:14:47 -070028using std::string;
Jae Hoon Kim80075fb2019-07-24 12:35:58 -070029using std::vector;
Jae Hoon Kim69cda482019-07-18 14:36:22 -070030using testing::_;
Mike Frysinger0cc18562021-01-04 02:16:54 -050031using testing::DoAll;
Amin Hassani86649982020-03-31 16:03:37 -070032using testing::ElementsAre;
Amin Hassanif2efc5a2020-05-25 21:22:57 -070033using testing::Invoke;
Jae Hoon Kimc7beafd2019-07-22 18:14:47 -070034using testing::Return;
35using testing::SetArgPointee;
Jae Hoon Kima170cfb2020-03-11 09:02:29 -070036using testing::StrictMock;
Amin Hassanif2efc5a2020-05-25 21:22:57 -070037using testing::WithArg;
38using testing::WithArgs;
Jae Hoon Kim80075fb2019-07-24 12:35:58 -070039using update_engine::Operation;
40using update_engine::StatusResult;
Jae Hoon Kim69cda482019-07-18 14:36:22 -070041
Xiaochu Liuc2b65f52018-07-20 12:47:05 -070042namespace dlcservice {
43
Amin Hassani10c8c6c2020-04-06 12:28:59 -070044class DlcServiceTest : public BaseTest {
Xiaochu Liuc2b65f52018-07-20 12:47:05 -070045 public:
Amin Hassani10c8c6c2020-04-06 12:28:59 -070046 DlcServiceTest() = default;
47
48 void SetUp() override {
Amin Hassani10c8c6c2020-04-06 12:28:59 -070049 BaseTest::SetUp();
Amin Hassanief35a382020-04-03 12:58:45 -070050
Amin Hassanica3cbb72020-04-10 12:26:50 -070051 InitializeDlcService();
Jae Hoon Kime70e24a2019-12-17 16:24:14 -080052 }
53
Amin Hassanica3cbb72020-04-10 12:26:50 -070054 void InitializeDlcService() {
Amin Hassanief35a382020-04-03 12:58:45 -070055 EXPECT_CALL(*mock_update_engine_proxy_ptr_,
56 DoRegisterStatusUpdateAdvancedSignalHandler(_, _))
57 .Times(1);
Amin Hassani759090b2020-04-13 12:31:10 -070058 EXPECT_CALL(*mock_session_manager_proxy_ptr_,
59 DoRegisterSessionStateChangedSignalHandler(_, _))
60 .Times(1);
Amin Hassanief35a382020-04-03 12:58:45 -070061
Jae Hoon Kimf4eed882020-01-28 17:29:16 -080062 dlc_service_ = std::make_unique<DlcService>();
Amin Hassanica3cbb72020-04-10 12:26:50 -070063 dlc_service_->Initialize();
Amin Hassanif656f292020-06-08 16:20:01 -070064
65 StatusResult status;
66 status.set_current_operation(Operation::IDLE);
67 EXPECT_CALL(*mock_update_engine_proxy_ptr_, GetStatusAdvanced(_, _, _))
68 .WillOnce(DoAll(SetArgPointee<0>(status), Return(true)));
69 // To set the update_engine status for the first time.
70 dlc_service_->OnStatusUpdateAdvancedSignalConnected("", "", true);
Jae Hoon Kim69cda482019-07-18 14:36:22 -070071 }
72
Andrew0a534ed2020-05-06 09:59:17 -070073 // Successfully install a DLC.
Amin Hassani6d0367d2020-05-10 18:07:03 -070074 void Install(const DlcId& id) {
Amin Hassani111f2bc2020-04-17 11:53:32 -070075 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Amin Hassanif2efc5a2020-05-25 21:22:57 -070076 .WillOnce(DoAll(
77 WithArg<1>(Invoke(this, &DlcServiceTest::InstallWithUpdateEngine)),
78 WithArgs<1, 2>(
79 Invoke(dlc_service_.get(), &DlcService::InstallCompleted)),
80 Return(true)));
Amin Hassani6d0367d2020-05-10 18:07:03 -070081 EXPECT_CALL(*mock_image_loader_proxy_ptr_, LoadDlcImage(id, _, _, _, _, _))
82 .WillOnce(DoAll(SetArgPointee<3>(mount_path_.value()), Return(true)));
Amin Hassani78a5ec82020-05-19 09:47:49 -070083 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(2);
Amin Hassani9a3f20c2020-05-25 16:38:33 -070084 EXPECT_CALL(*mock_update_engine_proxy_ptr_,
85 SetDlcActiveValue(true, id, _, _))
86 .WillOnce(Return(true));
Andrew0a534ed2020-05-06 09:59:17 -070087 EXPECT_CALL(*mock_metrics_,
88 SendInstallResult(InstallResult::kSuccessNewInstall));
Jae Hoon Kim0d057fb2020-04-13 17:44:38 -070089
Amin Hassani6d0367d2020-05-10 18:07:03 -070090 EXPECT_TRUE(dlc_service_->Install(id, kDefaultOmahaUrl, &err_));
Amin Hassanif2efc5a2020-05-25 21:22:57 -070091
92 CheckDlcState(id, DlcState::INSTALLING);
Jae Hoon Kim0d057fb2020-04-13 17:44:38 -070093
Jae Hoon Kim0d057fb2020-04-13 17:44:38 -070094 StatusResult status_result;
95 status_result.set_is_install(true);
96 status_result.set_current_operation(Operation::IDLE);
97 dlc_service_->OnStatusUpdateAdvancedSignal(status_result);
98
Amin Hassani6d0367d2020-05-10 18:07:03 -070099 CheckDlcState(id, DlcState::INSTALLED);
Amin Hassanief35a382020-04-03 12:58:45 -0700100 }
101
Andrew48a55f22020-06-17 06:50:04 -0700102 void CheckDlcState(const DlcId& id,
103 const DlcState::State& expected_state,
104 const string& error_code = kErrorNone) {
Amin Hassani1ac28312020-06-04 18:16:30 -0700105 const auto* dlc = dlc_service_->GetDlc(id, &err_);
Amin Hassanib2f139c2020-05-15 11:43:26 -0700106 EXPECT_NE(dlc, nullptr);
107 EXPECT_EQ(expected_state, dlc->GetState().state());
Andrew48a55f22020-06-17 06:50:04 -0700108 EXPECT_EQ(dlc->GetState().last_error_code(), error_code.c_str());
Amin Hassani10c8c6c2020-04-06 12:28:59 -0700109 }
110
111 protected:
Amin Hassani10c8c6c2020-04-06 12:28:59 -0700112 std::unique_ptr<DlcService> dlc_service_;
Amin Hassani10c8c6c2020-04-06 12:28:59 -0700113
Amin Hassanief35a382020-04-03 12:58:45 -0700114 private:
Amin Hassani6b010bf2020-06-04 17:26:58 -0700115 DlcServiceTest(const DlcServiceTest&) = delete;
116 DlcServiceTest& operator=(const DlcServiceTest&) = delete;
Xiaochu Liu46e94b92018-12-03 14:44:35 -0800117};
Xiaochu Liuc2b65f52018-07-20 12:47:05 -0700118
Amin Hassanic4cc1ee2019-11-14 11:51:35 -0800119TEST_F(DlcServiceTest, GetInstalledTest) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700120 Install(kFirstDlc);
121
Amin Hassani86649982020-03-31 16:03:37 -0700122 const auto& dlcs = dlc_service_->GetInstalled();
Jae Hoon Kim97fb05e2019-07-31 16:05:58 -0700123
Amin Hassani86649982020-03-31 16:03:37 -0700124 EXPECT_THAT(dlcs, ElementsAre(kFirstDlc));
Amin Hassani1ac28312020-06-04 18:16:30 -0700125 EXPECT_FALSE(
126 dlc_service_->GetDlc(kFirstDlc, &err_)->GetRoot().value().empty());
Xiaochu Liud0184e32018-10-19 17:21:33 -0700127}
128
Amin Hassanid5fc8b22020-04-29 12:44:52 -0700129TEST_F(DlcServiceTest, GetExistingDlcs) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700130 Install(kFirstDlc);
131
Amin Hassanid5fc8b22020-04-29 12:44:52 -0700132 SetUpDlcWithSlots(kSecondDlc);
133 const auto& dlcs = dlc_service_->GetExistingDlcs();
134
135 EXPECT_THAT(dlcs, ElementsAre(kFirstDlc, kSecondDlc));
136}
137
Amin Hassani38f36792020-04-17 11:47:08 -0700138TEST_F(DlcServiceTest, GetDlcsToUpdateTest) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700139 Install(kFirstDlc);
140
Amin Hassanif27aac02020-04-23 21:56:26 -0700141 // Make second DLC marked as verified so we can get it in the list of DLCs
142 // needed to be updated.
143 EXPECT_TRUE(dlc_service_->InstallCompleted({kSecondDlc}, &err_));
Amin Hassani38f36792020-04-17 11:47:08 -0700144 const auto& dlcs = dlc_service_->GetDlcsToUpdate();
145
Amin Hassanif27aac02020-04-23 21:56:26 -0700146 EXPECT_THAT(dlcs, ElementsAre(kFirstDlc, kSecondDlc));
Amin Hassani38f36792020-04-17 11:47:08 -0700147}
148
Amin Hassanif27aac02020-04-23 21:56:26 -0700149TEST_F(DlcServiceTest, GetInstalledMimicDlcserviceRebootWithoutVerifiedStamp) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700150 Install(kFirstDlc);
Jae Hoon Kim2c61e9e2020-04-07 15:03:35 -0700151 const auto& dlcs_before = dlc_service_->GetInstalled();
152 EXPECT_THAT(dlcs_before, ElementsAre(kFirstDlc));
Amin Hassani1ac28312020-06-04 18:16:30 -0700153 EXPECT_FALSE(
154 dlc_service_->GetDlc(kFirstDlc, &err_)->GetRoot().value().empty());
Jae Hoon Kim2c61e9e2020-04-07 15:03:35 -0700155
Amin Hassanif27aac02020-04-23 21:56:26 -0700156 // Create |kSecondDlc| image, but not verified after device reboot.
Jae Hoon Kim2c61e9e2020-04-07 15:03:35 -0700157 SetUpDlcWithSlots(kSecondDlc);
158
159 const auto& dlcs_after = dlc_service_->GetInstalled();
160 EXPECT_THAT(dlcs_after, ElementsAre(kFirstDlc));
Jae Hoon Kim2c61e9e2020-04-07 15:03:35 -0700161}
162
Amin Hassani40c0f112020-04-15 09:55:00 -0700163TEST_F(DlcServiceTest, UninstallTestForUserDlc) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700164 Install(kFirstDlc);
165
Jae Hoon Kim9090a122019-12-10 09:55:39 -0800166 EXPECT_CALL(*mock_image_loader_proxy_ptr_, UnloadDlcImage(_, _, _, _, _))
167 .WillOnce(DoAll(SetArgPointee<2>(true), Return(true)));
Amin Hassani40c0f112020-04-15 09:55:00 -0700168 // Uninstall should not set the DLC inactive.
169 EXPECT_CALL(*mock_update_engine_proxy_ptr_,
170 SetDlcActiveValue(false, kFirstDlc, _, _))
171 .Times(0);
Amin Hassani78a5ec82020-05-19 09:47:49 -0700172 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
Andrew2eb95542020-06-24 14:51:49 -0700173 EXPECT_CALL(*mock_metrics_, SendUninstallResult(UninstallResult::kSuccess));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700174
Amin Hassanife63fc22020-04-07 11:34:34 -0700175 auto dlc_prefs_path = prefs_path_.Append("dlc").Append(kFirstDlc);
176 EXPECT_TRUE(base::PathExists(dlc_prefs_path));
Xiaochu Liu6da17272018-11-06 14:04:01 -0800177
Amin Hassani5755c9b2020-04-03 13:05:51 -0700178 EXPECT_TRUE(dlc_service_->Uninstall(kFirstDlc, &err_));
Andrew91b62052020-06-24 14:57:30 -0700179 EXPECT_TRUE(err_.get() == nullptr);
Amin Hassani40c0f112020-04-15 09:55:00 -0700180 // Uninstall should not delete the DLC right away.
181 EXPECT_TRUE(base::PathExists(JoinPaths(content_path_, kFirstDlc)));
182 EXPECT_TRUE(base::PathExists(dlc_prefs_path));
Jae Hoon Kimee1ba902020-03-11 09:53:01 -0700183 CheckDlcState(kFirstDlc, DlcState::NOT_INSTALLED);
Amin Hassani40c0f112020-04-15 09:55:00 -0700184 // Uninstall should not change the verified status.
Amin Hassani1ac28312020-06-04 18:16:30 -0700185 EXPECT_TRUE(dlc_service_->GetDlc(kFirstDlc, &err_)->IsVerified());
Xiaochu Liu6da17272018-11-06 14:04:01 -0800186}
187
Amin Hassanib9d74b12020-04-08 15:35:20 -0700188TEST_F(DlcServiceTest, PurgeTest) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700189 Install(kFirstDlc);
190
Amin Hassanib9d74b12020-04-08 15:35:20 -0700191 EXPECT_CALL(*mock_update_engine_proxy_ptr_,
192 SetDlcActiveValue(false, kFirstDlc, _, _))
193 .WillOnce(Return(true));
194 EXPECT_CALL(*mock_image_loader_proxy_ptr_, UnloadDlcImage(_, _, _, _, _))
195 .WillOnce(DoAll(SetArgPointee<2>(true), Return(true)));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700196 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
197
Amin Hassanib9d74b12020-04-08 15:35:20 -0700198 auto dlc_prefs_path = prefs_path_.Append("dlc").Append(kFirstDlc);
199 EXPECT_TRUE(base::PathExists(dlc_prefs_path));
200
201 EXPECT_TRUE(dlc_service_->Purge(kFirstDlc, &err_));
202 EXPECT_FALSE(base::PathExists(JoinPaths(content_path_, kFirstDlc)));
203 EXPECT_FALSE(base::PathExists(dlc_prefs_path));
204 CheckDlcState(kFirstDlc, DlcState::NOT_INSTALLED);
205}
206
Amin Hassani40c0f112020-04-15 09:55:00 -0700207TEST_F(DlcServiceTest, UninstallNotInstalledIsValid) {
Amin Hassani9a3f20c2020-05-25 16:38:33 -0700208 EXPECT_CALL(*mock_image_loader_proxy_ptr_, UnloadDlcImage(_, _, _, _, _))
209 .WillOnce(DoAll(SetArgPointee<2>(true), Return(true)));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700210 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
Andrew2eb95542020-06-24 14:51:49 -0700211 EXPECT_CALL(*mock_metrics_, SendUninstallResult(UninstallResult::kSuccess));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700212
Amin Hassani5755c9b2020-04-03 13:05:51 -0700213 EXPECT_TRUE(dlc_service_->Uninstall(kSecondDlc, &err_));
Andrew91b62052020-06-24 14:57:30 -0700214 EXPECT_TRUE(err_.get() == nullptr);
Jae Hoon Kimee1ba902020-03-11 09:53:01 -0700215 CheckDlcState(kSecondDlc, DlcState::NOT_INSTALLED);
Xiaochu Liu6da17272018-11-06 14:04:01 -0800216}
217
Amin Hassani40c0f112020-04-15 09:55:00 -0700218TEST_F(DlcServiceTest, PurgeNotInstalledIsValid) {
Amin Hassani40c0f112020-04-15 09:55:00 -0700219 EXPECT_CALL(*mock_image_loader_proxy_ptr_, UnloadDlcImage(_, _, _, _, _))
220 .WillOnce(DoAll(SetArgPointee<2>(true), Return(true)));
221 EXPECT_CALL(*mock_update_engine_proxy_ptr_,
222 SetDlcActiveValue(false, kSecondDlc, _, _))
223 .WillOnce(Return(true));
224 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
225
226 EXPECT_TRUE(dlc_service_->Purge(kSecondDlc, &err_));
227 CheckDlcState(kSecondDlc, DlcState::NOT_INSTALLED);
228}
229
230TEST_F(DlcServiceTest, PurgeFailToSetDlcActiveValueFalse) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700231 Install(kFirstDlc);
232
Amin Hassani40c0f112020-04-15 09:55:00 -0700233 EXPECT_CALL(*mock_image_loader_proxy_ptr_, UnloadDlcImage(_, _, _, _, _))
234 .WillOnce(DoAll(SetArgPointee<2>(true), Return(true)));
Andrew51135f02020-03-02 14:29:07 -0800235 EXPECT_CALL(*mock_update_engine_proxy_ptr_,
236 SetDlcActiveValue(false, kFirstDlc, _, _))
237 .WillOnce(Return(false));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700238 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
Andrew51135f02020-03-02 14:29:07 -0800239
Amin Hassani40c0f112020-04-15 09:55:00 -0700240 EXPECT_TRUE(dlc_service_->Purge(kFirstDlc, &err_));
Andrew51135f02020-03-02 14:29:07 -0800241 EXPECT_FALSE(base::PathExists(JoinPaths(content_path_, kFirstDlc)));
242 CheckDlcState(kFirstDlc, DlcState::NOT_INSTALLED);
243}
244
Andrew6829e922019-12-13 14:17:53 -0800245TEST_F(DlcServiceTest, UninstallInvalidDlcTest) {
Jae Hoon Kimee1ba902020-03-11 09:53:01 -0700246 const auto& id = "invalid-dlc-id";
Andrew2eb95542020-06-24 14:51:49 -0700247 EXPECT_CALL(*mock_metrics_,
248 SendUninstallResult(UninstallResult::kFailedInvalidDlc));
249
Amin Hassani5755c9b2020-04-03 13:05:51 -0700250 EXPECT_FALSE(dlc_service_->Uninstall(id, &err_));
Amin Hassanib2f139c2020-05-15 11:43:26 -0700251 EXPECT_EQ(err_->GetCode(), kErrorInvalidDlc);
Andrew6829e922019-12-13 14:17:53 -0800252}
253
Amin Hassani40c0f112020-04-15 09:55:00 -0700254TEST_F(DlcServiceTest, PurgeInvalidDlcTest) {
Amin Hassani40c0f112020-04-15 09:55:00 -0700255 const auto& id = "invalid-dlc-id";
256 EXPECT_FALSE(dlc_service_->Purge(id, &err_));
257 EXPECT_EQ(err_->GetCode(), kErrorInvalidDlc);
Xiaochu Liu6da17272018-11-06 14:04:01 -0800258}
259
Amin Hassanic4cc1ee2019-11-14 11:51:35 -0800260TEST_F(DlcServiceTest, UninstallImageLoaderFailureTest) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700261 Install(kFirstDlc);
262
Amin Hassani40c0f112020-04-15 09:55:00 -0700263 // |ImageLoader| not available.
Jae Hoon Kimc7beafd2019-07-22 18:14:47 -0700264 EXPECT_CALL(*mock_image_loader_proxy_ptr_, UnloadDlcImage(_, _, _, _, _))
265 .WillOnce(Return(false));
Amin Hassani40c0f112020-04-15 09:55:00 -0700266 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
Andrew2eb95542020-06-24 14:51:49 -0700267 EXPECT_CALL(*mock_metrics_, SendUninstallResult(UninstallResult::kSuccess));
Jae Hoon Kimc7beafd2019-07-22 18:14:47 -0700268
Amin Hassani40c0f112020-04-15 09:55:00 -0700269 EXPECT_TRUE(dlc_service_->Uninstall(kFirstDlc, &err_));
Andrew91b62052020-06-24 14:57:30 -0700270 EXPECT_TRUE(err_.get() == nullptr);
Jae Hoon Kim373cd652020-01-21 10:03:39 -0800271 EXPECT_TRUE(base::PathExists(JoinPaths(content_path_, kFirstDlc)));
Andrew48a55f22020-06-17 06:50:04 -0700272 CheckDlcState(kFirstDlc, DlcState::NOT_INSTALLED, kErrorInternal);
Jae Hoon Kimc7beafd2019-07-22 18:14:47 -0700273}
274
Amin Hassani40c0f112020-04-15 09:55:00 -0700275TEST_F(DlcServiceTest, PurgeUpdateEngineBusyFailureTest) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700276 Install(kFirstDlc);
277
Jae Hoon Kimaa896512019-08-29 17:26:57 -0700278 StatusResult status_result;
279 status_result.set_current_operation(Operation::CHECKING_FOR_UPDATE);
Amin Hassanif656f292020-06-08 16:20:01 -0700280 SystemState::Get()->set_update_engine_status(status_result);
Jae Hoon Kimaa896512019-08-29 17:26:57 -0700281
Amin Hassani40c0f112020-04-15 09:55:00 -0700282 EXPECT_FALSE(dlc_service_->Purge(kFirstDlc, &err_));
Jae Hoon Kimee1ba902020-03-11 09:53:01 -0700283 CheckDlcState(kFirstDlc, DlcState::INSTALLED);
Jae Hoon Kimaa896512019-08-29 17:26:57 -0700284}
285
Amin Hassani40c0f112020-04-15 09:55:00 -0700286// Same behavior should be for purge.
Jae Hoon Kimfdaa53a2020-03-13 11:28:36 -0700287TEST_F(DlcServiceTest, UninstallInstallingFails) {
Amin Hassani111f2bc2020-04-17 11:53:32 -0700288 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Jae Hoon Kimfdaa53a2020-03-13 11:28:36 -0700289 .WillOnce(Return(true));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700290 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
Andrew2eb95542020-06-24 14:51:49 -0700291 EXPECT_CALL(*mock_metrics_,
292 SendUninstallResult(UninstallResult::kFailedUpdateEngineBusy));
Jae Hoon Kimfdaa53a2020-03-13 11:28:36 -0700293
Amin Hassani6d0367d2020-05-10 18:07:03 -0700294 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
Jae Hoon Kimfdaa53a2020-03-13 11:28:36 -0700295 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
296
Amin Hassani5755c9b2020-04-03 13:05:51 -0700297 EXPECT_FALSE(dlc_service_->Uninstall(kSecondDlc, &err_));
Jae Hoon Kimfdaa53a2020-03-13 11:28:36 -0700298 EXPECT_EQ(err_->GetCode(), kErrorBusy);
299}
300
Amin Hassani40c0f112020-04-15 09:55:00 -0700301TEST_F(DlcServiceTest, PurgeInstallingFails) {
Amin Hassani40c0f112020-04-15 09:55:00 -0700302 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
303 .WillOnce(Return(true));
304 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
305
306 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
307 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
308
309 EXPECT_FALSE(dlc_service_->Purge(kSecondDlc, &err_));
310 EXPECT_EQ(err_->GetCode(), kErrorBusy);
311}
312
Jae Hoon Kimfdaa53a2020-03-13 11:28:36 -0700313TEST_F(DlcServiceTest, UninstallInstallingButInstalledFails) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700314 Install(kFirstDlc);
315
Amin Hassani111f2bc2020-04-17 11:53:32 -0700316 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Jae Hoon Kimfdaa53a2020-03-13 11:28:36 -0700317 .WillOnce(Return(true));
Jae Hoon Kim6cb439b2020-03-23 14:02:44 -0700318 EXPECT_CALL(*mock_image_loader_proxy_ptr_, UnloadDlcImage(_, _, _, _, _))
319 .WillOnce(DoAll(SetArgPointee<2>(true), Return(true)));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700320 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(2);
Andrew2eb95542020-06-24 14:51:49 -0700321 EXPECT_CALL(*mock_metrics_, SendUninstallResult(UninstallResult::kSuccess));
Jae Hoon Kim6cb439b2020-03-23 14:02:44 -0700322
Amin Hassani6d0367d2020-05-10 18:07:03 -0700323 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
324 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
325
Amin Hassani40c0f112020-04-15 09:55:00 -0700326 // |kFirstDlc| was installed, so there should be no problem uninstalling it
327 // |even if |kSecondDlc| is installing.
Amin Hassani5755c9b2020-04-03 13:05:51 -0700328 EXPECT_TRUE(dlc_service_->Uninstall(kFirstDlc, &err_));
Andrew91b62052020-06-24 14:57:30 -0700329 EXPECT_TRUE(err_.get() == nullptr);
Jae Hoon Kim6cb439b2020-03-23 14:02:44 -0700330 CheckDlcState(kFirstDlc, DlcState::NOT_INSTALLED);
Jae Hoon Kimfdaa53a2020-03-13 11:28:36 -0700331}
332
Jae Hoon Kima170cfb2020-03-11 09:02:29 -0700333TEST_F(DlcServiceTest, InstallInvalidDlcTest) {
Amin Hassanief35a382020-04-03 12:58:45 -0700334 const string id = "bad-dlc-id";
Andrew0a534ed2020-05-06 09:59:17 -0700335 EXPECT_CALL(*mock_metrics_,
336 SendInstallResult(InstallResult::kFailedInvalidDlc));
Amin Hassani6d0367d2020-05-10 18:07:03 -0700337 EXPECT_FALSE(dlc_service_->Install(id, kDefaultOmahaUrl, &err_));
Amin Hassanib2f139c2020-05-15 11:43:26 -0700338 EXPECT_EQ(err_->GetCode(), kErrorInvalidDlc);
Jae Hoon Kima170cfb2020-03-11 09:02:29 -0700339}
340
Amin Hassanic4cc1ee2019-11-14 11:51:35 -0800341TEST_F(DlcServiceTest, InstallTest) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700342 Install(kFirstDlc);
343
Jae Hoon Kim1b8d6ab2019-10-09 10:21:16 -0700344 SetMountPath(mount_path_.value());
Amin Hassani111f2bc2020-04-17 11:53:32 -0700345 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Jae Hoon Kim9090a122019-12-10 09:55:39 -0800346 .WillOnce(Return(true));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700347 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
348
Amin Hassani6d0367d2020-05-10 18:07:03 -0700349 EXPECT_THAT(dlc_service_->GetInstalled(), ElementsAre(kFirstDlc));
Jae Hoon Kim2c61e9e2020-04-07 15:03:35 -0700350
Amin Hassani6d0367d2020-05-10 18:07:03 -0700351 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
Jae Hoon Kimee1ba902020-03-11 09:53:01 -0700352 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
Colin Howes7c7d47f2018-11-21 09:34:35 -0800353
Andrew0a534ed2020-05-06 09:59:17 -0700354 // Should remain same as it's not stamped verified.
Amin Hassani6d0367d2020-05-10 18:07:03 -0700355 EXPECT_THAT(dlc_service_->GetInstalled(), ElementsAre(kFirstDlc));
Jae Hoon Kim2c61e9e2020-04-07 15:03:35 -0700356
Amin Hassani78a5ec82020-05-19 09:47:49 -0700357 // TODO(ahassani): Add more install process liked |InstallCompleted|, etc.
Xiaochu Liue6056382019-01-22 11:15:36 -0800358}
359
Amin Hassanic4cc1ee2019-11-14 11:51:35 -0800360TEST_F(DlcServiceTest, InstallAlreadyInstalledValid) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700361 Install(kFirstDlc);
362
Jae Hoon Kim1b8d6ab2019-10-09 10:21:16 -0700363 SetMountPath(mount_path_.value());
Andrew51135f02020-03-02 14:29:07 -0800364 EXPECT_CALL(*mock_update_engine_proxy_ptr_,
365 SetDlcActiveValue(true, kFirstDlc, _, _))
366 .WillOnce(Return(true));
Amin Hassani9a3f20c2020-05-25 16:38:33 -0700367 EXPECT_CALL(*mock_image_loader_proxy_ptr_,
368 LoadDlcImage(kFirstDlc, _, _, _, _, _))
369 .WillOnce(DoAll(SetArgPointee<3>(mount_path_.value()), Return(true)));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700370 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
Andrew0a534ed2020-05-06 09:59:17 -0700371 EXPECT_CALL(*mock_metrics_,
372 SendInstallResult(InstallResult::kSuccessAlreadyInstalled));
Jae Hoon Kim69cda482019-07-18 14:36:22 -0700373
Amin Hassani6d0367d2020-05-10 18:07:03 -0700374 EXPECT_TRUE(dlc_service_->Install(kFirstDlc, kDefaultOmahaUrl, &err_));
Jae Hoon Kim373cd652020-01-21 10:03:39 -0800375 EXPECT_TRUE(base::PathExists(JoinPaths(content_path_, kFirstDlc)));
Jae Hoon Kimee1ba902020-03-11 09:53:01 -0700376 CheckDlcState(kFirstDlc, DlcState::INSTALLED);
Jae Hoon Kim69cda482019-07-18 14:36:22 -0700377}
378
Jae Hoon Kimbf48dea2020-07-24 14:16:57 -0700379TEST_F(DlcServiceTest, InstallAlreadyInstalledWhileAnotherInstalling) {
380 Install(kFirstDlc);
381
382 // Keep |kSecondDlc| installing.
383 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
384 .WillOnce(Return(true));
385 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
386
387 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
388 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
389
390 // |kFirstDlc| can quickly be installed again even though another install is
391 // ongoing.
392 SetMountPath(mount_path_.value());
393 EXPECT_CALL(*mock_update_engine_proxy_ptr_,
394 SetDlcActiveValue(true, kFirstDlc, _, _))
395 .WillOnce(Return(true));
396 EXPECT_CALL(*mock_image_loader_proxy_ptr_,
397 LoadDlcImage(kFirstDlc, _, _, _, _, _))
398 .WillOnce(DoAll(SetArgPointee<3>(mount_path_.value()), Return(true)));
399 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
400 EXPECT_CALL(*mock_metrics_,
401 SendInstallResult(InstallResult::kSuccessAlreadyInstalled));
402
403 EXPECT_TRUE(dlc_service_->Install(kFirstDlc, kDefaultOmahaUrl, &err_));
404 CheckDlcState(kFirstDlc, DlcState::INSTALLED);
405}
406
Andrew51135f02020-03-02 14:29:07 -0800407TEST_F(DlcServiceTest, InstallCannotSetDlcActiveValue) {
Andrew51135f02020-03-02 14:29:07 -0800408 SetMountPath(mount_path_.value());
Amin Hassani111f2bc2020-04-17 11:53:32 -0700409 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Andrew51135f02020-03-02 14:29:07 -0800410 .WillOnce(Return(true));
411 EXPECT_CALL(*mock_update_engine_proxy_ptr_,
412 SetDlcActiveValue(true, kSecondDlc, _, _))
413 .WillOnce(Return(false));
Amin Hassani9a3f20c2020-05-25 16:38:33 -0700414 EXPECT_CALL(*mock_image_loader_proxy_ptr_,
415 LoadDlcImage(kSecondDlc, _, _, _, _, _))
416 .WillOnce(DoAll(SetArgPointee<3>(mount_path_.value()), Return(true)));
417 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(2);
Andrew0a534ed2020-05-06 09:59:17 -0700418 EXPECT_CALL(*mock_metrics_,
419 SendInstallResult(InstallResult::kSuccessNewInstall));
Andrew51135f02020-03-02 14:29:07 -0800420
Amin Hassani6d0367d2020-05-10 18:07:03 -0700421 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
Amin Hassani9a3f20c2020-05-25 16:38:33 -0700422 EXPECT_TRUE(dlc_service_->InstallCompleted({kSecondDlc}, &err_));
423
424 StatusResult status_result;
425 status_result.set_is_install(true);
426 status_result.set_current_operation(Operation::IDLE);
427 dlc_service_->OnStatusUpdateAdvancedSignal(status_result);
428
429 CheckDlcState(kSecondDlc, DlcState::INSTALLED);
Andrew51135f02020-03-02 14:29:07 -0800430}
431
Amin Hassanif656f292020-06-08 16:20:01 -0700432TEST_F(DlcServiceTest, PeriodicInstallCheck) {
433 vector<StatusResult> status_list;
434 for (const auto& op :
435 {Operation::CHECKING_FOR_UPDATE, Operation::DOWNLOADING}) {
436 StatusResult status;
437 status.set_current_operation(op);
438 status.set_is_install(true);
439 status_list.push_back(status);
440 }
Jae Hoon Kimdcf783e2020-01-24 14:06:02 -0800441 EXPECT_CALL(*mock_update_engine_proxy_ptr_, GetStatusAdvanced(_, _, _))
Amin Hassanif656f292020-06-08 16:20:01 -0700442 .WillOnce(DoAll(SetArgPointee<0>(status_list[0]), Return(true)))
Jae Hoon Kimdcf783e2020-01-24 14:06:02 -0800443 .WillOnce(Return(false))
Amin Hassanif656f292020-06-08 16:20:01 -0700444 .WillOnce(DoAll(SetArgPointee<0>(status_list[1]), Return(true)));
445
446 // We need to make sure the state is intalling so, rescheduling periodic check
447 // happens.
Amin Hassani111f2bc2020-04-17 11:53:32 -0700448 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Jae Hoon Kimdcf783e2020-01-24 14:06:02 -0800449 .WillOnce(Return(true));
Amin Hassanif656f292020-06-08 16:20:01 -0700450 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
Jae Hoon Kimdcf783e2020-01-24 14:06:02 -0800451
Amin Hassani6d0367d2020-05-10 18:07:03 -0700452 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
Jae Hoon Kimee1ba902020-03-11 09:53:01 -0700453 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
Amin Hassanif656f292020-06-08 16:20:01 -0700454
455 // The first time it should not get the status because enough time hasn't
456 // passed yet.
457 dlc_service_->SchedulePeriodicInstallCheck();
458 EXPECT_EQ(SystemState::Get()->update_engine_status().current_operation(),
459 Operation::IDLE);
460
461 // Now advance clock and make sure that first time we do get status.
462 clock_.Advance(base::TimeDelta::FromSeconds(11));
463 loop_.RunOnce(false);
464 EXPECT_EQ(SystemState::Get()->update_engine_status().current_operation(),
465 Operation::CHECKING_FOR_UPDATE);
466
467 // Now advance the clock even more, this time fail the get status. The status
468 // should remain same.
469 clock_.Advance(base::TimeDelta::FromSeconds(11));
470 loop_.RunOnce(false);
471 EXPECT_EQ(SystemState::Get()->update_engine_status().current_operation(),
472 Operation::CHECKING_FOR_UPDATE);
473
474 // Now advance a little bit more to see we got the new status.
475 clock_.Advance(base::TimeDelta::FromSeconds(11));
476 loop_.RunOnce(false);
477 EXPECT_EQ(SystemState::Get()->update_engine_status().current_operation(),
478 Operation::DOWNLOADING);
Jae Hoon Kimdcf783e2020-01-24 14:06:02 -0800479}
480
Amin Hassanif656f292020-06-08 16:20:01 -0700481TEST_F(DlcServiceTest, InstallSchedulesPeriodicInstallCheck) {
482 vector<StatusResult> status_list;
483 for (const auto& op : {Operation::CHECKING_FOR_UPDATE, Operation::IDLE}) {
484 StatusResult status;
485 status.set_current_operation(op);
486 status.set_is_install(true);
487 status_list.push_back(status);
488 }
489
Jae Hoon Kimdcf783e2020-01-24 14:06:02 -0800490 EXPECT_CALL(*mock_update_engine_proxy_ptr_, GetStatusAdvanced(_, _, _))
Amin Hassanif656f292020-06-08 16:20:01 -0700491 .WillOnce(DoAll(SetArgPointee<0>(status_list[1]), Return(true)));
Amin Hassani111f2bc2020-04-17 11:53:32 -0700492 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Jae Hoon Kimdcf783e2020-01-24 14:06:02 -0800493 .WillOnce(Return(true));
Amin Hassanif656f292020-06-08 16:20:01 -0700494 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(2);
Andrew0a534ed2020-05-06 09:59:17 -0700495 EXPECT_CALL(*mock_metrics_,
496 SendInstallResult(InstallResult::kFailedToVerifyImage));
Jae Hoon Kimdcf783e2020-01-24 14:06:02 -0800497
Amin Hassani6d0367d2020-05-10 18:07:03 -0700498 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
Jae Hoon Kimee1ba902020-03-11 09:53:01 -0700499 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
Amin Hassanif656f292020-06-08 16:20:01 -0700500
501 // The checking for update comes from signal.
502 dlc_service_->OnStatusUpdateAdvancedSignal(status_list[0]);
503
504 // Now advance clock and make sure that periodic install check is scheduled
505 // and eventually called.
506 clock_.Advance(base::TimeDelta::FromSeconds(11));
507 loop_.RunOnce(false);
508
509 // Since the update_engine status went back to IDLE, the install is complete
510 // and it should fail.
Andrew48a55f22020-06-17 06:50:04 -0700511 CheckDlcState(kSecondDlc, DlcState::NOT_INSTALLED, kErrorInternal);
Jae Hoon Kimdcf783e2020-01-24 14:06:02 -0800512}
513
Amin Hassanic4cc1ee2019-11-14 11:51:35 -0800514TEST_F(DlcServiceTest, InstallFailureCleansUp) {
Amin Hassani111f2bc2020-04-17 11:53:32 -0700515 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700516 .WillOnce(Return(false));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700517 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(2);
Andrew0a534ed2020-05-06 09:59:17 -0700518 EXPECT_CALL(*mock_metrics_,
519 SendInstallResult(InstallResult::kFailedUpdateEngineBusy));
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700520
Amin Hassani6d0367d2020-05-10 18:07:03 -0700521 EXPECT_FALSE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
Andrewa888bfb2020-06-10 15:48:15 -0700522 EXPECT_EQ(err_->GetCode(), kErrorBusy);
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700523
Jae Hoon Kimace79b72020-03-10 18:00:15 +0000524 EXPECT_FALSE(base::PathExists(JoinPaths(content_path_, kSecondDlc)));
Andrew48a55f22020-06-17 06:50:04 -0700525 CheckDlcState(kSecondDlc, DlcState::NOT_INSTALLED, kErrorBusy);
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700526}
527
Amin Hassanic4cc1ee2019-11-14 11:51:35 -0800528TEST_F(DlcServiceTest, InstallUrlTest) {
Amin Hassani65202242020-03-31 12:26:37 -0700529 EXPECT_CALL(*mock_update_engine_proxy_ptr_,
Amin Hassani111f2bc2020-04-17 11:53:32 -0700530 AttemptInstall(kDefaultOmahaUrl, _, _, _))
Jae Hoon Kim9090a122019-12-10 09:55:39 -0800531 .WillOnce(Return(true));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700532 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
Xiaochu Liue6056382019-01-22 11:15:36 -0800533
Amin Hassani6d0367d2020-05-10 18:07:03 -0700534 dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_);
Jae Hoon Kimee1ba902020-03-11 09:53:01 -0700535 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
Xiaochu Liue9155842018-11-13 14:24:05 -0800536}
537
Jae Hoon Kim54faa5d2020-03-23 17:17:16 -0700538TEST_F(DlcServiceTest, InstallAlreadyInstalledThatGotUnmountedTest) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700539 Install(kFirstDlc);
540
Amin Hassani78a5ec82020-05-19 09:47:49 -0700541 // TOOD(ahassani): Move these checks to InstallTest.
Jae Hoon Kim54faa5d2020-03-23 17:17:16 -0700542 CheckDlcState(kFirstDlc, DlcState::INSTALLED);
543 const auto mount_path_root = JoinPaths(mount_path_, "root");
544 EXPECT_TRUE(base::PathExists(mount_path_root));
hscham53cf73a2020-11-30 15:58:42 +0900545 EXPECT_TRUE(base::DeletePathRecursively(mount_path_root));
Jae Hoon Kim54faa5d2020-03-23 17:17:16 -0700546
Jae Hoon Kim54faa5d2020-03-23 17:17:16 -0700547 EXPECT_CALL(*mock_image_loader_proxy_ptr_, LoadDlcImage(_, _, _, _, _, _))
Jae Hoon Kimc56f9062020-04-29 09:53:24 -0700548 .WillOnce(DoAll(SetArgPointee<3>(mount_path_.value()), Return(true)));
Jae Hoon Kim54faa5d2020-03-23 17:17:16 -0700549 EXPECT_CALL(*mock_update_engine_proxy_ptr_,
550 SetDlcActiveValue(true, kFirstDlc, _, _))
551 .WillOnce(Return(true));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700552 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
Andrew0a534ed2020-05-06 09:59:17 -0700553 EXPECT_CALL(*mock_metrics_,
554 SendInstallResult(InstallResult::kSuccessAlreadyInstalled));
Jae Hoon Kim54faa5d2020-03-23 17:17:16 -0700555
Andrew0a534ed2020-05-06 09:59:17 -0700556 EXPECT_TRUE(dlc_service_->Install(kFirstDlc, kDefaultOmahaUrl, &err_));
Jae Hoon Kim54faa5d2020-03-23 17:17:16 -0700557 CheckDlcState(kFirstDlc, DlcState::INSTALLED);
558}
559
Andrewda5871f2020-06-08 13:31:42 -0700560TEST_F(DlcServiceTest, InstallFailsToCreateDirectory) {
Andrewda5871f2020-06-08 13:31:42 -0700561 base::SetPosixFilePermissions(content_path_, 0444);
Andrew0a534ed2020-05-06 09:59:17 -0700562 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(1);
563 EXPECT_CALL(*mock_metrics_,
564 SendInstallResult(InstallResult::kFailedToCreateDirectory));
Andrewda5871f2020-06-08 13:31:42 -0700565
566 // Install will fail because DlcBase::CreateDlc() will fail to create
567 // directories inside |content_path_|, since the permissions don't allow
568 // writing into |content_path_|.
569 EXPECT_FALSE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
Andrewa888bfb2020-06-10 15:48:15 -0700570 EXPECT_EQ(err_->GetCode(), kErrorInternal);
Andrewda5871f2020-06-08 13:31:42 -0700571
Andrew48a55f22020-06-17 06:50:04 -0700572 CheckDlcState(kSecondDlc, DlcState::NOT_INSTALLED, kErrorInternal);
Andrewda5871f2020-06-08 13:31:42 -0700573}
574
Amin Hassaniaa38c792020-04-06 15:52:44 -0700575TEST_F(DlcServiceTest, OnStatusUpdateSignalDlcRootTest) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700576 Install(kFirstDlc);
577
Amin Hassani111f2bc2020-04-17 11:53:32 -0700578 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Jae Hoon Kim9090a122019-12-10 09:55:39 -0800579 .WillOnce(Return(true));
Andrew51135f02020-03-02 14:29:07 -0800580 EXPECT_CALL(*mock_update_engine_proxy_ptr_,
581 SetDlcActiveValue(true, kSecondDlc, _, _))
582 .WillOnce(Return(true));
Jae Hoon Kim9090a122019-12-10 09:55:39 -0800583 EXPECT_CALL(*mock_image_loader_proxy_ptr_, LoadDlcImage(_, _, _, _, _, _))
Amin Hassani6d0367d2020-05-10 18:07:03 -0700584 .WillOnce(DoAll(SetArgPointee<3>(mount_path_.value()), Return(true)));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700585 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(2);
Andrew0a534ed2020-05-06 09:59:17 -0700586 EXPECT_CALL(*mock_metrics_,
587 SendInstallResult(InstallResult::kSuccessNewInstall));
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700588
Amin Hassani6d0367d2020-05-10 18:07:03 -0700589 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700590
Amin Hassani6d0367d2020-05-10 18:07:03 -0700591 EXPECT_TRUE(base::PathExists(JoinPaths(content_path_, kSecondDlc)));
592 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
593
594 EXPECT_TRUE(dlc_service_->InstallCompleted({kSecondDlc}, &err_));
Jae Hoon Kim0d057fb2020-04-13 17:44:38 -0700595
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700596 StatusResult status_result;
597 status_result.set_current_operation(Operation::IDLE);
598 status_result.set_is_install(true);
Amin Hassanic4cc1ee2019-11-14 11:51:35 -0800599 dlc_service_->OnStatusUpdateAdvancedSignal(status_result);
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700600
Amin Hassani6d0367d2020-05-10 18:07:03 -0700601 EXPECT_TRUE(base::PathExists(JoinPaths(content_path_, kSecondDlc)));
602 CheckDlcState(kSecondDlc, DlcState::INSTALLED);
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700603
Amin Hassani86649982020-03-31 16:03:37 -0700604 const auto& dlcs_after = dlc_service_->GetInstalled();
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700605
Amin Hassani6d0367d2020-05-10 18:07:03 -0700606 EXPECT_THAT(dlcs_after, ElementsAre(kFirstDlc, kSecondDlc));
Amin Hassani1ac28312020-06-04 18:16:30 -0700607 EXPECT_FALSE(
608 dlc_service_->GetDlc(kFirstDlc, &err_)->GetRoot().value().empty());
609 EXPECT_FALSE(
610 dlc_service_->GetDlc(kSecondDlc, &err_)->GetRoot().value().empty());
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700611}
612
Amin Hassaniaa38c792020-04-06 15:52:44 -0700613TEST_F(DlcServiceTest, OnStatusUpdateSignalNoRemountTest) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700614 Install(kFirstDlc);
615
Amin Hassani111f2bc2020-04-17 11:53:32 -0700616 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Jae Hoon Kim9090a122019-12-10 09:55:39 -0800617 .WillOnce(Return(true));
Andrew51135f02020-03-02 14:29:07 -0800618 EXPECT_CALL(*mock_update_engine_proxy_ptr_,
Andrew51135f02020-03-02 14:29:07 -0800619 SetDlcActiveValue(true, kSecondDlc, _, _))
620 .WillOnce(Return(true));
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700621 EXPECT_CALL(*mock_image_loader_proxy_ptr_, LoadDlcImage(_, _, _, _, _, _))
Jae Hoon Kimee1ba902020-03-11 09:53:01 -0700622 .WillOnce(DoAll(SetArgPointee<3>(mount_path_.value()), Return(true)));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700623 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(2);
Andrew0a534ed2020-05-06 09:59:17 -0700624 EXPECT_CALL(*mock_metrics_,
625 SendInstallResult(InstallResult::kSuccessNewInstall));
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700626
Amin Hassani6d0367d2020-05-10 18:07:03 -0700627 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
628
629 EXPECT_TRUE(base::PathExists(JoinPaths(content_path_, kSecondDlc)));
Jae Hoon Kimee1ba902020-03-11 09:53:01 -0700630 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700631
Amin Hassani6d0367d2020-05-10 18:07:03 -0700632 EXPECT_TRUE(dlc_service_->InstallCompleted({kSecondDlc}, &err_));
Jae Hoon Kim0d057fb2020-04-13 17:44:38 -0700633
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700634 StatusResult status_result;
635 status_result.set_current_operation(Operation::IDLE);
636 status_result.set_is_install(true);
Amin Hassanic4cc1ee2019-11-14 11:51:35 -0800637 dlc_service_->OnStatusUpdateAdvancedSignal(status_result);
Jae Hoon Kim873404c2019-08-08 15:43:49 -0700638}
639
Amin Hassaniaa38c792020-04-06 15:52:44 -0700640TEST_F(DlcServiceTest, OnStatusUpdateSignalTest) {
Amin Hassani111f2bc2020-04-17 11:53:32 -0700641 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Jae Hoon Kim9090a122019-12-10 09:55:39 -0800642 .WillOnce(Return(true));
Andrew51135f02020-03-02 14:29:07 -0800643 EXPECT_CALL(*mock_update_engine_proxy_ptr_,
644 SetDlcActiveValue(true, kSecondDlc, _, _))
645 .WillOnce(Return(true));
Jae Hoon Kimc7beafd2019-07-22 18:14:47 -0700646 EXPECT_CALL(*mock_image_loader_proxy_ptr_, LoadDlcImage(_, _, _, _, _, _))
Amin Hassani6d0367d2020-05-10 18:07:03 -0700647 .WillOnce(DoAll(SetArgPointee<3>(mount_path_.value()), Return(true)));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700648 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(2);
Andrew0a534ed2020-05-06 09:59:17 -0700649 EXPECT_CALL(*mock_metrics_,
650 SendInstallResult(InstallResult::kSuccessNewInstall));
Jae Hoon Kimc7beafd2019-07-22 18:14:47 -0700651
Amin Hassani6d0367d2020-05-10 18:07:03 -0700652 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
653
654 EXPECT_TRUE(base::PathExists(JoinPaths(content_path_, kSecondDlc)));
655 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
656
657 EXPECT_TRUE(dlc_service_->InstallCompleted({kSecondDlc}, &err_));
Jae Hoon Kim0d057fb2020-04-13 17:44:38 -0700658
Jae Hoon Kim80075fb2019-07-24 12:35:58 -0700659 StatusResult status_result;
660 status_result.set_current_operation(Operation::IDLE);
Jae Hoon Kimc19dabe2019-07-31 09:37:35 -0700661 status_result.set_is_install(true);
Amin Hassanic4cc1ee2019-11-14 11:51:35 -0800662 dlc_service_->OnStatusUpdateAdvancedSignal(status_result);
Jae Hoon Kimc7beafd2019-07-22 18:14:47 -0700663
Jae Hoon Kim3bfeb772020-03-12 15:26:33 -0700664 EXPECT_TRUE(base::PathExists(JoinPaths(content_path_, kSecondDlc)));
665 CheckDlcState(kSecondDlc, DlcState::INSTALLED);
Amin Hassani6d0367d2020-05-10 18:07:03 -0700666}
667
668TEST_F(DlcServiceTest, MountFailureTest) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700669 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
670 .WillOnce(Return(true));
Amin Hassani6d0367d2020-05-10 18:07:03 -0700671 EXPECT_CALL(*mock_image_loader_proxy_ptr_, LoadDlcImage(_, _, _, _, _, _))
672 .WillOnce(DoAll(SetArgPointee<3>(""), Return(true)));
Andrew48a55f22020-06-17 06:50:04 -0700673 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(2);
Andrew0a534ed2020-05-06 09:59:17 -0700674 EXPECT_CALL(*mock_metrics_,
675 SendInstallResult(InstallResult::kFailedToMountImage));
Amin Hassani6d0367d2020-05-10 18:07:03 -0700676
677 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
678
679 EXPECT_TRUE(base::PathExists(JoinPaths(content_path_, kSecondDlc)));
680 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
681 EXPECT_TRUE(dlc_service_->InstallCompleted({kSecondDlc}, &err_));
682
683 StatusResult status_result;
684 status_result.set_current_operation(Operation::IDLE);
685 status_result.set_is_install(true);
686 dlc_service_->OnStatusUpdateAdvancedSignal(status_result);
687
Vyshu9e36f002020-08-31 16:42:04 +0000688 EXPECT_TRUE(base::PathExists(JoinPaths(content_path_, kSecondDlc)));
689 EXPECT_FALSE(dlc_service_->GetDlc(kSecondDlc, &err_)->IsVerified());
Andrew48a55f22020-06-17 06:50:04 -0700690 CheckDlcState(kSecondDlc, DlcState::NOT_INSTALLED, kErrorInternal);
Jae Hoon Kimc7beafd2019-07-22 18:14:47 -0700691}
692
Amin Hassanic4cc1ee2019-11-14 11:51:35 -0800693TEST_F(DlcServiceTest, ReportingFailureCleanupTest) {
Amin Hassani111f2bc2020-04-17 11:53:32 -0700694 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Jae Hoon Kim9090a122019-12-10 09:55:39 -0800695 .WillOnce(Return(true));
Andrew48a55f22020-06-17 06:50:04 -0700696 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(2);
Andrew0a534ed2020-05-06 09:59:17 -0700697 EXPECT_CALL(*mock_metrics_,
698 SendInstallResult(InstallResult::kFailedInstallInUpdateEngine));
Jae Hoon Kim9090a122019-12-10 09:55:39 -0800699
Amin Hassani6d0367d2020-05-10 18:07:03 -0700700 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
Jae Hoon Kim1c9d8582019-10-14 10:52:05 -0700701
Amin Hassani6d0367d2020-05-10 18:07:03 -0700702 EXPECT_TRUE(base::PathExists(JoinPaths(content_path_, kSecondDlc)));
703 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
Jae Hoon Kim1c9d8582019-10-14 10:52:05 -0700704
Jae Hoon Kim1855d262020-02-14 16:06:35 -0800705 {
706 StatusResult status_result;
707 status_result.set_current_operation(Operation::REPORTING_ERROR_EVENT);
708 status_result.set_is_install(true);
709 dlc_service_->OnStatusUpdateAdvancedSignal(status_result);
710 }
711 {
712 StatusResult status_result;
713 status_result.set_current_operation(Operation::IDLE);
714 status_result.set_is_install(false);
715 dlc_service_->OnStatusUpdateAdvancedSignal(status_result);
716 }
Jae Hoon Kim1c9d8582019-10-14 10:52:05 -0700717
Amin Hassani6d0367d2020-05-10 18:07:03 -0700718 EXPECT_FALSE(base::PathExists(JoinPaths(content_path_, kSecondDlc)));
Andrew48a55f22020-06-17 06:50:04 -0700719 CheckDlcState(kSecondDlc, DlcState::NOT_INSTALLED, kErrorInternal);
Jae Hoon Kim1c9d8582019-10-14 10:52:05 -0700720}
721
Jae Hoon Kim39aa9de2019-11-20 09:52:06 -0800722TEST_F(DlcServiceTest, ReportingFailureSignalTest) {
Amin Hassani111f2bc2020-04-17 11:53:32 -0700723 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Jae Hoon Kim9090a122019-12-10 09:55:39 -0800724 .WillOnce(Return(true));
Andrew48a55f22020-06-17 06:50:04 -0700725 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(2);
Andrew0a534ed2020-05-06 09:59:17 -0700726 EXPECT_CALL(*mock_metrics_,
727 SendInstallResult(InstallResult::kFailedInstallInUpdateEngine));
Jae Hoon Kim9090a122019-12-10 09:55:39 -0800728
Amin Hassani6d0367d2020-05-10 18:07:03 -0700729 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
Jae Hoon Kim39aa9de2019-11-20 09:52:06 -0800730
Amin Hassani6d0367d2020-05-10 18:07:03 -0700731 EXPECT_TRUE(base::PathExists(JoinPaths(content_path_, kSecondDlc)));
732 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
Jae Hoon Kim39aa9de2019-11-20 09:52:06 -0800733
Jae Hoon Kim1855d262020-02-14 16:06:35 -0800734 {
735 StatusResult status_result;
736 status_result.set_current_operation(Operation::REPORTING_ERROR_EVENT);
737 status_result.set_is_install(true);
738 dlc_service_->OnStatusUpdateAdvancedSignal(status_result);
739 }
740 {
741 StatusResult status_result;
742 status_result.set_current_operation(Operation::IDLE);
743 status_result.set_is_install(false);
744 dlc_service_->OnStatusUpdateAdvancedSignal(status_result);
745 }
746
Andrew48a55f22020-06-17 06:50:04 -0700747 CheckDlcState(kSecondDlc, DlcState::NOT_INSTALLED, kErrorInternal);
Jae Hoon Kim39aa9de2019-11-20 09:52:06 -0800748}
749
Amin Hassanic4cc1ee2019-11-14 11:51:35 -0800750TEST_F(DlcServiceTest, ProbableUpdateEngineRestartCleanupTest) {
Amin Hassani111f2bc2020-04-17 11:53:32 -0700751 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Jae Hoon Kim9090a122019-12-10 09:55:39 -0800752 .WillOnce(Return(true));
Andrew48a55f22020-06-17 06:50:04 -0700753 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(2);
Andrew0a534ed2020-05-06 09:59:17 -0700754 EXPECT_CALL(*mock_metrics_,
755 SendInstallResult(InstallResult::kFailedInstallInUpdateEngine));
Jae Hoon Kim9090a122019-12-10 09:55:39 -0800756
Amin Hassani6d0367d2020-05-10 18:07:03 -0700757 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
Jae Hoon Kim1c9d8582019-10-14 10:52:05 -0700758
Amin Hassani6d0367d2020-05-10 18:07:03 -0700759 EXPECT_TRUE(base::PathExists(JoinPaths(content_path_, kSecondDlc)));
760 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
Jae Hoon Kim1c9d8582019-10-14 10:52:05 -0700761
762 StatusResult status_result;
763 status_result.set_current_operation(Operation::IDLE);
764 status_result.set_is_install(false);
Amin Hassanic4cc1ee2019-11-14 11:51:35 -0800765 dlc_service_->OnStatusUpdateAdvancedSignal(status_result);
Jae Hoon Kim1c9d8582019-10-14 10:52:05 -0700766
Amin Hassani6d0367d2020-05-10 18:07:03 -0700767 EXPECT_FALSE(base::PathExists(JoinPaths(content_path_, kSecondDlc)));
Andrew48a55f22020-06-17 06:50:04 -0700768 CheckDlcState(kSecondDlc, DlcState::NOT_INSTALLED, kErrorInternal);
Jae Hoon Kim1c9d8582019-10-14 10:52:05 -0700769}
770
Amin Hassaniaa38c792020-04-06 15:52:44 -0700771TEST_F(DlcServiceTest, OnStatusUpdateSignalDownloadProgressTest) {
Amin Hassani111f2bc2020-04-17 11:53:32 -0700772 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Jae Hoon Kim9090a122019-12-10 09:55:39 -0800773 .WillOnce(Return(true));
Andrew51135f02020-03-02 14:29:07 -0800774 EXPECT_CALL(*mock_update_engine_proxy_ptr_,
775 SetDlcActiveValue(true, kSecondDlc, _, _))
776 .WillOnce(Return(true));
Jae Hoon Kim9090a122019-12-10 09:55:39 -0800777 EXPECT_CALL(*mock_image_loader_proxy_ptr_, LoadDlcImage(_, _, _, _, _, _))
Jae Hoon Kima170cfb2020-03-11 09:02:29 -0700778 .WillRepeatedly(
779 DoAll(SetArgPointee<3>(mount_path_.value()), Return(true)));
Amin Hassani78a5ec82020-05-19 09:47:49 -0700780 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(2);
Andrew0a534ed2020-05-06 09:59:17 -0700781 EXPECT_CALL(*mock_metrics_,
782 SendInstallResult(InstallResult::kSuccessNewInstall));
Jae Hoon Kim39aa9de2019-11-20 09:52:06 -0800783
Amin Hassani6d0367d2020-05-10 18:07:03 -0700784 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
785 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
786
Jae Hoon Kim39aa9de2019-11-20 09:52:06 -0800787 StatusResult status_result;
788 status_result.set_is_install(true);
789
Jae Hoon Kimee1ba902020-03-11 09:53:01 -0700790 const vector<Operation> install_operation_sequence = {
Jae Hoon Kim39aa9de2019-11-20 09:52:06 -0800791 Operation::CHECKING_FOR_UPDATE, Operation::UPDATE_AVAILABLE,
792 Operation::FINALIZING};
793
794 for (const auto& op : install_operation_sequence) {
795 status_result.set_current_operation(op);
796 dlc_service_->OnStatusUpdateAdvancedSignal(status_result);
Jae Hoon Kim39aa9de2019-11-20 09:52:06 -0800797 }
798
799 status_result.set_current_operation(Operation::DOWNLOADING);
800 dlc_service_->OnStatusUpdateAdvancedSignal(status_result);
Jae Hoon Kim39aa9de2019-11-20 09:52:06 -0800801
Amin Hassani6d0367d2020-05-10 18:07:03 -0700802 EXPECT_TRUE(dlc_service_->InstallCompleted({kSecondDlc}, &err_));
Jae Hoon Kim0d057fb2020-04-13 17:44:38 -0700803
Jae Hoon Kim39aa9de2019-11-20 09:52:06 -0800804 status_result.set_current_operation(Operation::IDLE);
805 dlc_service_->OnStatusUpdateAdvancedSignal(status_result);
Jae Hoon Kimee1ba902020-03-11 09:53:01 -0700806
Amin Hassani6d0367d2020-05-10 18:07:03 -0700807 CheckDlcState(kSecondDlc, DlcState::INSTALLED);
Jae Hoon Kim39aa9de2019-11-20 09:52:06 -0800808}
809
Amin Hassaniaa38c792020-04-06 15:52:44 -0700810TEST_F(DlcServiceTest,
811 OnStatusUpdateSignalSubsequentialBadOrNonInstalledDlcsNonBlocking) {
Jae Hoon Kimdcf783e2020-01-24 14:06:02 -0800812 for (int i = 0; i < 5; i++) {
Amin Hassani111f2bc2020-04-17 11:53:32 -0700813 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
Jae Hoon Kimdcf783e2020-01-24 14:06:02 -0800814 .WillOnce(Return(true));
Jae Hoon Kimdcf783e2020-01-24 14:06:02 -0800815 EXPECT_CALL(*mock_image_loader_proxy_ptr_, LoadDlcImage(_, _, _, _, _, _))
816 .WillOnce(Return(false));
Andrew48a55f22020-06-17 06:50:04 -0700817 EXPECT_CALL(mock_state_change_reporter_, DlcStateChanged(_)).Times(2);
Andrew0a534ed2020-05-06 09:59:17 -0700818 EXPECT_CALL(*mock_metrics_,
819 SendInstallResult(InstallResult::kFailedToMountImage));
Amin Hassani6d0367d2020-05-10 18:07:03 -0700820
821 EXPECT_TRUE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
822 CheckDlcState(kSecondDlc, DlcState::INSTALLING);
823
824 EXPECT_TRUE(dlc_service_->InstallCompleted({kSecondDlc}, &err_));
825
Jae Hoon Kimdcf783e2020-01-24 14:06:02 -0800826 StatusResult status_result;
827 status_result.set_is_install(true);
828 status_result.set_current_operation(Operation::IDLE);
829 dlc_service_->OnStatusUpdateAdvancedSignal(status_result);
Vyshu9e36f002020-08-31 16:42:04 +0000830 EXPECT_TRUE(base::PathExists(JoinPaths(content_path_, kSecondDlc)));
Andrew48a55f22020-06-17 06:50:04 -0700831 CheckDlcState(kSecondDlc, DlcState::NOT_INSTALLED, kErrorInternal);
Jae Hoon Kimdcf783e2020-01-24 14:06:02 -0800832 }
833}
834
Jae Hoon Kim9a27d152020-04-10 12:50:14 -0700835TEST_F(DlcServiceTest, InstallCompleted) {
Amin Hassani6d0367d2020-05-10 18:07:03 -0700836 EXPECT_TRUE(dlc_service_->InstallCompleted({kSecondDlc}, &err_));
Amin Hassani1ac28312020-06-04 18:16:30 -0700837 EXPECT_TRUE(dlc_service_->GetDlc(kSecondDlc, &err_)->IsVerified());
Jae Hoon Kim9a27d152020-04-10 12:50:14 -0700838}
839
840TEST_F(DlcServiceTest, UpdateCompleted) {
Jae Hoon Kim9a27d152020-04-10 12:50:14 -0700841 auto inactive_boot_slot = SystemState::Get()->inactive_boot_slot();
Amin Hassani6d0367d2020-05-10 18:07:03 -0700842 EXPECT_FALSE(
843 Prefs(DlcBase(kSecondDlc), inactive_boot_slot).Exists(kDlcPrefVerified));
Jae Hoon Kim9a27d152020-04-10 12:50:14 -0700844 EXPECT_TRUE(dlc_service_->UpdateCompleted({kFirstDlc, kSecondDlc}, &err_));
Amin Hassani6d0367d2020-05-10 18:07:03 -0700845 EXPECT_TRUE(
846 Prefs(DlcBase(kSecondDlc), inactive_boot_slot).Exists(kDlcPrefVerified));
Jae Hoon Kim9a27d152020-04-10 12:50:14 -0700847}
848
Jae Hoon Kim7d0001e2021-07-07 13:04:40 -0700849TEST_F(DlcServiceTest, UpdatedNeedRebootClearsInstalling) {
850 // TODO(kimjae): Eventually move all tests to use mocks instead of setup.
851 auto mock_dlc_manager = std::make_unique<StrictMock<MockDlcManager>>();
852 auto* mock_dlc_manager_ptr = mock_dlc_manager.get();
853
854 dlc_service_->SetDlcManagerForTest(std::move(mock_dlc_manager));
855
856 EXPECT_CALL(*mock_dlc_manager_ptr, Install(_, _, _))
857 .WillOnce(DoAll(SetArgPointee<1>(true), Return(true)));
858 EXPECT_CALL(*mock_dlc_manager_ptr, CancelInstall(kSecondDlc, _, _))
859 .WillOnce(Return(true));
860 EXPECT_CALL(*mock_metrics_, SendInstallResult(_));
861
862 StatusResult status;
863 status.set_current_operation(Operation::UPDATED_NEED_REBOOT);
864 SystemState::Get()->set_update_engine_status(status);
865
866 EXPECT_FALSE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
867}
868
869TEST_F(DlcServiceTest, UpdateEngineFailureClearsInstalling) {
870 // TODO(kimjae): Eventually move all tests to use mocks instead of setup.
871 auto mock_dlc_manager = std::make_unique<StrictMock<MockDlcManager>>();
872 auto* mock_dlc_manager_ptr = mock_dlc_manager.get();
873
874 dlc_service_->SetDlcManagerForTest(std::move(mock_dlc_manager));
875
876 EXPECT_CALL(*mock_dlc_manager_ptr, Install(_, _, _))
877 .WillOnce(DoAll(SetArgPointee<1>(true), Return(true)));
878 EXPECT_CALL(*mock_dlc_manager_ptr, CancelInstall(kSecondDlc, _, _))
879 .WillOnce(Return(true));
880 EXPECT_CALL(*mock_update_engine_proxy_ptr_, AttemptInstall(_, _, _, _))
881 .WillOnce(Return(false));
882 EXPECT_CALL(*mock_metrics_, SendInstallResult(_));
883
884 StatusResult status;
885 status.set_current_operation(Operation::IDLE);
886 SystemState::Get()->set_update_engine_status(status);
887
888 EXPECT_FALSE(dlc_service_->Install(kSecondDlc, kDefaultOmahaUrl, &err_));
889}
890
Xiaochu Liuc2b65f52018-07-20 12:47:05 -0700891} // namespace dlcservice