Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(670)

Unified Diff: src/platform/update_engine/set_bootable_flag_action_unittest.cc

Issue 465067: Missed new files in last commit
Patch Set: Created 11 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/platform/update_engine/set_bootable_flag_action.cc ('k') | src/platform/update_engine/subprocess.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/platform/update_engine/set_bootable_flag_action_unittest.cc
diff --git a/src/platform/update_engine/set_bootable_flag_action_unittest.cc b/src/platform/update_engine/set_bootable_flag_action_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..215c189e6877e0a59f2730f5f90a3c62ac71cb93
--- /dev/null
+++ b/src/platform/update_engine/set_bootable_flag_action_unittest.cc
@@ -0,0 +1,153 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <string>
+#include <vector>
+#include <gtest/gtest.h>
+#include "update_engine/set_bootable_flag_action.h"
+#include "update_engine/test_utils.h"
+#include "update_engine/utils.h"
+
+using std::string;
+using std::vector;
+
+namespace chromeos_update_engine {
+
+class SetBootableFlagActionProcessorDelegate : public ActionProcessorDelegate {
+ public:
+ SetBootableFlagActionProcessorDelegate()
+ : success_(false), success_set_(false) {}
+ void ActionCompleted(ActionProcessor* processor,
+ AbstractAction* action,
+ bool success) {
+ if (action->Type() == SetBootableFlagAction::StaticType()) {
+ success_ = success;
+ success_set_ = true;
+ }
+ }
+ bool success_;
+ bool success_set_;
+};
+
+class SetBootableFlagActionTest : public ::testing::Test {
+ public:
+ SetBootableFlagActionTest();
+ protected:
+ enum TestFlags {
+ EXPECT_SUCCESS = 0x01,
+ WRITE_FILE = 0x02,
+ SKIP_INPUT_OBJECT = 0x04
+ };
+ static const char* kTestDir;
+ virtual void SetUp() {
+ EXPECT_EQ(0, mkdir(kTestDir, 0755));
+ }
+ virtual void TearDown() {
+ EXPECT_EQ(0, System(string("rm -rf ") + kTestDir));
+ }
+ vector<char> DoTest(vector<char> mbr_in,
+ const string& filename,
+ uint32 test_flags);
+ // first partition bootable, no others bootable
+ const vector<char> sample_mbr_;
+};
+
+const char* SetBootableFlagActionTest::kTestDir =
+ "SetBootableFlagActionTestDir";
+
+SetBootableFlagActionTest::SetBootableFlagActionTest()
+ : sample_mbr_(GenerateSampleMbr()) {}
+
+vector<char> SetBootableFlagActionTest::DoTest(vector<char> mbr_in,
+ const string& filename,
+ uint32 flags) {
+ CHECK(!filename.empty());
+ const string root_filename(filename.begin(), --filename.end());
+ if (flags & WRITE_FILE)
+ EXPECT_TRUE(WriteFileVector(root_filename, mbr_in));
+
+ ActionProcessor processor;
+ SetBootableFlagActionProcessorDelegate delegate;
+ processor.set_delegate(&delegate);
+
+ ObjectFeederAction<string> feeder_action;
+ feeder_action.set_obj(filename);
+ SetBootableFlagAction set_bootable_action;
+ if (!(flags & SKIP_INPUT_OBJECT))
+ BondActions(&feeder_action, &set_bootable_action);
+ ObjectCollectorAction<string> collector_action;
+ BondActions(&set_bootable_action, &collector_action);
+ processor.EnqueueAction(&feeder_action);
+ processor.EnqueueAction(&set_bootable_action);
+ processor.EnqueueAction(&collector_action);
+ processor.StartProcessing();
+ EXPECT_TRUE(!processor.IsRunning())
+ << "Update test to handle non-asynch actions";
+
+ EXPECT_TRUE(delegate.success_set_);
+ EXPECT_EQ(flags & EXPECT_SUCCESS, delegate.success_);
+
+ vector<char> new_mbr;
+ if (flags & WRITE_FILE)
+ utils::ReadFile(root_filename, &new_mbr);
+
+ unlink(root_filename.c_str());
+ return new_mbr;
+}
+
+TEST_F(SetBootableFlagActionTest, SimpleTest) {
+ for (int i = 0; i < 4; i++) {
+ vector<char> expected_new_mbr = sample_mbr_;
+ for (int j = 0; j < 4; j++)
+ expected_new_mbr[446 + 16 * j] = '\0'; // mark non-bootable
+ expected_new_mbr[446 + 16 * i] = 0x80; // mark bootable
+
+ string filename(string(kTestDir) + "/SetBootableFlagActionTest.devX");
+ filename[filename.size() - 1] = '1' + i;
+
+ vector<char> actual_new_mbr = DoTest(expected_new_mbr, filename,
+ EXPECT_SUCCESS | WRITE_FILE);
+
+ ExpectVectorsEq(expected_new_mbr, actual_new_mbr);
+ }
+}
+
+TEST_F(SetBootableFlagActionTest, BadDeviceTest) {
+ vector<char> actual_new_mbr = DoTest(sample_mbr_,
+ string(kTestDir) +
+ "SetBootableFlagActionTest.dev5",
+ WRITE_FILE);
+ ExpectVectorsEq(sample_mbr_, actual_new_mbr); // no change
+
+ actual_new_mbr = DoTest(sample_mbr_,
+ string(kTestDir) + "SetBootableFlagActionTest.dev13",
+ WRITE_FILE);
+ ExpectVectorsEq(sample_mbr_, actual_new_mbr); // no change
+
+ actual_new_mbr = DoTest(sample_mbr_,
+ "/some/nonexistent/file3",
+ 0);
+ EXPECT_TRUE(actual_new_mbr.empty());
+
+ vector<char> bad_mbr = sample_mbr_;
+ bad_mbr[510] = 'x'; // makes signature invalid
+
+ actual_new_mbr = DoTest(bad_mbr,
+ string(kTestDir) + "SetBootableFlagActionTest.dev2",
+ WRITE_FILE);
+ ExpectVectorsEq(bad_mbr, actual_new_mbr); // no change
+}
+
+TEST_F(SetBootableFlagActionTest, NoInputObjectTest) {
+ vector<char> actual_new_mbr = DoTest(sample_mbr_,
+ string(kTestDir) +
+ "SetBootableFlagActionTest.dev5",
+ WRITE_FILE | SKIP_INPUT_OBJECT);
+ ExpectVectorsEq(sample_mbr_, actual_new_mbr); // no change
+}
+
+} // namespace chromeos_update_engine
« no previous file with comments | « src/platform/update_engine/set_bootable_flag_action.cc ('k') | src/platform/update_engine/subprocess.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698