diff options
Diffstat (limited to 'chrome/browser/component_updater/test/update_response_unittest.cc')
-rw-r--r-- | chrome/browser/component_updater/test/update_response_unittest.cc | 281 |
1 files changed, 281 insertions, 0 deletions
diff --git a/chrome/browser/component_updater/test/update_response_unittest.cc b/chrome/browser/component_updater/test/update_response_unittest.cc new file mode 100644 index 0000000..248c028 --- /dev/null +++ b/chrome/browser/component_updater/test/update_response_unittest.cc @@ -0,0 +1,281 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/memory/scoped_vector.h" +#include "chrome/browser/component_updater/update_response.h" +#include "libxml/globals.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace component_updater { + +const char* kValidXml = +"<?xml version='1.0' encoding='UTF-8'?>" +"<response protocol='3.0'>" +" <app appid='12345'>" +" <updatecheck status='ok'>" +" <urls>" +" <url codebase='http://example.com/'/>" +" <url codebasediff='http://diff.example.com/'/>" +" </urls>" +" <manifest version='1.2.3.4' prodversionmin='2.0.143.0'>" +" <packages>" +" <package name='extension_1_2_3_4.crx'/>" +" </packages>" +" </manifest>" +" </updatecheck>" +" </app>" +"</response>"; + +const char* valid_xml_with_hash = +"<?xml version='1.0' encoding='UTF-8'?>" +"<response protocol='3.0'>" +" <app appid='12345'>" +" <updatecheck status='ok'>" +" <urls>" +" <url codebase='http://example.com/'/>" +" </urls>" +" <manifest version='1.2.3.4' prodversionmin='2.0.143.0'>" +" <packages>" +" <package name='extension_1_2_3_4.crx' hash_sha256='1234'/>" +" </packages>" +" </manifest>" +" </updatecheck>" +" </app>" +"</response>"; + +const char* valid_xml_with_invalid_sizes = +"<?xml version='1.0' encoding='UTF-8'?>" +"<response protocol='3.0'>" +" <app appid='12345'>" +" <updatecheck status='ok'>" +" <urls>" +" <url codebase='http://example.com/'/>" +" </urls>" +" <manifest version='1.2.3.4' prodversionmin='2.0.143.0'>" +" <packages>" +" <package name='1' size='1234'/>" +" <package name='2' size='-1234'/>" +" <package name='3' />" +" <package name='4' size='-a'/>" +" <package name='5' size='-123467890123456789'/>" +" <package name='6' size='123467890123456789'/>" +" </packages>" +" </manifest>" +" </updatecheck>" +" </app>" +"</response>"; + +const char* kMissingAppId = +"<?xml version='1.0'?>" +"<response protocol='3.0'>" +" <app>" +" <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'" +" version='1.2.3.4' />" +" </app>" +"</response>"; + +const char* kInvalidCodebase = +"<?xml version='1.0'?>" +"<response protocol='3.0'>" +" <app appid='12345' status='ok'>" +" <updatecheck codebase='example.com/extension_1.2.3.4.crx'" +" version='1.2.3.4' />" +" </app>" +"</response>"; + +const char* kMissingVersion = +"<?xml version='1.0'?>" +"<response protocol='3.0'>" +" <app appid='12345' status='ok'>" +" <updatecheck codebase='http://example.com/extension_1.2.3.4.crx' />" +" </app>" +"</response>"; + +const char* kInvalidVersion = +"<?xml version='1.0'?>" +"<response protocol='3.0'>" +" <app appid='12345' status='ok'>" +" <updatecheck codebase='http://example.com/extension_1.2.3.4.crx' " +" version='1.2.3.a'/>" +" </app>" +"</response>"; + +// The v3 version of the protocol is not using namespaces. However, the parser +// must be able to parse responses that include namespaces. +const char* kUsesNamespacePrefix = +"<?xml version='1.0' encoding='UTF-8'?>" +"<g:response xmlns='http://www.google.com/update2/response' protocol='3.0'>" +" <g:app appid='12345'>" +" <g:updatecheck status='ok'>" +" <g:urls>" +" <g:url codebase='http://example.com/'/>" +" </g:urls>" +" <g:manifest version='1.2.3.4' prodversionmin='2.0.143.0'>" +" <g:packages>" +" <g:package name='extension_1_2_3_4.crx'/>" +" </g:packages>" +" </g:manifest>" +" </g:updatecheck>" +" </g:app>" +"</g:response>"; + +// Includes unrelated <app> tags from other xml namespaces - this should +// not cause problems. +const char* kSimilarTagnames = +"<?xml version='1.0' encoding='UTF-8'?>" +"<response xmlns:a='http://a' protocol='3.0'>" +" <a:app appid='12345'>" +" <updatecheck status='ok'>" +" <urls>" +" <url codebase='http://example.com/'/>" +" </urls>" +" <manifest version='1.2.3.4' prodversionmin='2.0.143.0'>" +" <packages>" +" <package name='extension_1_2_3_4.crx'/>" +" </packages>" +" </manifest>" +" </updatecheck>" +" </a:app>" +" <b:app appid='xyz' xmlns:b='http://b'>" +" <updatecheck status='noupdate'/>" +" </b:app>" +"</response>"; + +// Includes a <daystart> tag. +const char* kWithDaystart = +"<?xml version='1.0' encoding='UTF-8'?>" +"<response protocol='3.0'>" +" <daystart elapsed_seconds='456' />" +" <app appid='12345'>" +" <updatecheck status='ok'>" +" <urls>" +" <url codebase='http://example.com/'/>" +" </urls>" +" <manifest version='1.2.3.4' prodversionmin='2.0.143.0'>" +" <packages>" +" <package name='extension_1_2_3_4.crx'/>" +" </packages>" +" </manifest>" +" </updatecheck>" +" </app>" +"</response>"; + +// Indicates no updates available - this should not be a parse error. +const char* kNoUpdate = +"<?xml version='1.0' encoding='UTF-8'?>" +"<response protocol='3.0'>" +" <app appid='12345'>" +" <updatecheck status='noupdate' />" +" </app>" +"</response>"; + +// Includes two <app> tags, one with an error. +const char* kTwoAppsOneError = +"<?xml version='1.0' encoding='UTF-8'?>" +"<response protocol='3.0'>" +" <app appid='aaaaaaaa' status='error-unknownApplication'>" +" <updatecheck status='error-unknownapplication'/>" +" </app>" +" <app appid='bbbbbbbb'>" +" <updatecheck status='ok'>" +" <urls>" +" <url codebase='http://example.com/'/>" +" </urls>" +" <manifest version='1.2.3.4' prodversionmin='2.0.143.0'>" +" <packages>" +" <package name='extension_1_2_3_4.crx'/>" +" </packages>" +" </manifest>" +" </updatecheck>" +" </app>" +"</response>"; + +TEST(ComponentUpdaterUpdateResponseTest, TestParser) { + UpdateResponse parser; + + // Test parsing of a number of invalid xml cases + EXPECT_FALSE(parser.Parse(std::string())); + EXPECT_FALSE(parser.errors().empty()); + + EXPECT_TRUE(parser.Parse(kMissingAppId)); + EXPECT_TRUE(parser.results().list.empty()); + EXPECT_FALSE(parser.errors().empty()); + + EXPECT_TRUE(parser.Parse(kInvalidCodebase)); + EXPECT_TRUE(parser.results().list.empty()); + EXPECT_FALSE(parser.errors().empty()); + + EXPECT_TRUE(parser.Parse(kMissingVersion)); + EXPECT_TRUE(parser.results().list.empty()); + EXPECT_FALSE(parser.errors().empty()); + + EXPECT_TRUE(parser.Parse(kInvalidVersion)); + EXPECT_TRUE(parser.results().list.empty()); + EXPECT_FALSE(parser.errors().empty()); + + // Parse some valid XML, and check that all params came out as expected + EXPECT_TRUE(parser.Parse(kValidXml)); + EXPECT_TRUE(parser.errors().empty()); + EXPECT_EQ(1u, parser.results().list.size()); + const UpdateResponse::Result* firstResult = &parser.results().list[0]; + EXPECT_EQ(1u, firstResult->crx_urls.size()); + EXPECT_EQ(GURL("http://example.com/"), firstResult->crx_urls[0]); + EXPECT_EQ(GURL("http://diff.example.com/"), firstResult->crx_diffurls[0]); + EXPECT_EQ("1.2.3.4", firstResult->manifest.version); + EXPECT_EQ("2.0.143.0", firstResult->manifest.browser_min_version); + EXPECT_EQ(1u, firstResult->manifest.packages.size()); + EXPECT_EQ("extension_1_2_3_4.crx", firstResult->manifest.packages[0].name); + + // Parse some xml that uses namespace prefixes. + EXPECT_TRUE(parser.Parse(kUsesNamespacePrefix)); + EXPECT_TRUE(parser.errors().empty()); + EXPECT_TRUE(parser.Parse(kSimilarTagnames)); + EXPECT_TRUE(parser.errors().empty()); + xmlCleanupGlobals(); + + // Parse xml with hash value + EXPECT_TRUE(parser.Parse(valid_xml_with_hash)); + EXPECT_TRUE(parser.errors().empty()); + EXPECT_FALSE(parser.results().list.empty()); + firstResult = &parser.results().list[0]; + EXPECT_FALSE(firstResult->manifest.packages.empty()); + EXPECT_EQ("1234", firstResult->manifest.packages[0].hash_sha256); + + // Parse xml with package size value + EXPECT_TRUE(parser.Parse(valid_xml_with_invalid_sizes)); + EXPECT_TRUE(parser.errors().empty()); + EXPECT_FALSE(parser.results().list.empty()); + firstResult = &parser.results().list[0]; + EXPECT_FALSE(firstResult->manifest.packages.empty()); + EXPECT_EQ(1234, firstResult->manifest.packages[0].size); + EXPECT_EQ(-1234, firstResult->manifest.packages[1].size); + EXPECT_EQ(0, firstResult->manifest.packages[2].size); + EXPECT_EQ(0, firstResult->manifest.packages[3].size); + EXPECT_EQ(0, firstResult->manifest.packages[4].size); + EXPECT_EQ(0, firstResult->manifest.packages[5].size); + + // Parse xml with a <daystart> element. + EXPECT_TRUE(parser.Parse(kWithDaystart)); + EXPECT_TRUE(parser.errors().empty()); + EXPECT_FALSE(parser.results().list.empty()); + EXPECT_EQ(parser.results().daystart_elapsed_seconds, 456); + + // Parse a no-update response. + EXPECT_TRUE(parser.Parse(kNoUpdate)); + EXPECT_TRUE(parser.errors().empty()); + EXPECT_FALSE(parser.results().list.empty()); + firstResult = &parser.results().list[0]; + EXPECT_EQ(firstResult->extension_id, "12345"); + EXPECT_EQ(firstResult->manifest.version, ""); + + // Parse xml with one error and one success <app> tag. + EXPECT_TRUE(parser.Parse(kTwoAppsOneError)); + EXPECT_FALSE(parser.errors().empty()); + EXPECT_EQ(1u, parser.results().list.size()); + firstResult = &parser.results().list[0]; + EXPECT_EQ(firstResult->extension_id, "bbbbbbbb"); +} + +} // namespace component_updater + |