blob: 08cb97f4c91fc1b277ff3cc80ddb4b10d1785016 [file] [log] [blame]
// Copyright 2017 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 <memory>
#include "base/macros.h"
#include "net/base/net_export.h"
#include "net/base/rand_callback.h"
namespace base {
class OneShotTimer;
} // namespace base
namespace net {
class ReportingContext;
// Batches reports fetched from the ReportingCache and uploads them using the
// ReportingUploader.
// Reports are only considered for delivery if all of the following are true:
// - The report is not already part of a pending upload request.
// - Uploads are allowed for the report's origin (i.e. the origin of the URL
// associated with the reported event).
// - There is not already a pending upload for any reports sharing the same
// (NIK, origin, group) key.
// Reports are batched for upload to an endpoint URL such that:
// - The available reports with the same (NIK, origin, group) are always
// uploaded together.
// - All reports uploaded together must share a NIK and origin.
// - Reports for the same (NIK, origin) can be uploaded separately if they are
// for different groups.
// - Reports for different groups can be batched together, if they are assigned
// to ReportingEndpoints sharing a URL (that is, the upload URL).
// There is no limit to the number of reports that can be uploaded together.
// (Aside from the global cap on total reports.)
// TODO(juliatuttle): Consider capping the maximum number of reports per
// delivery attempt.
class NET_EXPORT ReportingDeliveryAgent {
// Creates a ReportingDeliveryAgent. |context| must outlive the agent.
static std::unique_ptr<ReportingDeliveryAgent> Create(
ReportingContext* context,
const RandIntCallback& rand_callback);
virtual ~ReportingDeliveryAgent();
// Replaces the internal OneShotTimer used for scheduling report delivery
// attempts with a caller-specified one so that unittests can provide a
// MockOneShotTimer.
virtual void SetTimerForTesting(
std::unique_ptr<base::OneShotTimer> timer) = 0;
} // namespace net