1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/attribution_reporting/os_registration.h"
#include <string_view>
#include <tuple>
#include <vector>
#include "base/test/gmock_expected_support.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/types/expected.h"
#include "components/attribution_reporting/os_registration_error.mojom-shared.h"
#include "components/attribution_reporting/test_utils.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/fuzztest/src/fuzztest/fuzztest.h"
#include "url/gurl.h"
namespace attribution_reporting {
namespace {
using ::attribution_reporting::mojom::OsRegistrationError;
using ::base::test::ErrorIs;
using ::base::test::ValueIs;
using ::testing::ElementsAre;
TEST(OsRegistrationTest, ParseOsSourceOrTriggerHeader) {
const struct {
const char* description;
std::string_view header;
::testing::Matcher<
base::expected<std::vector<OsRegistrationItem>, OsRegistrationError>>
matches;
} kTestCases[] = {
{
"empty",
"",
ErrorIs(OsRegistrationError::kInvalidList),
},
{
"invalid_url",
R"("foo")",
ErrorIs(OsRegistrationError::kInvalidList),
},
{
"integer",
"123",
ErrorIs(OsRegistrationError::kInvalidList),
},
{
"token",
"d",
ErrorIs(OsRegistrationError::kInvalidList),
},
{
"byte_sequence",
":YWJj:",
ErrorIs(OsRegistrationError::kInvalidList),
},
{
"valid_url_no_params",
R"("https://d.test")",
ValueIs(
ElementsAre(OsRegistrationItem{.url = GURL("https://d.test")})),
},
{
"extra_params_ignored",
R"("https://d.test"; y=1)",
ValueIs(
ElementsAre(OsRegistrationItem{.url = GURL("https://d.test")})),
},
{
"inner_list",
R"(("https://d.test"))",
ErrorIs(OsRegistrationError::kInvalidList),
},
{
"multiple",
R"(123, "https://d.test", "", "https://e.test")",
ValueIs(
ElementsAre(OsRegistrationItem{.url = GURL("https://d.test")},
OsRegistrationItem{.url = GURL("https://e.test")})),
},
{
"debug_reporting_param",
R"("https://d.test", "https://e.test";debug-reporting, "https://f.test";debug-reporting=?0)",
ValueIs(
ElementsAre(OsRegistrationItem{.url = GURL("https://d.test")},
OsRegistrationItem{.url = GURL("https://e.test"),
.debug_reporting = true},
OsRegistrationItem{.url = GURL("https://f.test")})),
},
{
"debug_reporting_param_wrong_type",
R"("https://d.test"; debug-reporting=1)",
ValueIs(
ElementsAre(OsRegistrationItem{.url = GURL("https://d.test")})),
},
};
for (const auto& test_case : kTestCases) {
SCOPED_TRACE(test_case.description);
EXPECT_THAT(ParseOsSourceOrTriggerHeader(test_case.header),
test_case.matches);
}
}
TEST(OsRegistrationTest, EmitItemsPerHeaderHistogram) {
base::HistogramTester histogram;
std::ignore = ParseOsSourceOrTriggerHeader(
R"(123, "https://d.test", "", "https://e.test")");
histogram.ExpectUniqueSample("Conversions.OsRegistrationItemsPerHeader", 2,
1);
}
void Parses(std::string_view input) {
std::ignore = ParseOsSourceOrTriggerHeader(input);
}
FUZZ_TEST(OsRegistrationTest, Parses)
.WithDomains(fuzztest::Arbitrary<std::string>());
} // namespace
} // namespace attribution_reporting
|