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 
5 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_util.h"
6 
7 #include <string>
8 
9 #include "chrome/common/extensions/api/safe_browsing_private.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 
12 namespace safe_browsing_private = extensions::api::safe_browsing_private;
13 
14 namespace extensions {
15 
16 namespace {
17 
18 const char kMainFrameUrl[] = "https://www.example.com/info";
19 const char kIpAddress[] = "localhost";
20 const char kReferrerUrl[] = "https://www.example.com";
21 const bool kIsRetargeting = false;
22 const double kNavTime = 12345;
23 const char kServerRedirectUrl[] = "https://example.com/redirect";
24 const bool kMaybeLaunched = false;
25 
InitializeFakeReferrerChainEntry(std::string url,safe_browsing::ReferrerChainEntry * referrer)26 void InitializeFakeReferrerChainEntry(
27     std::string url,
28     safe_browsing::ReferrerChainEntry* referrer) {
29   referrer->set_url(url);
30   referrer->set_main_frame_url(kMainFrameUrl);
31   referrer->set_type(safe_browsing::ReferrerChainEntry_URLType_LANDING_PAGE);
32   referrer->add_ip_addresses(kIpAddress);
33   referrer->set_referrer_url(kReferrerUrl);
34   referrer->set_is_retargeting(kIsRetargeting);
35   referrer->set_navigation_time_msec(kNavTime);
36   safe_browsing::ReferrerChainEntry_ServerRedirect* server_redirect =
37       referrer->add_server_redirect_chain();
38   server_redirect->set_url(kServerRedirectUrl);
39   referrer->set_navigation_initiation(
40       safe_browsing::ReferrerChainEntry_NavigationInitiation_BROWSER_INITIATED);
41   referrer->set_maybe_launched_by_external_application(kMaybeLaunched);
42 }
43 
ValidateReferrerChain(const safe_browsing_private::ReferrerChainEntry & referrer)44 void ValidateReferrerChain(
45     const safe_browsing_private::ReferrerChainEntry& referrer) {
46   ASSERT_FALSE(referrer.url.empty());
47   EXPECT_EQ(*referrer.main_frame_url, kMainFrameUrl);
48   EXPECT_EQ(referrer.url_type,
49             safe_browsing_private::URLType::URL_TYPE_LANDING_PAGE);
50   EXPECT_EQ(referrer.ip_addresses->at(0), kIpAddress);
51   EXPECT_EQ(*referrer.referrer_url, kReferrerUrl);
52   EXPECT_EQ(*referrer.is_retargeting, kIsRetargeting);
53   EXPECT_EQ(*referrer.navigation_time_ms, kNavTime);
54   EXPECT_EQ(*referrer.server_redirect_chain->at(0).url, kServerRedirectUrl);
55   EXPECT_EQ(referrer.navigation_initiation,
56             safe_browsing_private::NAVIGATION_INITIATION_BROWSER_INITIATED);
57   EXPECT_EQ(*referrer.maybe_launched_by_external_app, kMaybeLaunched);
58 }
59 
60 }  // namespace
61 
62 // Tests that we correctly convert referrer chain entries from proto to idl.
TEST(SafeBrowsingUtilUnitTest,ReferrerToReferrerChainEntry)63 TEST(SafeBrowsingUtilUnitTest, ReferrerToReferrerChainEntry) {
64   safe_browsing::ReferrerChainEntry entry;
65   InitializeFakeReferrerChainEntry("https://foo.com", &entry);
66   safe_browsing_private::ReferrerChainEntry landing_referrer_result =
67       safe_browsing_util::ReferrerToReferrerChainEntry(entry);
68   ValidateReferrerChain(landing_referrer_result);
69   EXPECT_EQ(landing_referrer_result.url, "https://foo.com");
70 }
71 
72 }  // namespace extensions
73