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/files/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, std::string(), ApplicationData::LOCAL_DIRECTORY,
45 Manifest::TYPE_MANIFEST, &error));
46 ASSERT_TRUE(application.get() != NULL);
47 EXPECT_EQ("The first application that I made.", application->Description());
50 TEST_F(ApplicationFileUtilTest,
51 LoadApplicationGivesHelpfullErrorOnMissingManifest) {
52 base::FilePath install_dir;
53 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &install_dir));
54 install_dir = install_dir.AppendASCII("xwalk")
55 .AppendASCII("application")
59 .AppendASCII("Applications")
63 scoped_refptr<ApplicationData> application(LoadApplication(
64 install_dir, std::string(), ApplicationData::LOCAL_DIRECTORY,
65 Manifest::TYPE_WIDGET, &error));
66 ASSERT_TRUE(application.get() == NULL);
67 ASSERT_FALSE(error.empty());
68 ASSERT_STREQ("Manifest file is missing or unreadable.", error.c_str());
71 TEST_F(ApplicationFileUtilTest,
72 LoadApplicationGivesHelpfullErrorOnBadManifest) {
73 base::FilePath install_dir;
74 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &install_dir));
75 install_dir = install_dir.AppendASCII("xwalk")
76 .AppendASCII("application")
80 .AppendASCII("Applications")
84 scoped_refptr<ApplicationData> application(LoadApplication(
85 install_dir, std::string(), ApplicationData::LOCAL_DIRECTORY,
86 Manifest::TYPE_MANIFEST, &error));
87 ASSERT_TRUE(application.get() == NULL);
88 ASSERT_FALSE(error.empty());
89 ASSERT_STREQ("Manifest is not valid JSON."
90 " Line: 2, column: 16, Syntax error.",
94 static scoped_refptr<ApplicationData> LoadApplicationManifest(
95 base::DictionaryValue* values,
96 const base::FilePath& manifest_dir,
97 ApplicationData::SourceType location,
100 scoped_ptr<Manifest> manifest = make_scoped_ptr(
101 new Manifest(make_scoped_ptr(values->DeepCopy())));
102 scoped_refptr<ApplicationData> application = ApplicationData::Create(
103 manifest_dir, std::string(), location, manifest.Pass(), error);
107 static scoped_refptr<ApplicationData> LoadApplicationManifest(
108 const std::string& manifest_value,
109 const base::FilePath& manifest_dir,
110 ApplicationData::SourceType location,
112 std::string* error) {
113 JSONStringValueSerializer serializer(manifest_value);
114 scoped_ptr<base::Value> result(serializer.Deserialize(NULL, error));
117 CHECK_EQ(base::Value::TYPE_DICTIONARY, result->GetType());
118 return LoadApplicationManifest(
119 static_cast<base::DictionaryValue*>(result.get()),
126 TEST_F(ApplicationFileUtilTest, ValidateThemeUTF8) {
127 base::ScopedTempDir temp;
128 ASSERT_TRUE(temp.CreateUniqueTempDir());
130 // "aeo" with accents. Use http://0xcc.net/jsescape/ to decode them.
131 std::string non_ascii_file = "\xC3\xA0\xC3\xA8\xC3\xB2.png";
132 base::FilePath non_ascii_path =
133 temp.path().Append(base::FilePath::FromUTF8Unsafe(non_ascii_file));
134 base::WriteFile(non_ascii_path, "", 0);
136 std::string kManifest =
138 "{ \"name\": \"Test\", \"version\": \"1.0\", "
139 " \"theme\": { \"images\": { \"theme_frame\": \"%s\" } }"
140 "}", non_ascii_file.c_str());
142 scoped_refptr<ApplicationData> application = LoadApplicationManifest(
143 kManifest, temp.path(), ApplicationData::LOCAL_DIRECTORY, 0, &error);
144 ASSERT_TRUE(application.get()) << error;
147 } // namespace application