blob: 685c546073dd0e1db3de081bae2d4def3a006c2e [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>
Darin Petkov698d0412010-10-13 10:59:44 -070012#include <base/string_util.h>
Mike Frysinger8155d082012-04-06 15:23:18 -040013#include <base/stringprintf.h>
Darin Petkov698d0412010-10-13 10:59:44 -070014#include <glib.h>
adlr@google.com3defe6a2009-12-04 20:57:17 +000015#include <gtest/gtest.h>
Darin Petkov698d0412010-10-13 10:59:44 -070016
adlr@google.com3defe6a2009-12-04 20:57:17 +000017#include "update_engine/filesystem_copier_action.h"
18#include "update_engine/filesystem_iterator.h"
Alex Deymo42432912013-07-12 20:21:15 -070019#include "update_engine/mock_system_state.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000020#include "update_engine/omaha_hash_calculator.h"
21#include "update_engine/test_utils.h"
22#include "update_engine/utils.h"
23
24using std::set;
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -080025using std::string;
adlr@google.com3defe6a2009-12-04 20:57:17 +000026using std::vector;
27
28namespace chromeos_update_engine {
29
30class FilesystemCopierActionTest : public ::testing::Test {
31 protected:
Darin Petkov3aefa862010-12-07 14:45:00 -080032 // |verify_hash|: 0 - no hash verification, 1 -- successful hash verification,
33 // 2 -- hash verification failure.
Gilad Arnoldae236702012-05-17 09:33:20 -070034 // Returns true iff test has completed successfully.
Gilad Arnoldae236702012-05-17 09:33:20 -070035 bool DoTest(bool run_out_of_space,
Andrew de los Reyesf9185172010-05-03 11:07:05 -070036 bool terminate_early,
Darin Petkov3aefa862010-12-07 14:45:00 -080037 bool use_kernel_partition,
Gilad Arnold6dbbd392012-07-10 16:19:11 -070038 int verify_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +000039 void SetUp() {
adlr@google.com3defe6a2009-12-04 20:57:17 +000040 }
41 void TearDown() {
adlr@google.com3defe6a2009-12-04 20:57:17 +000042 }
Alex Deymo42432912013-07-12 20:21:15 -070043
44 MockSystemState mock_system_state_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000045};
46
47class FilesystemCopierActionTestDelegate : public ActionProcessorDelegate {
48 public:
Ben Chan2add7d72012-10-08 19:28:37 -070049 FilesystemCopierActionTestDelegate(GMainLoop* loop,
50 FilesystemCopierAction* action)
David Zeuthena99981f2013-04-29 13:42:47 -070051 : loop_(loop), action_(action), ran_(false), code_(kErrorCodeError) {}
Andrew de los Reyesc7020782010-04-28 10:46:04 -070052 void ExitMainLoop() {
Ben Chan2add7d72012-10-08 19:28:37 -070053 GMainContext* context = g_main_loop_get_context(loop_);
54 // We cannot use g_main_context_pending() alone to determine if it is safe
55 // to quit the main loop here becasuse g_main_context_pending() may return
56 // FALSE when g_input_stream_read_async() in FilesystemCopierAction has
57 // been cancelled but the callback has not yet been invoked.
58 while (g_main_context_pending(context) || action_->IsCleanupPending()) {
59 g_main_context_iteration(context, false);
60 g_usleep(100);
Andrew de los Reyesc7020782010-04-28 10:46:04 -070061 }
adlr@google.com3defe6a2009-12-04 20:57:17 +000062 g_main_loop_quit(loop_);
63 }
David Zeuthena99981f2013-04-29 13:42:47 -070064 void ProcessingDone(const ActionProcessor* processor, ErrorCode code) {
Andrew de los Reyesc7020782010-04-28 10:46:04 -070065 ExitMainLoop();
66 }
67 void ProcessingStopped(const ActionProcessor* processor) {
68 ExitMainLoop();
69 }
adlr@google.com3defe6a2009-12-04 20:57:17 +000070 void ActionCompleted(ActionProcessor* processor,
71 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -070072 ErrorCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000073 if (action->Type() == FilesystemCopierAction::StaticType()) {
74 ran_ = true;
Darin Petkovc1a8b422010-07-19 11:34:49 -070075 code_ = code;
adlr@google.com3defe6a2009-12-04 20:57:17 +000076 }
77 }
Ben Chan2add7d72012-10-08 19:28:37 -070078 bool ran() const { return ran_; }
David Zeuthena99981f2013-04-29 13:42:47 -070079 ErrorCode code() const { return code_; }
adlr@google.com3defe6a2009-12-04 20:57:17 +000080 private:
81 GMainLoop* loop_;
Ben Chan2add7d72012-10-08 19:28:37 -070082 FilesystemCopierAction* action_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000083 bool ran_;
David Zeuthena99981f2013-04-29 13:42:47 -070084 ErrorCode code_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000085};
86
Andrew de los Reyesc7020782010-04-28 10:46:04 -070087struct StartProcessorCallbackArgs {
88 ActionProcessor* processor;
89 FilesystemCopierAction* filesystem_copier_action;
90 bool terminate_early;
91};
92
adlr@google.com3defe6a2009-12-04 20:57:17 +000093gboolean StartProcessorInRunLoop(gpointer data) {
Andrew de los Reyesc7020782010-04-28 10:46:04 -070094 StartProcessorCallbackArgs* args =
95 reinterpret_cast<StartProcessorCallbackArgs*>(data);
96 ActionProcessor* processor = args->processor;
adlr@google.com3defe6a2009-12-04 20:57:17 +000097 processor->StartProcessing();
Andrew de los Reyesc7020782010-04-28 10:46:04 -070098 if (args->terminate_early) {
99 EXPECT_TRUE(args->filesystem_copier_action);
100 args->processor->StopProcessing();
101 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000102 return FALSE;
103}
104
Gilad Arnold581c2ea2012-07-19 12:33:49 -0700105// TODO(garnold) Temporarily disabling this test, see chromium-os:31082 for
106// details; still trying to track down the root cause for these rare write
107// failures and whether or not they are due to the test setup or an inherent
108// issue with the chroot environiment, library versions we use, etc.
109TEST_F(FilesystemCopierActionTest, DISABLED_RunAsRootSimpleTest) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000110 ASSERT_EQ(0, getuid());
Gilad Arnold581c2ea2012-07-19 12:33:49 -0700111 bool test = DoTest(false, false, false, 0);
112 EXPECT_TRUE(test);
113 if (!test)
114 return;
115 test = DoTest(false, false, true, 0);
116 EXPECT_TRUE(test);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000117}
Darin Petkov3aefa862010-12-07 14:45:00 -0800118
Gilad Arnoldae236702012-05-17 09:33:20 -0700119bool FilesystemCopierActionTest::DoTest(bool run_out_of_space,
Andrew de los Reyesf9185172010-05-03 11:07:05 -0700120 bool terminate_early,
Darin Petkov3aefa862010-12-07 14:45:00 -0800121 bool use_kernel_partition,
Gilad Arnold6dbbd392012-07-10 16:19:11 -0700122 int verify_hash) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000123 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
124
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700125 string a_loop_file;
126 string b_loop_file;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700127
Gilad Arnoldae236702012-05-17 09:33:20 -0700128 if (!(utils::MakeTempFile("/tmp/a_loop_file.XXXXXX", &a_loop_file, NULL) &&
129 utils::MakeTempFile("/tmp/b_loop_file.XXXXXX", &b_loop_file, NULL))) {
130 ADD_FAILURE();
131 return false;
132 }
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700133 ScopedPathUnlinker a_loop_file_unlinker(a_loop_file);
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700134 ScopedPathUnlinker b_loop_file_unlinker(b_loop_file);
Darin Petkovc1a8b422010-07-19 11:34:49 -0700135
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700136 // Make random data for a, zero filled data for b.
Gilad Arnold6dbbd392012-07-10 16:19:11 -0700137 const size_t kLoopFileSize = 10 * 1024 * 1024 + 512;
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700138 vector<char> a_loop_data(kLoopFileSize);
139 FillWithData(&a_loop_data);
140 vector<char> b_loop_data(run_out_of_space ?
141 (kLoopFileSize - 1) :
142 kLoopFileSize,
143 '\0'); // Fill with 0s
adlr@google.com3defe6a2009-12-04 20:57:17 +0000144
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700145 // Write data to disk
Gilad Arnoldae236702012-05-17 09:33:20 -0700146 if (!(WriteFileVector(a_loop_file, a_loop_data) &&
147 WriteFileVector(b_loop_file, b_loop_data))) {
148 ADD_FAILURE();
149 return false;
150 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000151
Don Garrett58e8b1f2012-01-31 16:38:16 -0800152 // Attach loop devices to the files
153 string a_dev;
154 string b_dev;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000155
Don Garrett58e8b1f2012-01-31 16:38:16 -0800156 ScopedLoopbackDeviceBinder a_dev_releaser(a_loop_file, &a_dev);
157 ScopedLoopbackDeviceBinder b_dev_releaser(b_loop_file, &b_dev);
Gilad Arnoldc33faeb2012-07-24 15:11:11 -0700158 if (!(a_dev_releaser.is_bound() && b_dev_releaser.is_bound())) {
159 ADD_FAILURE();
160 return false;
161 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000162
Gilad Arnoldc33faeb2012-07-24 15:11:11 -0700163 LOG(INFO) << "copying: "
164 << a_loop_file << " (" << a_dev << ") -> "
165 << b_loop_file << " (" << b_dev << ", "
166 << kLoopFileSize << " bytes";
Gilad Arnoldae236702012-05-17 09:33:20 -0700167 bool success = true;
168
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700169 // Set up the action objects
adlr@google.com3defe6a2009-12-04 20:57:17 +0000170 InstallPlan install_plan;
Darin Petkov3aefa862010-12-07 14:45:00 -0800171 if (verify_hash) {
172 if (use_kernel_partition) {
173 install_plan.kernel_install_path = a_dev;
174 install_plan.kernel_size =
175 kLoopFileSize - ((verify_hash == 2) ? 1 : 0);
Gilad Arnoldae236702012-05-17 09:33:20 -0700176 if (!OmahaHashCalculator::RawHashOfData(a_loop_data,
177 &install_plan.kernel_hash)) {
178 ADD_FAILURE();
179 success = false;
180 }
Darin Petkov3aefa862010-12-07 14:45:00 -0800181 } else {
182 install_plan.install_path = a_dev;
183 install_plan.rootfs_size =
184 kLoopFileSize - ((verify_hash == 2) ? 1 : 0);
Gilad Arnoldae236702012-05-17 09:33:20 -0700185 if (!OmahaHashCalculator::RawHashOfData(a_loop_data,
186 &install_plan.rootfs_hash)) {
187 ADD_FAILURE();
188 success = false;
189 }
Darin Petkov3aefa862010-12-07 14:45:00 -0800190 }
191 } else {
192 if (use_kernel_partition) {
193 install_plan.kernel_install_path = b_dev;
194 } else {
195 install_plan.install_path = b_dev;
196 }
197 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000198
199 ActionProcessor processor;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000200
201 ObjectFeederAction<InstallPlan> feeder_action;
Alex Deymo42432912013-07-12 20:21:15 -0700202 FilesystemCopierAction copier_action(&mock_system_state_,
203 use_kernel_partition,
Gilad Arnold581c2ea2012-07-19 12:33:49 -0700204 verify_hash != 0);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000205 ObjectCollectorAction<InstallPlan> collector_action;
206
207 BondActions(&feeder_action, &copier_action);
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700208 BondActions(&copier_action, &collector_action);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000209
Ben Chan2add7d72012-10-08 19:28:37 -0700210 FilesystemCopierActionTestDelegate delegate(loop, &copier_action);
211 processor.set_delegate(&delegate);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000212 processor.EnqueueAction(&feeder_action);
213 processor.EnqueueAction(&copier_action);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000214 processor.EnqueueAction(&collector_action);
215
Darin Petkov3aefa862010-12-07 14:45:00 -0800216 if (!verify_hash) {
217 copier_action.set_copy_source(a_dev);
218 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000219 feeder_action.set_obj(install_plan);
220
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700221 StartProcessorCallbackArgs start_callback_args;
222 start_callback_args.processor = &processor;
223 start_callback_args.filesystem_copier_action = &copier_action;
224 start_callback_args.terminate_early = terminate_early;
225
226 g_timeout_add(0, &StartProcessorInRunLoop, &start_callback_args);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000227 g_main_loop_run(loop);
228 g_main_loop_unref(loop);
229
Gilad Arnoldae236702012-05-17 09:33:20 -0700230 if (!terminate_early) {
231 bool is_delegate_ran = delegate.ran();
232 EXPECT_TRUE(is_delegate_ran);
233 success = success && is_delegate_ran;
234 }
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700235 if (run_out_of_space || terminate_early) {
David Zeuthena99981f2013-04-29 13:42:47 -0700236 EXPECT_EQ(kErrorCodeError, delegate.code());
237 return (kErrorCodeError == delegate.code());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000238 }
Darin Petkov3aefa862010-12-07 14:45:00 -0800239 if (verify_hash == 2) {
David Zeuthena99981f2013-04-29 13:42:47 -0700240 ErrorCode expected_exit_code =
Gilad Arnoldae236702012-05-17 09:33:20 -0700241 (use_kernel_partition ?
David Zeuthena99981f2013-04-29 13:42:47 -0700242 kErrorCodeNewKernelVerificationError :
243 kErrorCodeNewRootfsVerificationError);
Gilad Arnoldae236702012-05-17 09:33:20 -0700244 EXPECT_EQ(expected_exit_code, delegate.code());
245 return (expected_exit_code == delegate.code());
Darin Petkov3aefa862010-12-07 14:45:00 -0800246 }
David Zeuthena99981f2013-04-29 13:42:47 -0700247 EXPECT_EQ(kErrorCodeSuccess, delegate.code());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000248
adlr@google.com3defe6a2009-12-04 20:57:17 +0000249 // Make sure everything in the out_image is there
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700250 vector<char> a_out;
Gilad Arnoldae236702012-05-17 09:33:20 -0700251 if (!utils::ReadFile(a_dev, &a_out)) {
252 ADD_FAILURE();
253 return false;
254 }
Gilad Arnold308b85e2012-06-07 15:50:16 -0700255 const bool is_a_file_reading_eq = ExpectVectorsEq(a_loop_data, a_out);
256 EXPECT_TRUE(is_a_file_reading_eq);
257 success = success && is_a_file_reading_eq;
Darin Petkov3aefa862010-12-07 14:45:00 -0800258 if (!verify_hash) {
259 vector<char> b_out;
Gilad Arnoldae236702012-05-17 09:33:20 -0700260 if (!utils::ReadFile(b_dev, &b_out)) {
261 ADD_FAILURE();
262 return false;
263 }
Gilad Arnold308b85e2012-06-07 15:50:16 -0700264 const bool is_b_file_reading_eq = ExpectVectorsEq(a_out, b_out);
265 EXPECT_TRUE(is_b_file_reading_eq);
266 success = success && is_b_file_reading_eq;
Darin Petkov3aefa862010-12-07 14:45:00 -0800267 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000268
Gilad Arnoldae236702012-05-17 09:33:20 -0700269 bool is_install_plan_eq = (collector_action.object() == install_plan);
270 EXPECT_TRUE(is_install_plan_eq);
271 success = success && is_install_plan_eq;
272
273 return success;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000274}
275
276class FilesystemCopierActionTest2Delegate : public ActionProcessorDelegate {
277 public:
278 void ActionCompleted(ActionProcessor* processor,
279 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -0700280 ErrorCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000281 if (action->Type() == FilesystemCopierAction::StaticType()) {
282 ran_ = true;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700283 code_ = code;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000284 }
285 }
286 GMainLoop *loop_;
287 bool ran_;
David Zeuthena99981f2013-04-29 13:42:47 -0700288 ErrorCode code_;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000289};
290
291TEST_F(FilesystemCopierActionTest, MissingInputObjectTest) {
292 ActionProcessor processor;
293 FilesystemCopierActionTest2Delegate delegate;
294
295 processor.set_delegate(&delegate);
296
Alex Deymo42432912013-07-12 20:21:15 -0700297 FilesystemCopierAction copier_action(&mock_system_state_, false, false);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000298 ObjectCollectorAction<InstallPlan> collector_action;
299
300 BondActions(&copier_action, &collector_action);
301
302 processor.EnqueueAction(&copier_action);
303 processor.EnqueueAction(&collector_action);
304 processor.StartProcessing();
305 EXPECT_FALSE(processor.IsRunning());
306 EXPECT_TRUE(delegate.ran_);
David Zeuthena99981f2013-04-29 13:42:47 -0700307 EXPECT_EQ(kErrorCodeError, delegate.code_);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000308}
309
Darin Petkov9b230572010-10-08 10:20:09 -0700310TEST_F(FilesystemCopierActionTest, ResumeTest) {
311 ActionProcessor processor;
312 FilesystemCopierActionTest2Delegate delegate;
313
314 processor.set_delegate(&delegate);
315
316 ObjectFeederAction<InstallPlan> feeder_action;
317 const char* kUrl = "http://some/url";
Gilad Arnold21504f02013-05-24 08:51:22 -0700318 InstallPlan install_plan(false, true, kUrl, 0, "", 0, "", "", "");
Darin Petkov9b230572010-10-08 10:20:09 -0700319 feeder_action.set_obj(install_plan);
Alex Deymo42432912013-07-12 20:21:15 -0700320 FilesystemCopierAction copier_action(&mock_system_state_, false, false);
Darin Petkov9b230572010-10-08 10:20:09 -0700321 ObjectCollectorAction<InstallPlan> collector_action;
322
323 BondActions(&feeder_action, &copier_action);
324 BondActions(&copier_action, &collector_action);
325
326 processor.EnqueueAction(&feeder_action);
327 processor.EnqueueAction(&copier_action);
328 processor.EnqueueAction(&collector_action);
329 processor.StartProcessing();
330 EXPECT_FALSE(processor.IsRunning());
331 EXPECT_TRUE(delegate.ran_);
David Zeuthena99981f2013-04-29 13:42:47 -0700332 EXPECT_EQ(kErrorCodeSuccess, delegate.code_);
Darin Petkov9b230572010-10-08 10:20:09 -0700333 EXPECT_EQ(kUrl, collector_action.object().download_url);
334}
335
adlr@google.com3defe6a2009-12-04 20:57:17 +0000336TEST_F(FilesystemCopierActionTest, NonExistentDriveTest) {
337 ActionProcessor processor;
338 FilesystemCopierActionTest2Delegate delegate;
339
340 processor.set_delegate(&delegate);
341
342 ObjectFeederAction<InstallPlan> feeder_action;
Darin Petkov0406e402010-10-06 21:33:11 -0700343 InstallPlan install_plan(false,
Gilad Arnold21504f02013-05-24 08:51:22 -0700344 false,
Darin Petkov0406e402010-10-06 21:33:11 -0700345 "",
346 0,
347 "",
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700348 0,
349 "",
Darin Petkov0406e402010-10-06 21:33:11 -0700350 "/no/such/file",
351 "/no/such/file");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000352 feeder_action.set_obj(install_plan);
Alex Deymo42432912013-07-12 20:21:15 -0700353 FilesystemCopierAction copier_action(&mock_system_state_, false, false);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000354 ObjectCollectorAction<InstallPlan> collector_action;
355
356 BondActions(&copier_action, &collector_action);
357
358 processor.EnqueueAction(&feeder_action);
359 processor.EnqueueAction(&copier_action);
360 processor.EnqueueAction(&collector_action);
361 processor.StartProcessing();
362 EXPECT_FALSE(processor.IsRunning());
363 EXPECT_TRUE(delegate.ran_);
David Zeuthena99981f2013-04-29 13:42:47 -0700364 EXPECT_EQ(kErrorCodeError, delegate.code_);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000365}
366
Darin Petkov3aefa862010-12-07 14:45:00 -0800367TEST_F(FilesystemCopierActionTest, RunAsRootVerifyHashTest) {
368 ASSERT_EQ(0, getuid());
Gilad Arnoldae236702012-05-17 09:33:20 -0700369 EXPECT_TRUE(DoTest(false, false, false, 1));
370 EXPECT_TRUE(DoTest(false, false, true, 1));
Darin Petkov3aefa862010-12-07 14:45:00 -0800371}
372
373TEST_F(FilesystemCopierActionTest, RunAsRootVerifyHashFailTest) {
374 ASSERT_EQ(0, getuid());
Gilad Arnoldae236702012-05-17 09:33:20 -0700375 EXPECT_TRUE(DoTest(false, false, false, 2));
376 EXPECT_TRUE(DoTest(false, false, true, 2));
Darin Petkov3aefa862010-12-07 14:45:00 -0800377}
378
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700379TEST_F(FilesystemCopierActionTest, RunAsRootNoSpaceTest) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000380 ASSERT_EQ(0, getuid());
Gilad Arnoldae236702012-05-17 09:33:20 -0700381 EXPECT_TRUE(DoTest(true, false, false, 0));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000382}
383
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700384TEST_F(FilesystemCopierActionTest, RunAsRootTerminateEarlyTest) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000385 ASSERT_EQ(0, getuid());
Gilad Arnoldae236702012-05-17 09:33:20 -0700386 EXPECT_TRUE(DoTest(false, true, false, 0));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000387}
388
Darin Petkov698d0412010-10-13 10:59:44 -0700389TEST_F(FilesystemCopierActionTest, RunAsRootDetermineFilesystemSizeTest) {
390 string img;
391 EXPECT_TRUE(utils::MakeTempFile("/tmp/img.XXXXXX", &img, NULL));
392 ScopedPathUnlinker img_unlinker(img);
393 CreateExtImageAtPath(img, NULL);
394 // Extend the "partition" holding the file system from 10MiB to 20MiB.
395 EXPECT_EQ(0, System(StringPrintf(
396 "dd if=/dev/zero of=%s seek=20971519 bs=1 count=1",
397 img.c_str())));
398 EXPECT_EQ(20 * 1024 * 1024, utils::FileSize(img));
399
400 for (int i = 0; i < 2; ++i) {
401 bool is_kernel = i == 1;
Alex Deymo42432912013-07-12 20:21:15 -0700402 FilesystemCopierAction action(&mock_system_state_, is_kernel, false);
Darin Petkov698d0412010-10-13 10:59:44 -0700403 EXPECT_EQ(kint64max, action.filesystem_size_);
404 {
405 int fd = HANDLE_EINTR(open(img.c_str(), O_RDONLY));
406 EXPECT_TRUE(fd > 0);
407 ScopedFdCloser fd_closer(&fd);
408 action.DetermineFilesystemSize(fd);
409 }
410 EXPECT_EQ(is_kernel ? kint64max : 10 * 1024 * 1024,
411 action.filesystem_size_);
412 }
413}
414
415
adlr@google.com3defe6a2009-12-04 20:57:17 +0000416} // namespace chromeos_update_engine