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.
5 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
7 #include "base/command_line.h"
8 #include "base/file_util.h"
9 #include "base/files/scoped_temp_dir.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/path_service.h"
12 #include "base/prefs/scoped_user_pref_update.h"
13 #include "base/strings/stringprintf.h"
14 #include "base/values.h"
15 #include "chrome/browser/browser_process.h"
16 #include "chrome/browser/chromeos/app_mode/fake_cws.h"
17 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager_observer.h"
18 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
19 #include "chrome/browser/chromeos/policy/device_local_account.h"
20 #include "chrome/browser/chromeos/settings/cros_settings.h"
21 #include "chrome/browser/ui/browser.h"
22 #include "chrome/common/chrome_paths.h"
23 #include "chrome/common/chrome_switches.h"
24 #include "chrome/test/base/in_process_browser_test.h"
25 #include "chromeos/settings/cros_settings_names.h"
26 #include "content/public/test/test_utils.h"
27 #include "extensions/common/extension.h"
28 #include "net/base/host_port_pair.h"
29 #include "net/dns/mock_host_resolver.h"
30 #include "net/test/embedded_test_server/embedded_test_server.h"
32 using content::BrowserThread;
38 // An app to test local fs data persistence across app update. V1 app writes
39 // data into local fs. V2 app reads and verifies the data.
40 // Webstore data json is in
41 // chrome/test/data/chromeos/app_mode/webstore/inlineinstall/
42 // detail/bmbpicmpniaclbbpdkfglgipkkebnbjf
43 // The version 1.0.0 installed is in
44 // chrome/test/data/chromeos/app_mode/webstore/downloads/
45 // bmbpicmpniaclbbpdkfglgipkkebnbjf.crx
46 // The version 2.0.0 crx is in
47 // chrome/test/data/chromeos/app_mode/webstore/downloads/
48 // bmbpicmpniaclbbpdkfglgipkkebnbjf_v2_read_and_verify_data.crx
49 const char kTestLocalFsKioskApp[] = "bmbpicmpniaclbbpdkfglgipkkebnbjf";
50 const char kTestLocalFsKioskAppName[] = "Kiosk App With Local Data";
52 // Helper KioskAppManager::GetConsumerKioskAutoLaunchStatusCallback
54 void ConsumerKioskAutoLaunchStatusCheck(
55 KioskAppManager::ConsumerKioskAutoLaunchStatus* out_status,
56 const base::Closure& runner_quit_task,
57 KioskAppManager::ConsumerKioskAutoLaunchStatus in_status) {
58 LOG(INFO) << "ConsumerKioskAutoLaunchStatus = " << in_status;
59 *out_status = in_status;
60 runner_quit_task.Run();
63 // Helper KioskAppManager::EnableKioskModeCallback implementation.
64 void ConsumerKioskModeLockCheck(
66 const base::Closure& runner_quit_task,
68 LOG(INFO) << "kiosk locked = " << in_locked;
69 *out_locked = in_locked;
70 runner_quit_task.Run();
73 // Helper EnterpriseInstallAttributes::LockResultCallback implementation.
74 void OnEnterpriseDeviceLock(
75 policy::EnterpriseInstallAttributes::LockResult* out_locked,
76 const base::Closure& runner_quit_task,
77 policy::EnterpriseInstallAttributes::LockResult in_locked) {
78 LOG(INFO) << "Enterprise lock = " << in_locked;
79 *out_locked = in_locked;
80 runner_quit_task.Run();
83 scoped_refptr<extensions::Extension> MakeApp(const std::string& name,
84 const std::string& version,
85 const std::string& url,
86 const std::string& id) {
88 base::DictionaryValue value;
89 value.SetString("name", name);
90 value.SetString("version", version);
91 value.SetString("app.launch.web_url", url);
92 scoped_refptr<extensions::Extension> app =
93 extensions::Extension::Create(
95 extensions::Manifest::INTERNAL,
97 extensions::Extension::WAS_INSTALLED_BY_DEFAULT,
104 class TestKioskAppManagerObserver : public KioskAppManagerObserver {
106 explicit TestKioskAppManagerObserver(KioskAppManager* manager)
108 data_changed_count_(0),
109 load_failure_count_(0) {
110 manager_->AddObserver(this);
112 virtual ~TestKioskAppManagerObserver() {
113 manager_->RemoveObserver(this);
117 data_changed_count_ = 0;
118 load_failure_count_ = 0;
121 int data_changed_count() const { return data_changed_count_; }
122 int load_failure_count() const { return load_failure_count_; }
125 // KioskAppManagerObserver overrides:
126 virtual void OnKioskAppDataChanged(const std::string& app_id) OVERRIDE {
127 ++data_changed_count_;
129 virtual void OnKioskAppDataLoadFailure(const std::string& app_id) OVERRIDE {
130 ++load_failure_count_;
133 KioskAppManager* manager_;
134 int data_changed_count_;
135 int load_failure_count_;
137 DISALLOW_COPY_AND_ASSIGN(TestKioskAppManagerObserver);
140 class AppDataLoadWaiter : public KioskAppManagerObserver {
142 AppDataLoadWaiter(KioskAppManager* manager, int data_loaded_threshold)
147 data_change_count_(0),
148 data_loaded_threshold_(data_loaded_threshold) {
149 manager_->AddObserver(this);
152 virtual ~AppDataLoadWaiter() { manager_->RemoveObserver(this); }
157 runner_ = new content::MessageLoopRunner;
161 bool loaded() const { return loaded_; }
164 // KioskAppManagerObserver overrides:
165 virtual void OnKioskAppDataChanged(const std::string& app_id) OVERRIDE {
166 ++data_change_count_;
167 if (data_change_count_ < data_loaded_threshold_)
175 virtual void OnKioskAppDataLoadFailure(const std::string& app_id) OVERRIDE {
182 scoped_refptr<content::MessageLoopRunner> runner_;
183 KioskAppManager* manager_;
186 int data_change_count_;
187 int data_loaded_threshold_;
189 DISALLOW_COPY_AND_ASSIGN(AppDataLoadWaiter);
194 class KioskAppManagerTest : public InProcessBrowserTest {
196 KioskAppManagerTest() : fake_cws_(new FakeCWS()) {}
197 virtual ~KioskAppManagerTest() {}
199 // InProcessBrowserTest overrides:
200 virtual void SetUp() OVERRIDE {
201 base::FilePath test_data_dir;
202 PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
203 embedded_test_server()->ServeFilesFromDirectory(test_data_dir);
204 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
205 // Stop IO thread here because no threads are allowed while
206 // spawning sandbox host process. See crbug.com/322732.
207 embedded_test_server()->StopThread();
209 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
211 InProcessBrowserTest::SetUp();
214 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
215 InProcessBrowserTest::SetUpCommandLine(command_line);
217 // Initialize fake_cws_ to setup web store gallery.
218 fake_cws_->Init(embedded_test_server());
221 virtual void SetUpOnMainThread() OVERRIDE {
222 InProcessBrowserTest::SetUpOnMainThread();
224 // Restart the thread as the sandbox host process has already been spawned.
225 embedded_test_server()->RestartThreadAndListen();
228 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
229 InProcessBrowserTest::SetUpInProcessBrowserTestFixture();
231 host_resolver()->AddRule("*", "127.0.0.1");
234 std::string GetAppIds() const {
235 KioskAppManager::Apps apps;
236 manager()->GetApps(&apps);
239 for (size_t i = 0; i < apps.size(); ++i) {
242 str += apps[i].app_id;
248 // Locks device for enterprise.
249 policy::EnterpriseInstallAttributes::LockResult LockDeviceForEnterprise() {
250 scoped_ptr<policy::EnterpriseInstallAttributes::LockResult> lock_result(
251 new policy::EnterpriseInstallAttributes::LockResult(
252 policy::EnterpriseInstallAttributes::LOCK_NOT_READY));
253 scoped_refptr<content::MessageLoopRunner> runner =
254 new content::MessageLoopRunner;
255 policy::BrowserPolicyConnectorChromeOS* connector =
256 g_browser_process->platform_part()->browser_policy_connector_chromeos();
257 connector->GetInstallAttributes()->LockDevice(
259 policy::DEVICE_MODE_ENTERPRISE,
262 &OnEnterpriseDeviceLock, lock_result.get(), runner->QuitClosure()));
264 return *lock_result.get();
267 void SetExistingApp(const std::string& app_id,
268 const std::string& app_name,
269 const std::string& icon_file_name) {
270 base::FilePath test_dir;
271 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_dir));
272 base::FilePath data_dir = test_dir.AppendASCII("chromeos/app_mode/");
274 // Copy the icon file to temp dir for using because ClearAppData test
276 base::FilePath icon_path = temp_dir_.path().AppendASCII(icon_file_name);
277 base::CopyFile(data_dir.AppendASCII(icon_file_name), icon_path);
279 scoped_ptr<base::DictionaryValue> apps_dict(new base::DictionaryValue);
280 apps_dict->SetString(app_id + ".name", app_name);
281 apps_dict->SetString(app_id + ".icon", icon_path.MaybeAsASCII());
283 PrefService* local_state = g_browser_process->local_state();
284 DictionaryPrefUpdate dict_update(local_state,
285 KioskAppManager::kKioskDictionaryName);
286 dict_update->Set(KioskAppManager::kKeyApps, apps_dict.release());
288 // Make the app appear in device settings.
289 base::ListValue device_local_accounts;
290 scoped_ptr<base::DictionaryValue> entry(new base::DictionaryValue);
291 entry->SetStringWithoutPathExpansion(
292 kAccountsPrefDeviceLocalAccountsKeyId,
294 entry->SetIntegerWithoutPathExpansion(
295 kAccountsPrefDeviceLocalAccountsKeyType,
296 policy::DeviceLocalAccount::TYPE_KIOSK_APP);
297 entry->SetStringWithoutPathExpansion(
298 kAccountsPrefDeviceLocalAccountsKeyKioskAppId,
300 device_local_accounts.Append(entry.release());
301 CrosSettings::Get()->Set(kAccountsPrefDeviceLocalAccounts,
302 device_local_accounts);
305 bool GetCachedCrx(const std::string& app_id,
306 base::FilePath* file_path,
307 std::string* version) {
308 return manager()->GetCachedCrx(app_id, file_path, version);
311 void UpdateAppData() { manager()->UpdateAppData(); }
313 void RunAddNewAppTest(const std::string& id,
314 const std::string& version,
315 const std::string& app_name) {
316 std::string crx_file_name = id + ".crx";
317 fake_cws_->SetUpdateCrx(id, crx_file_name, version);
319 AppDataLoadWaiter waiter(manager(), 3);
320 manager()->AddApp(id);
322 EXPECT_TRUE(waiter.loaded());
324 // Check CRX file is cached.
325 base::FilePath crx_path;
326 std::string crx_version;
327 EXPECT_TRUE(GetCachedCrx(id, &crx_path, &crx_version));
328 EXPECT_TRUE(base::PathExists(crx_path));
329 EXPECT_EQ(version, crx_version);
330 // Verify the original crx file is identical to the cached file.
331 base::FilePath test_data_dir;
332 PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
333 std::string src_file_path_str =
334 std::string("chromeos/app_mode/webstore/downloads/") + crx_file_name;
335 base::FilePath src_file_path = test_data_dir.Append(src_file_path_str);
336 EXPECT_TRUE(base::PathExists(src_file_path));
337 EXPECT_TRUE(base::ContentsEqual(src_file_path, crx_path));
339 // Check manifest data is cached correctly.
340 KioskAppManager::Apps apps;
341 manager()->GetApps(&apps);
342 ASSERT_EQ(1u, apps.size());
343 EXPECT_EQ(id, apps[0].app_id);
344 EXPECT_EQ(app_name, apps[0].name);
345 EXPECT_EQ(gfx::Size(16, 16), apps[0].icon.size());
347 // Check data is cached in local state.
348 PrefService* local_state = g_browser_process->local_state();
349 const base::DictionaryValue* dict =
350 local_state->GetDictionary(KioskAppManager::kKioskDictionaryName);
353 std::string name_key = "apps." + id + ".name";
354 EXPECT_TRUE(dict->GetString(name_key, &name));
355 EXPECT_EQ(apps[0].name, name);
357 std::string icon_path_string;
358 std::string icon_path_key = "apps." + id + ".icon";
359 EXPECT_TRUE(dict->GetString(icon_path_key, &icon_path_string));
361 base::FilePath expected_icon_path;
362 ASSERT_TRUE(PathService::Get(chrome::DIR_USER_DATA, &expected_icon_path));
364 expected_icon_path.AppendASCII(KioskAppManager::kIconCacheDir)
365 .AppendASCII(apps[0].app_id)
366 .AddExtension(".png");
367 EXPECT_EQ(expected_icon_path.value(), icon_path_string);
370 KioskAppManager* manager() const { return KioskAppManager::Get(); }
371 FakeCWS* fake_cws() { return fake_cws_.get(); }
374 base::ScopedTempDir temp_dir_;
375 scoped_ptr<FakeCWS> fake_cws_;
377 DISALLOW_COPY_AND_ASSIGN(KioskAppManagerTest);
380 IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, Basic) {
381 // Add a couple of apps. Use "fake_app_x" that do not have data on the test
382 // server to avoid pending data loads that could be lingering on tear down and
383 // cause DCHECK failure in utility_process_host_impl.cc.
384 manager()->AddApp("fake_app_1");
385 manager()->AddApp("fake_app_2");
386 EXPECT_EQ("fake_app_1,fake_app_2", GetAppIds());
388 // Set an auto launch app.
389 manager()->SetAutoLaunchApp("fake_app_1");
390 EXPECT_EQ("fake_app_1", manager()->GetAutoLaunchApp());
392 // Clear the auto launch app.
393 manager()->SetAutoLaunchApp("");
394 EXPECT_EQ("", manager()->GetAutoLaunchApp());
395 EXPECT_FALSE(manager()->IsAutoLaunchEnabled());
397 // Set another auto launch app.
398 manager()->SetAutoLaunchApp("fake_app_2");
399 EXPECT_EQ("fake_app_2", manager()->GetAutoLaunchApp());
401 // Check auto launch permissions.
402 EXPECT_FALSE(manager()->IsAutoLaunchEnabled());
403 manager()->SetEnableAutoLaunch(true);
404 EXPECT_TRUE(manager()->IsAutoLaunchEnabled());
406 // Remove the auto launch app.
407 manager()->RemoveApp("fake_app_2");
408 EXPECT_EQ("fake_app_1", GetAppIds());
409 EXPECT_EQ("", manager()->GetAutoLaunchApp());
411 // Add the just removed auto launch app again and it should no longer be
412 // the auto launch app.
413 manager()->AddApp("fake_app_2");
414 EXPECT_EQ("", manager()->GetAutoLaunchApp());
415 manager()->RemoveApp("fake_app_2");
416 EXPECT_EQ("fake_app_1", GetAppIds());
418 // Set a none exist app as auto launch.
419 manager()->SetAutoLaunchApp("none_exist_app");
420 EXPECT_EQ("", manager()->GetAutoLaunchApp());
421 EXPECT_FALSE(manager()->IsAutoLaunchEnabled());
423 // Add an existing app again.
424 manager()->AddApp("fake_app_1");
425 EXPECT_EQ("fake_app_1", GetAppIds());
428 IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, LoadCached) {
429 SetExistingApp("app_1", "Cached App1 Name", "red16x16.png");
431 fake_cws()->SetNoUpdate("app_1");
432 AppDataLoadWaiter waiter(manager(), 1);
434 EXPECT_TRUE(waiter.loaded());
436 KioskAppManager::Apps apps;
437 manager()->GetApps(&apps);
438 EXPECT_EQ(1u, apps.size());
439 EXPECT_EQ("app_1", apps[0].app_id);
440 EXPECT_EQ("Cached App1 Name", apps[0].name);
441 EXPECT_EQ(gfx::Size(16, 16), apps[0].icon.size());
444 IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, ClearAppData) {
445 SetExistingApp("app_1", "Cached App1 Name", "red16x16.png");
447 PrefService* local_state = g_browser_process->local_state();
448 const base::DictionaryValue* dict =
449 local_state->GetDictionary(KioskAppManager::kKioskDictionaryName);
450 const base::DictionaryValue* apps_dict;
451 EXPECT_TRUE(dict->GetDictionary(KioskAppManager::kKeyApps, &apps_dict));
452 EXPECT_TRUE(apps_dict->HasKey("app_1"));
454 manager()->ClearAppData("app_1");
456 EXPECT_FALSE(apps_dict->HasKey("app_1"));
459 IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, UpdateAppDataFromProfile) {
460 SetExistingApp("app_1", "Cached App1 Name", "red16x16.png");
462 fake_cws()->SetNoUpdate("app_1");
463 AppDataLoadWaiter waiter(manager(), 1);
465 EXPECT_TRUE(waiter.loaded());
467 KioskAppManager::Apps apps;
468 manager()->GetApps(&apps);
469 EXPECT_EQ(1u, apps.size());
470 EXPECT_EQ("app_1", apps[0].app_id);
471 EXPECT_EQ("Cached App1 Name", apps[0].name);
473 scoped_refptr<extensions::Extension> updated_app =
474 MakeApp("Updated App1 Name", "2.0", "http://localhost/", "app_1");
475 manager()->UpdateAppDataFromProfile(
476 "app_1", browser()->profile(), updated_app.get());
479 EXPECT_TRUE(waiter.loaded());
481 manager()->GetApps(&apps);
482 EXPECT_EQ(1u, apps.size());
483 EXPECT_EQ("app_1", apps[0].app_id);
484 EXPECT_EQ("Updated App1 Name", apps[0].name);
487 // Test is flaky. See http://crbug.com/379769 for details.
488 IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, DISABLED_BadApp) {
489 AppDataLoadWaiter waiter(manager(), 2);
490 manager()->AddApp("unknown_app");
491 TestKioskAppManagerObserver observer(manager());
493 EXPECT_FALSE(waiter.loaded());
495 EXPECT_EQ("", GetAppIds());
496 EXPECT_EQ(1, observer.load_failure_count());
499 IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, GoodApp) {
500 // Webstore data json is in
501 // chrome/test/data/chromeos/app_mode/webstore/inlineinstall/detail/app_1
502 fake_cws()->SetNoUpdate("app_1");
503 AppDataLoadWaiter waiter(manager(), 2);
504 manager()->AddApp("app_1");
506 EXPECT_TRUE(waiter.loaded());
508 // Check data is correct.
509 KioskAppManager::Apps apps;
510 manager()->GetApps(&apps);
511 ASSERT_EQ(1u, apps.size());
512 EXPECT_EQ("app_1", apps[0].app_id);
513 EXPECT_EQ("Name of App 1", apps[0].name);
514 EXPECT_EQ(gfx::Size(16, 16), apps[0].icon.size());
516 // Check data is cached in local state.
517 PrefService* local_state = g_browser_process->local_state();
518 const base::DictionaryValue* dict =
519 local_state->GetDictionary(KioskAppManager::kKioskDictionaryName);
522 EXPECT_TRUE(dict->GetString("apps.app_1.name", &name));
523 EXPECT_EQ(apps[0].name, name);
525 std::string icon_path_string;
526 EXPECT_TRUE(dict->GetString("apps.app_1.icon", &icon_path_string));
528 base::FilePath expected_icon_path;
529 ASSERT_TRUE(PathService::Get(chrome::DIR_USER_DATA, &expected_icon_path));
530 expected_icon_path = expected_icon_path.
531 AppendASCII(KioskAppManager::kIconCacheDir).
532 AppendASCII(apps[0].app_id).AddExtension(".png");
533 EXPECT_EQ(expected_icon_path.value(), icon_path_string);
536 IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, DownloadNewApp) {
537 base::FilePath crx_path;
538 RunAddNewAppTest(kTestLocalFsKioskApp, "1.0.0", kTestLocalFsKioskAppName);
541 IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, RemoveApp) {
543 RunAddNewAppTest(kTestLocalFsKioskApp, "1.0.0", kTestLocalFsKioskAppName);
544 KioskAppManager::Apps apps;
545 manager()->GetApps(&apps);
546 ASSERT_EQ(1u, apps.size());
547 base::FilePath crx_path;
549 EXPECT_TRUE(GetCachedCrx(kTestLocalFsKioskApp, &crx_path, &version));
550 EXPECT_TRUE(base::PathExists(crx_path));
551 EXPECT_EQ("1.0.0", version);
553 // Remove the app now.
554 manager()->RemoveApp(kTestLocalFsKioskApp);
555 content::BrowserThread::GetBlockingPool()->FlushForTesting();
556 manager()->GetApps(&apps);
557 ASSERT_EQ(0u, apps.size());
558 EXPECT_FALSE(base::PathExists(crx_path));
559 EXPECT_FALSE(GetCachedCrx(kTestLocalFsKioskApp, &crx_path, &version));
562 IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, UpdateApp) {
563 // Add a version 1 app first.
564 RunAddNewAppTest(kTestLocalFsKioskApp, "1.0.0", kTestLocalFsKioskAppName);
565 KioskAppManager::Apps apps;
566 manager()->GetApps(&apps);
567 ASSERT_EQ(1u, apps.size());
568 base::FilePath crx_path;
570 EXPECT_TRUE(GetCachedCrx(kTestLocalFsKioskApp, &crx_path, &version));
571 EXPECT_TRUE(base::PathExists(crx_path));
572 EXPECT_EQ("1.0.0", version);
574 // Update to version 2.
575 fake_cws()->SetUpdateCrx(
576 kTestLocalFsKioskApp,
577 "bmbpicmpniaclbbpdkfglgipkkebnbjf_v2_read_and_verify_data.crx",
579 AppDataLoadWaiter waiter(manager(), 1);
582 EXPECT_TRUE(waiter.loaded());
584 // Verify the app has been updated to v2.
585 manager()->GetApps(&apps);
586 ASSERT_EQ(1u, apps.size());
587 base::FilePath new_crx_path;
588 std::string new_version;
589 EXPECT_TRUE(GetCachedCrx(kTestLocalFsKioskApp, &new_crx_path, &new_version));
590 EXPECT_EQ("2.0.0", new_version);
591 EXPECT_TRUE(base::PathExists(new_crx_path));
592 // Get original version 2 source download crx file path.
593 base::FilePath test_data_dir;
594 PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
595 base::FilePath v2_file_path = test_data_dir.Append(FILE_PATH_LITERAL(
596 "chromeos/app_mode/webstore/downloads/"
597 "bmbpicmpniaclbbpdkfglgipkkebnbjf_v2_read_and_verify_data.crx"));
598 EXPECT_TRUE(base::PathExists(v2_file_path));
599 EXPECT_TRUE(base::ContentsEqual(v2_file_path, new_crx_path));
602 IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, UpdateAndRemoveApp) {
603 // Add a version 1 app first.
604 RunAddNewAppTest(kTestLocalFsKioskApp, "1.0.0", kTestLocalFsKioskAppName);
605 KioskAppManager::Apps apps;
606 manager()->GetApps(&apps);
607 ASSERT_EQ(1u, apps.size());
608 base::FilePath v1_crx_path;
610 EXPECT_TRUE(GetCachedCrx(kTestLocalFsKioskApp, &v1_crx_path, &version));
611 EXPECT_TRUE(base::PathExists(v1_crx_path));
612 EXPECT_EQ("1.0.0", version);
614 // Update to version 2.
615 fake_cws()->SetUpdateCrx(
616 kTestLocalFsKioskApp,
617 "bmbpicmpniaclbbpdkfglgipkkebnbjf_v2_read_and_verify_data.crx",
619 AppDataLoadWaiter waiter(manager(), 1);
622 EXPECT_TRUE(waiter.loaded());
624 // Verify the app has been updated to v2.
625 manager()->GetApps(&apps);
626 ASSERT_EQ(1u, apps.size());
627 base::FilePath v2_crx_path;
628 std::string new_version;
629 EXPECT_TRUE(GetCachedCrx(kTestLocalFsKioskApp, &v2_crx_path, &new_version));
630 EXPECT_EQ("2.0.0", new_version);
631 // Verify both v1 and v2 crx files exist.
632 EXPECT_TRUE(base::PathExists(v1_crx_path));
633 EXPECT_TRUE(base::PathExists(v2_crx_path));
635 // Remove the app now.
636 manager()->RemoveApp(kTestLocalFsKioskApp);
637 content::BrowserThread::GetBlockingPool()->FlushForTesting();
638 manager()->GetApps(&apps);
639 ASSERT_EQ(0u, apps.size());
640 // Verify both v1 and v2 crx files are removed.
641 EXPECT_FALSE(base::PathExists(v1_crx_path));
642 EXPECT_FALSE(base::PathExists(v2_crx_path));
643 EXPECT_FALSE(GetCachedCrx(kTestLocalFsKioskApp, &v2_crx_path, &version));
646 IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, EnableConsumerKiosk) {
647 scoped_ptr<KioskAppManager::ConsumerKioskAutoLaunchStatus> status(
648 new KioskAppManager::ConsumerKioskAutoLaunchStatus(
649 KioskAppManager::CONSUMER_KIOSK_AUTO_LAUNCH_DISABLED));
650 scoped_ptr<bool> locked(new bool(false));
652 scoped_refptr<content::MessageLoopRunner> runner =
653 new content::MessageLoopRunner;
654 manager()->GetConsumerKioskAutoLaunchStatus(
655 base::Bind(&ConsumerKioskAutoLaunchStatusCheck,
657 runner->QuitClosure()));
659 EXPECT_EQ(*status.get(),
660 KioskAppManager::CONSUMER_KIOSK_AUTO_LAUNCH_CONFIGURABLE);
662 scoped_refptr<content::MessageLoopRunner> runner2 =
663 new content::MessageLoopRunner;
664 manager()->EnableConsumerKioskAutoLaunch(
665 base::Bind(&ConsumerKioskModeLockCheck,
667 runner2->QuitClosure()));
669 EXPECT_TRUE(*locked.get());
671 scoped_refptr<content::MessageLoopRunner> runner3 =
672 new content::MessageLoopRunner;
673 manager()->GetConsumerKioskAutoLaunchStatus(
674 base::Bind(&ConsumerKioskAutoLaunchStatusCheck,
676 runner3->QuitClosure()));
678 EXPECT_EQ(*status.get(),
679 KioskAppManager::CONSUMER_KIOSK_AUTO_LAUNCH_ENABLED);
682 IN_PROC_BROWSER_TEST_F(KioskAppManagerTest,
683 PreventEnableConsumerKioskForEnterprise) {
684 // First, lock the device as enterprise.
685 EXPECT_EQ(LockDeviceForEnterprise(),
686 policy::EnterpriseInstallAttributes::LOCK_SUCCESS);
688 scoped_ptr<KioskAppManager::ConsumerKioskAutoLaunchStatus> status(
689 new KioskAppManager::ConsumerKioskAutoLaunchStatus(
690 KioskAppManager::CONSUMER_KIOSK_AUTO_LAUNCH_DISABLED));
691 scoped_ptr<bool> locked(new bool(true));
693 scoped_refptr<content::MessageLoopRunner> runner =
694 new content::MessageLoopRunner;
695 manager()->GetConsumerKioskAutoLaunchStatus(
696 base::Bind(&ConsumerKioskAutoLaunchStatusCheck,
698 runner->QuitClosure()));
700 EXPECT_EQ(*status.get(),
701 KioskAppManager::CONSUMER_KIOSK_AUTO_LAUNCH_DISABLED);
703 scoped_refptr<content::MessageLoopRunner> runner2 =
704 new content::MessageLoopRunner;
705 manager()->EnableConsumerKioskAutoLaunch(
706 base::Bind(&ConsumerKioskModeLockCheck,
708 runner2->QuitClosure()));
710 EXPECT_FALSE(*locked.get());
712 scoped_refptr<content::MessageLoopRunner> runner3 =
713 new content::MessageLoopRunner;
714 manager()->GetConsumerKioskAutoLaunchStatus(
715 base::Bind(&ConsumerKioskAutoLaunchStatusCheck,
717 runner3->QuitClosure()));
719 EXPECT_EQ(*status.get(),
720 KioskAppManager::CONSUMER_KIOSK_AUTO_LAUNCH_DISABLED);
723 } // namespace chromeos