blob: 4d67b5e2c2b3a5a8713592563253a882eaf18d27 [file] [log] [blame]
Mike Frysinger8155d082012-04-06 15:23:18 -04001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
adlr@google.com3defe6a2009-12-04 20:57:17 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Darin Petkov698d0412010-10-13 10:59:44 -07005#include <fcntl.h>
6
adlr@google.com3defe6a2009-12-04 20:57:17 +00007#include <set>
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -08008#include <string>
adlr@google.com3defe6a2009-12-04 20:57:17 +00009#include <vector>
Darin Petkov698d0412010-10-13 10:59:44 -070010
Chris Sosafc661a12013-02-26 14:43:21 -080011#include <base/posix/eintr_wrapper.h>
Alex Vakulenko75039d72014-03-25 12:36:28 -070012#include <base/strings/string_util.h>
13#include <base/strings/stringprintf.h>
Darin Petkov698d0412010-10-13 10:59:44 -070014#include <glib.h>
Don Garrett83692e42013-11-08 10:11:30 -080015#include <gmock/gmock.h>
adlr@google.com3defe6a2009-12-04 20:57:17 +000016#include <gtest/gtest.h>
Darin Petkov698d0412010-10-13 10:59:44 -070017
Gilad Arnold5bb4c902014-04-10 12:32:13 -070018#include "update_engine/fake_system_state.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000019#include "update_engine/filesystem_copier_action.h"
Don Garrett6646b442013-11-13 15:29:11 -080020#include "update_engine/mock_hardware.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000021#include "update_engine/omaha_hash_calculator.h"
22#include "update_engine/test_utils.h"
23#include "update_engine/utils.h"
24
25using std::set;
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -080026using std::string;
adlr@google.com3defe6a2009-12-04 20:57:17 +000027using std::vector;
28
29namespace chromeos_update_engine {
30
31class FilesystemCopierActionTest : public ::testing::Test {
32 protected:
Darin Petkov3aefa862010-12-07 14:45:00 -080033 // |verify_hash|: 0 - no hash verification, 1 -- successful hash verification,
34 // 2 -- hash verification failure.
Gilad Arnoldae236702012-05-17 09:33:20 -070035 // Returns true iff test has completed successfully.
Gilad Arnoldae236702012-05-17 09:33:20 -070036 bool DoTest(bool run_out_of_space,
Andrew de los Reyesf9185172010-05-03 11:07:05 -070037 bool terminate_early,
Darin Petkov3aefa862010-12-07 14:45:00 -080038 bool use_kernel_partition,
Gilad Arnold6dbbd392012-07-10 16:19:11 -070039 int verify_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +000040 void SetUp() {
adlr@google.com3defe6a2009-12-04 20:57:17 +000041 }
42 void TearDown() {
adlr@google.com3defe6a2009-12-04 20:57:17 +000043 }
Don Garrett6646b442013-11-13 15:29:11 -080044
Gilad Arnold5bb4c902014-04-10 12:32:13 -070045 FakeSystemState fake_system_state_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000046};
47
48class FilesystemCopierActionTestDelegate : public ActionProcessorDelegate {
49 public:
Ben Chan2add7d72012-10-08 19:28:37 -070050 FilesystemCopierActionTestDelegate(GMainLoop* loop,
51 FilesystemCopierAction* action)
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -070052 : loop_(loop), action_(action), ran_(false), code_(ErrorCode::kError) {}
Andrew de los Reyesc7020782010-04-28 10:46:04 -070053 void ExitMainLoop() {
Ben Chan2add7d72012-10-08 19:28:37 -070054 GMainContext* context = g_main_loop_get_context(loop_);
55 // We cannot use g_main_context_pending() alone to determine if it is safe
56 // to quit the main loop here becasuse g_main_context_pending() may return
57 // FALSE when g_input_stream_read_async() in FilesystemCopierAction has
58 // been cancelled but the callback has not yet been invoked.
59 while (g_main_context_pending(context) || action_->IsCleanupPending()) {
60 g_main_context_iteration(context, false);
61 g_usleep(100);
Andrew de los Reyesc7020782010-04-28 10:46:04 -070062 }
adlr@google.com3defe6a2009-12-04 20:57:17 +000063 g_main_loop_quit(loop_);
64 }
David Zeuthena99981f2013-04-29 13:42:47 -070065 void ProcessingDone(const ActionProcessor* processor, ErrorCode code) {
Andrew de los Reyesc7020782010-04-28 10:46:04 -070066 ExitMainLoop();
67 }
68 void ProcessingStopped(const ActionProcessor* processor) {
69 ExitMainLoop();
70 }
adlr@google.com3defe6a2009-12-04 20:57:17 +000071 void ActionCompleted(ActionProcessor* processor,
72 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -070073 ErrorCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000074 if (action->Type() == FilesystemCopierAction::StaticType()) {
75 ran_ = true;
Darin Petkovc1a8b422010-07-19 11:34:49 -070076 code_ = code;
adlr@google.com3defe6a2009-12-04 20:57:17 +000077 }
78 }
Ben Chan2add7d72012-10-08 19:28:37 -070079 bool ran() const { return ran_; }
David Zeuthena99981f2013-04-29 13:42:47 -070080 ErrorCode code() const { return code_; }
Alex Vakulenkod2779df2014-06-16 13:19:00 -070081
adlr@google.com3defe6a2009-12-04 20:57:17 +000082 private:
83 GMainLoop* loop_;
Ben Chan2add7d72012-10-08 19:28:37 -070084 FilesystemCopierAction* action_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000085 bool ran_;
David Zeuthena99981f2013-04-29 13:42:47 -070086 ErrorCode code_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000087};
88
Andrew de los Reyesc7020782010-04-28 10:46:04 -070089struct StartProcessorCallbackArgs {
90 ActionProcessor* processor;
91 FilesystemCopierAction* filesystem_copier_action;
92 bool terminate_early;
93};
94
adlr@google.com3defe6a2009-12-04 20:57:17 +000095gboolean StartProcessorInRunLoop(gpointer data) {
Andrew de los Reyesc7020782010-04-28 10:46:04 -070096 StartProcessorCallbackArgs* args =
97 reinterpret_cast<StartProcessorCallbackArgs*>(data);
98 ActionProcessor* processor = args->processor;
adlr@google.com3defe6a2009-12-04 20:57:17 +000099 processor->StartProcessing();
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700100 if (args->terminate_early) {
101 EXPECT_TRUE(args->filesystem_copier_action);
102 args->processor->StopProcessing();
103 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000104 return FALSE;
105}
106
Gilad Arnold581c2ea2012-07-19 12:33:49 -0700107// TODO(garnold) Temporarily disabling this test, see chromium-os:31082 for
108// details; still trying to track down the root cause for these rare write
109// failures and whether or not they are due to the test setup or an inherent
110// issue with the chroot environiment, library versions we use, etc.
111TEST_F(FilesystemCopierActionTest, DISABLED_RunAsRootSimpleTest) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000112 ASSERT_EQ(0, getuid());
Don Garrett83692e42013-11-08 10:11:30 -0800113 bool test = DoTest(false, false, true, 0);
Gilad Arnold581c2ea2012-07-19 12:33:49 -0700114 EXPECT_TRUE(test);
115 if (!test)
116 return;
Don Garrett83692e42013-11-08 10:11:30 -0800117 test = DoTest(false, false, false, 0);
Gilad Arnold581c2ea2012-07-19 12:33:49 -0700118 EXPECT_TRUE(test);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000119}
Darin Petkov3aefa862010-12-07 14:45:00 -0800120
Gilad Arnoldae236702012-05-17 09:33:20 -0700121bool FilesystemCopierActionTest::DoTest(bool run_out_of_space,
Andrew de los Reyesf9185172010-05-03 11:07:05 -0700122 bool terminate_early,
Darin Petkov3aefa862010-12-07 14:45:00 -0800123 bool use_kernel_partition,
Gilad Arnold6dbbd392012-07-10 16:19:11 -0700124 int verify_hash) {
Don Garrett6646b442013-11-13 15:29:11 -0800125 // We need MockHardware to verify MarkUnbootable calls, but don't want
126 // warnings about other usages.
127 testing::NiceMock<MockHardware> mock_hardware;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700128 fake_system_state_.set_hardware(&mock_hardware);
Don Garrett83692e42013-11-08 10:11:30 -0800129
adlr@google.com3defe6a2009-12-04 20:57:17 +0000130 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
131
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700132 string a_loop_file;
133 string b_loop_file;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700134
Gilad Arnolda6742b32014-01-11 00:18:34 -0800135 if (!(utils::MakeTempFile("a_loop_file.XXXXXX", &a_loop_file, NULL) &&
136 utils::MakeTempFile("b_loop_file.XXXXXX", &b_loop_file, NULL))) {
Gilad Arnoldae236702012-05-17 09:33:20 -0700137 ADD_FAILURE();
138 return false;
139 }
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700140 ScopedPathUnlinker a_loop_file_unlinker(a_loop_file);
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700141 ScopedPathUnlinker b_loop_file_unlinker(b_loop_file);
Darin Petkovc1a8b422010-07-19 11:34:49 -0700142
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700143 // Make random data for a, zero filled data for b.
Gilad Arnold6dbbd392012-07-10 16:19:11 -0700144 const size_t kLoopFileSize = 10 * 1024 * 1024 + 512;
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700145 vector<char> a_loop_data(kLoopFileSize);
146 FillWithData(&a_loop_data);
147 vector<char> b_loop_data(run_out_of_space ?
148 (kLoopFileSize - 1) :
149 kLoopFileSize,
150 '\0'); // Fill with 0s
adlr@google.com3defe6a2009-12-04 20:57:17 +0000151
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700152 // Write data to disk
Gilad Arnoldae236702012-05-17 09:33:20 -0700153 if (!(WriteFileVector(a_loop_file, a_loop_data) &&
154 WriteFileVector(b_loop_file, b_loop_data))) {
155 ADD_FAILURE();
156 return false;
157 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000158
Don Garrett58e8b1f2012-01-31 16:38:16 -0800159 // Attach loop devices to the files
160 string a_dev;
161 string b_dev;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000162
Don Garrett58e8b1f2012-01-31 16:38:16 -0800163 ScopedLoopbackDeviceBinder a_dev_releaser(a_loop_file, &a_dev);
164 ScopedLoopbackDeviceBinder b_dev_releaser(b_loop_file, &b_dev);
Gilad Arnoldc33faeb2012-07-24 15:11:11 -0700165 if (!(a_dev_releaser.is_bound() && b_dev_releaser.is_bound())) {
166 ADD_FAILURE();
167 return false;
168 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000169
Gilad Arnoldc33faeb2012-07-24 15:11:11 -0700170 LOG(INFO) << "copying: "
171 << a_loop_file << " (" << a_dev << ") -> "
172 << b_loop_file << " (" << b_dev << ", "
173 << kLoopFileSize << " bytes";
Gilad Arnoldae236702012-05-17 09:33:20 -0700174 bool success = true;
175
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700176 // Set up the action objects
adlr@google.com3defe6a2009-12-04 20:57:17 +0000177 InstallPlan install_plan;
Darin Petkov3aefa862010-12-07 14:45:00 -0800178 if (verify_hash) {
179 if (use_kernel_partition) {
180 install_plan.kernel_install_path = a_dev;
181 install_plan.kernel_size =
182 kLoopFileSize - ((verify_hash == 2) ? 1 : 0);
Gilad Arnoldae236702012-05-17 09:33:20 -0700183 if (!OmahaHashCalculator::RawHashOfData(a_loop_data,
184 &install_plan.kernel_hash)) {
185 ADD_FAILURE();
186 success = false;
187 }
Darin Petkov3aefa862010-12-07 14:45:00 -0800188 } else {
189 install_plan.install_path = a_dev;
190 install_plan.rootfs_size =
191 kLoopFileSize - ((verify_hash == 2) ? 1 : 0);
Gilad Arnoldae236702012-05-17 09:33:20 -0700192 if (!OmahaHashCalculator::RawHashOfData(a_loop_data,
193 &install_plan.rootfs_hash)) {
194 ADD_FAILURE();
195 success = false;
196 }
Darin Petkov3aefa862010-12-07 14:45:00 -0800197 }
198 } else {
199 if (use_kernel_partition) {
200 install_plan.kernel_install_path = b_dev;
201 } else {
202 install_plan.install_path = b_dev;
203 }
204 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000205
Don Garrett6646b442013-11-13 15:29:11 -0800206 EXPECT_CALL(mock_hardware,
Don Garrett83692e42013-11-08 10:11:30 -0800207 MarkKernelUnbootable(a_dev)).Times(use_kernel_partition ? 1 : 0);
208
adlr@google.com3defe6a2009-12-04 20:57:17 +0000209 ActionProcessor processor;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000210
211 ObjectFeederAction<InstallPlan> feeder_action;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700212 FilesystemCopierAction copier_action(&fake_system_state_,
Alex Deymo42432912013-07-12 20:21:15 -0700213 use_kernel_partition,
Gilad Arnold581c2ea2012-07-19 12:33:49 -0700214 verify_hash != 0);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000215 ObjectCollectorAction<InstallPlan> collector_action;
216
217 BondActions(&feeder_action, &copier_action);
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700218 BondActions(&copier_action, &collector_action);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000219
Ben Chan2add7d72012-10-08 19:28:37 -0700220 FilesystemCopierActionTestDelegate delegate(loop, &copier_action);
221 processor.set_delegate(&delegate);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000222 processor.EnqueueAction(&feeder_action);
223 processor.EnqueueAction(&copier_action);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000224 processor.EnqueueAction(&collector_action);
225
Darin Petkov3aefa862010-12-07 14:45:00 -0800226 if (!verify_hash) {
227 copier_action.set_copy_source(a_dev);
228 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000229 feeder_action.set_obj(install_plan);
230
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700231 StartProcessorCallbackArgs start_callback_args;
232 start_callback_args.processor = &processor;
233 start_callback_args.filesystem_copier_action = &copier_action;
234 start_callback_args.terminate_early = terminate_early;
235
236 g_timeout_add(0, &StartProcessorInRunLoop, &start_callback_args);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000237 g_main_loop_run(loop);
238 g_main_loop_unref(loop);
239
Gilad Arnoldae236702012-05-17 09:33:20 -0700240 if (!terminate_early) {
241 bool is_delegate_ran = delegate.ran();
242 EXPECT_TRUE(is_delegate_ran);
243 success = success && is_delegate_ran;
244 }
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700245 if (run_out_of_space || terminate_early) {
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700246 EXPECT_EQ(ErrorCode::kError, delegate.code());
247 return (ErrorCode::kError == delegate.code());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000248 }
Darin Petkov3aefa862010-12-07 14:45:00 -0800249 if (verify_hash == 2) {
David Zeuthena99981f2013-04-29 13:42:47 -0700250 ErrorCode expected_exit_code =
Gilad Arnoldae236702012-05-17 09:33:20 -0700251 (use_kernel_partition ?
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700252 ErrorCode::kNewKernelVerificationError :
253 ErrorCode::kNewRootfsVerificationError);
Gilad Arnoldae236702012-05-17 09:33:20 -0700254 EXPECT_EQ(expected_exit_code, delegate.code());
255 return (expected_exit_code == delegate.code());
Darin Petkov3aefa862010-12-07 14:45:00 -0800256 }
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700257 EXPECT_EQ(ErrorCode::kSuccess, delegate.code());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000258
adlr@google.com3defe6a2009-12-04 20:57:17 +0000259 // Make sure everything in the out_image is there
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700260 vector<char> a_out;
Gilad Arnoldae236702012-05-17 09:33:20 -0700261 if (!utils::ReadFile(a_dev, &a_out)) {
262 ADD_FAILURE();
263 return false;
264 }
Gilad Arnold308b85e2012-06-07 15:50:16 -0700265 const bool is_a_file_reading_eq = ExpectVectorsEq(a_loop_data, a_out);
266 EXPECT_TRUE(is_a_file_reading_eq);
267 success = success && is_a_file_reading_eq;
Darin Petkov3aefa862010-12-07 14:45:00 -0800268 if (!verify_hash) {
269 vector<char> b_out;
Gilad Arnoldae236702012-05-17 09:33:20 -0700270 if (!utils::ReadFile(b_dev, &b_out)) {
271 ADD_FAILURE();
272 return false;
273 }
Gilad Arnold308b85e2012-06-07 15:50:16 -0700274 const bool is_b_file_reading_eq = ExpectVectorsEq(a_out, b_out);
275 EXPECT_TRUE(is_b_file_reading_eq);
276 success = success && is_b_file_reading_eq;
Darin Petkov3aefa862010-12-07 14:45:00 -0800277 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000278
Gilad Arnoldae236702012-05-17 09:33:20 -0700279 bool is_install_plan_eq = (collector_action.object() == install_plan);
280 EXPECT_TRUE(is_install_plan_eq);
281 success = success && is_install_plan_eq;
282
Don Garrett83692e42013-11-08 10:11:30 -0800283 LOG(INFO) << "Verifying bootable flag on: " << a_dev;
284 bool bootable;
Don Garrett6646b442013-11-13 15:29:11 -0800285 EXPECT_TRUE(mock_hardware.fake().IsKernelBootable(a_dev, &bootable));
Don Garrett83692e42013-11-08 10:11:30 -0800286 // We should always mark a partition as unbootable if it's a kernel
287 // partition, but never if it's anything else.
288 EXPECT_EQ(bootable, !use_kernel_partition);
289
Gilad Arnoldae236702012-05-17 09:33:20 -0700290 return success;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000291}
292
293class FilesystemCopierActionTest2Delegate : public ActionProcessorDelegate {
294 public:
295 void ActionCompleted(ActionProcessor* processor,
296 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -0700297 ErrorCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000298 if (action->Type() == FilesystemCopierAction::StaticType()) {
299 ran_ = true;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700300 code_ = code;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000301 }
302 }
303 GMainLoop *loop_;
304 bool ran_;
David Zeuthena99981f2013-04-29 13:42:47 -0700305 ErrorCode code_;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000306};
307
308TEST_F(FilesystemCopierActionTest, MissingInputObjectTest) {
309 ActionProcessor processor;
310 FilesystemCopierActionTest2Delegate delegate;
311
312 processor.set_delegate(&delegate);
313
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700314 FilesystemCopierAction copier_action(&fake_system_state_, false, false);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000315 ObjectCollectorAction<InstallPlan> collector_action;
316
317 BondActions(&copier_action, &collector_action);
318
319 processor.EnqueueAction(&copier_action);
320 processor.EnqueueAction(&collector_action);
321 processor.StartProcessing();
322 EXPECT_FALSE(processor.IsRunning());
323 EXPECT_TRUE(delegate.ran_);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700324 EXPECT_EQ(ErrorCode::kError, delegate.code_);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000325}
326
Darin Petkov9b230572010-10-08 10:20:09 -0700327TEST_F(FilesystemCopierActionTest, ResumeTest) {
328 ActionProcessor processor;
329 FilesystemCopierActionTest2Delegate delegate;
330
331 processor.set_delegate(&delegate);
332
333 ObjectFeederAction<InstallPlan> feeder_action;
334 const char* kUrl = "http://some/url";
David Zeuthene7f89172013-10-31 10:21:04 -0700335 InstallPlan install_plan(false, true, kUrl, 0, "", 0, "", "", "", "");
Darin Petkov9b230572010-10-08 10:20:09 -0700336 feeder_action.set_obj(install_plan);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700337 FilesystemCopierAction copier_action(&fake_system_state_, false, false);
Darin Petkov9b230572010-10-08 10:20:09 -0700338 ObjectCollectorAction<InstallPlan> collector_action;
339
340 BondActions(&feeder_action, &copier_action);
341 BondActions(&copier_action, &collector_action);
342
343 processor.EnqueueAction(&feeder_action);
344 processor.EnqueueAction(&copier_action);
345 processor.EnqueueAction(&collector_action);
346 processor.StartProcessing();
347 EXPECT_FALSE(processor.IsRunning());
348 EXPECT_TRUE(delegate.ran_);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700349 EXPECT_EQ(ErrorCode::kSuccess, delegate.code_);
Darin Petkov9b230572010-10-08 10:20:09 -0700350 EXPECT_EQ(kUrl, collector_action.object().download_url);
351}
352
adlr@google.com3defe6a2009-12-04 20:57:17 +0000353TEST_F(FilesystemCopierActionTest, NonExistentDriveTest) {
354 ActionProcessor processor;
355 FilesystemCopierActionTest2Delegate delegate;
356
357 processor.set_delegate(&delegate);
358
359 ObjectFeederAction<InstallPlan> feeder_action;
Darin Petkov0406e402010-10-06 21:33:11 -0700360 InstallPlan install_plan(false,
Gilad Arnold21504f02013-05-24 08:51:22 -0700361 false,
Darin Petkov0406e402010-10-06 21:33:11 -0700362 "",
363 0,
364 "",
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700365 0,
366 "",
Darin Petkov0406e402010-10-06 21:33:11 -0700367 "/no/such/file",
David Zeuthene7f89172013-10-31 10:21:04 -0700368 "/no/such/file",
369 "");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000370 feeder_action.set_obj(install_plan);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700371 FilesystemCopierAction copier_action(&fake_system_state_, false, false);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000372 ObjectCollectorAction<InstallPlan> collector_action;
373
374 BondActions(&copier_action, &collector_action);
375
376 processor.EnqueueAction(&feeder_action);
377 processor.EnqueueAction(&copier_action);
378 processor.EnqueueAction(&collector_action);
379 processor.StartProcessing();
380 EXPECT_FALSE(processor.IsRunning());
381 EXPECT_TRUE(delegate.ran_);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700382 EXPECT_EQ(ErrorCode::kError, delegate.code_);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000383}
384
Darin Petkov3aefa862010-12-07 14:45:00 -0800385TEST_F(FilesystemCopierActionTest, RunAsRootVerifyHashTest) {
386 ASSERT_EQ(0, getuid());
Gilad Arnoldae236702012-05-17 09:33:20 -0700387 EXPECT_TRUE(DoTest(false, false, false, 1));
388 EXPECT_TRUE(DoTest(false, false, true, 1));
Darin Petkov3aefa862010-12-07 14:45:00 -0800389}
390
391TEST_F(FilesystemCopierActionTest, RunAsRootVerifyHashFailTest) {
392 ASSERT_EQ(0, getuid());
Gilad Arnoldae236702012-05-17 09:33:20 -0700393 EXPECT_TRUE(DoTest(false, false, false, 2));
394 EXPECT_TRUE(DoTest(false, false, true, 2));
Darin Petkov3aefa862010-12-07 14:45:00 -0800395}
396
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700397TEST_F(FilesystemCopierActionTest, RunAsRootNoSpaceTest) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000398 ASSERT_EQ(0, getuid());
Gilad Arnoldae236702012-05-17 09:33:20 -0700399 EXPECT_TRUE(DoTest(true, false, false, 0));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000400}
401
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700402TEST_F(FilesystemCopierActionTest, RunAsRootTerminateEarlyTest) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000403 ASSERT_EQ(0, getuid());
Gilad Arnoldae236702012-05-17 09:33:20 -0700404 EXPECT_TRUE(DoTest(false, true, false, 0));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000405}
406
Darin Petkov698d0412010-10-13 10:59:44 -0700407TEST_F(FilesystemCopierActionTest, RunAsRootDetermineFilesystemSizeTest) {
408 string img;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800409 EXPECT_TRUE(utils::MakeTempFile("img.XXXXXX", &img, NULL));
Darin Petkov698d0412010-10-13 10:59:44 -0700410 ScopedPathUnlinker img_unlinker(img);
411 CreateExtImageAtPath(img, NULL);
412 // Extend the "partition" holding the file system from 10MiB to 20MiB.
Alex Vakulenko75039d72014-03-25 12:36:28 -0700413 EXPECT_EQ(0, System(base::StringPrintf(
Darin Petkov698d0412010-10-13 10:59:44 -0700414 "dd if=/dev/zero of=%s seek=20971519 bs=1 count=1",
415 img.c_str())));
416 EXPECT_EQ(20 * 1024 * 1024, utils::FileSize(img));
417
418 for (int i = 0; i < 2; ++i) {
419 bool is_kernel = i == 1;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700420 FilesystemCopierAction action(&fake_system_state_, is_kernel, false);
Darin Petkov698d0412010-10-13 10:59:44 -0700421 EXPECT_EQ(kint64max, action.filesystem_size_);
422 {
423 int fd = HANDLE_EINTR(open(img.c_str(), O_RDONLY));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700424 EXPECT_GT(fd, 0);
Darin Petkov698d0412010-10-13 10:59:44 -0700425 ScopedFdCloser fd_closer(&fd);
426 action.DetermineFilesystemSize(fd);
427 }
428 EXPECT_EQ(is_kernel ? kint64max : 10 * 1024 * 1024,
429 action.filesystem_size_);
430 }
431}
432
433
adlr@google.com3defe6a2009-12-04 20:57:17 +0000434} // namespace chromeos_update_engine