1// Copyright 2013 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 "remoting/base/rate_counter.h"
6#include "testing/gtest/include/gtest/gtest.h"
7
8namespace remoting {
9
10static const int64 kTestValues[] = { 10, 20, 30, 10, 25, 16, 15 };
11
12// One second window and one sample per second, so rate equals each sample.
13TEST(RateCounterTest, OneSecondWindow) {
14  RateCounter rate_counter(base::TimeDelta::FromSeconds(1));
15  EXPECT_EQ(0, rate_counter.Rate());
16
17  base::Time now = base::Time::Now();
18  for (size_t i = 0; i < arraysize(kTestValues); ++i) {
19    now += base::TimeDelta::FromSeconds(1);
20    rate_counter.SetCurrentTimeForTest(now);
21    rate_counter.Record(kTestValues[i]);
22    EXPECT_EQ(static_cast<double>(kTestValues[i]), rate_counter.Rate());
23  }
24}
25
26// Record all samples instantaneously, so the rate is the total of the samples.
27TEST(RateCounterTest, OneSecondWindowAllSamples) {
28  RateCounter rate_counter(base::TimeDelta::FromSeconds(1));
29  EXPECT_EQ(0, rate_counter.Rate());
30
31  rate_counter.SetCurrentTimeForTest(base::Time::Now());
32
33  double expected = 0.0;
34  for (size_t i = 0; i < arraysize(kTestValues); ++i) {
35    rate_counter.Record(kTestValues[i]);
36    expected += kTestValues[i];
37  }
38
39  EXPECT_EQ(expected, rate_counter.Rate());
40}
41
42// Two second window, one sample per second.  For all but the first sample, the
43// rate should be the average of it and the preceding one.  For the first it
44// will be the average of the sample with zero.
45TEST(RateCounterTest, TwoSecondWindow) {
46  RateCounter rate_counter(base::TimeDelta::FromSeconds(2));
47  EXPECT_EQ(0, rate_counter.Rate());
48
49  base::Time now = base::Time::Now();
50  for (size_t i = 0; i < arraysize(kTestValues); ++i) {
51    now += base::TimeDelta::FromSeconds(1);
52    rate_counter.SetCurrentTimeForTest(now);
53    rate_counter.Record(kTestValues[i]);
54    double expected = kTestValues[i];
55    if (i > 0)
56      expected += kTestValues[i-1];
57    expected /= 2;
58    EXPECT_EQ(expected, rate_counter.Rate());
59  }
60}
61
62// Sample over a window one second shorter than the number of samples.
63// Rate should be the average of all but the first sample.
64TEST(RateCounterTest, LongWindow) {
65  const size_t kWindowSeconds = arraysize(kTestValues) - 1;
66
67  RateCounter rate_counter(base::TimeDelta::FromSeconds(kWindowSeconds));
68  EXPECT_EQ(0, rate_counter.Rate());
69
70  double expected = 0.0;
71  base::Time now = base::Time::Now();
72  for (size_t i = 0; i < arraysize(kTestValues); ++i) {
73    now += base::TimeDelta::FromSeconds(1);
74    rate_counter.SetCurrentTimeForTest(now);
75    rate_counter.Record(kTestValues[i]);
76    if (i != 0)
77      expected += kTestValues[i];
78  }
79  expected /= kWindowSeconds;
80
81  EXPECT_EQ(expected, rate_counter.Rate());
82}
83
84}  // namespace remoting
85