blob: af7d97ff41a405840c97f6a547bb50e866e38ba2 [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 "chrome/browser/safe_browsing/metadata.pb.h"
#include "chrome/browser/safe_browsing/safe_browsing_api_handler_util.h"
#include "chrome/browser/safe_browsing/safe_browsing_util.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace safe_browsing {
class SafeBrowsingApiHandlerUtilTest : public ::testing::Test {
protected:
SBThreatType threat_;
std::string pb_str_;
UmaRemoteCallResult ResetAndParseJson(const std::string& json) {
threat_ = SB_THREAT_TYPE_EXTENSION; // Should never be seen
pb_str_ = "unitialized value";
return ParseJsonToThreatAndPB(json, &threat_, &pb_str_);
}
MalwarePatternType::PATTERN_TYPE ParsePatternType() {
MalwarePatternType proto;
EXPECT_TRUE(proto.ParseFromString(pb_str_));
return proto.pattern_type();
}
};
TEST_F(SafeBrowsingApiHandlerUtilTest, BadJson) {
EXPECT_EQ(UMA_STATUS_JSON_EMPTY, ResetAndParseJson(""));
EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
EXPECT_TRUE(pb_str_.empty());
EXPECT_EQ(UMA_STATUS_JSON_FAILED_TO_PARSE, ResetAndParseJson("{"));
EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
EXPECT_TRUE(pb_str_.empty());
EXPECT_EQ(UMA_STATUS_JSON_FAILED_TO_PARSE, ResetAndParseJson("[]"));
EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
EXPECT_TRUE(pb_str_.empty());
EXPECT_EQ(UMA_STATUS_JSON_FAILED_TO_PARSE,
ResetAndParseJson("{\"matches\":\"foo\"}"));
EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
EXPECT_TRUE(pb_str_.empty());
EXPECT_EQ(UMA_STATUS_JSON_UNKNOWN_THREAT,
ResetAndParseJson("{\"matches\":[{}]}"));
EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
EXPECT_TRUE(pb_str_.empty());
EXPECT_EQ(UMA_STATUS_JSON_UNKNOWN_THREAT,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"junk\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
EXPECT_TRUE(pb_str_.empty());
EXPECT_EQ(UMA_STATUS_JSON_UNKNOWN_THREAT,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"999\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_SAFE, threat_);
EXPECT_TRUE(pb_str_.empty());
}
TEST_F(SafeBrowsingApiHandlerUtilTest, BasicThreats) {
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_);
EXPECT_TRUE(pb_str_.empty());
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"5\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_URL_PHISHING, threat_);
EXPECT_TRUE(pb_str_.empty());
}
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_TRUE(pb_str_.empty());
}
TEST_F(SafeBrowsingApiHandlerUtilTest, PhaSubType) {
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\", "
"\"pha_pattern_type\":\"LANDING\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_);
EXPECT_EQ(MalwarePatternType::LANDING, ParsePatternType());
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\", "
"\"pha_pattern_type\":\"DISTRIBUTION\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, threat_);
EXPECT_EQ(MalwarePatternType::DISTRIBUTION, ParsePatternType());
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"4\", "
"\"pha_pattern_type\":\"junk\"}]}"));
EXPECT_TRUE(pb_str_.empty());
}
TEST_F(SafeBrowsingApiHandlerUtilTest, SocialEngineeringSubType) {
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"5\", "
"\"se_pattern_type\":\"LANDING\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_URL_PHISHING, threat_);
EXPECT_EQ(MalwarePatternType::LANDING, ParsePatternType());
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"5\", "
"\"se_pattern_type\":\"DISTRIBUTION\"}]}"));
EXPECT_EQ(SB_THREAT_TYPE_URL_PHISHING, threat_);
EXPECT_EQ(MalwarePatternType::DISTRIBUTION, ParsePatternType());
EXPECT_EQ(UMA_STATUS_UNSAFE,
ResetAndParseJson("{\"matches\":[{\"threat_type\":\"5\", "
"\"se_pattern_type\":\"junk\"}]}"));
EXPECT_TRUE(pb_str_.empty());
}
} // namespace safe_browsing