1 // Copyright (c) 2012 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 "xwalk/application/common/application_file_util.h"
7 #include "base/file_util.h"
8 #include "base/files/scoped_temp_dir.h"
9 #include "base/json/json_string_value_serializer.h"
10 #include "base/path_service.h"
11 #include "base/strings/stringprintf.h"
12 #include "base/strings/utf_string_conversions.h"
13 #include "xwalk/application/common/application_data.h"
14 #include "xwalk/application/common/application_manifest_constants.h"
15 #include "xwalk/application/common/manifest.h"
16 #include "xwalk/application/common/constants.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "ui/base/l10n/l10n_util.h"
20 using xwalk::application::ApplicationData;
21 using xwalk::application::Manifest;
23 namespace keys = xwalk::application_manifest_keys;
26 namespace application {
28 class ApplicationFileUtilTest : public testing::Test {
31 TEST_F(ApplicationFileUtilTest, LoadApplicationWithValidPath) {
32 base::FilePath install_dir;
33 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &install_dir));
34 install_dir = install_dir.AppendASCII("xwalk")
35 .AppendASCII("application")
39 .AppendASCII("Applications")
43 scoped_refptr<ApplicationData> application(LoadApplication(
44 install_dir, ApplicationData::LOCAL_DIRECTORY, &error));
45 ASSERT_TRUE(application != NULL);
46 EXPECT_EQ("The first application that I made.", application->Description());
49 TEST_F(ApplicationFileUtilTest,
50 LoadApplicationGivesHelpfullErrorOnMissingManifest) {
51 base::FilePath install_dir;
52 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &install_dir));
53 install_dir = install_dir.AppendASCII("xwalk")
54 .AppendASCII("application")
58 .AppendASCII("Applications")
62 scoped_refptr<ApplicationData> application(LoadApplication(
63 install_dir, ApplicationData::LOCAL_DIRECTORY, &error));
64 ASSERT_TRUE(application == NULL);
65 ASSERT_FALSE(error.empty());
66 ASSERT_STREQ("Manifest file is missing or unreadable.", error.c_str());
69 TEST_F(ApplicationFileUtilTest,
70 LoadApplicationGivesHelpfullErrorOnBadManifest) {
71 base::FilePath install_dir;
72 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &install_dir));
73 install_dir = install_dir.AppendASCII("xwalk")
74 .AppendASCII("application")
78 .AppendASCII("Applications")
82 scoped_refptr<ApplicationData> application(LoadApplication(
83 install_dir, ApplicationData::LOCAL_DIRECTORY, &error));
84 ASSERT_TRUE(application == NULL);
85 ASSERT_FALSE(error.empty());
86 ASSERT_STREQ("Manifest is not valid JSON."
87 " Line: 2, column: 16, Syntax error.",
91 static scoped_refptr<ApplicationData> LoadApplicationManifest(
92 base::DictionaryValue* manifest,
93 const base::FilePath& manifest_dir,
94 ApplicationData::SourceType location,
97 scoped_refptr<ApplicationData> application = ApplicationData::Create(
98 manifest_dir, location, *manifest, std::string(), error);
102 static scoped_refptr<ApplicationData> LoadApplicationManifest(
103 const std::string& manifest_value,
104 const base::FilePath& manifest_dir,
105 ApplicationData::SourceType location,
107 std::string* error) {
108 JSONStringValueSerializer serializer(manifest_value);
109 scoped_ptr<base::Value> result(serializer.Deserialize(NULL, error));
112 CHECK_EQ(base::Value::TYPE_DICTIONARY, result->GetType());
113 return LoadApplicationManifest(
114 static_cast<base::DictionaryValue*>(result.get()),
121 TEST_F(ApplicationFileUtilTest, ValidateThemeUTF8) {
122 base::ScopedTempDir temp;
123 ASSERT_TRUE(temp.CreateUniqueTempDir());
125 // "aeo" with accents. Use http://0xcc.net/jsescape/ to decode them.
126 std::string non_ascii_file = "\xC3\xA0\xC3\xA8\xC3\xB2.png";
127 base::FilePath non_ascii_path =
128 temp.path().Append(base::FilePath::FromUTF8Unsafe(non_ascii_file));
129 base::WriteFile(non_ascii_path, "", 0);
131 std::string kManifest =
133 "{ \"name\": \"Test\", \"version\": \"1.0\", "
134 " \"theme\": { \"images\": { \"theme_frame\": \"%s\" } }"
135 "}", non_ascii_file.c_str());
137 scoped_refptr<ApplicationData> application = LoadApplicationManifest(
138 kManifest, temp.path(), ApplicationData::LOCAL_DIRECTORY, 0, &error);
139 ASSERT_TRUE(application.get()) << error;
142 } // namespace application