Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / components / component_updater / test / update_response_unittest.cc
1 // Copyright 2013 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 "base/memory/scoped_vector.h"
6 #include "components/component_updater/update_response.h"
7 #include "libxml/globals.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9
10 namespace component_updater {
11
12 const char* kValidXml =
13     "<?xml version='1.0' encoding='UTF-8'?>"
14     "<response protocol='3.0'>"
15     " <app appid='12345'>"
16     "   <updatecheck status='ok'>"
17     "     <urls>"
18     "       <url codebase='http://example.com/'/>"
19     "       <url codebasediff='http://diff.example.com/'/>"
20     "     </urls>"
21     "     <manifest version='1.2.3.4' prodversionmin='2.0.143.0'>"
22     "       <packages>"
23     "         <package name='extension_1_2_3_4.crx'/>"
24     "       </packages>"
25     "     </manifest>"
26     "   </updatecheck>"
27     " </app>"
28     "</response>";
29
30 const char* valid_xml_with_hash =
31     "<?xml version='1.0' encoding='UTF-8'?>"
32     "<response protocol='3.0'>"
33     " <app appid='12345'>"
34     "   <updatecheck status='ok'>"
35     "     <urls>"
36     "       <url codebase='http://example.com/'/>"
37     "     </urls>"
38     "     <manifest version='1.2.3.4' prodversionmin='2.0.143.0'>"
39     "       <packages>"
40     "         <package name='extension_1_2_3_4.crx' hash_sha256='1234'/>"
41     "       </packages>"
42     "     </manifest>"
43     "   </updatecheck>"
44     " </app>"
45     "</response>";
46
47 const char* valid_xml_with_invalid_sizes =
48     "<?xml version='1.0' encoding='UTF-8'?>"
49     "<response protocol='3.0'>"
50     " <app appid='12345'>"
51     "   <updatecheck status='ok'>"
52     "     <urls>"
53     "       <url codebase='http://example.com/'/>"
54     "     </urls>"
55     "     <manifest version='1.2.3.4' prodversionmin='2.0.143.0'>"
56     "       <packages>"
57     "         <package name='1' size='1234'/>"
58     "         <package name='2' size='-1234'/>"
59     "         <package name='3' />"
60     "         <package name='4' size='-a'/>"
61     "         <package name='5' size='-123467890123456789'/>"
62     "         <package name='6' size='123467890123456789'/>"
63     "       </packages>"
64     "     </manifest>"
65     "   </updatecheck>"
66     " </app>"
67     "</response>";
68
69 const char* kInvalidValidXmlMissingCodebase =
70     "<?xml version='1.0' encoding='UTF-8'?>"
71     "<response protocol='3.0'>"
72     " <app appid='12345'>"
73     "   <updatecheck status='ok'>"
74     "     <urls>"
75     "       <url codebasediff='http://diff.example.com/'/>"
76     "     </urls>"
77     "     <manifest version='1.2.3.4' prodversionmin='2.0.143.0'>"
78     "       <packages>"
79     "         <package namediff='extension_1_2_3_4.crx'/>"
80     "       </packages>"
81     "     </manifest>"
82     "   </updatecheck>"
83     " </app>"
84     "</response>";
85
86 const char* kMissingAppId =
87     "<?xml version='1.0'?>"
88     "<response protocol='3.0'>"
89     " <app>"
90     "  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
91     "               version='1.2.3.4' />"
92     " </app>"
93     "</response>";
94
95 const char* kInvalidCodebase =
96     "<?xml version='1.0'?>"
97     "<response protocol='3.0'>"
98     " <app appid='12345' status='ok'>"
99     "  <updatecheck codebase='example.com/extension_1.2.3.4.crx'"
100     "               version='1.2.3.4' />"
101     " </app>"
102     "</response>";
103
104 const char* kMissingVersion =
105     "<?xml version='1.0'?>"
106     "<response protocol='3.0'>"
107     " <app appid='12345' status='ok'>"
108     "  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx' />"
109     " </app>"
110     "</response>";
111
112 const char* kInvalidVersion =
113     "<?xml version='1.0'?>"
114     "<response protocol='3.0'>"
115     " <app appid='12345' status='ok'>"
116     "  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx' "
117     "               version='1.2.3.a'/>"
118     " </app>"
119     "</response>";
120
121 // The v3 version of the protocol is not using namespaces. However, the parser
122 // must be able to parse responses that include namespaces.
123 const char* kUsesNamespacePrefix =
124     "<?xml version='1.0' encoding='UTF-8'?>"
125     "<g:response xmlns:g='http://www.google.com/update2/response' protocol='3.0'>"
126     " <g:app appid='12345'>"
127     "   <g:updatecheck status='ok'>"
128     "     <g:urls>"
129     "       <g:url codebase='http://example.com/'/>"
130     "     </g:urls>"
131     "     <g:manifest version='1.2.3.4' prodversionmin='2.0.143.0'>"
132     "       <g:packages>"
133     "         <g:package name='extension_1_2_3_4.crx'/>"
134     "       </g:packages>"
135     "     </g:manifest>"
136     "   </g:updatecheck>"
137     " </g:app>"
138     "</g:response>";
139
140 // Includes unrelated <app> tags from other xml namespaces - this should
141 // not cause problems.
142 const char* kSimilarTagnames =
143     "<?xml version='1.0' encoding='UTF-8'?>"
144     "<response xmlns:a='http://a' protocol='3.0'>"
145     " <a:app appid='12345'>"
146     "   <updatecheck status='ok'>"
147     "     <urls>"
148     "       <url codebase='http://example.com/'/>"
149     "     </urls>"
150     "     <manifest version='1.2.3.4' prodversionmin='2.0.143.0'>"
151     "       <packages>"
152     "         <package name='extension_1_2_3_4.crx'/>"
153     "       </packages>"
154     "     </manifest>"
155     "   </updatecheck>"
156     " </a:app>"
157     " <b:app appid='xyz' xmlns:b='http://b'>"
158     "   <updatecheck status='noupdate'/>"
159     " </b:app>"
160     "</response>";
161
162 // Includes a <daystart> tag.
163 const char* kWithDaystart =
164     "<?xml version='1.0' encoding='UTF-8'?>"
165     "<response protocol='3.0'>"
166     " <daystart elapsed_seconds='456' />"
167     " <app appid='12345'>"
168     "   <updatecheck status='ok'>"
169     "     <urls>"
170     "       <url codebase='http://example.com/'/>"
171     "     </urls>"
172     "     <manifest version='1.2.3.4' prodversionmin='2.0.143.0'>"
173     "       <packages>"
174     "         <package name='extension_1_2_3_4.crx'/>"
175     "       </packages>"
176     "     </manifest>"
177     "   </updatecheck>"
178     " </app>"
179     "</response>";
180
181 // Indicates no updates available - this should not be a parse error.
182 const char* kNoUpdate =
183     "<?xml version='1.0' encoding='UTF-8'?>"
184     "<response protocol='3.0'>"
185     " <app appid='12345'>"
186     "  <updatecheck status='noupdate' />"
187     " </app>"
188     "</response>";
189
190 // Includes two <app> tags, one with an error.
191 const char* kTwoAppsOneError =
192     "<?xml version='1.0' encoding='UTF-8'?>"
193     "<response protocol='3.0'>"
194     " <app appid='aaaaaaaa' status='error-unknownApplication'>"
195     "  <updatecheck status='error-unknownapplication'/>"
196     " </app>"
197     " <app appid='bbbbbbbb'>"
198     "   <updatecheck status='ok'>"
199     "     <urls>"
200     "       <url codebase='http://example.com/'/>"
201     "     </urls>"
202     "     <manifest version='1.2.3.4' prodversionmin='2.0.143.0'>"
203     "       <packages>"
204     "         <package name='extension_1_2_3_4.crx'/>"
205     "       </packages>"
206     "     </manifest>"
207     "   </updatecheck>"
208     " </app>"
209     "</response>";
210
211 TEST(ComponentUpdaterUpdateResponseTest, TestParser) {
212   UpdateResponse parser;
213
214   // Test parsing of a number of invalid xml cases
215   EXPECT_FALSE(parser.Parse(std::string()));
216   EXPECT_FALSE(parser.errors().empty());
217
218   EXPECT_TRUE(parser.Parse(kMissingAppId));
219   EXPECT_TRUE(parser.results().list.empty());
220   EXPECT_FALSE(parser.errors().empty());
221
222   EXPECT_TRUE(parser.Parse(kInvalidCodebase));
223   EXPECT_TRUE(parser.results().list.empty());
224   EXPECT_FALSE(parser.errors().empty());
225
226   EXPECT_TRUE(parser.Parse(kMissingVersion));
227   EXPECT_TRUE(parser.results().list.empty());
228   EXPECT_FALSE(parser.errors().empty());
229
230   EXPECT_TRUE(parser.Parse(kInvalidVersion));
231   EXPECT_TRUE(parser.results().list.empty());
232   EXPECT_FALSE(parser.errors().empty());
233
234   EXPECT_TRUE(parser.Parse(kInvalidValidXmlMissingCodebase));
235   EXPECT_TRUE(parser.results().list.empty());
236   EXPECT_FALSE(parser.errors().empty());
237
238   // Parse some valid XML, and check that all params came out as expected
239   EXPECT_TRUE(parser.Parse(kValidXml));
240   EXPECT_TRUE(parser.errors().empty());
241   EXPECT_EQ(1u, parser.results().list.size());
242   const UpdateResponse::Result* firstResult = &parser.results().list[0];
243   EXPECT_EQ(1u, firstResult->crx_urls.size());
244   EXPECT_EQ(GURL("http://example.com/"), firstResult->crx_urls[0]);
245   EXPECT_EQ(GURL("http://diff.example.com/"), firstResult->crx_diffurls[0]);
246   EXPECT_EQ("1.2.3.4", firstResult->manifest.version);
247   EXPECT_EQ("2.0.143.0", firstResult->manifest.browser_min_version);
248   EXPECT_EQ(1u, firstResult->manifest.packages.size());
249   EXPECT_EQ("extension_1_2_3_4.crx", firstResult->manifest.packages[0].name);
250
251   // Parse some xml that uses namespace prefixes.
252   EXPECT_TRUE(parser.Parse(kUsesNamespacePrefix));
253   EXPECT_TRUE(parser.errors().empty());
254   EXPECT_TRUE(parser.Parse(kSimilarTagnames));
255   EXPECT_TRUE(parser.errors().empty());
256   xmlCleanupGlobals();
257
258   // Parse xml with hash value
259   EXPECT_TRUE(parser.Parse(valid_xml_with_hash));
260   EXPECT_TRUE(parser.errors().empty());
261   EXPECT_FALSE(parser.results().list.empty());
262   firstResult = &parser.results().list[0];
263   EXPECT_FALSE(firstResult->manifest.packages.empty());
264   EXPECT_EQ("1234", firstResult->manifest.packages[0].hash_sha256);
265
266   // Parse xml with package size value
267   EXPECT_TRUE(parser.Parse(valid_xml_with_invalid_sizes));
268   EXPECT_TRUE(parser.errors().empty());
269   EXPECT_FALSE(parser.results().list.empty());
270   firstResult = &parser.results().list[0];
271   EXPECT_FALSE(firstResult->manifest.packages.empty());
272   EXPECT_EQ(1234, firstResult->manifest.packages[0].size);
273   EXPECT_EQ(-1234, firstResult->manifest.packages[1].size);
274   EXPECT_EQ(0, firstResult->manifest.packages[2].size);
275   EXPECT_EQ(0, firstResult->manifest.packages[3].size);
276   EXPECT_EQ(0, firstResult->manifest.packages[4].size);
277   EXPECT_EQ(0, firstResult->manifest.packages[5].size);
278
279   // Parse xml with a <daystart> element.
280   EXPECT_TRUE(parser.Parse(kWithDaystart));
281   EXPECT_TRUE(parser.errors().empty());
282   EXPECT_FALSE(parser.results().list.empty());
283   EXPECT_EQ(parser.results().daystart_elapsed_seconds, 456);
284
285   // Parse a no-update response.
286   EXPECT_TRUE(parser.Parse(kNoUpdate));
287   EXPECT_TRUE(parser.errors().empty());
288   EXPECT_FALSE(parser.results().list.empty());
289   firstResult = &parser.results().list[0];
290   EXPECT_EQ(firstResult->extension_id, "12345");
291   EXPECT_EQ(firstResult->manifest.version, "");
292
293   // Parse xml with one error and one success <app> tag.
294   EXPECT_TRUE(parser.Parse(kTwoAppsOneError));
295   EXPECT_FALSE(parser.errors().empty());
296   EXPECT_EQ(1u, parser.results().list.size());
297   firstResult = &parser.results().list[0];
298   EXPECT_EQ(firstResult->extension_id, "bbbbbbbb");
299 }
300
301 }  // namespace component_updater