1 // Copyright (c) 2013 Intel Corporation. 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 "xwalk/application/browser/application_storage_impl.h"
7 #include "base/file_util.h"
8 #include "base/files/scoped_temp_dir.h"
9 #include "base/json/json_file_value_serializer.h"
10 #include "base/logging.h"
11 #include "base/path_service.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 #include "xwalk/application/browser/application_storage.h"
14 #include "xwalk/application/common/application_manifest_constants.h"
18 namespace keys = application_manifest_keys;
20 namespace application {
22 class ApplicationStorageImplTest : public testing::Test {
26 ASSERT_TRUE(PathService::Get(base::DIR_TEMP, &tmp));
27 ASSERT_TRUE(temp_dir_.CreateUniqueTempDirUnderPath(tmp));
28 app_storage_impl_.reset(new ApplicationStorageImpl(temp_dir_.path()));
29 ASSERT_TRUE(app_storage_impl_->Init(applications));
33 base::ScopedTempDir temp_dir_;
34 scoped_ptr<ApplicationStorageImpl> app_storage_impl_;
35 ApplicationData::ApplicationDataMap applications;
38 TEST_F(ApplicationStorageImplTest, CreateDBFile) {
40 EXPECT_TRUE(base::PathExists(
41 temp_dir_.path().Append(ApplicationStorageImpl::kDBFileName)));
44 TEST_F(ApplicationStorageImplTest, DBInsert) {
46 base::DictionaryValue manifest;
47 manifest.SetString(keys::kNameKey, "no name");
48 manifest.SetString(keys::kVersionKey, "0");
49 manifest.SetString("a", "b");
51 scoped_refptr<ApplicationData> application = ApplicationData::Create(
53 Manifest::INVALID_TYPE,
57 ASSERT_TRUE(error.empty());
58 ASSERT_TRUE(application);
59 std::set<std::string> events;
60 events.insert("test_events");
61 application->SetEvents(events);
62 EXPECT_TRUE(app_storage_impl_->AddApplication(application.get(),
63 base::Time::FromDoubleT(0)));
64 ApplicationData::ApplicationDataMap applications;
65 ASSERT_TRUE(app_storage_impl_->GetInstalledApplications(applications));
66 EXPECT_EQ(applications.size(), 1);
67 EXPECT_TRUE(applications[application->ID()]);
68 EXPECT_EQ(applications[application->ID()]
69 ->GetEvents().count("test_events"), 1);
72 TEST_F(ApplicationStorageImplTest, DBDelete) {
74 base::DictionaryValue manifest;
75 manifest.SetString(keys::kNameKey, "no name");
76 manifest.SetString(keys::kVersionKey, "0");
77 manifest.SetString("a", "b");
79 scoped_refptr<ApplicationData> application =
80 ApplicationData::Create(base::FilePath(),
85 ASSERT_TRUE(error.empty());
86 EXPECT_TRUE(application);
87 EXPECT_TRUE(app_storage_impl_->AddApplication(application.get(),
88 base::Time::FromDoubleT(0)));
90 EXPECT_TRUE(app_storage_impl_->RemoveApplication(application->ID()));
91 ApplicationData::ApplicationDataMap applications;
92 ASSERT_TRUE(app_storage_impl_->GetInstalledApplications(applications));
93 EXPECT_EQ(applications.size(), 0);
96 TEST_F(ApplicationStorageImplTest, DBUpgradeToV1) {
98 ASSERT_TRUE(PathService::Get(base::DIR_TEMP, &tmp));
99 ASSERT_TRUE(temp_dir_.CreateUniqueTempDirUnderPath(tmp));
101 scoped_ptr<base::DictionaryValue> db_value(new base::DictionaryValue);
102 scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue);
103 value->SetString("path", "");
104 base::DictionaryValue* manifest = new base::DictionaryValue;
105 manifest->SetString("a", "b");
106 manifest->SetString(keys::kNameKey, "no name");
107 manifest->SetString(keys::kVersionKey, "0");
108 value->Set("manifest", manifest);
109 value->SetDouble("install_time", 0);
110 db_value->Set("test_id", value.release());
112 base::FilePath v0_db_file(
113 temp_dir_.path().AppendASCII("applications_db"));
114 JSONFileValueSerializer serializer(v0_db_file);
115 ASSERT_TRUE(serializer.Serialize(*db_value.get()));
116 ASSERT_TRUE(base::PathExists(v0_db_file));
118 app_storage_impl_.reset(new ApplicationStorageImpl(temp_dir_.path()));
119 ApplicationData::ApplicationDataMap applications;
120 ASSERT_TRUE(app_storage_impl_->Init(applications));
121 ASSERT_FALSE(base::PathExists(v0_db_file));
122 EXPECT_EQ(applications.size(), 1);
123 EXPECT_TRUE(applications["test_id"]);
126 TEST_F(ApplicationStorageImplTest, DBUpdate) {
128 base::DictionaryValue manifest;
129 manifest.SetString(keys::kNameKey, "no name");
130 manifest.SetString(keys::kVersionKey, "0");
131 manifest.SetString("a", "b");
133 scoped_refptr<ApplicationData> application =
134 ApplicationData::Create(base::FilePath(),
139 ASSERT_TRUE(error.empty());
140 ASSERT_TRUE(application);
141 EXPECT_TRUE(app_storage_impl_->AddApplication(application.get(),
142 base::Time::FromDoubleT(0)));
144 manifest.SetString("a", "c");
145 scoped_refptr<ApplicationData> new_application =
146 ApplicationData::Create(base::FilePath(),
151 ASSERT_TRUE(error.empty());
152 ASSERT_TRUE(new_application);
153 EXPECT_TRUE(app_storage_impl_->UpdateApplication(new_application.get(),
154 base::Time::FromDoubleT(0)));
155 ApplicationData::ApplicationDataMap applications;
156 ASSERT_TRUE(app_storage_impl_->GetInstalledApplications(applications));
157 EXPECT_EQ(applications.size(), 1);
158 scoped_refptr<ApplicationData> saved_application =
159 applications[new_application->ID()];
160 EXPECT_TRUE(saved_application);
162 EXPECT_TRUE(saved_application->GetManifest()->value()->Equals(
163 new_application->GetManifest()->value()));
166 } // namespace application