blob: fbf07be6136aadc21d3a31aed048cb857ab2f364 [file] [log] [blame]
// Copyright 2015 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 "components/safe_browsing_db/metadata.pb.h"
#include "components/safe_browsing_db/safe_browsing_api_handler_util.h"
#include "components/safe_browsing_db/util.h"
#include "components/safe_browsing_db/v4_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace safe_browsing {
class SafeBrowsingApiHandlerUtilTest : public ::testing::Test {
protected:
SBThreatType threat_;
ThreatMetadata meta_;
const ThreatMetadata empty_meta_;
UmaRemoteCallResult ResetAndParseJson(const std::string& json) {
threat_ = SB_THREAT_TYPE_EXTENSION; // Should never be seen
meta_ = ThreatMetadata();
return ParseJsonFromGMSCore(json, &threat_, &meta_);
}
};
TEST_F(SafeBrowsingApiHandlerUtilTest, BadJson) {
EXPECT_EQ(UMA_STATUS_JSON_EMPTY, ResetAndParseJson(""));
EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
EXPECT_EQ(empty_meta_, meta_);
EXPECT_EQ(UMA_STATUS_JSON_FAILED_TO_PARSE, ResetAndParseJson("{"));
EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
EXPECT_EQ(empty_meta_, meta_);
EXPECT_EQ(UMA_STATUS_JSON_FAILED_TO_PARSE, ResetAndParseJson("[]"));
EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
EXPECT_EQ(empty_meta_, meta_);
EXPECT_EQ(UMA_STATUS_JSON_FAILED_TO_PARSE,
ResetAndParseJson("{\"matches\":\"foo\"}"));
EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
EXPECT_EQ(empty_meta_, meta_);
EXPECT_EQ(UMA_STATUS_JSON_UNKNOWN_THREAT,
ResetAndParseJson("{\"matches\":[{}]}"));
EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
EXPECT_EQ(empty_meta_, meta_);
EXPECT_EQ(UMA_STATUS_JSON_UNKNOWN_THREAT,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"junk\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
EXPECT_EQ(empty_meta_, meta_);
EXPECT_EQ(UMA_STATUS_JSON_UNKNOWN_THREAT,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"999\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
EXPECT_EQ(empty_meta_, meta_);
}
TEST_F(SafeBrowsingApiHandlerUtilTest, BasicThreats) {
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_);
EXPECT_EQ(empty_meta_, meta_);
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"5\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_URL_PHISHING, threat_);
EXPECT_EQ(empty_meta_, meta_);
}
TEST_F(SafeBrowsingApiHandlerUtilTest, MultipleThreats) {
EXPECT_EQ(
UMA_STATUS_UNSAFE,
ResetAndParseJson(
"{\"matches\":[{\"threat_type\":\"4\"}, {\"threat_type\":\"5\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_);
EXPECT_EQ(empty_meta_, meta_);
}
TEST_F(SafeBrowsingApiHandlerUtilTest, PhaSubType) {
ThreatMetadata expected;
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\", "
"\"pha_pattern_type\":\"LANDING\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_);
expected.threat_pattern_type = ThreatPatternType::MALWARE_LANDING;
EXPECT_EQ(expected, meta_);
// Test the ThreatMetadata comparitor for this field.
EXPECT_NE(empty_meta_, meta_);
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\", "
"\"pha_pattern_type\":\"DISTRIBUTION\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_);
expected.threat_pattern_type = ThreatPatternType::MALWARE_DISTRIBUTION;
EXPECT_EQ(expected, meta_);
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\", "
"\"pha_pattern_type\":\"junk\"}]}"));
EXPECT_EQ(empty_meta_, meta_);
}
TEST_F(SafeBrowsingApiHandlerUtilTest, SocialEngineeringSubType) {
ThreatMetadata expected;
EXPECT_EQ(
UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"5\", "
"\"se_pattern_type\":\"SOCIAL_ENGINEERING_ADS\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_URL_PHISHING, threat_);
expected.threat_pattern_type = ThreatPatternType::SOCIAL_ENGINEERING_ADS;
EXPECT_EQ(expected, meta_);
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson(
"{\"matches\":[{\"threat_type\":\"5\", "
"\"se_pattern_type\":\"SOCIAL_ENGINEERING_LANDING\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_URL_PHISHING, threat_);
expected.threat_pattern_type = ThreatPatternType::SOCIAL_ENGINEERING_LANDING;
EXPECT_EQ(expected, meta_);
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"5\", "
"\"se_pattern_type\":\"PHISHING\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_URL_PHISHING, threat_);
expected.threat_pattern_type = ThreatPatternType::PHISHING;
EXPECT_EQ(expected, meta_);
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"5\", "
"\"se_pattern_type\":\"junk\"}]}"));
EXPECT_EQ(empty_meta_, meta_);
}
TEST_F(SafeBrowsingApiHandlerUtilTest, PopulationId) {
ThreatMetadata expected;
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\", "
"\"UserPopulation\":\"foobarbazz\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_);
expected.population_id = "foobarbazz";
EXPECT_EQ(expected, meta_);
// Test the ThreatMetadata comparator for this field.
EXPECT_NE(empty_meta_, meta_);
}
} // namespace safe_browsing