12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "remoting/base/rate_counter.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace remoting { 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const int64 kTestValues[] = { 10, 20, 30, 10, 25, 16, 15 }; 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// One second window and one sample per second, so rate equals each sample. 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(RateCounterTest, OneSecondWindow) { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RateCounter rate_counter(base::TimeDelta::FromSeconds(1)); 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, rate_counter.Rate()); 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time now = base::Time::Now(); 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(kTestValues); ++i) { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) now += base::TimeDelta::FromSeconds(1); 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rate_counter.SetCurrentTimeForTest(now); 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rate_counter.Record(kTestValues[i]); 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<double>(kTestValues[i]), rate_counter.Rate()); 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Record all samples instantaneously, so the rate is the total of the samples. 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(RateCounterTest, OneSecondWindowAllSamples) { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RateCounter rate_counter(base::TimeDelta::FromSeconds(1)); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, rate_counter.Rate()); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rate_counter.SetCurrentTimeForTest(base::Time::Now()); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double expected = 0.0; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(kTestValues); ++i) { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rate_counter.Record(kTestValues[i]); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected += kTestValues[i]; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected, rate_counter.Rate()); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Two second window, one sample per second. For all but the first sample, the 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// rate should be the average of it and the preceding one. For the first it 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// will be the average of the sample with zero. 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(RateCounterTest, TwoSecondWindow) { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RateCounter rate_counter(base::TimeDelta::FromSeconds(2)); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, rate_counter.Rate()); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time now = base::Time::Now(); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(kTestValues); ++i) { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) now += base::TimeDelta::FromSeconds(1); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rate_counter.SetCurrentTimeForTest(now); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rate_counter.Record(kTestValues[i]); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double expected = kTestValues[i]; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i > 0) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected += kTestValues[i-1]; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected /= 2; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected, rate_counter.Rate()); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sample over a window one second shorter than the number of samples. 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Rate should be the average of all but the first sample. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(RateCounterTest, LongWindow) { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const size_t kWindowSeconds = arraysize(kTestValues) - 1; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RateCounter rate_counter(base::TimeDelta::FromSeconds(kWindowSeconds)); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, rate_counter.Rate()); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double expected = 0.0; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time now = base::Time::Now(); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(kTestValues); ++i) { 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) now += base::TimeDelta::FromSeconds(1); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rate_counter.SetCurrentTimeForTest(now); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rate_counter.Record(kTestValues[i]); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i != 0) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected += kTestValues[i]; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected /= kWindowSeconds; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected, rate_counter.Rate()); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace remoting 85