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
|
// Copyright 2023 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/event_level_epsilon.h"
#include <optional>
#include "base/check.h"
#include "base/check_op.h"
#include "base/types/expected.h"
#include "base/values.h"
#include "components/attribution_reporting/constants.h"
#include "components/attribution_reporting/source_registration_error.mojom.h"
namespace attribution_reporting {
namespace {
using ::attribution_reporting::mojom::SourceRegistrationError;
double g_max_event_level_epsilon = 14;
bool IsEventLevelEpsilonValid(double epsilon) {
return epsilon >= 0 && epsilon <= g_max_event_level_epsilon;
}
} // namespace
// static
base::expected<EventLevelEpsilon, SourceRegistrationError>
EventLevelEpsilon::Parse(const base::Value::Dict& dict) {
const base::Value* value = dict.Find(kEventLevelEpsilon);
if (!value) {
return EventLevelEpsilon();
}
std::optional<double> d = value->GetIfDouble();
if (!d.has_value() || !IsEventLevelEpsilonValid(*d)) {
return base::unexpected(
SourceRegistrationError::kEventLevelEpsilonValueInvalid);
}
return EventLevelEpsilon(*d);
}
EventLevelEpsilon::EventLevelEpsilon()
: EventLevelEpsilon(g_max_event_level_epsilon) {}
EventLevelEpsilon::EventLevelEpsilon(double epsilon) : epsilon_(epsilon) {
CHECK(IsEventLevelEpsilonValid(epsilon_));
}
bool EventLevelEpsilon::SetIfValid(double epsilon) {
if (!IsEventLevelEpsilonValid(epsilon)) {
return false;
}
epsilon_ = epsilon;
return true;
}
void EventLevelEpsilon::Serialize(base::Value::Dict& dict) const {
dict.Set(kEventLevelEpsilon, epsilon_);
}
ScopedMaxEventLevelEpsilonForTesting::ScopedMaxEventLevelEpsilonForTesting(
double epsilon)
: previous_(g_max_event_level_epsilon) {
CHECK_GE(epsilon, 0);
g_max_event_level_epsilon = epsilon;
}
ScopedMaxEventLevelEpsilonForTesting::~ScopedMaxEventLevelEpsilonForTesting() {
g_max_event_level_epsilon = previous_;
}
} // namespace attribution_reporting
|