Commit cb477af4 authored by kumarniranjan's avatar kumarniranjan Committed by Commit bot

Fix autoupdate_EndToEndTest on veyron_rialto

Adds a 3 min delay before starting zero-touch enrollment during OOBE.

BUG=chromium:710716
TEST=browser test

Review-Url: https://codereview.chromium.org/2824283003
Cr-Commit-Position: refs/heads/master@{#468086}
parent aa5f200c
...@@ -1517,12 +1517,19 @@ static_library("test_support") { ...@@ -1517,12 +1517,19 @@ static_library("test_support") {
"login/enrollment/enterprise_enrollment_helper_mock.h", "login/enrollment/enterprise_enrollment_helper_mock.h",
"login/enrollment/mock_enrollment_screen.cc", "login/enrollment/mock_enrollment_screen.cc",
"login/enrollment/mock_enrollment_screen.h", "login/enrollment/mock_enrollment_screen.h",
"login/mock_network_state_helper.cc",
"login/mock_network_state_helper.h",
"login/screens/mock_base_screen_delegate.cc", "login/screens/mock_base_screen_delegate.cc",
"login/screens/mock_base_screen_delegate.h", "login/screens/mock_base_screen_delegate.h",
"login/screens/mock_model_view_channel.cc",
"login/screens/mock_model_view_channel.h",
"login/screens/mock_network_screen.cc",
"login/screens/mock_network_screen.h",
] ]
deps = [ deps = [
"//components/policy/proto", "//components/policy/proto",
"//skia",
"//testing/gmock", "//testing/gmock",
] ]
} }
...@@ -1667,6 +1674,7 @@ source_set("unit_tests") { ...@@ -1667,6 +1674,7 @@ source_set("unit_tests") {
"login/quick_unlock/pin_storage_unittest.cc", "login/quick_unlock/pin_storage_unittest.cc",
"login/quick_unlock/quick_unlock_storage_unittest.cc", "login/quick_unlock/quick_unlock_storage_unittest.cc",
"login/saml/saml_offline_signin_limiter_unittest.cc", "login/saml/saml_offline_signin_limiter_unittest.cc",
"login/screens/network_screen_unittest.cc",
"login/signin/merge_session_load_page_unittest.cc", "login/signin/merge_session_load_page_unittest.cc",
"login/supervised/supervised_user_authentication_unittest.cc", "login/supervised/supervised_user_authentication_unittest.cc",
"login/users/affiliation_unittest.cc", "login/users/affiliation_unittest.cc",
......
// Copyright 2017 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/chromeos/login/mock_network_state_helper.h"
namespace chromeos {
namespace login {
MockNetworkStateHelper::MockNetworkStateHelper() {}
MockNetworkStateHelper::~MockNetworkStateHelper() {}
} // namespace login
} // namespace chromeos
// Copyright 2017 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.
#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_MOCK_NETWORK_STATE_HELPER_H_
#define CHROME_BROWSER_CHROMEOS_LOGIN_MOCK_NETWORK_STATE_HELPER_H_
#include "chrome/browser/chromeos/login/helper.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace chromeos {
namespace login {
class MockNetworkStateHelper : public NetworkStateHelper {
public:
MockNetworkStateHelper();
~MockNetworkStateHelper() override;
MOCK_CONST_METHOD0(GetCurrentNetworkName, base::string16(void));
MOCK_CONST_METHOD0(IsConnected, bool(void));
MOCK_CONST_METHOD0(IsConnecting, bool(void));
};
} // namespace login
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_LOGIN_MOCK_NETWORK_STATE_HELPER_H_
// Copyright 2017 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/chromeos/login/screens/mock_model_view_channel.h"
namespace chromeos {
MockModelViewChannel::MockModelViewChannel() {}
MockModelViewChannel::~MockModelViewChannel() {}
} // namespace chromeos
// Copyright 2017 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.
#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_MOCK_MODEL_VIEW_CHANNEL_H_
#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_MOCK_MODEL_VIEW_CHANNEL_H_
#include "base/values.h"
#include "chrome/browser/chromeos/login/screens/model_view_channel.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace chromeos {
class MockModelViewChannel : public ModelViewChannel {
public:
MockModelViewChannel();
~MockModelViewChannel() override;
MOCK_METHOD1(CommitContextChanges, void(const base::DictionaryValue& diff));
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_MOCK_MODEL_VIEW_CHANNEL_H_
...@@ -363,7 +363,12 @@ void NetworkScreen::StopWaitingForConnection(const base::string16& network_id) { ...@@ -363,7 +363,12 @@ void NetworkScreen::StopWaitingForConnection(const base::string16& network_id) {
if (is_connected && continue_attempts_ == 0 && if (is_connected && continue_attempts_ == 0 &&
policy::DeviceCloudPolicyManagerChromeOS::GetZeroTouchEnrollmentMode() == policy::DeviceCloudPolicyManagerChromeOS::GetZeroTouchEnrollmentMode() ==
policy::ZeroTouchEnrollmentMode::HANDS_OFF) { policy::ZeroTouchEnrollmentMode::HANDS_OFF) {
OnContinueButtonPressed(); // Call OnContinueButtonPressed after 3 minutes.
base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
FROM_HERE,
base::Bind(&NetworkScreen::OnContinueButtonPressed,
weak_factory_.GetWeakPtr()),
base::TimeDelta::FromMinutes(3));
} }
} }
......
...@@ -95,10 +95,11 @@ class NetworkScreen : public BaseScreen, ...@@ -95,10 +95,11 @@ class NetworkScreen : public BaseScreen,
private: private:
friend class NetworkScreenTest; friend class NetworkScreenTest;
friend class NetworkScreenUnitTest;
FRIEND_TEST_ALL_PREFIXES(NetworkScreenTest, Timeout); FRIEND_TEST_ALL_PREFIXES(NetworkScreenTest, Timeout);
FRIEND_TEST_ALL_PREFIXES(NetworkScreenTest, CanConnect); FRIEND_TEST_ALL_PREFIXES(NetworkScreenTest, CanConnect);
FRIEND_TEST_ALL_PREFIXES(HandsOffNetworkScreenTest, RequiresNoInput); FRIEND_TEST_ALL_PREFIXES(NetworkScreenUnitTest, ContinuesAutomatically);
FRIEND_TEST_ALL_PREFIXES(HandsOffNetworkScreenTest, ContinueClickedOnlyOnce); FRIEND_TEST_ALL_PREFIXES(NetworkScreenUnitTest, ContinuesOnlyOnce);
// BaseScreen implementation: // BaseScreen implementation:
void Show() override; void Show() override;
......
...@@ -8,9 +8,9 @@ ...@@ -8,9 +8,9 @@
#include "base/command_line.h" #include "base/command_line.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h" #include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h"
#include "chrome/browser/chromeos/login/helper.h" #include "chrome/browser/chromeos/login/helper.h"
#include "chrome/browser/chromeos/login/mock_network_state_helper.h"
#include "chrome/browser/chromeos/login/screens/base_screen.h" #include "chrome/browser/chromeos/login/screens/base_screen.h"
#include "chrome/browser/chromeos/login/screens/mock_base_screen_delegate.h" #include "chrome/browser/chromeos/login/screens/mock_base_screen_delegate.h"
#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h" #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
...@@ -41,17 +41,6 @@ class DummyButtonListener : public views::ButtonListener { ...@@ -41,17 +41,6 @@ class DummyButtonListener : public views::ButtonListener {
void ButtonPressed(views::Button* sender, const ui::Event& event) override {} void ButtonPressed(views::Button* sender, const ui::Event& event) override {}
}; };
namespace login {
class MockNetworkStateHelper : public NetworkStateHelper {
public:
MOCK_CONST_METHOD0(GetCurrentNetworkName, base::string16(void));
MOCK_CONST_METHOD0(IsConnected, bool(void));
MOCK_CONST_METHOD0(IsConnecting, bool(void));
};
} // namespace login
class NetworkScreenTest : public WizardInProcessBrowserTest { class NetworkScreenTest : public WizardInProcessBrowserTest {
public: public:
NetworkScreenTest() NetworkScreenTest()
...@@ -157,124 +146,4 @@ IN_PROC_BROWSER_TEST_F(NetworkScreenTest, Timeout) { ...@@ -157,124 +146,4 @@ IN_PROC_BROWSER_TEST_F(NetworkScreenTest, Timeout) {
// view_->ClearErrors(); // view_->ClearErrors();
} }
class HandsOffNetworkScreenTest : public NetworkScreenTest {
public:
HandsOffNetworkScreenTest() {}
protected:
void SetUpOnMainThread() override {
NetworkScreenTest::SetUpOnMainThread();
// Set up fake networks.
DBusThreadManager::Get()
->GetShillManagerClient()
->GetTestInterface()
->SetupDefaultEnvironment();
}
private:
// Overridden from InProcessBrowserTest:
void SetUpCommandLine(base::CommandLine* command_line) override {
command_line->AppendSwitchASCII(
switches::kEnterpriseEnableZeroTouchEnrollment, "hands-off");
}
DISALLOW_COPY_AND_ASSIGN(HandsOffNetworkScreenTest);
};
#if defined(OS_CHROMEOS)
// Flaky on ChromeOS. See https://crbug.com/674782.
#define MAYBE_RequiresNoInput DISABLED_RequiresNoInput
#else
#define MAYBE_RequiresNoInput RequiresNoInput
#endif
IN_PROC_BROWSER_TEST_F(HandsOffNetworkScreenTest, MAYBE_RequiresNoInput) {
WizardController* wizard_controller = WizardController::default_controller();
// Allow the WizardController to advance throught the enrollment flow.
network_screen_->base_screen_delegate_ = wizard_controller;
// Simulate a network connection.
EXPECT_CALL(*mock_network_state_helper_, IsConnected())
.Times(AnyNumber())
.WillRepeatedly((Return(true)));
network_screen_->UpdateStatus();
// Check if NetworkScreen::OnContinueButtonPressed() is called
// Note that checking network_screen_->continue_pressed_ is not
// sufficient since there are cases where OnContinueButtonPressed()
// is called but where this variable is not set to true.
ASSERT_TRUE((!network_screen_->is_network_subscribed_) &&
network_screen_->network_state_helper_->IsConnected());
// Check that we reach the enrollment screen.
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_ENROLLMENT).Wait();
// Check that attestation-based enrollment finishes
// with either success or error.
bool done = false;
ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
LoginDisplayHost::default_host()->GetOobeUI()->web_ui()->GetWebContents(),
"var count = 0;"
"function isVisible(el) {"
" return window.getComputedStyle(document.getElementById(el)).display"
" !== 'none';"
"}"
"function SendReplyIfEnrollmentDone() {"
" if (isVisible('oauth-enroll-step-abe-success') ||"
" isVisible('oauth-enroll-step-error')) {"
" domAutomationController.send(true);"
" } else if (count > 10) {"
" domAutomationController.send(false);"
" } else {"
" count++;"
" setTimeout(SendReplyIfEnrollmentDone, 1000);"
" }"
"}"
"SendReplyIfEnrollmentDone();",
&done));
// Reset the enrollment helper so there is no side effect with other tests.
static_cast<EnrollmentScreen*>(wizard_controller->current_screen())
->enrollment_helper_.reset();
}
IN_PROC_BROWSER_TEST_F(HandsOffNetworkScreenTest, ContinueClickedOnlyOnce) {
WizardController* wizard_controller = WizardController::default_controller();
// Allow the WizardController to advance through the enrollment flow.
network_screen_->base_screen_delegate_ = wizard_controller;
// Check that OnContinueButtonPressed has not been called yet.
ASSERT_EQ(0, network_screen_->continue_attempts_);
// Connect to network "net0".
EXPECT_CALL(*mock_network_state_helper_, GetCurrentNetworkName())
.Times(AnyNumber())
.WillRepeatedly(Return(base::ASCIIToUTF16("net0")));
EXPECT_CALL(*mock_network_state_helper_, IsConnected())
.Times(AnyNumber())
.WillRepeatedly(Return(true));
// Stop waiting for net0.
network_screen_->StopWaitingForConnection(base::ASCIIToUTF16("net0"));
// Check that OnContinueButtonPressed has been called exactly once.
ASSERT_EQ(1, network_screen_->continue_attempts_);
// Stop waiting for another network, net1.
network_screen_->StopWaitingForConnection(base::ASCIIToUTF16("net1"));
// Check that OnContinueButtonPressed stil has been called exactly once
ASSERT_EQ(1, network_screen_->continue_attempts_);
// Wait for the enrollment screen.
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_ENROLLMENT)
.WaitNoAssertCurrentScreen();
// Reset the enrollment helper so there is no side effect with other tests.
static_cast<EnrollmentScreen*>(wizard_controller->current_screen())
->enrollment_helper_.reset();
}
} // namespace chromeos } // namespace chromeos
// Copyright 2017 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 "base/command_line.h"
#include "base/message_loop/message_loop.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/scoped_mock_time_message_loop_task_runner.h"
#include "chrome/browser/chromeos/input_method/input_method_configuration.h"
#include "chrome/browser/chromeos/input_method/mock_input_method_manager_impl.h"
#include "chrome/browser/chromeos/login/mock_network_state_helper.h"
#include "chrome/browser/chromeos/login/screens/mock_base_screen_delegate.h"
#include "chrome/browser/chromeos/login/screens/mock_model_view_channel.h"
#include "chrome/browser/chromeos/login/screens/mock_network_screen.h"
#include "chrome/browser/chromeos/settings/cros_settings.h"
#include "chrome/browser/chromeos/settings/device_settings_service.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chromeos/chromeos_switches.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/system/fake_statistics_provider.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/ime/chromeos/mock_component_extension_ime_manager.h"
using testing::_;
using testing::AnyNumber;
using testing::Return;
namespace chromeos {
class NetworkScreenUnitTest : public testing::Test {
public:
NetworkScreenUnitTest() {}
base::ScopedMockTimeMessageLoopTaskRunner* GetTestMessageLoopTaskRunner() {
return &runner_;
}
void FastForwardTime(base::TimeDelta time) {
runner_.task_runner()->FastForwardBy(time);
}
// testing::Test:
void SetUp() override {
// Initialize the thread manager.
DBusThreadManager::Initialize();
// Configure the browser to use Hands-Off Enrollment.
base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
switches::kEnterpriseEnableZeroTouchEnrollment, "hands-off");
// Replace the regular InputMethodManager with a mock.
input_method::MockInputMethodManagerImpl* mock_input_manager =
new input_method::MockInputMethodManagerImpl();
mock_input_manager->SetComponentExtensionIMEManager(
std::unique_ptr<MockComponentExtensionIMEManager>(
new MockComponentExtensionIMEManager()));
input_method::InitializeForTesting(mock_input_manager);
// Create the NetworkScreen we will use for testing.
network_screen_.reset(
new NetworkScreen(&mock_base_screen_delegate_, nullptr, &mock_view_));
network_screen_->set_model_view_channel(&mock_channel_);
mock_network_state_helper_ = new login::MockNetworkStateHelper();
network_screen_->SetNetworkStateHelperForTest(mock_network_state_helper_);
}
void TearDown() override {
TestingBrowserProcess::GetGlobal()->SetShuttingDown(true);
network_screen_.reset();
input_method::Shutdown();
DBusThreadManager::Shutdown();
}
protected:
// A pointer to the NetworkScreen.
std::unique_ptr<NetworkScreen> network_screen_;
// Accessory objects needed by NetworkScreen.
MockBaseScreenDelegate mock_base_screen_delegate_;
login::MockNetworkStateHelper* mock_network_state_helper_ = nullptr;
private:
// Test versions of core browser infrastructure.
content::TestBrowserThreadBundle threads_;
base::ScopedMockTimeMessageLoopTaskRunner runner_;
// More accessory objects needed by NetworkScreen.
MockNetworkView mock_view_;
MockModelViewChannel mock_channel_;
// Scoped test versions of required global objects.
ScopedTestDeviceSettingsService device_settings_;
ScopedTestCrosSettings cros_settings_;
system::ScopedFakeStatisticsProvider provider_;
DISALLOW_COPY_AND_ASSIGN(NetworkScreenUnitTest);
};
TEST_F(NetworkScreenUnitTest, ContinuesAutomatically) {
// Verify that we are using the right TaskRunner.
EXPECT_EQ(GetTestMessageLoopTaskRunner()->task_runner(),
base::MessageLoop::current()->task_runner().get());
// Set expectation that NetworkScreen will finish.
EXPECT_CALL(mock_base_screen_delegate_,
OnExit(_, ScreenExitCode::NETWORK_CONNECTED, _))
.Times(1);
// Simulate a network connection.
EXPECT_CALL(*mock_network_state_helper_, IsConnected())
.Times(AnyNumber())
.WillRepeatedly((Return(true)));
network_screen_->UpdateStatus();
// Fast forward time by 3 minutes.
FastForwardTime(base::TimeDelta::FromMinutes(3));
// Check that we continued once
EXPECT_EQ(1, network_screen_->continue_attempts_);
}
TEST_F(NetworkScreenUnitTest, ContinuesOnlyOnce) {
// Verify that we are using the right TaskRunner.
EXPECT_EQ(GetTestMessageLoopTaskRunner()->task_runner(),
base::MessageLoop::current()->task_runner().get());
// Set expectation that NetworkScreen will finish.
EXPECT_CALL(mock_base_screen_delegate_,
OnExit(_, ScreenExitCode::NETWORK_CONNECTED, _))
.Times(1);
// Connect to network "net0".
EXPECT_CALL(*mock_network_state_helper_, GetCurrentNetworkName())
.Times(AnyNumber())
.WillRepeatedly(Return(base::ASCIIToUTF16("net0")));
EXPECT_CALL(*mock_network_state_helper_, IsConnected())
.Times(AnyNumber())
.WillRepeatedly(Return(true));
// Stop waiting for net0.
network_screen_->StopWaitingForConnection(base::ASCIIToUTF16("net0"));
// Fast forward time by 3 minutes.
FastForwardTime(base::TimeDelta::FromMinutes(3));
// Check that we have continued exactly once.
ASSERT_EQ(1, network_screen_->continue_attempts_);
// Stop waiting for another network, net1.
network_screen_->StopWaitingForConnection(base::ASCIIToUTF16("net1"));
// Fast forward time by 3 minutes.
FastForwardTime(base::TimeDelta::FromMinutes(3));
// Check that we have still continued only once.
EXPECT_EQ(1, network_screen_->continue_attempts_);
}
} // namespace chromeos
...@@ -42,6 +42,8 @@ component("ime") { ...@@ -42,6 +42,8 @@ component("ime") {
"chromeos/input_method_descriptor.h", "chromeos/input_method_descriptor.h",
"chromeos/input_method_manager.cc", "chromeos/input_method_manager.cc",
"chromeos/input_method_manager.h", "chromeos/input_method_manager.h",
"chromeos/mock_component_extension_ime_manager.cc",
"chromeos/mock_component_extension_ime_manager.h",
"chromeos/mock_component_extension_ime_manager_delegate.cc", "chromeos/mock_component_extension_ime_manager_delegate.cc",
"chromeos/mock_component_extension_ime_manager_delegate.h", "chromeos/mock_component_extension_ime_manager_delegate.h",
"chromeos/mock_ime_candidate_window_handler.cc", "chromeos/mock_ime_candidate_window_handler.cc",
......
...@@ -104,7 +104,8 @@ class UI_BASE_IME_EXPORT ComponentExtensionIMEManager { ...@@ -104,7 +104,8 @@ class UI_BASE_IME_EXPORT ComponentExtensionIMEManager {
input_method::InputMethodDescriptors GetAllIMEAsInputMethodDescriptor(); input_method::InputMethodDescriptors GetAllIMEAsInputMethodDescriptor();
// Returns all XKB keyboard IME as InputMethodDescriptors. // Returns all XKB keyboard IME as InputMethodDescriptors.
input_method::InputMethodDescriptors GetXkbIMEAsInputMethodDescriptor(); virtual input_method::InputMethodDescriptors
GetXkbIMEAsInputMethodDescriptor();
private: private:
// Finds ComponentExtensionIME and EngineDescription associated with // Finds ComponentExtensionIME and EngineDescription associated with
......
// Copyright 2017 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 "ui/base/ime/chromeos/mock_component_extension_ime_manager.h"
namespace chromeos {
input_method::InputMethodDescriptors
MockComponentExtensionIMEManager::GetXkbIMEAsInputMethodDescriptor() {
return input_method::InputMethodDescriptors();
}
} // namespace chromeos
// Copyright 2017 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.
#ifndef UI_BASE_IME_MOCK_CHROMEOS_COMPONENT_EXTENSION_IME_MANAGER_H_
#define UI_BASE_IME_MOCK_CHROMEOS_COMPONENT_EXTENSION_IME_MANAGER_H_
#include "ui/base/ime/chromeos/component_extension_ime_manager.h"
namespace chromeos {
class UI_BASE_IME_EXPORT MockComponentExtensionIMEManager
: public ComponentExtensionIMEManager {
public:
input_method::InputMethodDescriptors GetXkbIMEAsInputMethodDescriptor()
override;
};
} // namespace chromeos
#endif // UI_BASE_IME_MOCK_CHROMEOS_COMPONENT_EXTENSION_IME_MANAGER_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment