Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/chromeos/login/managed/managed_user_test_base.h" | |
| 6 | |
| 7 #include <string> | |
| 8 | |
| 9 #include "base/compiler_specific.h" | |
| 10 #include "base/run_loop.h" | |
| 11 #include "base/strings/string_number_conversions.h" | |
| 12 #include "base/strings/stringprintf.h" | |
| 13 #include "base/strings/utf_string_conversions.h" | |
| 14 #include "base/threading/sequenced_worker_pool.h" | |
| 15 #include "chrome/browser/chrome_notification_types.h" | |
| 16 #include "chrome/browser/chromeos/login/login_display_host_impl.h" | |
| 17 #include "chrome/browser/chromeos/login/login_manager_test.h" | |
| 18 #include "chrome/browser/chromeos/login/managed/supervised_user_authentication.h " | |
| 19 #include "chrome/browser/chromeos/login/startup_utils.h" | |
| 20 #include "chrome/browser/chromeos/login/supervised_user_manager.h" | |
| 21 #include "chrome/browser/chromeos/login/webui_login_view.h" | |
| 22 #include "chrome/browser/chromeos/net/network_portal_detector_test_impl.h" | |
| 23 #include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h" | |
| 24 #include "chrome/browser/managed_mode/managed_user_constants.h" | |
| 25 #include "chrome/browser/managed_mode/managed_user_registration_utility.h" | |
| 26 #include "chrome/browser/managed_mode/managed_user_registration_utility_stub.h" | |
| 27 #include "chrome/browser/managed_mode/managed_user_shared_settings_service.h" | |
| 28 #include "chrome/browser/managed_mode/managed_user_shared_settings_service_facto ry.h" | |
| 29 #include "chrome/browser/managed_mode/managed_user_sync_service.h" | |
| 30 #include "chrome/browser/managed_mode/managed_user_sync_service_factory.h" | |
| 31 #include "chromeos/cryptohome/mock_async_method_caller.h" | |
| 32 #include "chromeos/cryptohome/mock_homedir_methods.h" | |
| 33 #include "content/public/browser/notification_service.h" | |
| 34 #include "content/public/test/browser_test_utils.h" | |
| 35 #include "content/public/test/test_utils.h" | |
| 36 #include "sync/api/attachments/attachment_service_proxy_for_test.h" | |
| 37 #include "sync/api/fake_sync_change_processor.h" | |
| 38 #include "sync/api/sync_change.h" | |
| 39 #include "sync/api/sync_error_factory_mock.h" | |
| 40 #include "sync/protocol/sync.pb.h" | |
| 41 | |
| 42 using testing::_; | |
| 43 using base::StringPrintf; | |
| 44 | |
| 45 namespace chromeos { | |
| 46 | |
| 47 namespace testing { | |
| 48 | |
| 49 namespace { | |
| 50 | |
|
Nikita (slow)
2014/04/23 09:50:17
nit: Drop empty line (or insert empty line after c
Denis Kuznetsov (DE-MUC)
2014/04/24 17:44:09
Done.
| |
| 51 std::string current_page = "$('managed-user-creation').currentPage_"; | |
|
Nikita (slow)
2014/04/23 09:50:17
const char kCurrentPage[] = "...";
Denis Kuznetsov (DE-MUC)
2014/04/24 17:44:09
Done.
| |
| 52 } | |
| 53 | |
| 54 ManagedUsersSyncTestAdapter::ManagedUsersSyncTestAdapter(Profile* profile) | |
| 55 : processor_(), next_sync_data_id_(0) { | |
| 56 service_ = ManagedUserSyncServiceFactory::GetForProfile(profile); | |
| 57 processor_ = new syncer::FakeSyncChangeProcessor(); | |
| 58 service_->MergeDataAndStartSyncing( | |
| 59 syncer::MANAGED_USERS, | |
| 60 syncer::SyncDataList(), | |
| 61 scoped_ptr<syncer::SyncChangeProcessor>(processor_), | |
| 62 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock)); | |
| 63 } | |
| 64 | |
| 65 scoped_ptr< ::sync_pb::ManagedUserSpecifics> | |
| 66 ManagedUsersSyncTestAdapter::GetFirstChange() { | |
| 67 scoped_ptr< ::sync_pb::ManagedUserSpecifics> result( | |
| 68 new ::sync_pb::ManagedUserSpecifics); | |
| 69 CHECK(HasChanges()); | |
|
Nikita (slow)
2014/04/23 09:50:17
Why not ASSERT or EXPECT? We should be using them
Denis Kuznetsov (DE-MUC)
2014/04/24 17:44:09
These are sanity checks, not things we try to vali
Nikita (slow)
2014/04/25 06:43:59
Still this is just a test and should not ever cras
Denis Kuznetsov (DE-MUC)
2014/04/25 12:52:04
ASSERT can be used only inside tests (that macro e
| |
| 70 const syncer::SyncData& data = processor_->changes().front().sync_data(); | |
| 71 CHECK_EQ(syncer::MANAGED_USERS, data.GetDataType()); | |
| 72 result->CopyFrom(data.GetSpecifics().managed_user()); | |
| 73 return result.Pass(); | |
| 74 } | |
| 75 | |
| 76 void ManagedUsersSyncTestAdapter::AddChange( | |
| 77 const ::sync_pb::ManagedUserSpecifics& proto) { | |
| 78 sync_pb::EntitySpecifics specifics; | |
| 79 | |
| 80 specifics.mutable_managed_user()->CopyFrom(proto); | |
| 81 | |
| 82 syncer::SyncData change_data = syncer::SyncData::CreateRemoteData( | |
| 83 ++next_sync_data_id_, | |
| 84 specifics, | |
| 85 base::Time(), | |
| 86 syncer::AttachmentIdList(), | |
| 87 syncer::AttachmentServiceProxyForTest::Create()); | |
| 88 syncer::SyncChange change( | |
| 89 FROM_HERE, syncer::SyncChange::ACTION_UPDATE, change_data); | |
| 90 | |
| 91 syncer::SyncChangeList change_list; | |
| 92 change_list.push_back(change); | |
| 93 | |
| 94 service_->ProcessSyncChanges(FROM_HERE, change_list); | |
| 95 } | |
| 96 | |
| 97 ManagedUsersSharedSettingsSyncTestAdapter:: | |
| 98 ManagedUsersSharedSettingsSyncTestAdapter(Profile* profile) | |
| 99 : processor_(), next_sync_data_id_(0) { | |
| 100 service_ = | |
| 101 ManagedUserSharedSettingsServiceFactory::GetForBrowserContext(profile); | |
| 102 processor_ = new syncer::FakeSyncChangeProcessor(); | |
| 103 service_->MergeDataAndStartSyncing( | |
| 104 syncer::MANAGED_USER_SHARED_SETTINGS, | |
| 105 syncer::SyncDataList(), | |
| 106 scoped_ptr<syncer::SyncChangeProcessor>(processor_), | |
| 107 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock)); | |
| 108 } | |
| 109 | |
| 110 scoped_ptr< ::sync_pb::ManagedUserSharedSettingSpecifics> | |
| 111 ManagedUsersSharedSettingsSyncTestAdapter::GetFirstChange() { | |
| 112 scoped_ptr< ::sync_pb::ManagedUserSharedSettingSpecifics> result( | |
| 113 new ::sync_pb::ManagedUserSharedSettingSpecifics); | |
| 114 CHECK(HasChanges()); | |
| 115 const syncer::SyncData& data = processor_->changes().front().sync_data(); | |
| 116 CHECK_EQ(syncer::MANAGED_USER_SHARED_SETTINGS, data.GetDataType()); | |
| 117 result->CopyFrom(data.GetSpecifics().managed_user_shared_setting()); | |
| 118 return result.Pass(); | |
| 119 } | |
| 120 | |
| 121 void ManagedUsersSharedSettingsSyncTestAdapter::AddChange( | |
| 122 const ::sync_pb::ManagedUserSharedSettingSpecifics& proto) { | |
| 123 sync_pb::EntitySpecifics specifics; | |
| 124 | |
| 125 specifics.mutable_managed_user_shared_setting()->CopyFrom(proto); | |
| 126 | |
| 127 syncer::SyncData change_data = syncer::SyncData::CreateRemoteData( | |
| 128 ++next_sync_data_id_, | |
| 129 specifics, | |
| 130 base::Time(), | |
| 131 syncer::AttachmentIdList(), | |
| 132 syncer::AttachmentServiceProxyForTest::Create()); | |
| 133 syncer::SyncChange change( | |
| 134 FROM_HERE, syncer::SyncChange::ACTION_UPDATE, change_data); | |
| 135 | |
| 136 syncer::SyncChangeList change_list; | |
| 137 change_list.push_back(change); | |
| 138 | |
| 139 service_->ProcessSyncChanges(FROM_HERE, change_list); | |
| 140 } | |
| 141 | |
| 142 void ManagedUsersSharedSettingsSyncTestAdapter::AddChange( | |
| 143 const std::string& mu_id, | |
| 144 const std::string& key, | |
| 145 const base::Value& value, | |
| 146 bool acknowledged) { | |
| 147 syncer::SyncData data = | |
| 148 ManagedUserSharedSettingsService::CreateSyncDataForSetting( | |
| 149 mu_id, key, value, acknowledged); | |
| 150 AddChange(data.GetSpecifics().managed_user_shared_setting()); | |
| 151 } | |
| 152 | |
| 153 ManagedUserTestBase::ManagedUserTestBase() | |
| 154 : LoginManagerTest(true), | |
| 155 mock_async_method_caller_(NULL), | |
| 156 mock_homedir_methods_(NULL), | |
| 157 network_portal_detector_(NULL), | |
| 158 registration_utility_stub_(NULL) { | |
| 159 } | |
| 160 | |
| 161 ManagedUserTestBase::~ManagedUserTestBase() { | |
| 162 } | |
| 163 | |
| 164 void ManagedUserTestBase::SetUpInProcessBrowserTestFixture() { | |
| 165 LoginManagerTest::SetUpInProcessBrowserTestFixture(); | |
| 166 mock_async_method_caller_ = new cryptohome::MockAsyncMethodCaller; | |
| 167 mock_async_method_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); | |
| 168 cryptohome::AsyncMethodCaller::InitializeForTesting( | |
| 169 mock_async_method_caller_); | |
| 170 | |
| 171 mock_homedir_methods_ = new cryptohome::MockHomedirMethods; | |
| 172 mock_homedir_methods_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); | |
| 173 cryptohome::HomedirMethods::InitializeForTesting(mock_homedir_methods_); | |
| 174 | |
| 175 registration_utility_stub_ = new ManagedUserRegistrationUtilityStub(); | |
| 176 scoped_utility_.reset(new ScopedTestingManagedUserRegistrationUtility( | |
| 177 registration_utility_stub_)); | |
| 178 | |
| 179 // Setup network portal detector to return online state for both | |
| 180 // ethernet and wifi networks. Ethernet is an active network by | |
| 181 // default. | |
| 182 network_portal_detector_ = new NetworkPortalDetectorTestImpl(); | |
| 183 NetworkPortalDetector::InitializeForTesting(network_portal_detector_); | |
| 184 NetworkPortalDetector::CaptivePortalState online_state; | |
| 185 online_state.status = NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE; | |
| 186 online_state.response_code = 204; | |
| 187 network_portal_detector_->SetDefaultNetworkPathForTesting( | |
| 188 kStubEthernetServicePath); | |
| 189 network_portal_detector_->SetDetectionResultsForTesting( | |
| 190 kStubEthernetServicePath, online_state); | |
| 191 } | |
| 192 | |
| 193 void ManagedUserTestBase::CleanUpOnMainThread() { | |
| 194 LoginManagerTest::CleanUpOnMainThread(); | |
| 195 scoped_utility_.reset(NULL); | |
|
Nikita (slow)
2014/04/23 09:50:17
Is this needed? Can you just rely on scoped_ptr de
Denis Kuznetsov (DE-MUC)
2014/04/24 17:44:09
Done.
| |
| 196 } | |
| 197 | |
| 198 void ManagedUserTestBase::TearDown() { | |
| 199 cryptohome::AsyncMethodCaller::Shutdown(); | |
| 200 cryptohome::HomedirMethods::Shutdown(); | |
| 201 mock_homedir_methods_ = NULL; | |
| 202 mock_async_method_caller_ = NULL; | |
| 203 LoginManagerTest::TearDown(); | |
| 204 } | |
| 205 | |
| 206 void ManagedUserTestBase::TearDownInProcessBrowserTestFixture() { | |
| 207 NetworkPortalDetector::Shutdown(); | |
| 208 } | |
| 209 | |
| 210 void ManagedUserTestBase::JSEval(const std::string& script) { | |
| 211 EXPECT_TRUE(content::ExecuteScript(web_contents(), script)); | |
| 212 } | |
| 213 | |
| 214 void ManagedUserTestBase::JSExpectAsync(const std::string& function) { | |
| 215 bool result; | |
| 216 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( | |
| 217 web_contents(), | |
| 218 StringPrintf( | |
| 219 "(%s)(function() { window.domAutomationController.send(true); });", | |
| 220 function.c_str()), | |
| 221 &result)); | |
| 222 EXPECT_TRUE(result); | |
| 223 } | |
| 224 | |
| 225 void ManagedUserTestBase::JSSetTextField(const std::string& element_selector, | |
| 226 const std::string& value) { | |
| 227 std::string function = | |
| 228 StringPrintf("document.querySelector('%s').value = '%s'", | |
| 229 element_selector.c_str(), | |
| 230 value.c_str()); | |
| 231 JSEval(function); | |
| 232 } | |
| 233 | |
| 234 void ManagedUserTestBase::PrepareUsers() { | |
| 235 RegisterUser(kTestManager); | |
| 236 RegisterUser(kTestOtherUser); | |
| 237 chromeos::StartupUtils::MarkOobeCompleted(); | |
| 238 } | |
| 239 | |
| 240 void ManagedUserTestBase::StartFlowLoginAsManager() { | |
| 241 // Navigate to supervised user creation screen. | |
| 242 JSEval("chrome.send('showLocallyManagedUserCreationScreen')"); | |
| 243 | |
| 244 // Read intro and proceed. | |
| 245 JSExpect(StringPrintf("%s == 'intro'", current_page.c_str())); | |
| 246 | |
| 247 JSEval("$('managed-user-creation-start-button').click()"); | |
| 248 | |
| 249 // Check that both users appear as managers, and test-manager@gmail.com is | |
| 250 // the first one. | |
| 251 JSExpect(StringPrintf("%s == 'manager'", current_page.c_str())); | |
| 252 | |
| 253 std::string manager_pods = | |
| 254 "document.querySelectorAll('#managed-user-creation-managers-pane " | |
| 255 ".manager-pod')"; | |
| 256 std::string selected_manager_pods = | |
| 257 "document.querySelectorAll('#managed-user-creation-managers-pane " | |
| 258 ".manager-pod.focused')"; | |
| 259 | |
| 260 int managers_on_device = 2; | |
| 261 | |
| 262 JSExpect(StringPrintf("%s.length == 1", selected_manager_pods.c_str())); | |
| 263 | |
| 264 JSExpect( | |
| 265 StringPrintf("$('managed-user-creation').managerList_.pods.length == %d", | |
| 266 managers_on_device)); | |
| 267 JSExpect(StringPrintf( | |
| 268 "%s.length == %d", manager_pods.c_str(), managers_on_device)); | |
| 269 JSExpect(StringPrintf("%s[%d].user.emailAddress == '%s'", | |
| 270 manager_pods.c_str(), | |
| 271 0, | |
| 272 kTestManager)); | |
| 273 | |
| 274 // Select the first user as manager, and enter password. | |
| 275 JSExpect("$('managed-user-creation-next-button').disabled"); | |
| 276 JSSetTextField("#managed-user-creation .manager-pod.focused input", | |
| 277 kTestManagerPassword); | |
| 278 | |
| 279 JSEval("$('managed-user-creation').updateNextButtonForManager_()"); | |
| 280 | |
| 281 // Next button is now enabled. | |
| 282 JSExpect("!$('managed-user-creation-next-button').disabled"); | |
| 283 SetExpectedCredentials(kTestManager, kTestManagerPassword); | |
| 284 content::WindowedNotificationObserver login_observer( | |
| 285 chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED, | |
| 286 content::NotificationService::AllSources()); | |
| 287 // Log in as manager. | |
|
Nikita (slow)
2014/04/23 09:50:17
nit: insert empty line.
Denis Kuznetsov (DE-MUC)
2014/04/24 17:44:09
Done.
| |
| 288 JSEval("$('managed-user-creation-next-button').click()"); | |
| 289 login_observer.Wait(); | |
| 290 // OAuth token is valid. | |
|
Nikita (slow)
2014/04/23 09:50:17
nit: insert empty line.
Denis Kuznetsov (DE-MUC)
2014/04/24 17:44:09
Done.
| |
| 291 UserManager::Get()->SaveUserOAuthStatus(kTestManager, | |
| 292 User::OAUTH2_TOKEN_STATUS_VALID); | |
| 293 base::RunLoop().RunUntilIdle(); | |
| 294 | |
| 295 // Check the page have changed. | |
| 296 JSExpect(StringPrintf("%s == 'username'", current_page.c_str())); | |
| 297 } | |
| 298 | |
| 299 void ManagedUserTestBase::FillNewUserData(const std::string& display_name) { | |
| 300 JSExpect("$('managed-user-creation-next-button').disabled"); | |
| 301 JSSetTextField("#managed-user-creation-name", display_name); | |
| 302 JSEval("$('managed-user-creation').checkUserName_()"); | |
| 303 | |
| 304 base::RunLoop().RunUntilIdle(); | |
| 305 | |
| 306 JSSetTextField("#managed-user-creation-password", | |
| 307 kTestSupervisedUserPassword); | |
| 308 JSSetTextField("#managed-user-creation-password-confirm", | |
| 309 kTestSupervisedUserPassword); | |
| 310 | |
| 311 JSEval("$('managed-user-creation').updateNextButtonForUser_()"); | |
| 312 JSExpect("!$('managed-user-creation-next-button').disabled"); | |
| 313 } | |
| 314 | |
| 315 void ManagedUserTestBase::StartUserCreation( | |
| 316 const std::string& button_id, | |
| 317 const std::string& expected_display_name) { | |
| 318 EXPECT_CALL(*mock_homedir_methods_, MountEx(_, _, _, _)).Times(1); | |
| 319 EXPECT_CALL(*mock_homedir_methods_, AddKeyEx(_, _, _, _, _)).Times(1); | |
| 320 | |
| 321 JSEval(std::string("$('").append(button_id).append("').click()")); | |
| 322 | |
| 323 ::testing::Mock::VerifyAndClearExpectations(mock_homedir_methods_); | |
| 324 | |
| 325 EXPECT_TRUE(registration_utility_stub_->register_was_called()); | |
| 326 EXPECT_EQ(registration_utility_stub_->display_name(), | |
| 327 base::UTF8ToUTF16(expected_display_name)); | |
| 328 | |
| 329 registration_utility_stub_->RunSuccessCallback("token"); | |
| 330 | |
| 331 // Token writing moves control to BlockingPool and back. | |
| 332 base::RunLoop().RunUntilIdle(); | |
| 333 content::BrowserThread::GetBlockingPool()->FlushForTesting(); | |
| 334 base::RunLoop().RunUntilIdle(); | |
| 335 | |
| 336 JSExpect(StringPrintf("%s == 'created'", current_page.c_str())); | |
| 337 JSEval("$('managed-user-creation-gotit-button').click()"); | |
| 338 } | |
| 339 | |
| 340 void ManagedUserTestBase::SigninAsSupervisedUser( | |
| 341 bool check_homedir_calls, | |
| 342 int user_index, | |
| 343 const std::string& expected_display_name) { | |
| 344 if (check_homedir_calls) { | |
|
Nikita (slow)
2014/04/23 09:50:17
nit: drop {}
Denis Kuznetsov (DE-MUC)
2014/04/24 17:44:09
Done.
| |
| 345 EXPECT_CALL(*mock_homedir_methods_, MountEx(_, _, _, _)).Times(1); | |
| 346 } | |
| 347 // Log in as supervised user, make sure that everything works. | |
|
Nikita (slow)
2014/04/23 09:50:17
nit: insert empty line.
Denis Kuznetsov (DE-MUC)
2014/04/24 17:44:09
Done.
| |
| 348 ASSERT_EQ(3UL, UserManager::Get()->GetUsers().size()); | |
| 349 // Created supervised user have to be first in a list. | |
|
Nikita (slow)
2014/04/23 09:50:17
nit: insert empty line.
Denis Kuznetsov (DE-MUC)
2014/04/24 17:44:09
Done.
| |
| 350 const User* user = UserManager::Get()->GetUsers().at(user_index); | |
| 351 ASSERT_EQ(base::UTF8ToUTF16(expected_display_name), user->display_name()); | |
| 352 LoginUser(user->email()); | |
| 353 if (check_homedir_calls) { | |
|
Nikita (slow)
2014/04/23 09:50:17
nit: drop {}
Denis Kuznetsov (DE-MUC)
2014/04/24 17:44:09
Done.
| |
| 354 ::testing::Mock::VerifyAndClearExpectations(mock_homedir_methods_); | |
| 355 } | |
| 356 Profile* profile = UserManager::Get()->GetProfileByUser(user); | |
| 357 shared_settings_adapter_.reset( | |
| 358 new ManagedUsersSharedSettingsSyncTestAdapter(profile)); | |
| 359 } | |
| 360 | |
| 361 void ManagedUserTestBase::SigninAsManager(int user_index) { | |
| 362 // Log in as supervised user, make sure that everything works. | |
| 363 ASSERT_EQ(3UL, UserManager::Get()->GetUsers().size()); | |
| 364 // Created supervised user have to be first in a list. | |
|
Nikita (slow)
2014/04/23 09:50:17
nit: insert empty line.
Denis Kuznetsov (DE-MUC)
2014/04/24 17:44:09
Done.
| |
| 365 const User* user = UserManager::Get()->GetUsers().at(user_index); | |
| 366 LoginUser(user->email()); | |
| 367 Profile* profile = UserManager::Get()->GetProfileByUser(user); | |
| 368 shared_settings_adapter_.reset( | |
| 369 new ManagedUsersSharedSettingsSyncTestAdapter(profile)); | |
| 370 managed_users_adapter_.reset(new ManagedUsersSyncTestAdapter(profile)); | |
| 371 } | |
| 372 | |
| 373 void ManagedUserTestBase::RemoveSupervisedUser( | |
| 374 unsigned long original_user_count, | |
| 375 int user_index, | |
| 376 const std::string& expected_display_name) { | |
| 377 // Remove supervised user. | |
| 378 | |
|
Nikita (slow)
2014/04/23 09:50:17
nit: drop empty line.
Denis Kuznetsov (DE-MUC)
2014/04/24 17:44:09
Done.
| |
| 379 ASSERT_EQ(original_user_count, UserManager::Get()->GetUsers().size()); | |
| 380 // Created supervised user have to be first in a list. | |
|
Nikita (slow)
2014/04/23 09:50:17
nit: insert empty line.
Denis Kuznetsov (DE-MUC)
2014/04/24 17:44:09
Done.
| |
| 381 const User* user = UserManager::Get()->GetUsers().at(user_index); | |
| 382 ASSERT_EQ(base::UTF8ToUTF16(expected_display_name), user->display_name()); | |
| 383 | |
| 384 // Open pod menu. | |
| 385 JSExpect( | |
| 386 StringPrintf("!$('pod-row').pods[%d].isActionBoxMenuActive", user_index)); | |
| 387 JSEval(StringPrintf( | |
| 388 "$('pod-row').pods[%d].querySelector('.action-box-button').click()", | |
| 389 user_index)); | |
| 390 JSExpect( | |
| 391 StringPrintf("$('pod-row').pods[%d].isActionBoxMenuActive", user_index)); | |
| 392 | |
| 393 // Select "Remove user" element. | |
| 394 JSExpect(StringPrintf( | |
| 395 "$('pod-row').pods[%d].actionBoxRemoveUserWarningElement.hidden", | |
| 396 user_index)); | |
| 397 JSEval(StringPrintf( | |
| 398 "$('pod-row').pods[%d].querySelector('.action-box-menu-remove').click()", | |
| 399 user_index)); | |
| 400 JSExpect(StringPrintf( | |
| 401 "!$('pod-row').pods[%d].actionBoxRemoveUserWarningElement.hidden", | |
| 402 user_index)); | |
| 403 | |
| 404 EXPECT_CALL(*mock_async_method_caller_, AsyncRemove(_, _)).Times(1); | |
| 405 | |
| 406 // Confirm deletion. | |
| 407 JSEval(StringPrintf( | |
| 408 "$('pod-row').pods[%d].querySelector('.remove-warning-button').click()", | |
| 409 user_index)); | |
| 410 | |
| 411 // Make sure there is no supervised user in list. | |
| 412 ASSERT_EQ(original_user_count - 1, UserManager::Get()->GetUsers().size()); | |
| 413 } | |
| 414 | |
| 415 } // namespace testing | |
| 416 | |
| 417 } // namespace chromeos | |
| OLD | NEW |