update_engine: Pospone setgoodkernel after update check
Currently, if an update is forced, we first run setgoodkernel and then continue
with the update check. However, this delays the update check screen in the
OOBE. This patch adds a new Action, UpdateBootFlagsAction which is configured to
run AFTER an update check and response. However, now if the update check failed
due for example the response was invalid, then setgoodkernel will not
happen. But we already have a mechanism in SystemState where setgoodkernel is
always called (currently) 45 seconds after the boot. So there would no worries.
BUG=chromium:807976
TEST=unittests
TEST=powerwashed the device, and the check for update passed faster on OOBE.
Change-Id: I5845d7a4c1393aec568b6279dfbb7d3dfa31cdd8
Reviewed-on: https://chromium-review.googlesource.com/1011244
Commit-Ready: Amin Hassani <ahassani@chromium.org>
Tested-by: Amin Hassani <ahassani@chromium.org>
Reviewed-by: Sen Jiang <senj@chromium.org>
diff --git a/update_boot_flags_action_unittest.cc b/update_boot_flags_action_unittest.cc
new file mode 100644
index 0000000..1b2bfa5
--- /dev/null
+++ b/update_boot_flags_action_unittest.cc
@@ -0,0 +1,69 @@
+//
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "update_engine/update_boot_flags_action.h"
+
+#include <memory>
+#include <utility>
+
+#include <base/bind.h>
+#include <gtest/gtest.h>
+
+#include "update_engine/fake_system_state.h"
+
+namespace chromeos_update_engine {
+
+class UpdateBootFlagsActionTest : public ::testing::Test {
+ public:
+ FakeSystemState fake_system_state_;
+};
+
+TEST_F(UpdateBootFlagsActionTest, SimpleTest) {
+ auto boot_control = fake_system_state_.fake_boot_control();
+ auto action = std::make_unique<UpdateBootFlagsAction>(boot_control);
+ ActionProcessor processor;
+ processor.EnqueueAction(std::move(action));
+
+ EXPECT_FALSE(UpdateBootFlagsAction::updated_boot_flags_);
+ EXPECT_FALSE(UpdateBootFlagsAction::is_running_);
+ processor.StartProcessing();
+ EXPECT_TRUE(UpdateBootFlagsAction::updated_boot_flags_);
+ EXPECT_FALSE(UpdateBootFlagsAction::is_running_);
+}
+
+TEST_F(UpdateBootFlagsActionTest, DoubleActionTest) {
+ // Reset the static flags.
+ UpdateBootFlagsAction::updated_boot_flags_ = false;
+ UpdateBootFlagsAction::is_running_ = false;
+
+ auto boot_control = fake_system_state_.fake_boot_control();
+ auto action1 = std::make_unique<UpdateBootFlagsAction>(boot_control);
+ auto action2 = std::make_unique<UpdateBootFlagsAction>(boot_control);
+ ActionProcessor processor1, processor2;
+ processor1.EnqueueAction(std::move(action1));
+ processor2.EnqueueAction(std::move(action2));
+
+ EXPECT_FALSE(UpdateBootFlagsAction::updated_boot_flags_);
+ EXPECT_FALSE(UpdateBootFlagsAction::is_running_);
+ processor1.StartProcessing();
+ EXPECT_TRUE(UpdateBootFlagsAction::updated_boot_flags_);
+ EXPECT_FALSE(UpdateBootFlagsAction::is_running_);
+ processor2.StartProcessing();
+ EXPECT_TRUE(UpdateBootFlagsAction::updated_boot_flags_);
+ EXPECT_FALSE(UpdateBootFlagsAction::is_running_);
+}
+
+} // namespace chromeos_update_engine