Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8580)

Unified Diff: chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc

Issue 271263002: New test cases for kiosk app crx file cache. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Nit: remove a unused variable. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc b/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc
index a675a7e9e40f99b3a0d893c20b577212a7154ecc..2b6cca3840ccf1c3e4040ec45a99ae4f65b51719 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc
@@ -13,6 +13,7 @@
#include "base/strings/stringprintf.h"
#include "base/values.h"
#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/app_mode/fake_cws.h"
#include "chrome/browser/chromeos/app_mode/kiosk_app_manager_observer.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/browser/chromeos/policy/device_local_account.h"
@@ -32,7 +33,19 @@ namespace chromeos {
namespace {
-const char kWebstoreDomain[] = "cws.com";
+// An app to test local fs data persistence across app update. V1 app writes
+// data into local fs. V2 app reads and verifies the data.
+// Webstore data json is in
+// chrome/test/data/chromeos/app_mode/webstore/inlineinstall/
+// detail/bmbpicmpniaclbbpdkfglgipkkebnbjf
+// The version 1.0.0 installed is in
+// chrome/test/data/chromeos/app_mode/webstore/downloads/
+// bmbpicmpniaclbbpdkfglgipkkebnbjf.crx
+// The version 2.0.0 crx is in
+// chrome/test/data/chromeos/app_mode/webstore/downloads/
+// bmbpicmpniaclbbpdkfglgipkkebnbjf_v2_read_and_verify_data.crx
+const char kTestLocalFsKioskApp[] = "bmbpicmpniaclbbpdkfglgipkkebnbjf";
+const char kTestLocalFsKioskAppName[] = "Kiosk App With Local Data";
// Helper KioskAppManager::GetConsumerKioskAutoLaunchStatusCallback
// implementation.
@@ -124,19 +137,23 @@ class TestKioskAppManagerObserver : public KioskAppManagerObserver {
class AppDataLoadWaiter : public KioskAppManagerObserver {
public:
- explicit AppDataLoadWaiter(KioskAppManager* manager)
- : manager_(manager),
- loaded_(false) {
+ AppDataLoadWaiter(KioskAppManager* manager, int data_loaded_threshold)
+ : runner_(NULL),
+ manager_(manager),
+ loaded_(false),
+ quit_(false),
+ data_change_count_(0),
+ data_loaded_threshold_(data_loaded_threshold) {
+ manager_->AddObserver(this);
}
- virtual ~AppDataLoadWaiter() {
- }
+ virtual ~AppDataLoadWaiter() { manager_->RemoveObserver(this); }
void Wait() {
- manager_->AddObserver(this);
+ if (quit_)
xiyuan 2014/05/13 16:43:35 Can we use |loaded_| and get rid of |quit_|?
jennyz 2014/05/13 18:36:11 In OnKioskAppDataLoadFailure case, loaded will be
+ return;
runner_ = new content::MessageLoopRunner;
runner_->Run();
- manager_->RemoveObserver(this);
}
bool loaded() const { return loaded_; }
@@ -144,18 +161,28 @@ class AppDataLoadWaiter : public KioskAppManagerObserver {
private:
// KioskAppManagerObserver overrides:
virtual void OnKioskAppDataChanged(const std::string& app_id) OVERRIDE {
+ ++data_change_count_;
+ if (data_change_count_ < data_loaded_threshold_)
+ return;
loaded_ = true;
- runner_->Quit();
+ quit_ = true;
+ if (runner_)
+ runner_->Quit();
}
virtual void OnKioskAppDataLoadFailure(const std::string& app_id) OVERRIDE {
loaded_ = false;
- runner_->Quit();
+ quit_ = true;
+ if (runner_)
+ runner_->Quit();
}
scoped_refptr<content::MessageLoopRunner> runner_;
KioskAppManager* manager_;
bool loaded_;
+ bool quit_;
+ int data_change_count_;
+ int data_loaded_threshold_;
DISALLOW_COPY_AND_ASSIGN(AppDataLoadWaiter);
};
@@ -164,16 +191,14 @@ class AppDataLoadWaiter : public KioskAppManagerObserver {
class KioskAppManagerTest : public InProcessBrowserTest {
public:
- KioskAppManagerTest() {}
+ KioskAppManagerTest() : fake_cws_(new FakeCWS()) {}
virtual ~KioskAppManagerTest() {}
// InProcessBrowserTest overrides:
virtual void SetUp() OVERRIDE {
base::FilePath test_data_dir;
PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
- base::FilePath webstore_dir =
- test_data_dir.Append(FILE_PATH_LITERAL("chromeos/app_mode/"));
- embedded_test_server()->ServeFilesFromDirectory(webstore_dir);
+ embedded_test_server()->ServeFilesFromDirectory(test_data_dir);
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
// Stop IO thread here because no threads are allowed while
// spawning sandbox host process. See crbug.com/322732.
@@ -187,16 +212,8 @@ class KioskAppManagerTest : public InProcessBrowserTest {
virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
InProcessBrowserTest::SetUpCommandLine(command_line);
- // Get fake webstore gallery URL. At the end, it should look something like
- // http://cws.com:<test_server_port>/webstore.
- const GURL& server_url = embedded_test_server()->base_url();
- std::string google_host(kWebstoreDomain);
- GURL::Replacements replace_google_host;
- replace_google_host.SetHostStr(google_host);
- GURL google_url = server_url.ReplaceComponents(replace_google_host);
- GURL fake_store_url = google_url.Resolve("/webstore");
- command_line->AppendSwitchASCII(switches::kAppsGalleryURL,
- fake_store_url.spec());
+ // Initialize fake_cws_ to setup web store gallery.
+ fake_cws_->Init(embedded_test_server(), true); // Set up gallery url only.
}
virtual void SetUpOnMainThread() OVERRIDE {
@@ -209,7 +226,7 @@ class KioskAppManagerTest : public InProcessBrowserTest {
virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
InProcessBrowserTest::SetUpInProcessBrowserTestFixture();
- host_resolver()->AddRule(kWebstoreDomain, "127.0.0.1");
+ host_resolver()->AddRule(fake_cws_->GetWebStoreDomain(), "127.0.0.1");
xiyuan 2014/05/13 16:43:35 We can just map "*" to 127.0.0.1. No need to just
jennyz 2014/05/13 18:36:11 Done.
}
std::string GetAppIds() const {
@@ -283,10 +300,78 @@ class KioskAppManagerTest : public InProcessBrowserTest {
device_local_accounts);
}
+ bool GetCachedCrx(const std::string& app_id,
+ base::FilePath* file_path,
+ std::string* version) {
+ return manager()->GetCachedCrx(app_id, file_path, version);
+ }
+
+ void UpdateAppData() { manager()->UpdateAppData(); }
+
+ void RunAddNewAppTest(const std::string& id,
+ const std::string& version,
+ const std::string& app_name) {
+ fake_cws_->SetupCrxDownloadAndUpdateUrls(embedded_test_server());
+ std::string crx_file_name = id + ".crx";
+ fake_cws_->SetUpdateCrx(id, crx_file_name, version);
+
+ AppDataLoadWaiter waiter(manager(), 3);
+ manager()->AddApp(id);
+ waiter.Wait();
+ EXPECT_TRUE(waiter.loaded());
+
+ // Check CRX file is cached.
+ base::FilePath crx_path;
+ std::string crx_version;
+ EXPECT_TRUE(GetCachedCrx(id, &crx_path, &crx_version));
+ EXPECT_TRUE(base::PathExists(crx_path));
+ EXPECT_EQ(version, crx_version);
+ // Verify the original crx file is identical to the cached file.
+ base::FilePath test_data_dir;
+ PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
+ std::string src_file_path_str =
+ std::string("chromeos/app_mode/webstore/downloads/") + crx_file_name;
+ base::FilePath src_file_path = test_data_dir.Append(src_file_path_str);
+ EXPECT_TRUE(base::PathExists(src_file_path));
+ EXPECT_TRUE(base::ContentsEqual(src_file_path, crx_path));
+
+ // Check manifest data is cached correctly.
+ KioskAppManager::Apps apps;
+ manager()->GetApps(&apps);
+ ASSERT_EQ(1u, apps.size());
+ EXPECT_EQ(id, apps[0].app_id);
+ EXPECT_EQ(app_name, apps[0].name);
+ EXPECT_EQ(gfx::Size(16, 16), apps[0].icon.size());
+
+ // Check data is cached in local state.
+ PrefService* local_state = g_browser_process->local_state();
+ const base::DictionaryValue* dict =
+ local_state->GetDictionary(KioskAppManager::kKioskDictionaryName);
+
+ std::string name;
+ std::string name_key = "apps." + id + ".name";
+ EXPECT_TRUE(dict->GetString(name_key, &name));
+ EXPECT_EQ(apps[0].name, name);
+
+ std::string icon_path_string;
+ std::string icon_path_key = "apps." + id + ".icon";
+ EXPECT_TRUE(dict->GetString(icon_path_key, &icon_path_string));
+
+ base::FilePath expected_icon_path;
+ ASSERT_TRUE(PathService::Get(chrome::DIR_USER_DATA, &expected_icon_path));
+ expected_icon_path =
+ expected_icon_path.AppendASCII(KioskAppManager::kIconCacheDir)
+ .AppendASCII(apps[0].app_id)
+ .AddExtension(".png");
+ EXPECT_EQ(expected_icon_path.value(), icon_path_string);
+ }
+
KioskAppManager* manager() const { return KioskAppManager::Get(); }
+ FakeCWS* fake_cws() { return fake_cws_.get(); }
private:
base::ScopedTempDir temp_dir_;
+ scoped_ptr<FakeCWS> fake_cws_;
DISALLOW_COPY_AND_ASSIGN(KioskAppManagerTest);
};
@@ -342,7 +427,7 @@ IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, Basic) {
IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, LoadCached) {
SetExistingApp("app_1", "Cached App1 Name", "red16x16.png");
- AppDataLoadWaiter waiter(manager());
+ AppDataLoadWaiter waiter(manager(), 1);
waiter.Wait();
EXPECT_TRUE(waiter.loaded());
@@ -372,7 +457,7 @@ IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, ClearAppData) {
IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, UpdateAppDataFromProfile) {
SetExistingApp("app_1", "Cached App1 Name", "red16x16.png");
- AppDataLoadWaiter waiter(manager());
+ AppDataLoadWaiter waiter(manager(), 1);
waiter.Wait();
EXPECT_TRUE(waiter.loaded());
@@ -401,7 +486,7 @@ IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, BadApp) {
TestKioskAppManagerObserver observer(manager());
- AppDataLoadWaiter waiter(manager());
+ AppDataLoadWaiter waiter(manager(), 1);
waiter.Wait();
EXPECT_FALSE(waiter.loaded());
@@ -414,7 +499,7 @@ IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, GoodApp) {
// chrome/test/data/chromeos/app_mode/webstore/inlineinstall/detail/app_1
manager()->AddApp("app_1");
- AppDataLoadWaiter waiter(manager());
+ AppDataLoadWaiter waiter(manager(), 1);
waiter.Wait();
EXPECT_TRUE(waiter.loaded());
@@ -446,6 +531,71 @@ IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, GoodApp) {
EXPECT_EQ(expected_icon_path.value(), icon_path_string);
}
+IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, DownloadNewApp) {
+ base::FilePath crx_path;
+ RunAddNewAppTest(kTestLocalFsKioskApp, "1.0.0", kTestLocalFsKioskAppName);
+}
+
+IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, RemoveApp) {
+ // Add a new app.
+ RunAddNewAppTest(kTestLocalFsKioskApp, "1.0.0", kTestLocalFsKioskAppName);
+ KioskAppManager::Apps apps;
+ manager()->GetApps(&apps);
+ ASSERT_EQ(1u, apps.size());
+ base::FilePath crx_path;
+ std::string version;
+ EXPECT_TRUE(GetCachedCrx(kTestLocalFsKioskApp, &crx_path, &version));
+ EXPECT_TRUE(base::PathExists(crx_path));
+ EXPECT_EQ("1.0.0", version);
+
+ // Remove the app now.
+ manager()->RemoveApp(kTestLocalFsKioskApp);
+ manager()->GetApps(&apps);
+ ASSERT_EQ(0u, apps.size());
+ EXPECT_FALSE(base::PathExists(crx_path));
+ EXPECT_FALSE(GetCachedCrx(kTestLocalFsKioskApp, &crx_path, &version));
+}
+
+IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, UpdateApp) {
+ // Add a version 1 app first.
+ RunAddNewAppTest(kTestLocalFsKioskApp, "1.0.0", kTestLocalFsKioskAppName);
+ KioskAppManager::Apps apps;
+ manager()->GetApps(&apps);
+ ASSERT_EQ(1u, apps.size());
+ base::FilePath crx_path;
+ std::string version;
+ EXPECT_TRUE(GetCachedCrx(kTestLocalFsKioskApp, &crx_path, &version));
+ EXPECT_TRUE(base::PathExists(crx_path));
+ EXPECT_EQ("1.0.0", version);
+
+ // Update to version 2.
+ fake_cws()->SetUpdateCrx(
+ kTestLocalFsKioskApp,
+ "bmbpicmpniaclbbpdkfglgipkkebnbjf_v2_read_and_verify_data.crx",
+ "2.0.0");
+ AppDataLoadWaiter waiter(manager(), 1);
+ UpdateAppData();
+ waiter.Wait();
+ EXPECT_TRUE(waiter.loaded());
+
+ // Verify the app has been updated to v2.
+ manager()->GetApps(&apps);
+ ASSERT_EQ(1u, apps.size());
+ base::FilePath new_crx_path;
+ std::string new_version;
+ EXPECT_TRUE(GetCachedCrx(kTestLocalFsKioskApp, &new_crx_path, &new_version));
+ EXPECT_EQ("2.0.0", new_version);
+ EXPECT_TRUE(base::PathExists(new_crx_path));
+ // Get original version 2 source download crx file path.
+ base::FilePath test_data_dir;
+ PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
+ base::FilePath v2_file_path = test_data_dir.Append(FILE_PATH_LITERAL(
+ "chromeos/app_mode/webstore/downloads/"
+ "bmbpicmpniaclbbpdkfglgipkkebnbjf_v2_read_and_verify_data.crx"));
+ EXPECT_TRUE(base::PathExists(v2_file_path));
+ EXPECT_TRUE(base::ContentsEqual(v2_file_path, new_crx_path));
+}
+
IN_PROC_BROWSER_TEST_F(KioskAppManagerTest, EnableConsumerKiosk) {
scoped_ptr<KioskAppManager::ConsumerKioskAutoLaunchStatus> status(
new KioskAppManager::ConsumerKioskAutoLaunchStatus(

Powered by Google App Engine
This is Rietveld 408576698