blob: 62b39a6e1dc2b2bae10cb1fb12db0a2091ecdd4e [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
11#include <base/eintr_wrapper.h>
12#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"
19#include "update_engine/omaha_hash_calculator.h"
20#include "update_engine/test_utils.h"
21#include "update_engine/utils.h"
22
23using std::set;
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -080024using std::string;
adlr@google.com3defe6a2009-12-04 20:57:17 +000025using std::vector;
26
27namespace chromeos_update_engine {
28
29class FilesystemCopierActionTest : public ::testing::Test {
30 protected:
Darin Petkov3aefa862010-12-07 14:45:00 -080031 // |verify_hash|: 0 - no hash verification, 1 -- successful hash verification,
32 // 2 -- hash verification failure.
Gilad Arnoldae236702012-05-17 09:33:20 -070033 // Returns true iff test has completed successfully.
Gilad Arnoldae236702012-05-17 09:33:20 -070034 bool DoTest(bool run_out_of_space,
Andrew de los Reyesf9185172010-05-03 11:07:05 -070035 bool terminate_early,
Darin Petkov3aefa862010-12-07 14:45:00 -080036 bool use_kernel_partition,
Gilad Arnold6dbbd392012-07-10 16:19:11 -070037 int verify_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +000038 void SetUp() {
adlr@google.com3defe6a2009-12-04 20:57:17 +000039 }
40 void TearDown() {
adlr@google.com3defe6a2009-12-04 20:57:17 +000041 }
42};
43
44class FilesystemCopierActionTestDelegate : public ActionProcessorDelegate {
45 public:
Darin Petkovc1a8b422010-07-19 11:34:49 -070046 FilesystemCopierActionTestDelegate() : ran_(false), code_(kActionCodeError) {}
Andrew de los Reyesc7020782010-04-28 10:46:04 -070047 void ExitMainLoop() {
48 while (g_main_context_pending(NULL)) {
49 g_main_context_iteration(NULL, false);
50 }
adlr@google.com3defe6a2009-12-04 20:57:17 +000051 g_main_loop_quit(loop_);
52 }
Darin Petkovc1a8b422010-07-19 11:34:49 -070053 void ProcessingDone(const ActionProcessor* processor, ActionExitCode code) {
Andrew de los Reyesc7020782010-04-28 10:46:04 -070054 ExitMainLoop();
55 }
56 void ProcessingStopped(const ActionProcessor* processor) {
57 ExitMainLoop();
58 }
adlr@google.com3defe6a2009-12-04 20:57:17 +000059 void ActionCompleted(ActionProcessor* processor,
60 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -070061 ActionExitCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000062 if (action->Type() == FilesystemCopierAction::StaticType()) {
63 ran_ = true;
Darin Petkovc1a8b422010-07-19 11:34:49 -070064 code_ = code;
adlr@google.com3defe6a2009-12-04 20:57:17 +000065 }
66 }
67 void set_loop(GMainLoop* loop) {
68 loop_ = loop;
69 }
70 bool ran() { return ran_; }
Darin Petkovc1a8b422010-07-19 11:34:49 -070071 ActionExitCode code() { return code_; }
adlr@google.com3defe6a2009-12-04 20:57:17 +000072 private:
73 GMainLoop* loop_;
74 bool ran_;
Darin Petkovc1a8b422010-07-19 11:34:49 -070075 ActionExitCode code_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000076};
77
Andrew de los Reyesc7020782010-04-28 10:46:04 -070078struct StartProcessorCallbackArgs {
79 ActionProcessor* processor;
80 FilesystemCopierAction* filesystem_copier_action;
81 bool terminate_early;
82};
83
adlr@google.com3defe6a2009-12-04 20:57:17 +000084gboolean StartProcessorInRunLoop(gpointer data) {
Andrew de los Reyesc7020782010-04-28 10:46:04 -070085 StartProcessorCallbackArgs* args =
86 reinterpret_cast<StartProcessorCallbackArgs*>(data);
87 ActionProcessor* processor = args->processor;
adlr@google.com3defe6a2009-12-04 20:57:17 +000088 processor->StartProcessing();
Andrew de los Reyesc7020782010-04-28 10:46:04 -070089 if (args->terminate_early) {
90 EXPECT_TRUE(args->filesystem_copier_action);
91 args->processor->StopProcessing();
92 }
adlr@google.com3defe6a2009-12-04 20:57:17 +000093 return FALSE;
94}
95
Gilad Arnold581c2ea2012-07-19 12:33:49 -070096// TODO(garnold) Temporarily disabling this test, see chromium-os:31082 for
97// details; still trying to track down the root cause for these rare write
98// failures and whether or not they are due to the test setup or an inherent
99// issue with the chroot environiment, library versions we use, etc.
100TEST_F(FilesystemCopierActionTest, DISABLED_RunAsRootSimpleTest) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000101 ASSERT_EQ(0, getuid());
Gilad Arnold581c2ea2012-07-19 12:33:49 -0700102 bool test = DoTest(false, false, false, 0);
103 EXPECT_TRUE(test);
104 if (!test)
105 return;
106 test = DoTest(false, false, true, 0);
107 EXPECT_TRUE(test);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000108}
Darin Petkov3aefa862010-12-07 14:45:00 -0800109
Gilad Arnoldae236702012-05-17 09:33:20 -0700110bool FilesystemCopierActionTest::DoTest(bool run_out_of_space,
Andrew de los Reyesf9185172010-05-03 11:07:05 -0700111 bool terminate_early,
Darin Petkov3aefa862010-12-07 14:45:00 -0800112 bool use_kernel_partition,
Gilad Arnold6dbbd392012-07-10 16:19:11 -0700113 int verify_hash) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000114 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
115
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700116 string a_loop_file;
117 string b_loop_file;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700118
Gilad Arnoldae236702012-05-17 09:33:20 -0700119 if (!(utils::MakeTempFile("/tmp/a_loop_file.XXXXXX", &a_loop_file, NULL) &&
120 utils::MakeTempFile("/tmp/b_loop_file.XXXXXX", &b_loop_file, NULL))) {
121 ADD_FAILURE();
122 return false;
123 }
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700124 ScopedPathUnlinker a_loop_file_unlinker(a_loop_file);
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700125 ScopedPathUnlinker b_loop_file_unlinker(b_loop_file);
Darin Petkovc1a8b422010-07-19 11:34:49 -0700126
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700127 // Make random data for a, zero filled data for b.
Gilad Arnold6dbbd392012-07-10 16:19:11 -0700128 const size_t kLoopFileSize = 10 * 1024 * 1024 + 512;
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700129 vector<char> a_loop_data(kLoopFileSize);
130 FillWithData(&a_loop_data);
131 vector<char> b_loop_data(run_out_of_space ?
132 (kLoopFileSize - 1) :
133 kLoopFileSize,
134 '\0'); // Fill with 0s
adlr@google.com3defe6a2009-12-04 20:57:17 +0000135
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700136 // Write data to disk
Gilad Arnoldae236702012-05-17 09:33:20 -0700137 if (!(WriteFileVector(a_loop_file, a_loop_data) &&
138 WriteFileVector(b_loop_file, b_loop_data))) {
139 ADD_FAILURE();
140 return false;
141 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000142
Don Garrett58e8b1f2012-01-31 16:38:16 -0800143 // Attach loop devices to the files
144 string a_dev;
145 string b_dev;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000146
Don Garrett58e8b1f2012-01-31 16:38:16 -0800147 ScopedLoopbackDeviceBinder a_dev_releaser(a_loop_file, &a_dev);
148 ScopedLoopbackDeviceBinder b_dev_releaser(b_loop_file, &b_dev);
Gilad Arnoldc33faeb2012-07-24 15:11:11 -0700149 if (!(a_dev_releaser.is_bound() && b_dev_releaser.is_bound())) {
150 ADD_FAILURE();
151 return false;
152 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000153
Gilad Arnoldc33faeb2012-07-24 15:11:11 -0700154 LOG(INFO) << "copying: "
155 << a_loop_file << " (" << a_dev << ") -> "
156 << b_loop_file << " (" << b_dev << ", "
157 << kLoopFileSize << " bytes";
Gilad Arnoldae236702012-05-17 09:33:20 -0700158 bool success = true;
159
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700160 // Set up the action objects
adlr@google.com3defe6a2009-12-04 20:57:17 +0000161 InstallPlan install_plan;
Darin Petkov3aefa862010-12-07 14:45:00 -0800162 if (verify_hash) {
163 if (use_kernel_partition) {
164 install_plan.kernel_install_path = a_dev;
165 install_plan.kernel_size =
166 kLoopFileSize - ((verify_hash == 2) ? 1 : 0);
Gilad Arnoldae236702012-05-17 09:33:20 -0700167 if (!OmahaHashCalculator::RawHashOfData(a_loop_data,
168 &install_plan.kernel_hash)) {
169 ADD_FAILURE();
170 success = false;
171 }
Darin Petkov3aefa862010-12-07 14:45:00 -0800172 } else {
173 install_plan.install_path = a_dev;
174 install_plan.rootfs_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.rootfs_hash)) {
178 ADD_FAILURE();
179 success = false;
180 }
Darin Petkov3aefa862010-12-07 14:45:00 -0800181 }
182 } else {
183 if (use_kernel_partition) {
184 install_plan.kernel_install_path = b_dev;
185 } else {
186 install_plan.install_path = b_dev;
187 }
188 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000189
190 ActionProcessor processor;
191 FilesystemCopierActionTestDelegate delegate;
192 delegate.set_loop(loop);
193 processor.set_delegate(&delegate);
194
195 ObjectFeederAction<InstallPlan> feeder_action;
Darin Petkov3aefa862010-12-07 14:45:00 -0800196 FilesystemCopierAction copier_action(use_kernel_partition,
Gilad Arnold581c2ea2012-07-19 12:33:49 -0700197 verify_hash != 0);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000198 ObjectCollectorAction<InstallPlan> collector_action;
199
200 BondActions(&feeder_action, &copier_action);
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700201 BondActions(&copier_action, &collector_action);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000202
203 processor.EnqueueAction(&feeder_action);
204 processor.EnqueueAction(&copier_action);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000205 processor.EnqueueAction(&collector_action);
206
Darin Petkov3aefa862010-12-07 14:45:00 -0800207 if (!verify_hash) {
208 copier_action.set_copy_source(a_dev);
209 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000210 feeder_action.set_obj(install_plan);
211
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700212 StartProcessorCallbackArgs start_callback_args;
213 start_callback_args.processor = &processor;
214 start_callback_args.filesystem_copier_action = &copier_action;
215 start_callback_args.terminate_early = terminate_early;
216
217 g_timeout_add(0, &StartProcessorInRunLoop, &start_callback_args);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000218 g_main_loop_run(loop);
219 g_main_loop_unref(loop);
220
Gilad Arnoldae236702012-05-17 09:33:20 -0700221 if (!terminate_early) {
222 bool is_delegate_ran = delegate.ran();
223 EXPECT_TRUE(is_delegate_ran);
224 success = success && is_delegate_ran;
225 }
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700226 if (run_out_of_space || terminate_early) {
Darin Petkovc1a8b422010-07-19 11:34:49 -0700227 EXPECT_EQ(kActionCodeError, delegate.code());
Gilad Arnoldae236702012-05-17 09:33:20 -0700228 return (kActionCodeError == delegate.code());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000229 }
Darin Petkov3aefa862010-12-07 14:45:00 -0800230 if (verify_hash == 2) {
Gilad Arnoldae236702012-05-17 09:33:20 -0700231 ActionExitCode expected_exit_code =
232 (use_kernel_partition ?
233 kActionCodeNewKernelVerificationError :
234 kActionCodeNewRootfsVerificationError);
235 EXPECT_EQ(expected_exit_code, delegate.code());
236 return (expected_exit_code == delegate.code());
Darin Petkov3aefa862010-12-07 14:45:00 -0800237 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700238 EXPECT_EQ(kActionCodeSuccess, delegate.code());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000239
adlr@google.com3defe6a2009-12-04 20:57:17 +0000240 // Make sure everything in the out_image is there
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700241 vector<char> a_out;
Gilad Arnoldae236702012-05-17 09:33:20 -0700242 if (!utils::ReadFile(a_dev, &a_out)) {
243 ADD_FAILURE();
244 return false;
245 }
Gilad Arnold308b85e2012-06-07 15:50:16 -0700246 const bool is_a_file_reading_eq = ExpectVectorsEq(a_loop_data, a_out);
247 EXPECT_TRUE(is_a_file_reading_eq);
248 success = success && is_a_file_reading_eq;
Darin Petkov3aefa862010-12-07 14:45:00 -0800249 if (!verify_hash) {
250 vector<char> b_out;
Gilad Arnoldae236702012-05-17 09:33:20 -0700251 if (!utils::ReadFile(b_dev, &b_out)) {
252 ADD_FAILURE();
253 return false;
254 }
Gilad Arnold308b85e2012-06-07 15:50:16 -0700255 const bool is_b_file_reading_eq = ExpectVectorsEq(a_out, b_out);
256 EXPECT_TRUE(is_b_file_reading_eq);
257 success = success && is_b_file_reading_eq;
Darin Petkov3aefa862010-12-07 14:45:00 -0800258 }
adlr@google.com3defe6a2009-12-04 20:57:17 +0000259
Gilad Arnoldae236702012-05-17 09:33:20 -0700260 bool is_install_plan_eq = (collector_action.object() == install_plan);
261 EXPECT_TRUE(is_install_plan_eq);
262 success = success && is_install_plan_eq;
263
264 return success;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000265}
266
267class FilesystemCopierActionTest2Delegate : public ActionProcessorDelegate {
268 public:
269 void ActionCompleted(ActionProcessor* processor,
270 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700271 ActionExitCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000272 if (action->Type() == FilesystemCopierAction::StaticType()) {
273 ran_ = true;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700274 code_ = code;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000275 }
276 }
277 GMainLoop *loop_;
278 bool ran_;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700279 ActionExitCode code_;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000280};
281
282TEST_F(FilesystemCopierActionTest, MissingInputObjectTest) {
283 ActionProcessor processor;
284 FilesystemCopierActionTest2Delegate delegate;
285
286 processor.set_delegate(&delegate);
287
Gilad Arnold581c2ea2012-07-19 12:33:49 -0700288 FilesystemCopierAction copier_action(false, false);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000289 ObjectCollectorAction<InstallPlan> collector_action;
290
291 BondActions(&copier_action, &collector_action);
292
293 processor.EnqueueAction(&copier_action);
294 processor.EnqueueAction(&collector_action);
295 processor.StartProcessing();
296 EXPECT_FALSE(processor.IsRunning());
297 EXPECT_TRUE(delegate.ran_);
Darin Petkovc1a8b422010-07-19 11:34:49 -0700298 EXPECT_EQ(kActionCodeError, delegate.code_);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000299}
300
Darin Petkov9b230572010-10-08 10:20:09 -0700301TEST_F(FilesystemCopierActionTest, ResumeTest) {
302 ActionProcessor processor;
303 FilesystemCopierActionTest2Delegate delegate;
304
305 processor.set_delegate(&delegate);
306
307 ObjectFeederAction<InstallPlan> feeder_action;
308 const char* kUrl = "http://some/url";
Darin Petkov7ed561b2011-10-04 02:59:03 -0700309 InstallPlan install_plan(true, kUrl, 0, "", "", "");
Darin Petkov9b230572010-10-08 10:20:09 -0700310 feeder_action.set_obj(install_plan);
Gilad Arnold581c2ea2012-07-19 12:33:49 -0700311 FilesystemCopierAction copier_action(false, false);
Darin Petkov9b230572010-10-08 10:20:09 -0700312 ObjectCollectorAction<InstallPlan> collector_action;
313
314 BondActions(&feeder_action, &copier_action);
315 BondActions(&copier_action, &collector_action);
316
317 processor.EnqueueAction(&feeder_action);
318 processor.EnqueueAction(&copier_action);
319 processor.EnqueueAction(&collector_action);
320 processor.StartProcessing();
321 EXPECT_FALSE(processor.IsRunning());
322 EXPECT_TRUE(delegate.ran_);
323 EXPECT_EQ(kActionCodeSuccess, delegate.code_);
324 EXPECT_EQ(kUrl, collector_action.object().download_url);
325}
326
adlr@google.com3defe6a2009-12-04 20:57:17 +0000327TEST_F(FilesystemCopierActionTest, NonExistentDriveTest) {
328 ActionProcessor processor;
329 FilesystemCopierActionTest2Delegate delegate;
330
331 processor.set_delegate(&delegate);
332
333 ObjectFeederAction<InstallPlan> feeder_action;
Darin Petkov0406e402010-10-06 21:33:11 -0700334 InstallPlan install_plan(false,
Darin Petkov0406e402010-10-06 21:33:11 -0700335 "",
336 0,
337 "",
338 "/no/such/file",
339 "/no/such/file");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000340 feeder_action.set_obj(install_plan);
Gilad Arnold581c2ea2012-07-19 12:33:49 -0700341 FilesystemCopierAction copier_action(false, false);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000342 ObjectCollectorAction<InstallPlan> collector_action;
343
344 BondActions(&copier_action, &collector_action);
345
346 processor.EnqueueAction(&feeder_action);
347 processor.EnqueueAction(&copier_action);
348 processor.EnqueueAction(&collector_action);
349 processor.StartProcessing();
350 EXPECT_FALSE(processor.IsRunning());
351 EXPECT_TRUE(delegate.ran_);
Darin Petkovc1a8b422010-07-19 11:34:49 -0700352 EXPECT_EQ(kActionCodeError, delegate.code_);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000353}
354
Darin Petkov3aefa862010-12-07 14:45:00 -0800355TEST_F(FilesystemCopierActionTest, RunAsRootVerifyHashTest) {
356 ASSERT_EQ(0, getuid());
Gilad Arnoldae236702012-05-17 09:33:20 -0700357 EXPECT_TRUE(DoTest(false, false, false, 1));
358 EXPECT_TRUE(DoTest(false, false, true, 1));
Darin Petkov3aefa862010-12-07 14:45:00 -0800359}
360
361TEST_F(FilesystemCopierActionTest, RunAsRootVerifyHashFailTest) {
362 ASSERT_EQ(0, getuid());
Gilad Arnoldae236702012-05-17 09:33:20 -0700363 EXPECT_TRUE(DoTest(false, false, false, 2));
364 EXPECT_TRUE(DoTest(false, false, true, 2));
Darin Petkov3aefa862010-12-07 14:45:00 -0800365}
366
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700367TEST_F(FilesystemCopierActionTest, RunAsRootNoSpaceTest) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000368 ASSERT_EQ(0, getuid());
Gilad Arnoldae236702012-05-17 09:33:20 -0700369 EXPECT_TRUE(DoTest(true, false, false, 0));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000370}
371
Andrew de los Reyesc7020782010-04-28 10:46:04 -0700372TEST_F(FilesystemCopierActionTest, RunAsRootTerminateEarlyTest) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000373 ASSERT_EQ(0, getuid());
Gilad Arnoldae236702012-05-17 09:33:20 -0700374 EXPECT_TRUE(DoTest(false, true, false, 0));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000375}
376
Darin Petkov698d0412010-10-13 10:59:44 -0700377TEST_F(FilesystemCopierActionTest, RunAsRootDetermineFilesystemSizeTest) {
378 string img;
379 EXPECT_TRUE(utils::MakeTempFile("/tmp/img.XXXXXX", &img, NULL));
380 ScopedPathUnlinker img_unlinker(img);
381 CreateExtImageAtPath(img, NULL);
382 // Extend the "partition" holding the file system from 10MiB to 20MiB.
383 EXPECT_EQ(0, System(StringPrintf(
384 "dd if=/dev/zero of=%s seek=20971519 bs=1 count=1",
385 img.c_str())));
386 EXPECT_EQ(20 * 1024 * 1024, utils::FileSize(img));
387
388 for (int i = 0; i < 2; ++i) {
389 bool is_kernel = i == 1;
Gilad Arnold581c2ea2012-07-19 12:33:49 -0700390 FilesystemCopierAction action(is_kernel, false);
Darin Petkov698d0412010-10-13 10:59:44 -0700391 EXPECT_EQ(kint64max, action.filesystem_size_);
392 {
393 int fd = HANDLE_EINTR(open(img.c_str(), O_RDONLY));
394 EXPECT_TRUE(fd > 0);
395 ScopedFdCloser fd_closer(&fd);
396 action.DetermineFilesystemSize(fd);
397 }
398 EXPECT_EQ(is_kernel ? kint64max : 10 * 1024 * 1024,
399 action.filesystem_size_);
400 }
401}
402
403
adlr@google.com3defe6a2009-12-04 20:57:17 +0000404} // namespace chromeos_update_engine