manifest_unittest.cc 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. // Copyright 2019 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. #include "extensions/common/manifest.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "base/json/json_reader.h"
  8. #include "components/crx_file/id_util.h"
  9. #include "extensions/common/install_warning.h"
  10. #include "extensions/common/manifest_constants.h"
  11. #include "extensions/common/value_builder.h"
  12. #include "testing/gtest/include/gtest/gtest.h"
  13. using ManifestTest = testing::Test;
  14. using extensions::mojom::ManifestLocation;
  15. namespace extensions {
  16. TEST(ManifestTest, ValidateWarnsOnDiffFingerprintKeyUnpacked) {
  17. std::string error;
  18. std::vector<InstallWarning> warnings;
  19. Manifest(ManifestLocation::kUnpacked,
  20. DictionaryBuilder()
  21. .Set(manifest_keys::kDifferentialFingerprint, "")
  22. .Build(),
  23. crx_file::id_util::GenerateId("extid"))
  24. .ValidateManifest(&error, &warnings);
  25. EXPECT_EQ("", error);
  26. EXPECT_EQ(1uL, warnings.size());
  27. EXPECT_EQ(manifest_errors::kHasDifferentialFingerprint, warnings[0].message);
  28. }
  29. TEST(ManifestTest, ValidateWarnsOnDiffFingerprintKeyCommandLine) {
  30. std::string error;
  31. std::vector<InstallWarning> warnings;
  32. Manifest(ManifestLocation::kCommandLine,
  33. DictionaryBuilder()
  34. .Set(manifest_keys::kDifferentialFingerprint, "")
  35. .Build(),
  36. crx_file::id_util::GenerateId("extid"))
  37. .ValidateManifest(&error, &warnings);
  38. EXPECT_EQ("", error);
  39. EXPECT_EQ(1uL, warnings.size());
  40. EXPECT_EQ(manifest_errors::kHasDifferentialFingerprint, warnings[0].message);
  41. }
  42. TEST(ManifestTest, ValidateSilentOnDiffFingerprintKeyInternal) {
  43. std::string error;
  44. std::vector<InstallWarning> warnings;
  45. Manifest(ManifestLocation::kInternal,
  46. DictionaryBuilder()
  47. .Set(manifest_keys::kDifferentialFingerprint, "")
  48. .Build(),
  49. crx_file::id_util::GenerateId("extid"))
  50. .ValidateManifest(&error, &warnings);
  51. EXPECT_EQ("", error);
  52. EXPECT_EQ(0uL, warnings.size());
  53. }
  54. TEST(ManifestTest, ValidateSilentOnNoDiffFingerprintKeyUnpacked) {
  55. std::string error;
  56. std::vector<InstallWarning> warnings;
  57. Manifest(ManifestLocation::kUnpacked, DictionaryBuilder().Build(),
  58. crx_file::id_util::GenerateId("extid"))
  59. .ValidateManifest(&error, &warnings);
  60. EXPECT_EQ("", error);
  61. EXPECT_EQ(0uL, warnings.size());
  62. }
  63. TEST(ManifestTest, ValidateSilentOnNoDiffFingerprintKeyInternal) {
  64. std::string error;
  65. std::vector<InstallWarning> warnings;
  66. Manifest(ManifestLocation::kInternal, DictionaryBuilder().Build(),
  67. crx_file::id_util::GenerateId("extid"))
  68. .ValidateManifest(&error, &warnings);
  69. EXPECT_EQ("", error);
  70. EXPECT_EQ(0uL, warnings.size());
  71. }
  72. // Tests `Manifest::available_values()` and whether it correctly filters keys
  73. // not available to the manifest.
  74. TEST(ManifestTest, AvailableValues) {
  75. struct {
  76. const char* input_manifest;
  77. const char* expected_available_manifest;
  78. } test_cases[] =
  79. // clang-format off
  80. {
  81. // In manifest version 2, "host_permissions" key is not available.
  82. // Additionally "background.service_worker" key is not available to hosted
  83. // apps.
  84. {R"(
  85. {
  86. "name": "Test Extension",
  87. "app": {
  88. "urls": ""
  89. },
  90. "background": {
  91. "service_worker": "service_worker.js"
  92. },
  93. "manifest_version": 2,
  94. "host_permissions": [],
  95. "nacl_modules": ""
  96. }
  97. )",
  98. R"(
  99. {
  100. "name": "Test Extension",
  101. "app": {
  102. "urls": ""
  103. },
  104. "background": {},
  105. "manifest_version": 2,
  106. "nacl_modules": ""
  107. }
  108. )"},
  109. // In manifest version 3, "nacl_modules" key is not available.
  110. {R"(
  111. {
  112. "name": "Test Extension",
  113. "manifest_version": 3,
  114. "host_permissions": [],
  115. "nacl_modules": ""
  116. }
  117. )",
  118. R"(
  119. {
  120. "name": "Test Extension",
  121. "manifest_version": 3,
  122. "host_permissions": []
  123. }
  124. )"}
  125. };
  126. // clang-format on
  127. for (const auto& test_case : test_cases) {
  128. absl::optional<base::Value> manifest_value =
  129. base::JSONReader::Read(test_case.input_manifest);
  130. ASSERT_TRUE(manifest_value) << test_case.input_manifest;
  131. ASSERT_TRUE(manifest_value->is_dict()) << test_case.input_manifest;
  132. Manifest manifest(ManifestLocation::kInternal,
  133. base::DictionaryValue::From(base::Value::ToUniquePtrValue(
  134. std::move(*manifest_value))),
  135. crx_file::id_util::GenerateId("extid"));
  136. absl::optional<base::Value> expected_value =
  137. base::JSONReader::Read(test_case.expected_available_manifest);
  138. ASSERT_TRUE(expected_value) << test_case.expected_available_manifest;
  139. EXPECT_EQ(*expected_value,
  140. static_cast<const base::Value&>(manifest.available_values()));
  141. }
  142. }
  143. } // namespace extensions