safe_browsing_api_handler_unittest.cc 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. // Copyright 2015 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 "components/safe_browsing/android/safe_browsing_api_handler_util.h"
  5. #include <string>
  6. #include "base/strings/stringprintf.h"
  7. #include "components/safe_browsing/core/browser/db/metadata.pb.h"
  8. #include "components/safe_browsing/core/browser/db/util.h"
  9. #include "components/safe_browsing/core/browser/db/v4_test_util.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. namespace safe_browsing {
  12. class SafeBrowsingApiHandlerUtilTest : public ::testing::Test {
  13. protected:
  14. SBThreatType threat_;
  15. ThreatMetadata meta_;
  16. const ThreatMetadata empty_meta_;
  17. UmaRemoteCallResult ResetAndParseJson(const std::string& json) {
  18. threat_ = SB_THREAT_TYPE_EXTENSION; // Should never be seen
  19. meta_ = ThreatMetadata();
  20. return ParseJsonFromGMSCore(json, &threat_, &meta_);
  21. }
  22. };
  23. TEST_F(SafeBrowsingApiHandlerUtilTest, BadJson) {
  24. EXPECT_EQ(UMA_STATUS_JSON_EMPTY, ResetAndParseJson(""));
  25. EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
  26. EXPECT_EQ(empty_meta_, meta_);
  27. EXPECT_EQ(UMA_STATUS_JSON_FAILED_TO_PARSE, ResetAndParseJson("{"));
  28. EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
  29. EXPECT_EQ(empty_meta_, meta_);
  30. EXPECT_EQ(UMA_STATUS_JSON_FAILED_TO_PARSE, ResetAndParseJson("[]"));
  31. EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
  32. EXPECT_EQ(empty_meta_, meta_);
  33. EXPECT_EQ(UMA_STATUS_JSON_FAILED_TO_PARSE,
  34. ResetAndParseJson("{\"matches\":\"foo\"}"));
  35. EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
  36. EXPECT_EQ(empty_meta_, meta_);
  37. EXPECT_EQ(UMA_STATUS_JSON_UNKNOWN_THREAT,
  38. ResetAndParseJson("{\"matches\":[{}]}"));
  39. EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
  40. EXPECT_EQ(empty_meta_, meta_);
  41. EXPECT_EQ(UMA_STATUS_JSON_UNKNOWN_THREAT,
  42. ResetAndParseJson("{\"matches\":[{\"threat_type\":\"junk\"}]}"));
  43. EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
  44. EXPECT_EQ(empty_meta_, meta_);
  45. EXPECT_EQ(UMA_STATUS_JSON_UNKNOWN_THREAT,
  46. ResetAndParseJson("{\"matches\":[{\"threat_type\":\"999\"}]}"));
  47. EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
  48. EXPECT_EQ(empty_meta_, meta_);
  49. }
  50. TEST_F(SafeBrowsingApiHandlerUtilTest, BasicThreats) {
  51. EXPECT_EQ(UMA_STATUS_MATCH,
  52. ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\"}]}"));
  53. EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_);
  54. EXPECT_EQ(empty_meta_, meta_);
  55. EXPECT_EQ(UMA_STATUS_MATCH,
  56. ResetAndParseJson("{\"matches\":[{\"threat_type\":\"5\"}]}"));
  57. EXPECT_EQ(SB_THREAT_TYPE_URL_PHISHING, threat_);
  58. EXPECT_EQ(empty_meta_, meta_);
  59. }
  60. TEST_F(SafeBrowsingApiHandlerUtilTest, MultipleThreats) {
  61. EXPECT_EQ(
  62. UMA_STATUS_MATCH,
  63. ResetAndParseJson(
  64. "{\"matches\":[{\"threat_type\":\"4\"}, {\"threat_type\":\"5\"}]}"));
  65. EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_);
  66. EXPECT_EQ(empty_meta_, meta_);
  67. }
  68. TEST_F(SafeBrowsingApiHandlerUtilTest, PopulationId) {
  69. ThreatMetadata expected;
  70. EXPECT_EQ(UMA_STATUS_MATCH,
  71. ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\", "
  72. "\"UserPopulation\":\"foobarbazz\"}]}"));
  73. EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_);
  74. expected.population_id = "foobarbazz";
  75. EXPECT_EQ(expected, meta_);
  76. // Test the ThreatMetadata comparator for this field.
  77. EXPECT_NE(empty_meta_, meta_);
  78. }
  79. TEST_F(SafeBrowsingApiHandlerUtilTest, SubresourceFilterSubTypes) {
  80. typedef SubresourceFilterLevel Level;
  81. typedef SubresourceFilterType Type;
  82. const struct {
  83. const char* abusive_type;
  84. const char* bas_type;
  85. SubresourceFilterMatch expected_match;
  86. } test_cases[] = {
  87. {"warn",
  88. "enforce",
  89. {{Type::ABUSIVE, Level::WARN}, {Type::BETTER_ADS, Level::ENFORCE}}},
  90. {nullptr, "warn", {{Type::BETTER_ADS, Level::WARN}}},
  91. {"asdf",
  92. "",
  93. {{Type::ABUSIVE, Level::ENFORCE}, {Type::BETTER_ADS, Level::ENFORCE}}},
  94. {"warn", nullptr, {{Type::ABUSIVE, Level::WARN}}},
  95. {nullptr, nullptr, {}},
  96. {"",
  97. "",
  98. {{Type::ABUSIVE, Level::ENFORCE}, {Type::BETTER_ADS, Level::ENFORCE}}},
  99. };
  100. for (const auto& test_case : test_cases) {
  101. std::string json = R"({
  102. "matches" : [{
  103. "threat_type":"13"
  104. %s
  105. %s
  106. }]
  107. })";
  108. auto put_kv = [](const char* k, const char* v) {
  109. if (!v)
  110. return std::string();
  111. return base::StringPrintf(",\"%s\":\"%s\"", k, v);
  112. };
  113. json = base::StringPrintf(json.c_str(),
  114. put_kv("sf_absv", test_case.abusive_type).c_str(),
  115. put_kv("sf_bas", test_case.bas_type).c_str());
  116. SCOPED_TRACE(testing::Message() << json);
  117. ASSERT_EQ(UMA_STATUS_MATCH, ResetAndParseJson(json));
  118. EXPECT_EQ(SB_THREAT_TYPE_SUBRESOURCE_FILTER, threat_);
  119. ThreatMetadata expected;
  120. expected.subresource_filter_match = test_case.expected_match;
  121. EXPECT_EQ(expected, meta_);
  122. }
  123. }
  124. } // namespace safe_browsing