163a844b97d55f30e3687f642d1dc307282e4575
[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, ApplicationData::LOCAL_DIRECTORY, &error));
45   ASSERT_TRUE(application != NULL);
46   EXPECT_EQ("The first application that I made.", application->Description());
47 }
48
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")
55       .AppendASCII("test")
56       .AppendASCII("data")
57       .AppendASCII("bad")
58       .AppendASCII("Applications")
59       .AppendASCII("aaa");
60
61   std::string error;
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());
67 }
68
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")
75       .AppendASCII("test")
76       .AppendASCII("data")
77       .AppendASCII("bad")
78       .AppendASCII("Applications")
79       .AppendASCII("bbb");
80
81   std::string error;
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.",
88                error.c_str());
89 }
90
91 static scoped_refptr<ApplicationData> LoadApplicationManifest(
92     base::DictionaryValue* manifest,
93     const base::FilePath& manifest_dir,
94     ApplicationData::SourceType location,
95     int extra_flags,
96     std::string* error) {
97   scoped_refptr<ApplicationData> application = ApplicationData::Create(
98       manifest_dir, location, *manifest, std::string(), error);
99   return application;
100 }
101
102 static scoped_refptr<ApplicationData> LoadApplicationManifest(
103     const std::string& manifest_value,
104     const base::FilePath& manifest_dir,
105     ApplicationData::SourceType location,
106     int extra_flags,
107     std::string* error) {
108   JSONStringValueSerializer serializer(manifest_value);
109   scoped_ptr<base::Value> result(serializer.Deserialize(NULL, error));
110   if (!result.get())
111     return NULL;
112   CHECK_EQ(base::Value::TYPE_DICTIONARY, result->GetType());
113   return LoadApplicationManifest(
114       static_cast<base::DictionaryValue*>(result.get()),
115       manifest_dir,
116       location,
117       extra_flags,
118       error);
119 }
120
121 TEST_F(ApplicationFileUtilTest, ValidateThemeUTF8) {
122   base::ScopedTempDir temp;
123   ASSERT_TRUE(temp.CreateUniqueTempDir());
124
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);
130
131   std::string kManifest =
132       base::StringPrintf(
133           "{ \"name\": \"Test\", \"version\": \"1.0\", "
134           "  \"theme\": { \"images\": { \"theme_frame\": \"%s\" } }"
135           "}", non_ascii_file.c_str());
136   std::string error;
137   scoped_refptr<ApplicationData> application = LoadApplicationManifest(
138       kManifest, temp.path(), ApplicationData::LOCAL_DIRECTORY, 0, &error);
139   ASSERT_TRUE(application.get()) << error;
140 }
141
142 }  // namespace application
143 }  // namespace xwalk