Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / xwalk / application / common / application_file_util_unittest.cc
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.
4
5 #include "xwalk/application/common/application_file_util.h"
6
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"
19
20 using xwalk::application::ApplicationData;
21 using xwalk::application::Manifest;
22
23 namespace keys = xwalk::application_manifest_keys;
24
25 namespace xwalk {
26 namespace application {
27
28 class ApplicationFileUtilTest : public testing::Test {
29 };
30
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")
36       .AppendASCII("test")
37       .AppendASCII("data")
38       .AppendASCII("good")
39       .AppendASCII("Applications")
40       .AppendASCII("aaa");
41
42   std::string error;
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());
48 }
49
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")
56       .AppendASCII("test")
57       .AppendASCII("data")
58       .AppendASCII("bad")
59       .AppendASCII("Applications")
60       .AppendASCII("aaa");
61
62   std::string error;
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());
69 }
70
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")
77       .AppendASCII("test")
78       .AppendASCII("data")
79       .AppendASCII("bad")
80       .AppendASCII("Applications")
81       .AppendASCII("bbb");
82
83   std::string error;
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.",
91                error.c_str());
92 }
93
94 static scoped_refptr<ApplicationData> LoadApplicationManifest(
95     base::DictionaryValue* values,
96     const base::FilePath& manifest_dir,
97     ApplicationData::SourceType location,
98     int extra_flags,
99     std::string* error) {
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);
104   return application;
105 }
106
107 static scoped_refptr<ApplicationData> LoadApplicationManifest(
108     const std::string& manifest_value,
109     const base::FilePath& manifest_dir,
110     ApplicationData::SourceType location,
111     int extra_flags,
112     std::string* error) {
113   JSONStringValueSerializer serializer(manifest_value);
114   scoped_ptr<base::Value> result(serializer.Deserialize(NULL, error));
115   if (!result.get())
116     return NULL;
117   CHECK_EQ(base::Value::TYPE_DICTIONARY, result->GetType());
118   return LoadApplicationManifest(
119       static_cast<base::DictionaryValue*>(result.get()),
120       manifest_dir,
121       location,
122       extra_flags,
123       error);
124 }
125
126 TEST_F(ApplicationFileUtilTest, ValidateThemeUTF8) {
127   base::ScopedTempDir temp;
128   ASSERT_TRUE(temp.CreateUniqueTempDir());
129
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);
135
136   std::string kManifest =
137       base::StringPrintf(
138           "{ \"name\": \"Test\", \"version\": \"1.0\", "
139           "  \"theme\": { \"images\": { \"theme_frame\": \"%s\" } }"
140           "}", non_ascii_file.c_str());
141   std::string error;
142   scoped_refptr<ApplicationData> application = LoadApplicationManifest(
143       kManifest, temp.path(), ApplicationData::LOCAL_DIRECTORY, 0, &error);
144   ASSERT_TRUE(application.get()) << error;
145 }
146
147 }  // namespace application
148 }  // namespace xwalk