Index: chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc |
diff --git a/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc b/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c896822d5e4f5eba989363983f1b73ddc8ce5c29 |
--- /dev/null |
+++ b/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc |
@@ -0,0 +1,124 @@ |
+// Copyright 2014 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 "chrome/browser/ui/webui/help/version_updater_chromeos.h" |
+ |
+#include "base/bind.h" |
+#include "base/compiler_specific.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "chrome/browser/chromeos/login/users/mock_user_manager.h" |
+#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h" |
+#include "chromeos/dbus/dbus_thread_manager.h" |
+#include "chromeos/dbus/fake_update_engine_client.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+using ::testing::AtLeast; |
+using ::testing::Return; |
+ |
+namespace chromeos { |
+ |
+namespace { |
+ |
+void CheckNotification(VersionUpdater::Status /* status */, |
+ int /* progress */, |
+ const base::string16& /* message */) { |
+} |
+ |
+} // namespace |
+ |
+class VersionUpdaterCrosTest : public ::testing::Test { |
+ protected: |
+ VersionUpdaterCrosTest() |
+ : version_updater_(VersionUpdater::Create()), |
+ fake_update_engine_client_(NULL), |
+ mock_user_manager_(new MockUserManager()), |
+ user_manager_enabler_(mock_user_manager_) { |
+ VersionUpdaterCros* version_updater = |
+ static_cast<VersionUpdaterCros*>(version_updater_.get()); |
+ version_updater->set_can_update_for_testing(true); |
+ } |
+ |
+ virtual ~VersionUpdaterCrosTest() {} |
+ |
+ virtual void SetUp() OVERRIDE { |
+ fake_update_engine_client_ = new FakeUpdateEngineClient(); |
+ scoped_ptr<DBusThreadManagerSetter> dbus_setter = |
+ DBusThreadManager::GetSetterForTesting(); |
+ dbus_setter->SetUpdateEngineClient( |
+ scoped_ptr<UpdateEngineClient>(fake_update_engine_client_).Pass()); |
+ |
+ EXPECT_CALL(*mock_user_manager_, IsCurrentUserOwner()) |
+ .WillRepeatedly(Return(false)); |
+ EXPECT_CALL(*mock_user_manager_, Shutdown()).Times(AtLeast(0)); |
+ } |
+ |
+ scoped_ptr<VersionUpdater> version_updater_; |
+ FakeUpdateEngineClient* fake_update_engine_client_; // Not owned. |
+ |
+ MockUserManager* mock_user_manager_; // Not owned. |
+ ScopedUserManagerEnabler user_manager_enabler_; |
+}; |
+ |
+// The test checks following behaviour: |
+// 1. The device is currently on the dev channel and an user decides to switch |
+// to the beta channel. |
+// 2. In the middle of channel switch the user decides to switch to the stable |
+// channel. |
+// 3. Update engine reports an error because downloading channel (beta) is not |
+// equal |
+// to the target channel (stable). |
+// 4. When update engine becomes idle downloading of the stable channel is |
+// initiated. |
+TEST_F(VersionUpdaterCrosTest, TwoOverlappingSetChannelRequests) { |
+ version_updater_->SetChannel("beta-channel", true); |
+ |
+ { |
+ UpdateEngineClient::Status status; |
+ status.status = UpdateEngineClient::UPDATE_STATUS_IDLE; |
+ fake_update_engine_client_->set_default_status(status); |
+ fake_update_engine_client_->NotifyObserversThatStatusChanged(status); |
+ } |
+ |
+ EXPECT_EQ(0, fake_update_engine_client_->request_update_check_call_count()); |
+ |
+ // IDLE -> DOWNLOADING transition after update check. |
+ version_updater_->CheckForUpdate(base::Bind(&CheckNotification)); |
+ EXPECT_EQ(1, fake_update_engine_client_->request_update_check_call_count()); |
+ |
+ { |
+ UpdateEngineClient::Status status; |
+ status.status = UpdateEngineClient::UPDATE_STATUS_DOWNLOADING; |
+ status.download_progress = 0.1; |
+ fake_update_engine_client_->set_default_status(status); |
+ fake_update_engine_client_->NotifyObserversThatStatusChanged(status); |
+ } |
+ |
+ version_updater_->SetChannel("stable-channel", true); |
+ |
+ // DOWNLOADING -> REPORTING_ERROR_EVENT transition since target channel is not |
+ // equal to downloading channel now. |
+ { |
+ UpdateEngineClient::Status status; |
+ status.status = UpdateEngineClient::UPDATE_STATUS_REPORTING_ERROR_EVENT; |
+ fake_update_engine_client_->set_default_status(status); |
+ fake_update_engine_client_->NotifyObserversThatStatusChanged(status); |
+ } |
+ |
+ version_updater_->CheckForUpdate(base::Bind(&CheckNotification)); |
+ EXPECT_EQ(1, fake_update_engine_client_->request_update_check_call_count()); |
+ |
+ // REPORTING_ERROR_EVENT -> IDLE transition, update check should be |
+ // automatically scheduled. |
+ { |
+ UpdateEngineClient::Status status; |
+ status.status = UpdateEngineClient::UPDATE_STATUS_IDLE; |
+ fake_update_engine_client_->set_default_status(status); |
+ fake_update_engine_client_->NotifyObserversThatStatusChanged(status); |
+ } |
+ |
+ EXPECT_EQ(2, fake_update_engine_client_->request_update_check_call_count()); |
+} |
+ |
+} // namespace chromeos |