| Index: net/nqe/observation_buffer_unittest.cc
|
| diff --git a/net/nqe/network_quality_observation_unittest.cc b/net/nqe/observation_buffer_unittest.cc
|
| similarity index 74%
|
| rename from net/nqe/network_quality_observation_unittest.cc
|
| rename to net/nqe/observation_buffer_unittest.cc
|
| index f8215a23f4e74c635bd1c3c20520d772af859896..4da54e44ddfd57d65785ffe7da650b07891c11e8 100644
|
| --- a/net/nqe/network_quality_observation_unittest.cc
|
| +++ b/net/nqe/observation_buffer_unittest.cc
|
| @@ -2,30 +2,93 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "net/nqe/network_quality_observation.h"
|
| +#include "net/nqe/observation_buffer.h"
|
|
|
| #include <stddef.h>
|
|
|
| +#include <memory>
|
| +#include <utility>
|
| #include <vector>
|
|
|
| #include "base/logging.h"
|
| #include "base/macros.h"
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/test/simple_test_tick_clock.h"
|
| #include "base/time/time.h"
|
| +#include "net/nqe/network_quality_observation.h"
|
| #include "net/nqe/network_quality_observation_source.h"
|
| -#include "net/nqe/observation_buffer.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace net {
|
|
|
| namespace nqe {
|
|
|
| +namespace internal {
|
| +
|
| namespace {
|
|
|
| +// Verify that the buffer size is never exceeded.
|
| +TEST(NetworkQualityObservationBufferTest, BoundedBuffer) {
|
| + ObservationBuffer<int32_t> observation_buffer(1.0);
|
| + const base::TimeTicks now =
|
| + base::TimeTicks() + base::TimeDelta::FromSeconds(1);
|
| + for (int i = 1; i <= 1000; ++i) {
|
| + observation_buffer.AddObservation(
|
| + Observation<int32_t>(i, now, NETWORK_QUALITY_OBSERVATION_SOURCE_TCP));
|
| + // The number of entries should be at most the maximum buffer size.
|
| + EXPECT_GE(300u, observation_buffer.Size());
|
| + }
|
| +}
|
| +
|
| +// Test disabled on OS_WIN to avoid linking errors when calling
|
| +// SetTickClockForTesting.
|
| +// TODO(tbansal): crbug.com/651963. Pass the clock through NQE's constructor.
|
| +#if !defined(OS_WIN)
|
| +// Verify that the percentiles are monotonically non-decreasing when a weight is
|
| +// applied.
|
| +TEST(NetworkQualityObservationBufferTest, GetPercentileWithWeights) {
|
| + std::unique_ptr<base::SimpleTestTickClock> tick_clock(
|
| + new base::SimpleTestTickClock());
|
| + base::SimpleTestTickClock* tick_clock_ptr = tick_clock.get();
|
| +
|
| + ObservationBuffer<int32_t> observation_buffer(0.98);
|
| + observation_buffer.SetTickClockForTesting(std::move(tick_clock));
|
| + const base::TimeTicks now = tick_clock_ptr->NowTicks();
|
| + for (int i = 1; i <= 100; ++i) {
|
| + tick_clock_ptr->Advance(base::TimeDelta::FromSeconds(1));
|
| + observation_buffer.AddObservation(Observation<int32_t>(
|
| + i, tick_clock_ptr->NowTicks(), NETWORK_QUALITY_OBSERVATION_SOURCE_TCP));
|
| + }
|
| + EXPECT_EQ(100U, observation_buffer.Size());
|
| +
|
| + int32_t result_lowest = INT32_MAX;
|
| + int32_t result_highest = INT32_MIN;
|
| +
|
| + for (int i = 1; i <= 100; ++i) {
|
| + // Verify that i'th percentile is more than i-1'th percentile.
|
| + int32_t result_i;
|
| + EXPECT_TRUE(observation_buffer.GetPercentile(
|
| + now, &result_i, i, std::vector<NetworkQualityObservationSource>()));
|
| + result_lowest = std::min(result_lowest, result_i);
|
| +
|
| + result_highest = std::max(result_highest, result_i);
|
| +
|
| + int32_t result_i_1;
|
| + EXPECT_TRUE(observation_buffer.GetPercentile(
|
| + now, &result_i_1, i - 1,
|
| + std::vector<NetworkQualityObservationSource>()));
|
| +
|
| + EXPECT_LE(result_i_1, result_i);
|
| + }
|
| + EXPECT_LT(result_lowest, result_highest);
|
| +}
|
| +#endif
|
| +
|
| // Verifies that the percentiles are correctly computed. All observations have
|
| // the same timestamp.
|
| -TEST(NetworkQualityObservationTest, PercentileSameTimestamps) {
|
| - internal::ObservationBuffer<int32_t> int_buffer(0.5);
|
| - internal::ObservationBuffer<base::TimeDelta> time_delta_buffer(0.5);
|
| +TEST(NetworkQualityObservationBufferTest, PercentileSameTimestamps) {
|
| + ObservationBuffer<int32_t> int_buffer(0.5);
|
| + ObservationBuffer<base::TimeDelta> time_delta_buffer(0.5);
|
| ASSERT_EQ(0u, int_buffer.Size());
|
| ASSERT_LT(0u, int_buffer.Capacity());
|
| ASSERT_EQ(0u, time_delta_buffer.Size());
|
| @@ -47,9 +110,9 @@ TEST(NetworkQualityObservationTest, PercentileSameTimestamps) {
|
| // Insert samples from {1,2,3,..., 100}. First insert odd samples, then even
|
| // samples. This helps in verifying that the order of samples does not matter.
|
| for (int i = 1; i <= 99; i += 2) {
|
| - int_buffer.AddObservation(internal::Observation<int32_t>(
|
| + int_buffer.AddObservation(Observation<int32_t>(
|
| i, now, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
| - time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
|
| + time_delta_buffer.AddObservation(Observation<base::TimeDelta>(
|
| base::TimeDelta::FromMilliseconds(i), now,
|
| NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
| EXPECT_TRUE(int_buffer.GetPercentile(
|
| @@ -63,9 +126,9 @@ TEST(NetworkQualityObservationTest, PercentileSameTimestamps) {
|
| }
|
|
|
| for (int i = 2; i <= 100; i += 2) {
|
| - int_buffer.AddObservation(internal::Observation<int32_t>(
|
| + int_buffer.AddObservation(Observation<int32_t>(
|
| i, now, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
| - time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
|
| + time_delta_buffer.AddObservation(Observation<base::TimeDelta>(
|
| base::TimeDelta::FromMilliseconds(i), now,
|
| NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
| EXPECT_TRUE(int_buffer.GetPercentile(
|
| @@ -118,9 +181,9 @@ TEST(NetworkQualityObservationTest, PercentileSameTimestamps) {
|
| // different timestamps with half the observations being very old and the rest
|
| // of them being very recent. Percentiles should factor in recent observations
|
| // much more heavily than older samples.
|
| -TEST(NetworkQualityObservationTest, PercentileDifferentTimestamps) {
|
| - internal::ObservationBuffer<int32_t> int_buffer(0.5);
|
| - internal::ObservationBuffer<base::TimeDelta> time_delta_buffer(0.5);
|
| +TEST(NetworkQualityObservationBufferTest, PercentileDifferentTimestamps) {
|
| + ObservationBuffer<int32_t> int_buffer(0.5);
|
| + ObservationBuffer<base::TimeDelta> time_delta_buffer(0.5);
|
| const base::TimeTicks now = base::TimeTicks::Now();
|
| const base::TimeTicks very_old = now - base::TimeDelta::FromDays(365);
|
|
|
| @@ -137,18 +200,18 @@ TEST(NetworkQualityObservationTest, PercentileDifferentTimestamps) {
|
|
|
| // First 50 samples have very old timestamp.
|
| for (int i = 1; i <= 50; ++i) {
|
| - int_buffer.AddObservation(internal::Observation<int32_t>(
|
| + int_buffer.AddObservation(Observation<int32_t>(
|
| i, very_old, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
| - time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
|
| + time_delta_buffer.AddObservation(Observation<base::TimeDelta>(
|
| base::TimeDelta::FromMilliseconds(i), very_old,
|
| NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
| }
|
|
|
| // Next 50 (i.e., from 51 to 100) have recent timestamp.
|
| for (int i = 51; i <= 100; ++i) {
|
| - int_buffer.AddObservation(internal::Observation<int32_t>(
|
| + int_buffer.AddObservation(Observation<int32_t>(
|
| i, now, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
| - time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
|
| + time_delta_buffer.AddObservation(Observation<base::TimeDelta>(
|
| base::TimeDelta::FromMilliseconds(i), now,
|
| NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
| }
|
| @@ -181,9 +244,9 @@ TEST(NetworkQualityObservationTest, PercentileDifferentTimestamps) {
|
|
|
| // Verifies that the percentiles are correctly computed when some of the
|
| // observation sources are disallowed. All observations have the same timestamp.
|
| -TEST(NetworkQualityObservationTest, DisallowedObservationSources) {
|
| - internal::ObservationBuffer<int32_t> int_buffer(0.5);
|
| - internal::ObservationBuffer<base::TimeDelta> time_delta_buffer(0.5);
|
| +TEST(NetworkQualityObservationBufferTest, DisallowedObservationSources) {
|
| + ObservationBuffer<int32_t> int_buffer(0.5);
|
| + ObservationBuffer<base::TimeDelta> time_delta_buffer(0.5);
|
| const base::TimeTicks now = base::TimeTicks::Now();
|
|
|
| int32_t result;
|
| @@ -200,9 +263,9 @@ TEST(NetworkQualityObservationTest, DisallowedObservationSources) {
|
| // Insert samples from {1,2,3,..., 100}. First insert odd samples, then even
|
| // samples. This helps in verifying that the order of samples does not matter.
|
| for (int i = 1; i <= 99; i += 2) {
|
| - int_buffer.AddObservation(internal::Observation<int32_t>(
|
| + int_buffer.AddObservation(Observation<int32_t>(
|
| i, now, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
| - time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
|
| + time_delta_buffer.AddObservation(Observation<base::TimeDelta>(
|
| base::TimeDelta::FromMilliseconds(i), now,
|
| NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
| }
|
| @@ -210,22 +273,22 @@ TEST(NetworkQualityObservationTest, DisallowedObservationSources) {
|
| // Add samples for TCP and QUIC observations which should not be taken into
|
| // account when computing the percentile.
|
| for (int i = 1; i <= 99; i += 2) {
|
| - int_buffer.AddObservation(internal::Observation<int32_t>(
|
| + int_buffer.AddObservation(Observation<int32_t>(
|
| 10000, now, NETWORK_QUALITY_OBSERVATION_SOURCE_TCP));
|
| - int_buffer.AddObservation(internal::Observation<int32_t>(
|
| + int_buffer.AddObservation(Observation<int32_t>(
|
| 10000, now, NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC));
|
| - time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
|
| + time_delta_buffer.AddObservation(Observation<base::TimeDelta>(
|
| base::TimeDelta::FromMilliseconds(10000), now,
|
| NETWORK_QUALITY_OBSERVATION_SOURCE_TCP));
|
| - time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
|
| + time_delta_buffer.AddObservation(Observation<base::TimeDelta>(
|
| base::TimeDelta::FromMilliseconds(10000), now,
|
| NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC));
|
| }
|
|
|
| for (int i = 2; i <= 100; i += 2) {
|
| - int_buffer.AddObservation(internal::Observation<int32_t>(
|
| + int_buffer.AddObservation(Observation<int32_t>(
|
| i, now, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
| - time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
|
| + time_delta_buffer.AddObservation(Observation<base::TimeDelta>(
|
| base::TimeDelta::FromMilliseconds(i), now,
|
| NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
| }
|
| @@ -269,23 +332,23 @@ TEST(NetworkQualityObservationTest, DisallowedObservationSources) {
|
| }
|
| }
|
|
|
| -TEST(NetworkQualityObservationTest, TestGetMedianRTTSince) {
|
| - internal::ObservationBuffer<int32_t> int_buffer(0.5);
|
| - internal::ObservationBuffer<base::TimeDelta> time_delta_buffer(0.5);
|
| +TEST(NetworkQualityObservationBufferTest, TestGetMedianRTTSince) {
|
| + ObservationBuffer<int32_t> int_buffer(0.5);
|
| + ObservationBuffer<base::TimeDelta> time_delta_buffer(0.5);
|
| base::TimeTicks now = base::TimeTicks::Now();
|
| base::TimeTicks old = now - base::TimeDelta::FromMilliseconds(1);
|
| ASSERT_NE(old, now);
|
|
|
| // First sample has very old timestamp.
|
| - int_buffer.AddObservation(internal::Observation<int32_t>(
|
| + int_buffer.AddObservation(Observation<int32_t>(
|
| 1, old, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
| - time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
|
| + time_delta_buffer.AddObservation(Observation<base::TimeDelta>(
|
| base::TimeDelta::FromMilliseconds(1), old,
|
| NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
|
|
| - int_buffer.AddObservation(internal::Observation<int32_t>(
|
| + int_buffer.AddObservation(Observation<int32_t>(
|
| 100, now, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
| - time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
|
| + time_delta_buffer.AddObservation(Observation<base::TimeDelta>(
|
| base::TimeDelta::FromMilliseconds(100), now,
|
| NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
|
|
|
| @@ -327,6 +390,8 @@ TEST(NetworkQualityObservationTest, TestGetMedianRTTSince) {
|
|
|
| } // namespace
|
|
|
| +} // namespace internal
|
| +
|
| } // namespace nqe
|
|
|
| } // namespace net
|
|
|