15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/manifest_tests/extension_manifest_test.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_file_value_serializer.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_l10n_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// If filename is a relative path, LoadManifestFile will treat it relative to
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the appropriate test directory.
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::DictionaryValue* LoadManifestFile(const base::FilePath& filename_path,
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                        std::string* error) {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath extension_path;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath manifest_path;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PathService::Get(chrome::DIR_TEST_DATA, &manifest_path);
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manifest_path = manifest_path.Append(filename_path);
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extension_path = manifest_path.DirName();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(manifest_path)) <<
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Couldn't find " << manifest_path.value();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JSONFileValueSerializer serializer(manifest_path);
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* manifest =
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      static_cast<base::DictionaryValue*>(serializer.Deserialize(NULL, error));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Most unit tests don't need localization, and they'll fail if we try to
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // localize them, since their manifests don't have a default_locale key.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only localize manifests that indicate they want to be localized.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calling LocalizeExtension at this point mirrors
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension_file_util::LoadExtension.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (manifest &&
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      filename_path.value().find(FILE_PATH_LITERAL("localized")) !=
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::string::npos)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_l10n_util::LocalizeExtension(extension_path, manifest, error);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return manifest;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionManifestTest::ExtensionManifestTest()
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : enable_apps_(true),
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // UNKNOWN == trunk.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_channel_(chrome::VersionInfo::CHANNEL_UNKNOWN) {}
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class that simplifies creating methods that take either a filename
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to a manifest or the manifest itself.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionManifestTest::Manifest::Manifest(const char* name)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : name_(name), manifest_(NULL) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)ExtensionManifestTest::Manifest::Manifest(base::DictionaryValue* manifest,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const char* name)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : name_(name), manifest_(manifest) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(manifest_) << "Manifest NULL";
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionManifestTest::Manifest::Manifest(const Manifest& m) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionManifestTest::Manifest::~Manifest() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::DictionaryValue* ExtensionManifestTest::Manifest::GetManifest(
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    char const* test_data_dir, std::string* error) const {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (manifest_)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return manifest_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath filename_path;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  filename_path = filename_path.AppendASCII("extensions")
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .AppendASCII(test_data_dir)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .AppendASCII(name_);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manifest_ = LoadManifestFile(filename_path, error);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manifest_holder_.reset(manifest_);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return manifest_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)char const* ExtensionManifestTest::test_data_dir() {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return "manifest_tests";
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)scoped_ptr<base::DictionaryValue> ExtensionManifestTest::LoadManifest(
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    char const* manifest_name, std::string* error) {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath filename_path;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  filename_path = filename_path.AppendASCII("extensions")
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .AppendASCII(test_data_dir())
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .AppendASCII(manifest_name);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return make_scoped_ptr(LoadManifestFile(filename_path, error));
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension> ExtensionManifestTest::LoadExtension(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Manifest& manifest,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* error,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::Manifest::Location location,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags) {
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::DictionaryValue* value = manifest.GetManifest(test_data_dir(), error);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!value)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(chrome::DIR_TEST_DATA, &path);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  path = path.AppendASCII("extensions").AppendASCII(test_data_dir());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Extension::Create(path.DirName(), location, *value, flags, error);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension> ExtensionManifestTest::LoadAndExpectSuccess(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Manifest& manifest,
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::Manifest::Location location,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension =
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadExtension(manifest, &error, location, flags);
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(extension.get()) << manifest.name();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", error) << manifest.name();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return extension;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension> ExtensionManifestTest::LoadAndExpectSuccess(
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char const* manifest_name,
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::Manifest::Location location,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return LoadAndExpectSuccess(Manifest(manifest_name), location, flags);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension> ExtensionManifestTest::LoadAndExpectWarning(
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Manifest& manifest,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& expected_warning,
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::Manifest::Location location,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension =
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadExtension(manifest, &error, location, flags);
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(extension.get()) << manifest.name();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", error) << manifest.name();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, extension->install_warnings().size());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_warning, extension->install_warnings()[0].message);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return extension;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<Extension> ExtensionManifestTest::LoadAndExpectWarning(
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char const* manifest_name,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& expected_warning,
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::Manifest::Location location,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return LoadAndExpectWarning(
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Manifest(manifest_name), expected_warning, location, flags);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionManifestTest::VerifyExpectedError(
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Extension* extension,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& name,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& error,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& expected_error) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(extension) <<
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Expected failure loading extension '" << name <<
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "', but didn't get one.";
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(MatchPattern(error, expected_error)) << name <<
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " expected '" << expected_error << "' but got '" << error << "'";
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionManifestTest::LoadAndExpectError(
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Manifest& manifest,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& expected_error,
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::Manifest::Location location,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension(
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadExtension(manifest, &error, location, flags));
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyExpectedError(extension.get(), manifest.name(), error,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      expected_error);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionManifestTest::LoadAndExpectError(
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char const* manifest_name,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& expected_error,
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::Manifest::Location location,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return LoadAndExpectError(
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Manifest(manifest_name), expected_error, location, flags);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ExtensionManifestTest::AddPattern(extensions::URLPatternSet* extent,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const std::string& pattern) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int schemes = URLPattern::SCHEME_ALL;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extent->AddPattern(URLPattern(schemes, pattern));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionManifestTest::Testcase::Testcase(
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string manifest_filename,
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string expected_error,
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::Manifest::Location location,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int flags)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : manifest_filename_(manifest_filename),
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_error_(expected_error),
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location_(location), flags_(flags) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionManifestTest::Testcase::Testcase(std::string manifest_filename,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          std::string expected_error)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : manifest_filename_(manifest_filename),
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_error_(expected_error),
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      location_(extensions::Manifest::INTERNAL),
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags_(Extension::NO_FLAGS) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionManifestTest::Testcase::Testcase(std::string manifest_filename)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : manifest_filename_(manifest_filename),
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      location_(extensions::Manifest::INTERNAL),
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      flags_(Extension::NO_FLAGS) {}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ExtensionManifestTest::Testcase::Testcase(
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string manifest_filename,
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::Manifest::Location location,
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int flags)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : manifest_filename_(manifest_filename),
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location_(location),
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      flags_(flags) {}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionManifestTest::RunTestcases(const Testcase* testcases,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         size_t num_testcases,
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         ExpectType type) {
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < num_testcases; ++i)
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RunTestcase(testcases[i], type);
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ExtensionManifestTest::RunTestcase(const Testcase& testcase,
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                        ExpectType type) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EXPECT_TYPE_ERROR:
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LoadAndExpectError(testcase.manifest_filename_.c_str(),
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         testcase.expected_error_,
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         testcase.location_,
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         testcase.flags_);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EXPECT_TYPE_WARNING:
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LoadAndExpectWarning(testcase.manifest_filename_.c_str(),
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           testcase.expected_error_,
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           testcase.location_,
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           testcase.flags_);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EXPECT_TYPE_SUCCESS:
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      LoadAndExpectSuccess(testcase.manifest_filename_.c_str(),
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           testcase.location_,
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           testcase.flags_);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
260