blob: c58d6c2c0b2eb0acc7733d1d2d687b4fe51e14b4 [file] [log] [blame]
// 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/json/json_reader.h"
#include "base/json/json_writer.h"
#include "base/macros.h"
#include "base/path_service.h"
#include "base/strings/strcat.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task_scheduler/post_task.h"
#include "base/task_scheduler/task_traits.h"
#include "base/test/scoped_feature_list.h"
#include "base/threading/thread_restrictions.h"
#include "base/values.h"
#include "build/build_config.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/javascript_dialogs/javascript_dialog_tab_helper.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/webui/policy_tool_ui_handler.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/testing_profile.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/policy/core/common/plist_writer.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test_utils.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/shell_dialogs/select_file_dialog.h"
#include "ui/shell_dialogs/select_file_dialog_factory.h"
#include "ui/shell_dialogs/select_file_policy.h"
namespace {
const base::FilePath::CharType kPolicyToolSessionsDir[] =
FILE_PATH_LITERAL("Policy sessions");
const base::FilePath::CharType kPolicyToolDefaultSessionName[] =
FILE_PATH_LITERAL("policy");
const base::FilePath::CharType kPolicyToolSessionExtension[] =
FILE_PATH_LITERAL("json");
} // namespace
class PolicyToolUITest : public InProcessBrowserTest {
public:
PolicyToolUITest();
~PolicyToolUITest() override;
protected:
void SetUp() override;
base::FilePath GetSessionsDir();
base::FilePath::StringType GetDefaultSessionName();
base::FilePath::StringType GetSessionExtension();
base::FilePath GetSessionPath(const base::FilePath::StringType& session_name);
void LoadSession(const std::string& session_name);
void DeleteSession(const std::string& session_name);
void RenameSession(const std::string& session_name,
const std::string& new_session_name);
std::unique_ptr<base::DictionaryValue> ExtractPolicyValues(bool need_status);
bool IsInvalidSessionNameErrorMessageDisplayed();
bool IsSessionRenameErrorMessageDisplayed();
std::unique_ptr<base::ListValue> ExtractSessionsList();
// Creates a session directly by putting a file with valid content inside the
// session default directory. This helps us to avoid editing a session using
// the UI when we need a default session with values.
void CreateSingleSessionWithFixedValues(
const base::FilePath::StringType& session_name);
void CreateMultipleSessionFiles(int count);
void SetPolicyValue(const std::string& policy_name,
const std::string& policy_value);
bool CheckPolicyStatus(const std::string& policy_name,
const std::string& policy_value,
const std::string& expected_status);
// Check if the error message that replaces the element is shown correctly.
// Returns 1 if error message is shown, -1 if the error message is not shown,
// and 0 if the displaying is incorrect (e.g. both error message and the
// element are shown).
int GetElementDisabledState(const std::string& element_id,
const std::string& error_message_id);
std::string ExtractSinglePolicyValue(const std::string& policy_name);
private:
base::test::ScopedFeatureList scoped_feature_list_;
DISALLOW_COPY_AND_ASSIGN(PolicyToolUITest);
};
base::FilePath PolicyToolUITest::GetSessionsDir() {
base::FilePath profile_dir;
EXPECT_TRUE(base::PathService::Get(chrome::DIR_USER_DATA, &profile_dir));
return profile_dir.AppendASCII(TestingProfile::kTestUserProfileDir)
.Append(kPolicyToolSessionsDir);
}
base::FilePath::StringType PolicyToolUITest::GetDefaultSessionName() {
return kPolicyToolDefaultSessionName;
}
base::FilePath::StringType PolicyToolUITest::GetSessionExtension() {
return kPolicyToolSessionExtension;
}
base::FilePath PolicyToolUITest::GetSessionPath(
const base::FilePath::StringType& session_name) {
return GetSessionsDir()
.Append(session_name)
.AddExtension(GetSessionExtension());
}
PolicyToolUITest::PolicyToolUITest() {}
PolicyToolUITest::~PolicyToolUITest() {}
void PolicyToolUITest::SetUp() {
scoped_feature_list_.InitAndEnableFeature(features::kPolicyTool);
InProcessBrowserTest::SetUp();
}
void PolicyToolUITest::LoadSession(const std::string& session_name) {
const std::string javascript = "$('session-name-field').value = '" +
session_name +
"';"
"$('load-session-button').click();";
EXPECT_TRUE(content::ExecuteScript(
browser()->tab_strip_model()->GetActiveWebContents(), javascript));
content::RunAllTasksUntilIdle();
}
void PolicyToolUITest::DeleteSession(const std::string& session_name) {
const std::string javascript = "$('session-list').value = '" + session_name +
"';"
"$('delete-session-button').click();";
EXPECT_TRUE(content::ExecuteScript(
browser()->tab_strip_model()->GetActiveWebContents(), javascript));
content::RunAllTasksUntilIdle();
}
void PolicyToolUITest::RenameSession(const std::string& session_name,
const std::string& new_session_name) {
const std::string javascript =
base::StrCat({"$('session-list').value = '", session_name, "';",
"$('rename-session-button').click();",
"$('new-session-name-field').value = '", new_session_name,
"';", "$('confirm-rename-button').click();"});
EXPECT_TRUE(content::ExecuteScript(
browser()->tab_strip_model()->GetActiveWebContents(), javascript));
content::RunAllTasksUntilIdle();
}
// Set |policy_value| as a value of |policy_name|, this function will
// run all the tasks until idle because editing a policy value will post
// tasks in the TaskScheduler.
void PolicyToolUITest::SetPolicyValue(const std::string& policy_name,
const std::string& policy_value) {
std::string javascript =
"document.getElementById('show-unset').click();"
"var policies = document.querySelectorAll("
" 'section.policy-table-section > * > tbody');"
"var policyEntry;"
"for (var i = 0; i < policies.length; ++i) {"
" if (policies[i].getElementsByClassName('name')[0].textContent == '" +
policy_name +
"') {"
" policyEntry = policies[i];"
" break;"
" }"
"}"
"policyEntry.getElementsByClassName('edit-button')[0].click();"
"policyEntry.getElementsByClassName('value-edit-field')[0].value = '" +
policy_value +
"';"
"policyEntry.getElementsByClassName('save-button')[0].click();"
"document.getElementById('show-unset').click();"
"var name = policyEntry.getElementsByClassName('name-column')[0]"
" .getElementsByTagName('div')[0].textContent;";
EXPECT_TRUE(content::ExecuteScript(
browser()->tab_strip_model()->GetActiveWebContents(), javascript));
content::RunAllTasksUntilIdle();
}
// Check the status of |policy_name| after set |policy_value| as a value.
// Return |true| if the status is equal to |expected_status| and |false|
// otherwise.
bool PolicyToolUITest::CheckPolicyStatus(const std::string& policy_name,
const std::string& policy_value,
const std::string& expected_status) {
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
// Wait until the current session load.
content::RunAllTasksUntilIdle();
// SetPolicyValue waits until all the tasks finish.
SetPolicyValue(policy_name, policy_value);
std::unique_ptr<base::DictionaryValue> page = ExtractPolicyValues(true);
return base::Value(expected_status) ==
*page->FindPath({"chromePolicies", policy_name, "status"});
}
std::unique_ptr<base::DictionaryValue> PolicyToolUITest::ExtractPolicyValues(
bool need_status) {
std::string javascript =
"var entries = document.querySelectorAll("
" 'section.policy-table-section > * > tbody');"
"var policies = {'chromePolicies': {}};"
"for (var i = 0; i < entries.length; ++i) {"
" if (entries[i].hidden)"
" continue;"
" var name = entries[i].getElementsByClassName('name-column')[0]"
" .getElementsByTagName('div')[0].textContent;"
" var valueContainer = entries[i].getElementsByClassName("
" 'value-container')[0];"
" var value = valueContainer.getElementsByClassName("
" 'value')[0].textContent;";
if (need_status) {
javascript +=
" var status = entries[i].getElementsByClassName('status-column')[0]"
" .getElementsByTagName('div')[0].textContent;"
" policies.chromePolicies[name] = {'value': value, 'status': status};";
} else {
javascript += " policies.chromePolicies[name] = {'value': value};";
}
javascript += "} domAutomationController.send(JSON.stringify(policies));";
std::string json;
EXPECT_TRUE(content::ExecuteScriptAndExtractString(
browser()->tab_strip_model()->GetActiveWebContents(), javascript, &json));
return base::DictionaryValue::From(base::JSONReader::Read(json));
}
std::unique_ptr<base::ListValue> PolicyToolUITest::ExtractSessionsList() {
std::string javascript =
"var list = $('session-list');"
"var sessions = [];"
"for (var i = 0; i < list.length; i++) {"
" sessions.push(list[i].value);"
"}"
"domAutomationController.send(JSON.stringify(sessions));";
std::string json;
EXPECT_TRUE(content::ExecuteScriptAndExtractString(
browser()->tab_strip_model()->GetActiveWebContents(), javascript, &json));
return base::ListValue::From(base::JSONReader::Read(json));
}
bool PolicyToolUITest::IsInvalidSessionNameErrorMessageDisplayed() {
const std::string javascript =
"domAutomationController.send($('invalid-session-name-error')."
"offsetWidth > "
"0)";
content::WebContents* contents =
browser()->tab_strip_model()->GetActiveWebContents();
bool result = false;
EXPECT_TRUE(ExecuteScriptAndExtractBool(contents, javascript, &result));
return result;
}
bool PolicyToolUITest::IsSessionRenameErrorMessageDisplayed() {
constexpr char kJavascript[] =
"domAutomationController.send($('session-rename-error').hidden == false)";
content::WebContents* contents =
browser()->tab_strip_model()->GetActiveWebContents();
bool result = false;
EXPECT_TRUE(ExecuteScriptAndExtractBool(contents, kJavascript, &result));
return result;
}
void PolicyToolUITest::CreateMultipleSessionFiles(int count) {
base::ScopedAllowBlockingForTesting allow_blocking;
EXPECT_TRUE(base::CreateDirectory(GetSessionsDir()));
base::DictionaryValue contents;
base::Time initial_time = base::Time::Now();
for (int i = 0; i < count; ++i) {
contents.SetPath({"chromePolicies", "SessionId", "value"},
base::Value(base::IntToString(i)));
base::FilePath::StringType session_name =
base::FilePath::FromUTF8Unsafe(base::IntToString(i)).value();
std::string stringified_contents;
base::JSONWriter::Write(contents, &stringified_contents);
base::WriteFile(GetSessionPath(session_name), stringified_contents.c_str(),
stringified_contents.size());
base::Time current_time =
initial_time - base::TimeDelta::FromSeconds(count - i);
base::TouchFile(GetSessionPath(session_name), current_time, current_time);
}
}
void PolicyToolUITest::CreateSingleSessionWithFixedValues(
const base::FilePath::StringType& session_name) {
base::ScopedAllowBlockingForTesting allow_blocking;
EXPECT_TRUE(base::CreateDirectory(GetSessionsDir()));
base::ListValue list;
list.GetList().push_back(base::Value("https://[*.]ext.google.com").Clone());
list.GetList().push_back(base::Value("{}").Clone());
base::DictionaryValue dict, inner_dict;
inner_dict.SetKey("pattern", base::Value("chrome://policy"));
inner_dict.SetKey("filter", base::Value("{}"));
// Add values to the dict.
dict.SetKey("extensionPolicies", base::DictionaryValue().Clone());
dict.SetPath({"chromePolicies", "AutoSelectCertificateForUrls", "value"},
list.Clone());
dict.SetPath({"chromePolicies", "DeviceLoginScreenPowerManagement", "value"},
inner_dict.Clone());
dict.SetPath({"chromePolicies", "AllowDinosaurEasterEgg", "value"},
base::Value(true));
dict.SetPath({"chromePolicies", "MaxInvalidationFetchDelay", "value"},
base::Value(1000));
// Get JSON string from dict.
std::string stringified_contents;
base::JSONWriter::Write(dict, &stringified_contents);
// Write in file.
base::WriteFile(GetSessionPath(session_name), stringified_contents.c_str(),
stringified_contents.size());
base::TouchFile(GetSessionPath(session_name), base::Time::Now(),
base::Time::Now());
}
int PolicyToolUITest::GetElementDisabledState(
const std::string& element_id,
const std::string& error_message_id) {
const std::string javascript =
"var element = $('" + element_id +
"');"
"var errorMessage = $('" +
error_message_id +
"');"
"domAutomationController.send((element.offsetWidth == 0) -"
" (errorMessage.offsetWidth == 0));";
content::WebContents* contents =
browser()->tab_strip_model()->GetActiveWebContents();
int result = 0;
EXPECT_TRUE(ExecuteScriptAndExtractInt(contents, javascript, &result));
return result;
}
std::string PolicyToolUITest::ExtractSinglePolicyValue(
const std::string& session_name) {
std::unique_ptr<base::DictionaryValue> page_contents =
ExtractPolicyValues(/*need_status=*/false);
if (!page_contents)
return "";
base::Value* value =
page_contents->FindPath({"chromePolicies", session_name, "value"});
EXPECT_TRUE(value);
EXPECT_EQ(base::Value::Type::STRING, value->type());
return value->GetString();
}
class PolicyToolUIExportTest : public PolicyToolUITest {
public:
PolicyToolUIExportTest();
~PolicyToolUIExportTest() override;
protected:
// InProcessBrowserTest implementation.
void SetUpInProcessBrowserTestFixture() override;
// The temporary directory and file path for policy saving.
base::ScopedTempDir export_policies_test_dir_;
base::FilePath export_policies_test_file_path_;
};
PolicyToolUIExportTest::PolicyToolUIExportTest() {}
PolicyToolUIExportTest::~PolicyToolUIExportTest() {}
void PolicyToolUIExportTest::SetUpInProcessBrowserTestFixture() {
ASSERT_TRUE(export_policies_test_dir_.CreateUniqueTempDir());
const std::string filename = "policy.json";
export_policies_test_file_path_ =
export_policies_test_dir_.GetPath().AppendASCII(filename);
}
// An artificial SelectFileDialog that immediately returns the location of test
// file instead of showing the UI file picker.
class TestSelectFileDialogPolicyTool : public ui::SelectFileDialog {
public:
TestSelectFileDialogPolicyTool(ui::SelectFileDialog::Listener* listener,
std::unique_ptr<ui::SelectFilePolicy> policy,
const base::FilePath& default_selected_path)
: ui::SelectFileDialog(listener, std::move(policy)) {
default_path_ = default_selected_path;
}
void SelectFileImpl(Type type,
const base::string16& title,
const base::FilePath& default_path,
const FileTypeInfo* file_types,
int file_type_index,
const base::FilePath::StringType& default_extension,
gfx::NativeWindow owning_window,
void* params) override {
listener_->FileSelected(default_path_, /*index=*/0, /*params=*/nullptr);
}
bool IsRunning(gfx::NativeWindow owning_window) const override {
return false;
}
void ListenerDestroyed() override {}
bool HasMultipleFileTypeChoicesImpl() override { return false; }
private:
~TestSelectFileDialogPolicyTool() override {}
base::FilePath default_path_;
};
// A factory associated with the artificial file picker.
class TestSelectFileDialogFactoryPolicyTool
: public ui::SelectFileDialogFactory {
public:
TestSelectFileDialogFactoryPolicyTool(
const base::FilePath& default_selected_path) {
default_path_ = default_selected_path;
}
private:
base::FilePath default_path_;
ui::SelectFileDialog* Create(
ui::SelectFileDialog::Listener* listener,
std::unique_ptr<ui::SelectFilePolicy> policy) override {
return new TestSelectFileDialogPolicyTool(listener, std::move(policy),
default_path_);
}
};
// Flaky on Win buildbots. See crbug.com/832673.
#if defined(OS_WIN)
#define MAYBE_CreatingSessionFiles DISABLED_CreatingSessionFiles
#else
#define MAYBE_CreatingSessionFiles CreatingSessionFiles
#endif
IN_PROC_BROWSER_TEST_F(PolicyToolUITest, MAYBE_CreatingSessionFiles) {
base::ScopedAllowBlockingForTesting allow_blocking;
// Check that the directory is not created yet.
EXPECT_FALSE(PathExists(GetSessionsDir()));
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
// Check that the default session file was created.
EXPECT_TRUE(PathExists(GetSessionPath(GetDefaultSessionName())));
// Check that when moving to a different session the corresponding file is
// created.
LoadSession("test_creating_sessions");
EXPECT_TRUE(
PathExists(GetSessionPath(FILE_PATH_LITERAL("test_creating_sessions"))));
// Check that unicode characters are valid for the session name.
LoadSession("сессия");
EXPECT_TRUE(PathExists(GetSessionPath(FILE_PATH_LITERAL("сессия"))));
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest, ImportingSession) {
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
// Set up policy values and put them in the session file.
base::ScopedAllowBlockingForTesting allow_blocking;
base::DictionaryValue test_policies;
// Add a known chrome policy.
test_policies.SetString("chromePolicies.AllowDinosaurEasterEgg.value",
"true");
// Add an unknown chrome policy.
test_policies.SetString("chromePolicies.UnknownPolicy.value", "test");
std::string json;
base::JSONWriter::WriteWithOptions(
test_policies, base::JSONWriter::Options::OPTIONS_PRETTY_PRINT, &json);
base::WriteFile(GetSessionPath(FILE_PATH_LITERAL("test_session")),
json.c_str(), json.size());
// Import the created session and wait until all the tasks are finished.
LoadSession("test_session");
std::unique_ptr<base::DictionaryValue> values = ExtractPolicyValues(false);
EXPECT_EQ(test_policies, *values);
}
// Flaky on all platforms, see https://crbug.com/797446
IN_PROC_BROWSER_TEST_F(PolicyToolUITest, DISABLED_Editing) {
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
// Change one policy value and get its name.
std::string javascript =
"document.getElementById('show-unset').click();"
"var policyEntry = document.querySelectorAll("
" 'section.policy-table-section > * > tbody')[0];"
"policyEntry.getElementsByClassName('edit-button')[0].click();"
"policyEntry.getElementsByClassName('value-edit-field')[0].value ="
" 'test';"
"policyEntry.getElementsByClassName('save-button')[0].click();"
"document.getElementById('show-unset').click();"
"var name = policyEntry.getElementsByClassName('name-column')[0]"
" .getElementsByTagName('div')[0].textContent;"
"domAutomationController.send(name);";
content::WebContents* contents =
browser()->tab_strip_model()->GetActiveWebContents();
std::string name = "";
EXPECT_TRUE(
content::ExecuteScriptAndExtractString(contents, javascript, &name));
std::unique_ptr<base::Value> values = ExtractPolicyValues(true);
base::DictionaryValue expected;
expected.SetString("chromePolicies." + name + ".value", "test");
expected.SetString("chromePolicies." + name + ".status", "OK");
EXPECT_EQ(expected, *values);
// Check if the session file is correct.
base::ScopedAllowBlockingForTesting allow_blocking;
std::string file_contents;
base::ReadFileToString(GetSessionPath(GetDefaultSessionName()),
&file_contents);
values = base::JSONReader::Read(file_contents);
expected.SetDictionary("extensionPolicies",
std::make_unique<base::DictionaryValue>());
expected.Remove("chromePolicies." + name + ".status", nullptr);
EXPECT_EQ(expected, *values);
// Set value of this variable to "", so that it becomes unset.
javascript =
"var policyEntry = document.querySelectorAll("
" 'section.policy-table-section > * > tbody')[0];"
"policyEntry.getElementsByClassName('edit-button')[0].click();"
"policyEntry.getElementsByClassName('value-edit-field')[0].value = '';"
"policyEntry.getElementsByClassName('save-button')[0].click();";
EXPECT_TRUE(ExecuteScript(contents, javascript));
values = ExtractPolicyValues(false);
expected.Remove("chromePolicies." + name, nullptr);
expected.Remove("extensionPolicies", nullptr);
EXPECT_EQ(expected, *values);
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest, InvalidSessionName) {
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
EXPECT_FALSE(IsInvalidSessionNameErrorMessageDisplayed());
LoadSession("../test");
EXPECT_TRUE(IsInvalidSessionNameErrorMessageDisplayed());
LoadSession("/full_path");
EXPECT_TRUE(IsInvalidSessionNameErrorMessageDisplayed());
LoadSession("policy");
EXPECT_FALSE(IsInvalidSessionNameErrorMessageDisplayed());
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest, InvalidJson) {
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
EXPECT_EQ(GetElementDisabledState("main-section", "disable-editing-error"),
-1);
base::ScopedAllowBlockingForTesting allow_blocking;
base::WriteFile(
GetSessionsDir().Append(FILE_PATH_LITERAL("test_session.json")), "{", 1);
LoadSession("test_session");
EXPECT_EQ(GetElementDisabledState("main-section", "disable-editing-error"),
1);
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest, SavingToDiskError) {
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
EXPECT_EQ(GetElementDisabledState("session-choice", "saving"), -1);
base::ScopedAllowBlockingForTesting allow_blocking;
base::DeleteFile(GetSessionsDir(), true);
base::File not_directory(GetSessionsDir(), base::File::Flags::FLAG_CREATE |
base::File::Flags::FLAG_WRITE);
not_directory.Close();
LoadSession("policy");
EXPECT_EQ(GetElementDisabledState("session-choice", "saving"), 1);
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest, DISABLED_DefaultSession) {
// Navigate to the tool to make sure the sessions directory is created.
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
// Check that if there are no sessions, a session with default name is
// created.
base::ScopedAllowBlockingForTesting allow_blocking;
EXPECT_TRUE(base::PathExists(GetSessionPath(GetDefaultSessionName())));
// Create a session file and load it.
base::DictionaryValue expected;
expected.SetString("chromePolicies.SessionName.value", "session");
std::string file_contents;
base::JSONWriter::Write(expected, &file_contents);
base::WriteFile(GetSessionPath(FILE_PATH_LITERAL("session")),
file_contents.c_str(), file_contents.size());
LoadSession("session");
std::unique_ptr<base::DictionaryValue> values = ExtractPolicyValues(false);
EXPECT_EQ(expected, *values);
// Open the tool in a new tab and check that it loads the newly created
// session (which is the last used session) and not the default session.
chrome::NewTab(browser());
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
values = ExtractPolicyValues(false);
EXPECT_EQ(expected, *values);
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest, MultipleSessionsChoice) {
base::ScopedAllowBlockingForTesting allow_blocking;
base::CreateDirectory(GetSessionsDir());
// Create 5 session files with different last access times and contents.
CreateMultipleSessionFiles(5);
// Load the page. This should load the last session.
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
// Wait until the session data is loaded.
content::RunAllTasksUntilIdle();
std::unique_ptr<base::DictionaryValue> page_contents =
ExtractPolicyValues(false);
base::DictionaryValue expected;
expected.SetPath({"chromePolicies", "SessionId", "value"}, base::Value("4"));
EXPECT_EQ(expected, *page_contents);
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest, SessionsList) {
CreateMultipleSessionFiles(5);
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
content::RunAllTasksUntilIdle();
std::unique_ptr<base::ListValue> sessions = ExtractSessionsList();
base::ListValue expected;
for (int i = 4; i >= 0; --i) {
expected.GetList().push_back(base::Value(base::IntToString(i)));
}
EXPECT_EQ(expected, *sessions);
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest, DeleteSession) {
CreateMultipleSessionFiles(3);
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
// Wait until the page data is filled.
content::RunAllTasksUntilIdle();
EXPECT_EQ("2", ExtractSinglePolicyValue("SessionId"));
// Check that a non-current session is deleted correctly.
DeleteSession("0");
base::ListValue expected;
expected.GetList().push_back(base::Value("2"));
expected.GetList().push_back(base::Value("1"));
EXPECT_EQ(expected, *ExtractSessionsList());
// Check that a current when the current session is deleted,
DeleteSession("2");
expected.GetList().erase(expected.GetList().begin());
EXPECT_EQ(expected, *ExtractSessionsList());
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest, RenameCurrentSession) {
CreateMultipleSessionFiles(3);
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
// Wait until the session data is loaded.
content::RunAllTasksUntilIdle();
EXPECT_EQ("2", ExtractSinglePolicyValue("SessionId"));
// RenameSession will wait until idle.
RenameSession("2", "5");
EXPECT_FALSE(IsSessionRenameErrorMessageDisplayed());
base::ListValue expected;
expected.GetList().push_back(base::Value("5"));
expected.GetList().push_back(base::Value("1"));
expected.GetList().push_back(base::Value("0"));
EXPECT_EQ(expected, *ExtractSessionsList());
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest, RenameNonCurrentSession) {
CreateMultipleSessionFiles(3);
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
// Wait until the session data is loaded.
content::RunAllTasksUntilIdle();
EXPECT_EQ("2", ExtractSinglePolicyValue("SessionId"));
// Rename a session and wait until idle.
RenameSession("0", "4");
EXPECT_FALSE(IsSessionRenameErrorMessageDisplayed());
base::ListValue expected;
expected.GetList().push_back(base::Value("2"));
expected.GetList().push_back(base::Value("1"));
expected.GetList().push_back(base::Value("4"));
EXPECT_EQ(expected, *ExtractSessionsList());
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest, RenameSessionWithExistingSessionName) {
CreateMultipleSessionFiles(3);
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
content::RunAllTasksUntilIdle();
// Make sure the current session is '2'.
EXPECT_EQ("2", ExtractSinglePolicyValue("SessionId"));
// Check that a session can not be renamed with a name of another existing
// session.
RenameSession("2", "1");
// Wait until the posted tasks are done. After check that name already exist
// the tool displays an error message in the UI.
content::RunAllTasksUntilIdle();
EXPECT_TRUE(IsSessionRenameErrorMessageDisplayed());
// Check the names that appear in the session list didn't change.
base::ListValue expected;
expected.GetList().push_back(base::Value("2"));
expected.GetList().push_back(base::Value("1"));
expected.GetList().push_back(base::Value("0"));
EXPECT_EQ(expected, *ExtractSessionsList());
}
#if defined(OS_WIN)
#define MAYBE_RenameSessionInvalidName DISABLED_RenameSessionInvalidName
#else
#define MAYBE_RenameSessionInvalidName RenameSessionInvalidName
#endif
IN_PROC_BROWSER_TEST_F(PolicyToolUITest, MAYBE_RenameSessionInvalidName) {
CreateMultipleSessionFiles(3);
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
EXPECT_EQ("2", ExtractSinglePolicyValue("SessionId"));
RenameSession("2", "../");
EXPECT_TRUE(IsSessionRenameErrorMessageDisplayed());
base::ListValue expected;
expected.GetList().push_back(base::Value("2"));
expected.GetList().push_back(base::Value("1"));
expected.GetList().push_back(base::Value("0"));
EXPECT_EQ(expected, *ExtractSessionsList());
// Check that full path is not allowed
RenameSession("2", "/full_path");
EXPECT_TRUE(IsSessionRenameErrorMessageDisplayed());
EXPECT_EQ(expected, *ExtractSessionsList());
}
IN_PROC_BROWSER_TEST_F(PolicyToolUIExportTest, ExportSessionPolicyToLinux) {
// Create policy session with fixed values.
CreateSingleSessionWithFixedValues(
base::FilePath::FromUTF8Unsafe("test_session").value());
// Set SelectFileDialog to use our factory.
ui::SelectFileDialog::SetFactory(new TestSelectFileDialogFactoryPolicyTool(
export_policies_test_file_path_));
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
content::RunAllTasksUntilIdle();
content::WebContents* contents =
browser()->tab_strip_model()->GetActiveWebContents();
std::string export_js = "$('export-policies-linux').click()";
EXPECT_TRUE(content::ExecuteScript(contents, export_js));
// Wait until export to linux is done.
content::RunAllTasksUntilIdle();
EXPECT_TRUE(
base::ContentsEqual(export_policies_test_file_path_,
GetSessionPath(FILE_PATH_LITERAL("test_session"))));
TestSelectFileDialogPolicyTool::SetFactory(nullptr);
}
IN_PROC_BROWSER_TEST_F(PolicyToolUIExportTest, ExportSessionToMac) {
base::ScopedAllowBlockingForTesting allow_blocking;
// Set SelectFileDialog to use our factory.
ui::SelectFileDialog::SetFactory(new TestSelectFileDialogFactoryPolicyTool(
export_policies_test_file_path_));
// Create a session with default values.
CreateSingleSessionWithFixedValues(
base::FilePath::FromUTF8Unsafe("test_session").value());
// Test if the current policy session is successfully exported.
ui_test_utils::NavigateToURL(browser(), GURL("chrome://policy-tool"));
content::RunAllTasksUntilIdle();
content::WebContents* contents =
browser()->tab_strip_model()->GetActiveWebContents();
std::string export_js = "$('export-policies-mac').click()";
EXPECT_TRUE(content::ExecuteScript(contents, export_js));
// Wait until the posted task export to Mac is done.
content::RunAllTasksUntilIdle();
// Read the content of the exported file and the |test_session| file.
std::string file_export_content = "", file_session_content = "";
base::ReadFileToString(export_policies_test_file_path_, &file_export_content);
base::ReadFileToString(GetSessionPath(FILE_PATH_LITERAL("test_session")),
&file_session_content);
// The format of every session file is JSON.
policy::PlistWrite(*base::JSONReader::Read(file_session_content),
&file_session_content);
EXPECT_TRUE(file_export_content == file_session_content);
TestSelectFileDialogPolicyTool::SetFactory(nullptr);
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest,
CheckPolicyTypeCorrectBooleanTypeValidation) {
EXPECT_TRUE(CheckPolicyStatus("AllowDinosaurEasterEgg", "true",
l10n_util::GetStringUTF8(IDS_POLICY_OK)));
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest,
CheckPolicyTypeIncorrectBooleanTypeValidation) {
EXPECT_TRUE(CheckPolicyStatus(
"AllowDinosaurEasterEgg", "string",
l10n_util::GetStringUTF8(IDS_POLICY_TOOL_INVALID_TYPE)));
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest,
CheckPolicyTypeCorrectListTypeValidation) {
EXPECT_TRUE(CheckPolicyStatus("ImagesAllowedForUrls", "[\"a\", \"b\"]",
l10n_util::GetStringUTF8(IDS_POLICY_OK)));
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest,
CheckPolicyTypeBoolAsListTypeValidation) {
EXPECT_TRUE(CheckPolicyStatus(
"ImagesAllowedForUrls", "true",
l10n_util::GetStringUTF8(IDS_POLICY_TOOL_INVALID_TYPE)));
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest,
CheckPolicyTypeWrongElementTypesInListValidation) {
EXPECT_TRUE(CheckPolicyStatus(
"ImagesAllowedForUrls", "[1, 2]",
l10n_util::GetStringUTF8(IDS_POLICY_TOOL_INVALID_TYPE)));
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest,
CheckPolicyTypeMalformedListValidation) {
EXPECT_TRUE(CheckPolicyStatus(
"ImagesAllowedForUrls", "[\"a\"",
l10n_util::GetStringUTF8(IDS_POLICY_TOOL_INVALID_TYPE)));
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest,
CheckPolicyTypeValidDictionaryTypeValidation) {
EXPECT_TRUE(
CheckPolicyStatus("ManagedBookmarks",
R"([{"toplevel_name": "My managed bookmarks folder"},)"
R"({"url": "google.com", "name": "Google"}])",
l10n_util::GetStringUTF8(IDS_POLICY_OK)));
}
IN_PROC_BROWSER_TEST_F(PolicyToolUITest,
CheckPolicyTypeWrongAttributesTypeValidation) {
EXPECT_TRUE(CheckPolicyStatus(
"ManagedBookmarks", "[{\"attribute\": \"value\"}]",
l10n_util::GetStringUTF8(IDS_POLICY_TOOL_INVALID_TYPE)));
}