blob: b1e5a269976f8e1e21fec6abad8ba7f8f8f344b5 [file] [log] [blame]
Amin Hassani10c8c6c2020-04-06 12:28:59 -07001// Copyright 2020 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 "dlcservice/test_utils.h"
6
Amin Hassanif2efc5a2020-05-25 21:22:57 -07007#include <string>
Amin Hassani10c8c6c2020-04-06 12:28:59 -07008#include <utility>
Amin Hassanif2efc5a2020-05-25 21:22:57 -07009#include <vector>
Amin Hassani10c8c6c2020-04-06 12:28:59 -070010
Qijiang Fan713061e2021-03-08 15:45:12 +090011#include <base/check.h>
Amin Hassani10c8c6c2020-04-06 12:28:59 -070012#include <base/files/file_path.h>
13#include <base/files/file_util.h>
14#include <base/files/scoped_temp_dir.h>
15#include <dbus/dlcservice/dbus-constants.h>
16#include <gmock/gmock.h>
17#include <gtest/gtest.h>
18#include <imageloader/dbus-proxy-mocks.h>
Andrew4d454002020-05-06 09:59:17 -070019#include <metrics/metrics_library_mock.h>
Amin Hassani10c8c6c2020-04-06 12:28:59 -070020#include <update_engine/dbus-constants.h>
21#include <update_engine/dbus-proxy-mocks.h>
22
23#include "dlcservice/boot/boot_slot.h"
Amin Hassani10c8c6c2020-04-06 12:28:59 -070024#include "dlcservice/dlc.h"
Andrew4d454002020-05-06 09:59:17 -070025#include "dlcservice/metrics.h"
Jae Hoon Kim0d057fb2020-04-13 17:44:38 -070026#include "dlcservice/system_state.h"
Amin Hassani10c8c6c2020-04-06 12:28:59 -070027#include "dlcservice/utils.h"
28
29using std::string;
Amin Hassanif2efc5a2020-05-25 21:22:57 -070030using std::vector;
Amin Hassani10c8c6c2020-04-06 12:28:59 -070031using testing::_;
Mike Frysinger0cc18562021-01-04 02:16:54 -050032using testing::DoAll;
Amin Hassani10c8c6c2020-04-06 12:28:59 -070033using testing::Return;
34using testing::SetArgPointee;
35using testing::StrictMock;
36
37namespace dlcservice {
38
Amin Hassanic0208d72020-04-23 22:49:31 -070039const char kFirstDlc[] = "first-dlc";
40const char kSecondDlc[] = "second-dlc";
41const char kThirdDlc[] = "third-dlc";
42const char kPackage[] = "package";
Amin Hassani10c8c6c2020-04-06 12:28:59 -070043const char kDefaultOmahaUrl[] = "http://foo-url";
44
45BaseTest::BaseTest() {
46 // Create mocks with default behaviors.
47 mock_image_loader_proxy_ =
48 std::make_unique<StrictMock<ImageLoaderProxyMock>>();
49 mock_image_loader_proxy_ptr_ = mock_image_loader_proxy_.get();
50
51 mock_update_engine_proxy_ =
52 std::make_unique<StrictMock<UpdateEngineProxyMock>>();
53 mock_update_engine_proxy_ptr_ = mock_update_engine_proxy_.get();
Amin Hassani759090b2020-04-13 12:31:10 -070054
55 mock_session_manager_proxy_ =
56 std::make_unique<StrictMock<SessionManagerProxyMock>>();
57 mock_session_manager_proxy_ptr_ = mock_session_manager_proxy_.get();
Jae Hoon Kim23c7f492020-06-26 10:30:09 -070058
59 mock_boot_device_ = std::make_unique<MockBootDevice>();
60 mock_boot_device_ptr_ = mock_boot_device_.get();
61 EXPECT_CALL(*mock_boot_device_, GetBootDevice())
62 .WillOnce(Return("/dev/sdb5"));
63 ON_CALL(*mock_boot_device_, IsRemovableDevice(_))
64 .WillByDefault(Return(false));
65 EXPECT_CALL(*mock_boot_device_, IsRemovableDevice(_)).Times(1);
Amin Hassani10c8c6c2020-04-06 12:28:59 -070066}
67
68void BaseTest::SetUp() {
Amin Hassanif656f292020-06-08 16:20:01 -070069 loop_.SetAsCurrent();
70
Amin Hassani10c8c6c2020-04-06 12:28:59 -070071 SetUpFilesAndDirectories();
72
Andrew0a534ed2020-05-06 09:59:17 -070073 auto mock_metrics = std::make_unique<testing::StrictMock<MockMetrics>>();
74 mock_metrics_ = mock_metrics.get();
Andrew4d454002020-05-06 09:59:17 -070075
Jae Hoon Kim9318f342020-09-10 14:38:13 -070076 auto mock_system_properties =
77 std::make_unique<testing::StrictMock<MockSystemProperties>>();
78 mock_system_properties_ = mock_system_properties.get();
79
Amin Hassani10c8c6c2020-04-06 12:28:59 -070080 SystemState::Initialize(
81 std::move(mock_image_loader_proxy_), std::move(mock_update_engine_proxy_),
Amin Hassani78a5ec82020-05-19 09:47:49 -070082 std::move(mock_session_manager_proxy_), &mock_state_change_reporter_,
Jae Hoon Kim23c7f492020-06-26 10:30:09 -070083 std::make_unique<BootSlot>(std::move(mock_boot_device_)),
Jae Hoon Kim9318f342020-09-10 14:38:13 -070084 std::move(mock_metrics), std::move(mock_system_properties),
85 manifest_path_, preloaded_content_path_, content_path_, prefs_path_,
86 users_path_, &clock_,
87 /*for_test=*/true);
Amin Hassani10c8c6c2020-04-06 12:28:59 -070088}
89
90void BaseTest::SetUpFilesAndDirectories() {
91 // Initialize DLC path.
92 CHECK(scoped_temp_dir_.CreateUniqueTempDir());
93 manifest_path_ = JoinPaths(scoped_temp_dir_.GetPath(), "rootfs");
94 preloaded_content_path_ =
95 JoinPaths(scoped_temp_dir_.GetPath(), "preloaded_stateful");
96 content_path_ = JoinPaths(scoped_temp_dir_.GetPath(), "stateful");
Amin Hassanife63fc22020-04-07 11:34:34 -070097 prefs_path_ = JoinPaths(scoped_temp_dir_.GetPath(), "var_lib_dlcservice");
Amin Hassanibfad7b82020-04-13 12:33:47 -070098 users_path_ = JoinPaths(scoped_temp_dir_.GetPath(), "users");
Amin Hassani10c8c6c2020-04-06 12:28:59 -070099 mount_path_ = JoinPaths(scoped_temp_dir_.GetPath(), "mount");
100 base::FilePath mount_root_path = JoinPaths(mount_path_, "root");
101 base::CreateDirectory(manifest_path_);
102 base::CreateDirectory(preloaded_content_path_);
103 base::CreateDirectory(content_path_);
Amin Hassanife63fc22020-04-07 11:34:34 -0700104 base::CreateDirectory(prefs_path_);
Amin Hassanibfad7b82020-04-13 12:33:47 -0700105 base::CreateDirectory(users_path_);
Amin Hassani10c8c6c2020-04-06 12:28:59 -0700106 base::CreateDirectory(mount_root_path);
107 testdata_path_ = JoinPaths(getenv("SRC"), "testdata");
108
109 // Create DLC manifest sub-directories.
110 for (auto&& id : {kFirstDlc, kSecondDlc, kThirdDlc}) {
111 base::CreateDirectory(JoinPaths(manifest_path_, id, kPackage));
112 base::CopyFile(JoinPaths(testdata_path_, id, kPackage, kManifestName),
113 JoinPaths(manifest_path_, id, kPackage, kManifestName));
114 }
115}
116
Amin Hassanic0867b62020-04-16 09:44:34 -0700117int64_t GetFileSize(const base::FilePath& path) {
Amin Hassani10c8c6c2020-04-06 12:28:59 -0700118 int64_t file_size;
119 EXPECT_TRUE(base::GetFileSize(path, &file_size));
120 return file_size;
121}
122
Amin Hassani28ed9002020-05-28 12:37:01 -0700123base::FilePath BaseTest::SetUpDlcPreloadedImage(const DlcId& id) {
Amin Hassanif2efc5a2020-05-25 21:22:57 -0700124 imageloader::Manifest manifest;
125 dlcservice::GetDlcManifest(manifest_path_, id, kPackage, &manifest);
126
Amin Hassani10c8c6c2020-04-06 12:28:59 -0700127 base::FilePath image_path =
128 JoinPaths(preloaded_content_path_, id, kPackage, kDlcImageFileName);
Amin Hassanif2efc5a2020-05-25 21:22:57 -0700129 CreateFile(image_path, manifest.size());
Amin Hassani28ed9002020-05-28 12:37:01 -0700130 EXPECT_TRUE(base::PathExists(image_path));
Amin Hassanif2efc5a2020-05-25 21:22:57 -0700131
132 string data(manifest.size(), '1');
Amin Hassani7c6543f2020-06-02 16:16:43 -0700133 WriteToImage(image_path, data);
Amin Hassani28ed9002020-05-28 12:37:01 -0700134
135 return image_path;
Amin Hassani10c8c6c2020-04-06 12:28:59 -0700136}
137
138// Will create |path/|id|/|package|/dlc_[a|b]/dlc.img files.
139void BaseTest::SetUpDlcWithSlots(const DlcId& id) {
Amin Hassanif2efc5a2020-05-25 21:22:57 -0700140 imageloader::Manifest manifest;
141 dlcservice::GetDlcManifest(manifest_path_, id, kPackage, &manifest);
142
Amin Hassani10c8c6c2020-04-06 12:28:59 -0700143 // Create DLC content sub-directories and empty images.
144 for (const auto& slot : {BootSlot::Slot::A, BootSlot::Slot::B}) {
145 base::FilePath image_path =
146 GetDlcImagePath(content_path_, id, kPackage, slot);
Amin Hassanif2efc5a2020-05-25 21:22:57 -0700147 CreateFile(image_path, manifest.preallocated_size());
148 }
149}
150
151void BaseTest::InstallWithUpdateEngine(const vector<string>& ids) {
152 for (const auto& id : ids) {
153 imageloader::Manifest manifest;
154 dlcservice::GetDlcManifest(manifest_path_, id, kPackage, &manifest);
155 base::FilePath image_path = GetDlcImagePath(
156 content_path_, id, kPackage, SystemState::Get()->active_boot_slot());
157
158 string data(manifest.size(), '1');
Amin Hassani7c6543f2020-06-02 16:16:43 -0700159 WriteToImage(image_path, data);
Amin Hassani10c8c6c2020-04-06 12:28:59 -0700160 }
161}
162
163void BaseTest::SetMountPath(const string& mount_path_expected) {
164 ON_CALL(*mock_image_loader_proxy_ptr_, LoadDlcImage(_, _, _, _, _, _))
165 .WillByDefault(
166 DoAll(SetArgPointee<3>(mount_path_expected), Return(true)));
167}
168
169} // namespace dlcservice