123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- // Copyright 2019 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 "extensions/common/manifest.h"
- #include <memory>
- #include <utility>
- #include "base/json/json_reader.h"
- #include "components/crx_file/id_util.h"
- #include "extensions/common/install_warning.h"
- #include "extensions/common/manifest_constants.h"
- #include "extensions/common/value_builder.h"
- #include "testing/gtest/include/gtest/gtest.h"
- using ManifestTest = testing::Test;
- using extensions::mojom::ManifestLocation;
- namespace extensions {
- TEST(ManifestTest, ValidateWarnsOnDiffFingerprintKeyUnpacked) {
- std::string error;
- std::vector<InstallWarning> warnings;
- Manifest(ManifestLocation::kUnpacked,
- DictionaryBuilder()
- .Set(manifest_keys::kDifferentialFingerprint, "")
- .Build(),
- crx_file::id_util::GenerateId("extid"))
- .ValidateManifest(&error, &warnings);
- EXPECT_EQ("", error);
- EXPECT_EQ(1uL, warnings.size());
- EXPECT_EQ(manifest_errors::kHasDifferentialFingerprint, warnings[0].message);
- }
- TEST(ManifestTest, ValidateWarnsOnDiffFingerprintKeyCommandLine) {
- std::string error;
- std::vector<InstallWarning> warnings;
- Manifest(ManifestLocation::kCommandLine,
- DictionaryBuilder()
- .Set(manifest_keys::kDifferentialFingerprint, "")
- .Build(),
- crx_file::id_util::GenerateId("extid"))
- .ValidateManifest(&error, &warnings);
- EXPECT_EQ("", error);
- EXPECT_EQ(1uL, warnings.size());
- EXPECT_EQ(manifest_errors::kHasDifferentialFingerprint, warnings[0].message);
- }
- TEST(ManifestTest, ValidateSilentOnDiffFingerprintKeyInternal) {
- std::string error;
- std::vector<InstallWarning> warnings;
- Manifest(ManifestLocation::kInternal,
- DictionaryBuilder()
- .Set(manifest_keys::kDifferentialFingerprint, "")
- .Build(),
- crx_file::id_util::GenerateId("extid"))
- .ValidateManifest(&error, &warnings);
- EXPECT_EQ("", error);
- EXPECT_EQ(0uL, warnings.size());
- }
- TEST(ManifestTest, ValidateSilentOnNoDiffFingerprintKeyUnpacked) {
- std::string error;
- std::vector<InstallWarning> warnings;
- Manifest(ManifestLocation::kUnpacked, DictionaryBuilder().Build(),
- crx_file::id_util::GenerateId("extid"))
- .ValidateManifest(&error, &warnings);
- EXPECT_EQ("", error);
- EXPECT_EQ(0uL, warnings.size());
- }
- TEST(ManifestTest, ValidateSilentOnNoDiffFingerprintKeyInternal) {
- std::string error;
- std::vector<InstallWarning> warnings;
- Manifest(ManifestLocation::kInternal, DictionaryBuilder().Build(),
- crx_file::id_util::GenerateId("extid"))
- .ValidateManifest(&error, &warnings);
- EXPECT_EQ("", error);
- EXPECT_EQ(0uL, warnings.size());
- }
- // Tests `Manifest::available_values()` and whether it correctly filters keys
- // not available to the manifest.
- TEST(ManifestTest, AvailableValues) {
- struct {
- const char* input_manifest;
- const char* expected_available_manifest;
- } test_cases[] =
- // clang-format off
- {
- // In manifest version 2, "host_permissions" key is not available.
- // Additionally "background.service_worker" key is not available to hosted
- // apps.
- {R"(
- {
- "name": "Test Extension",
- "app": {
- "urls": ""
- },
- "background": {
- "service_worker": "service_worker.js"
- },
- "manifest_version": 2,
- "host_permissions": [],
- "nacl_modules": ""
- }
- )",
- R"(
- {
- "name": "Test Extension",
- "app": {
- "urls": ""
- },
- "background": {},
- "manifest_version": 2,
- "nacl_modules": ""
- }
- )"},
- // In manifest version 3, "nacl_modules" key is not available.
- {R"(
- {
- "name": "Test Extension",
- "manifest_version": 3,
- "host_permissions": [],
- "nacl_modules": ""
- }
- )",
- R"(
- {
- "name": "Test Extension",
- "manifest_version": 3,
- "host_permissions": []
- }
- )"}
- };
- // clang-format on
- for (const auto& test_case : test_cases) {
- absl::optional<base::Value> manifest_value =
- base::JSONReader::Read(test_case.input_manifest);
- ASSERT_TRUE(manifest_value) << test_case.input_manifest;
- ASSERT_TRUE(manifest_value->is_dict()) << test_case.input_manifest;
- Manifest manifest(ManifestLocation::kInternal,
- base::DictionaryValue::From(base::Value::ToUniquePtrValue(
- std::move(*manifest_value))),
- crx_file::id_util::GenerateId("extid"));
- absl::optional<base::Value> expected_value =
- base::JSONReader::Read(test_case.expected_available_manifest);
- ASSERT_TRUE(expected_value) << test_case.expected_available_manifest;
- EXPECT_EQ(*expected_value,
- static_cast<const base::Value&>(manifest.available_values()));
- }
- }
- } // namespace extensions
|