This source file includes following definitions.
- SetUp
- SetLoginHTMLTemplate
- SetLoginAuthHTMLTemplate
- HandleRequest
- BuildHTMLResponse
- SetUp
- SetUpInProcessBrowserTestFixture
- SetUpCommandLine
- SetUpOnMainThread
- CleanUpOnMainThread
- SetMergeSessionParams
- GetLoginDisplay
- WaitForSigninScreen
- StartSamlAndWaitForIdpPageLoad
- SetSignFormField
- SendConfirmPassword
- JsExpect
- GetLoginUI
- ExecuteJsInSigninFrame
- fake_saml_idp
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- SetUpInProcessBrowserTestFixture
- SetUpOnMainThread
- SetSAMLOfflineSigninTimeLimitPolicy
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
#include "base/command_line.h"
#include "base/file_util.h"
#include "base/files/file_path.h"
#include "base/memory/scoped_ptr.h"
#include "base/path_service.h"
#include "base/run_loop.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/chromeos/login/existing_user_controller.h"
#include "chrome/browser/chromeos/login/login_display_host_impl.h"
#include "chrome/browser/chromeos/login/test/https_forwarder.h"
#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
#include "chrome/browser/chromeos/login/user.h"
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/chromeos/login/webui_login_display.h"
#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chromeos/chromeos_switches.h"
#include "components/policy/core/browser/browser_policy_connector.h"
#include "components/policy/core/common/mock_configuration_policy_provider.h"
#include "components/policy/core/common/policy_map.h"
#include "components/policy/core/common/policy_types.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
#include "google_apis/gaia/fake_gaia.h"
#include "google_apis/gaia/gaia_switches.h"
#include "net/base/url_util.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h"
#include "policy/policy_constants.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
using net::test_server::BasicHttpResponse;
using net::test_server::HttpRequest;
using net::test_server::HttpResponse;
using testing::_;
using testing::Return;
namespace chromeos {
namespace {
const char kTestAuthSIDCookie[] = "fake-auth-SID-cookie";
const char kTestAuthLSIDCookie[] = "fake-auth-LSID-cookie";
const char kTestAuthCode[] = "fake-auth-code";
const char kTestGaiaUberToken[] = "fake-uber-token";
const char kTestAuthLoginAccessToken[] = "fake-access-token";
const char kTestRefreshToken[] = "fake-refresh-token";
const char kTestSessionSIDCookie[] = "fake-session-SID-cookie";
const char kTestSessionLSIDCookie[] = "fake-session-LSID-cookie";
const char kFirstSAMLUserEmail[] = "bob@example.com";
const char kSecondSAMLUserEmail[] = "alice@example.com";
const char kHTTPSAMLUserEmail[] = "carol@example.com";
const char kNonSAMLUserEmail[] = "dan@example.com";
const char kRelayState[] = "RelayState";
class FakeSamlIdp {
public:
FakeSamlIdp();
~FakeSamlIdp();
void SetUp(const std::string& base_path, const GURL& gaia_url);
void SetLoginHTMLTemplate(const std::string& template_file);
void SetLoginAuthHTMLTemplate(const std::string& template_file);
scoped_ptr<HttpResponse> HandleRequest(const HttpRequest& request);
private:
scoped_ptr<HttpResponse> BuildHTMLResponse(const std::string& html_template,
const std::string& relay_state,
const std::string& next_path);
base::FilePath html_template_dir_;
std::string login_path_;
std::string login_auth_path_;
std::string login_html_template_;
std::string login_auth_html_template_;
GURL gaia_assertion_url_;
DISALLOW_COPY_AND_ASSIGN(FakeSamlIdp);
};
FakeSamlIdp::FakeSamlIdp() {
}
FakeSamlIdp::~FakeSamlIdp() {
}
void FakeSamlIdp::SetUp(const std::string& base_path, const GURL& gaia_url) {
base::FilePath test_data_dir;
ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir));
html_template_dir_ = test_data_dir.Append("login");
login_path_= base_path;
login_auth_path_ = base_path + "Auth";
gaia_assertion_url_ = gaia_url.Resolve("/SSO");
}
void FakeSamlIdp::SetLoginHTMLTemplate(const std::string& template_file) {
EXPECT_TRUE(base::ReadFileToString(
html_template_dir_.Append(template_file),
&login_html_template_));
}
void FakeSamlIdp::SetLoginAuthHTMLTemplate(const std::string& template_file) {
EXPECT_TRUE(base::ReadFileToString(
html_template_dir_.Append(template_file),
&login_auth_html_template_));
}
scoped_ptr<HttpResponse> FakeSamlIdp::HandleRequest(
const HttpRequest& request) {
GURL request_url = GURL("http://localhost").Resolve(request.relative_url);
std::string request_path = request_url.path();
if (request_path == login_path_) {
std::string relay_state;
net::GetValueForKeyInQuery(request_url, kRelayState, &relay_state);
return BuildHTMLResponse(login_html_template_,
relay_state,
login_auth_path_);
}
if (request_path != login_auth_path_) {
return scoped_ptr<HttpResponse>();
}
std::string relay_state;
FakeGaia::GetQueryParameter(request.content, kRelayState, &relay_state);
GURL redirect_url = gaia_assertion_url_;
if (!login_auth_html_template_.empty()) {
return BuildHTMLResponse(login_auth_html_template_,
relay_state,
redirect_url.spec());
}
redirect_url = net::AppendQueryParameter(
redirect_url, "SAMLResponse", "fake_response");
redirect_url = net::AppendQueryParameter(
redirect_url, kRelayState, relay_state);
scoped_ptr<BasicHttpResponse> http_response(new BasicHttpResponse());
http_response->set_code(net::HTTP_TEMPORARY_REDIRECT);
http_response->AddCustomHeader("Location", redirect_url.spec());
return http_response.PassAs<HttpResponse>();
}
scoped_ptr<HttpResponse> FakeSamlIdp::BuildHTMLResponse(
const std::string& html_template,
const std::string& relay_state,
const std::string& next_path) {
std::string response_html = html_template;
ReplaceSubstringsAfterOffset(&response_html, 0, "$RelayState", relay_state);
ReplaceSubstringsAfterOffset(&response_html, 0, "$Post", next_path);
scoped_ptr<BasicHttpResponse> http_response(new BasicHttpResponse());
http_response->set_code(net::HTTP_OK);
http_response->set_content(response_html);
http_response->set_content_type("text/html");
return http_response.PassAs<HttpResponse>();
}
}
class SamlTest : public InProcessBrowserTest {
public:
SamlTest() : saml_load_injected_(false) {}
virtual ~SamlTest() {}
virtual void SetUp() OVERRIDE {
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
gaia_https_forwarder_.reset(
new HTTPSForwarder(embedded_test_server()->base_url()));
ASSERT_TRUE(gaia_https_forwarder_->Start());
saml_https_forwarder_.reset(
new HTTPSForwarder(embedded_test_server()->base_url()));
ASSERT_TRUE(saml_https_forwarder_->Start());
embedded_test_server()->StopThread();
InProcessBrowserTest::SetUp();
}
virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
host_resolver()->AddRule("*", "127.0.0.1");
}
virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
command_line->AppendSwitch(switches::kLoginManager);
command_line->AppendSwitch(switches::kForceLoginManagerInTests);
command_line->AppendSwitch(::switches::kDisableBackgroundNetworking);
command_line->AppendSwitchASCII(switches::kLoginProfile, "user");
const GURL gaia_url = gaia_https_forwarder_->GetURL("");
command_line->AppendSwitchASCII(::switches::kGaiaUrl, gaia_url.spec());
command_line->AppendSwitchASCII(::switches::kLsoUrl, gaia_url.spec());
command_line->AppendSwitchASCII(::switches::kGoogleApisUrl,
gaia_url.spec());
const GURL saml_idp_url = saml_https_forwarder_->GetURL("SAML");
fake_saml_idp_.SetUp(saml_idp_url.path(), gaia_url);
fake_gaia_.RegisterSamlUser(kFirstSAMLUserEmail, saml_idp_url);
fake_gaia_.RegisterSamlUser(kSecondSAMLUserEmail, saml_idp_url);
fake_gaia_.RegisterSamlUser(
kHTTPSAMLUserEmail,
embedded_test_server()->base_url().Resolve("/SAML"));
fake_gaia_.Initialize();
}
virtual void SetUpOnMainThread() OVERRIDE {
SetMergeSessionParams(kFirstSAMLUserEmail);
embedded_test_server()->RegisterRequestHandler(
base::Bind(&FakeGaia::HandleRequest, base::Unretained(&fake_gaia_)));
embedded_test_server()->RegisterRequestHandler(base::Bind(
&FakeSamlIdp::HandleRequest, base::Unretained(&fake_saml_idp_)));
embedded_test_server()->RestartThreadAndListen();
login_screen_load_observer_.reset(new content::WindowedNotificationObserver(
chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE,
content::NotificationService::AllSources()));
}
virtual void CleanUpOnMainThread() OVERRIDE {
if (LoginDisplayHostImpl::default_host()) {
base::MessageLoop::current()->PostTask(FROM_HERE,
base::Bind(&chrome::AttemptExit));
content::RunMessageLoop();
}
}
void SetMergeSessionParams(const std::string& email) {
FakeGaia::MergeSessionParams params;
params.auth_sid_cookie = kTestAuthSIDCookie;
params.auth_lsid_cookie = kTestAuthLSIDCookie;
params.auth_code = kTestAuthCode;
params.refresh_token = kTestRefreshToken;
params.access_token = kTestAuthLoginAccessToken;
params.gaia_uber_token = kTestGaiaUberToken;
params.session_sid_cookie = kTestSessionSIDCookie;
params.session_lsid_cookie = kTestSessionLSIDCookie;
params.email = email;
fake_gaia_.SetMergeSessionParams(params);
}
WebUILoginDisplay* GetLoginDisplay() {
ExistingUserController* controller =
ExistingUserController::current_controller();
CHECK(controller);
return static_cast<WebUILoginDisplay*>(controller->login_display());
}
void WaitForSigninScreen() {
WizardController::SkipPostLoginScreensForTesting();
WizardController* wizard_controller =
chromeos::WizardController::default_controller();
CHECK(wizard_controller);
wizard_controller->SkipToLoginForTesting(LoginScreenContext());
login_screen_load_observer_->Wait();
}
void StartSamlAndWaitForIdpPageLoad(const std::string& gaia_email) {
WaitForSigninScreen();
if (!saml_load_injected_) {
saml_load_injected_ = true;
ASSERT_TRUE(content::ExecuteScript(
GetLoginUI()->GetWebContents(),
"$('gaia-signin').gaiaAuthHost_.addEventListener('authFlowChange',"
"function() {"
"window.domAutomationController.setAutomationId(0);"
"window.domAutomationController.send("
"$('gaia-signin').isSAML() ? 'SamlLoaded' : 'GaiaLoaded');"
"});"));
}
content::DOMMessageQueue message_queue;
GetLoginDisplay()->ShowSigninScreenForCreds(gaia_email, "");
std::string message;
ASSERT_TRUE(message_queue.WaitForMessage(&message));
EXPECT_EQ("\"SamlLoaded\"", message);
}
void SetSignFormField(const std::string& field_id,
const std::string& field_value) {
std::string js =
"(function(){"
"document.getElementById('$FieldId').value = '$FieldValue';"
"var e = new Event('input');"
"document.getElementById('$FieldId').dispatchEvent(e);"
"})();";
ReplaceSubstringsAfterOffset(&js, 0, "$FieldId", field_id);
ReplaceSubstringsAfterOffset(&js, 0, "$FieldValue", field_value);
ExecuteJsInSigninFrame(js);
}
void SendConfirmPassword(const std::string& password_to_confirm) {
std::string js =
"$('confirm-password-input').value='$Password';"
"$('confirm-password').onConfirmPassword_();";
ReplaceSubstringsAfterOffset(&js, 0, "$Password", password_to_confirm);
ASSERT_TRUE(content::ExecuteScript(GetLoginUI()->GetWebContents(), js));
}
void JsExpect(const std::string& js) {
bool result;
EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
GetLoginUI()->GetWebContents(),
"window.domAutomationController.send(!!(" + js + "));",
&result));
EXPECT_TRUE(result) << js;
}
content::WebUI* GetLoginUI() {
return static_cast<LoginDisplayHostImpl*>(
LoginDisplayHostImpl::default_host())->GetOobeUI()->web_ui();
}
void ExecuteJsInSigninFrame(const std::string& js) {
content::RenderFrameHost* frame =
LoginDisplayHostImpl::GetGaiaAuthIframe(GetLoginUI()->GetWebContents());
ASSERT_TRUE(content::ExecuteScript(frame, js));
}
FakeSamlIdp* fake_saml_idp() { return &fake_saml_idp_; }
protected:
scoped_ptr<content::WindowedNotificationObserver> login_screen_load_observer_;
private:
FakeGaia fake_gaia_;
FakeSamlIdp fake_saml_idp_;
scoped_ptr<HTTPSForwarder> gaia_https_forwarder_;
scoped_ptr<HTTPSForwarder> saml_https_forwarder_;
bool saml_load_injected_;
DISALLOW_COPY_AND_ASSIGN(SamlTest);
};
IN_PROC_BROWSER_TEST_F(SamlTest, SamlUI) {
fake_saml_idp()->SetLoginHTMLTemplate("saml_login.html");
StartSamlAndWaitForIdpPageLoad(kFirstSAMLUserEmail);
JsExpect("$('gaia-signin').classList.contains('saml')");
JsExpect("!$('cancel-add-user-button').hidden");
content::DOMMessageQueue message_queue;
ASSERT_TRUE(content::ExecuteScript(
GetLoginUI()->GetWebContents(),
"$('cancel-add-user-button').click();"));
std::string message;
do {
ASSERT_TRUE(message_queue.WaitForMessage(&message));
} while (message != "\"GaiaLoaded\"");
JsExpect("!$('gaia-signin').classList.contains('saml')");
}
IN_PROC_BROWSER_TEST_F(SamlTest, CredentialPassingAPI) {
fake_saml_idp()->SetLoginHTMLTemplate("saml_api_login.html");
fake_saml_idp()->SetLoginAuthHTMLTemplate("saml_api_login_auth.html");
StartSamlAndWaitForIdpPageLoad(kFirstSAMLUserEmail);
SetSignFormField("Email", "fake_user");
SetSignFormField("Password", "fake_password");
ExecuteJsInSigninFrame("document.getElementById('Submit').click();");
content::WindowedNotificationObserver(
chrome::NOTIFICATION_SESSION_STARTED,
content::NotificationService::AllSources()).Wait();
}
IN_PROC_BROWSER_TEST_F(SamlTest, ScrapedSingle) {
fake_saml_idp()->SetLoginHTMLTemplate("saml_login.html");
StartSamlAndWaitForIdpPageLoad(kFirstSAMLUserEmail);
SetSignFormField("Email", "fake_user");
SetSignFormField("Password", "fake_password");
ExecuteJsInSigninFrame("document.getElementById('Submit').click();");
OobeScreenWaiter(OobeDisplay::SCREEN_CONFIRM_PASSWORD).Wait();
SendConfirmPassword("wrong_password");
OobeScreenWaiter(OobeDisplay::SCREEN_CONFIRM_PASSWORD).Wait();
SendConfirmPassword("fake_password");
content::WindowedNotificationObserver(
chrome::NOTIFICATION_SESSION_STARTED,
content::NotificationService::AllSources()).Wait();
}
IN_PROC_BROWSER_TEST_F(SamlTest, ScrapedMultiple) {
fake_saml_idp()->SetLoginHTMLTemplate("saml_login_two_passwords.html");
StartSamlAndWaitForIdpPageLoad(kFirstSAMLUserEmail);
SetSignFormField("Email", "fake_user");
SetSignFormField("Password", "fake_password");
SetSignFormField("Password1", "password1");
ExecuteJsInSigninFrame("document.getElementById('Submit').click();");
OobeScreenWaiter(OobeDisplay::SCREEN_CONFIRM_PASSWORD).Wait();
SendConfirmPassword("password1");
content::WindowedNotificationObserver(
chrome::NOTIFICATION_SESSION_STARTED,
content::NotificationService::AllSources()).Wait();
}
IN_PROC_BROWSER_TEST_F(SamlTest, ScrapedNone) {
fake_saml_idp()->SetLoginHTMLTemplate("saml_login_no_passwords.html");
StartSamlAndWaitForIdpPageLoad(kFirstSAMLUserEmail);
SetSignFormField("Email", "fake_user");
ExecuteJsInSigninFrame("document.getElementById('Submit').click();");
OobeScreenWaiter(OobeDisplay::SCREEN_FATAL_ERROR).Wait();
}
IN_PROC_BROWSER_TEST_F(SamlTest, UseAutenticatedUserEmailAddress) {
fake_saml_idp()->SetLoginHTMLTemplate("saml_login.html");
StartSamlAndWaitForIdpPageLoad(kSecondSAMLUserEmail);
SetSignFormField("Email", "fake_user");
SetSignFormField("Password", "fake_password");
ExecuteJsInSigninFrame("document.getElementById('Submit').click();");
OobeScreenWaiter(OobeDisplay::SCREEN_CONFIRM_PASSWORD).Wait();
SendConfirmPassword("fake_password");
content::WindowedNotificationObserver(
chrome::NOTIFICATION_SESSION_STARTED,
content::NotificationService::AllSources()).Wait();
const User* user = UserManager::Get()->GetActiveUser();
ASSERT_TRUE(user);
EXPECT_EQ(kFirstSAMLUserEmail, user->email());
}
IN_PROC_BROWSER_TEST_F(SamlTest, FailToRetrieveAutenticatedUserEmailAddress) {
fake_saml_idp()->SetLoginHTMLTemplate("saml_login.html");
StartSamlAndWaitForIdpPageLoad(kFirstSAMLUserEmail);
SetMergeSessionParams("");
SetSignFormField("Email", "fake_user");
SetSignFormField("Password", "fake_password");
ExecuteJsInSigninFrame("document.getElementById('Submit').click();");
OobeScreenWaiter(OobeDisplay::SCREEN_FATAL_ERROR).Wait();
}
IN_PROC_BROWSER_TEST_F(SamlTest, PasswordConfirmFlow) {
fake_saml_idp()->SetLoginHTMLTemplate("saml_login.html");
StartSamlAndWaitForIdpPageLoad(kFirstSAMLUserEmail);
SetSignFormField("Email", "fake_user");
SetSignFormField("Password", "fake_password");
ExecuteJsInSigninFrame("document.getElementById('Submit').click();");
OobeScreenWaiter(OobeDisplay::SCREEN_CONFIRM_PASSWORD).Wait();
JsExpect("!$('confirm-password').classList.contains('error')");
SendConfirmPassword("wrong_password");
OobeScreenWaiter(OobeDisplay::SCREEN_CONFIRM_PASSWORD).Wait();
JsExpect("$('confirm-password').classList.contains('error')");
SendConfirmPassword("wrong_password");
OobeScreenWaiter(OobeDisplay::SCREEN_FATAL_ERROR).Wait();
}
IN_PROC_BROWSER_TEST_F(SamlTest, HTTPRedirectDisallowed) {
fake_saml_idp()->SetLoginHTMLTemplate("saml_login.html");
WaitForSigninScreen();
GetLoginDisplay()->ShowSigninScreenForCreds(kHTTPSAMLUserEmail, "");
OobeScreenWaiter(OobeDisplay::SCREEN_FATAL_ERROR).Wait();
}
class SAMLPolicyTest : public SamlTest {
public:
SAMLPolicyTest();
virtual ~SAMLPolicyTest();
virtual void SetUpInProcessBrowserTestFixture() OVERRIDE;
virtual void SetUpOnMainThread() OVERRIDE;
void SetSAMLOfflineSigninTimeLimitPolicy(int limit);
protected:
policy::MockConfigurationPolicyProvider provider_;
private:
DISALLOW_COPY_AND_ASSIGN(SAMLPolicyTest);
};
SAMLPolicyTest::SAMLPolicyTest() {
}
SAMLPolicyTest::~SAMLPolicyTest() {
}
void SAMLPolicyTest::SetUpInProcessBrowserTestFixture() {
SamlTest::SetUpInProcessBrowserTestFixture();
EXPECT_CALL(provider_, IsInitializationComplete(_))
.WillRepeatedly(Return(true));
policy::BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_);
}
void SAMLPolicyTest::SetUpOnMainThread() {
SamlTest::SetUpOnMainThread();
UserManager::Get()->SaveUserOAuthStatus(kFirstSAMLUserEmail,
User::OAUTH2_TOKEN_STATUS_VALID);
UserManager::Get()->SaveUserOAuthStatus(kNonSAMLUserEmail,
User::OAUTH2_TOKEN_STATUS_VALID);
}
void SAMLPolicyTest::SetSAMLOfflineSigninTimeLimitPolicy(int limit) {
policy::PolicyMap policy;
policy.Set(policy::key::kSAMLOfflineSigninTimeLimit,
policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER,
new base::FundamentalValue(limit),
NULL);
provider_.UpdateChromePolicy(policy);
base::RunLoop().RunUntilIdle();
}
IN_PROC_BROWSER_TEST_F(SAMLPolicyTest, PRE_NoSAML) {
SetSAMLOfflineSigninTimeLimitPolicy(0);
WaitForSigninScreen();
GetLoginDisplay()->ShowSigninScreenForCreds(kNonSAMLUserEmail, "password");
content::WindowedNotificationObserver(
chrome::NOTIFICATION_SESSION_STARTED,
content::NotificationService::AllSources()).Wait();
}
IN_PROC_BROWSER_TEST_F(SAMLPolicyTest, NoSAML) {
login_screen_load_observer_->Wait();
JsExpect("document.querySelector('#pod-row .signin-button').hidden");
}
IN_PROC_BROWSER_TEST_F(SAMLPolicyTest, PRE_SAMLNoLimit) {
SetSAMLOfflineSigninTimeLimitPolicy(-1);
fake_saml_idp()->SetLoginHTMLTemplate("saml_login.html");
StartSamlAndWaitForIdpPageLoad(kFirstSAMLUserEmail);
SetSignFormField("Email", "fake_user");
SetSignFormField("Password", "fake_password");
ExecuteJsInSigninFrame("document.getElementById('Submit').click();");
OobeScreenWaiter(OobeDisplay::SCREEN_CONFIRM_PASSWORD).Wait();
SendConfirmPassword("fake_password");
content::WindowedNotificationObserver(
chrome::NOTIFICATION_SESSION_STARTED,
content::NotificationService::AllSources()).Wait();
}
IN_PROC_BROWSER_TEST_F(SAMLPolicyTest, SAMLNoLimit) {
login_screen_load_observer_->Wait();
JsExpect("document.querySelector('#pod-row .signin-button').hidden");
}
IN_PROC_BROWSER_TEST_F(SAMLPolicyTest, PRE_SAMLZeroLimit) {
SetSAMLOfflineSigninTimeLimitPolicy(0);
fake_saml_idp()->SetLoginHTMLTemplate("saml_login.html");
StartSamlAndWaitForIdpPageLoad(kFirstSAMLUserEmail);
SetSignFormField("Email", "fake_user");
SetSignFormField("Password", "fake_password");
ExecuteJsInSigninFrame("document.getElementById('Submit').click();");
OobeScreenWaiter(OobeDisplay::SCREEN_CONFIRM_PASSWORD).Wait();
SendConfirmPassword("fake_password");
content::WindowedNotificationObserver(
chrome::NOTIFICATION_SESSION_STARTED,
content::NotificationService::AllSources()).Wait();
}
IN_PROC_BROWSER_TEST_F(SAMLPolicyTest, SAMLZeroLimit) {
login_screen_load_observer_->Wait();
JsExpect("!document.querySelector('#pod-row .signin-button').hidden");
}
}