| // Copyright 2015 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 "apps/benchmark/measurements.h" | 
 |  | 
 | #include <algorithm> | 
 |  | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | namespace benchmark { | 
 | namespace { | 
 |  | 
 | base::TimeTicks Ticks(int64 value) { | 
 |   return base::TimeTicks::FromInternalValue(value); | 
 | } | 
 |  | 
 | base::TimeDelta Delta(int64 value) { | 
 |   return base::TimeDelta::FromInternalValue(value); | 
 | } | 
 |  | 
 | class MeasurementsTest : public ::testing::Test { | 
 |  protected: | 
 |   void SetUp() override { | 
 |     events_.resize(11); | 
 |     events_[0] = Event(EventType::COMPLETE, "a", "some", Ticks(10), Delta(2)); | 
 |     events_[1] = Event(EventType::COMPLETE, "a", "some", Ticks(11), Delta(4)); | 
 |     events_[2] = Event(EventType::COMPLETE, "a", "other", Ticks(12), Delta(8)); | 
 |     events_[3] = Event(EventType::COMPLETE, "b", "some", Ticks(3), Delta(16)); | 
 |     events_[4] = Event(EventType::COMPLETE, "b", "some", Ticks(13), Delta(32)); | 
 |  | 
 |     events_[5] = Event(EventType::COMPLETE, "c", "some", Ticks(14), Delta(10)); | 
 |     events_[6] = Event(EventType::COMPLETE, "c", "some", Ticks(16), Delta(11)); | 
 |     events_[7] = Event(EventType::COMPLETE, "c", "some", Ticks(18), Delta(12)); | 
 |  | 
 |     events_[8] = | 
 |         Event(EventType::INSTANT, "instant", "another", Ticks(20), Delta(0)); | 
 |     events_[9] = Event(EventType::INSTANT, "multi_occurence", "another", | 
 |                        Ticks(30), Delta(0)); | 
 |     events_[10] = Event(EventType::INSTANT, "multi_occurence", "another", | 
 |                         Ticks(40), Delta(0)); | 
 |  | 
 |     reversed_ = events_; | 
 |     reverse(reversed_.begin(), reversed_.end()); | 
 |   } | 
 |  | 
 |   std::vector<Event> events_; | 
 |   std::vector<Event> reversed_; | 
 | }; | 
 |  | 
 | TEST_F(MeasurementsTest, MeasureTimeUntil) { | 
 |   // The results should be the same regardless of the order of events. | 
 |   Measurements regular(events_, base::TimeTicks::FromInternalValue(2)); | 
 |   Measurements reversed(reversed_, base::TimeTicks::FromInternalValue(2)); | 
 |  | 
 |   EXPECT_DOUBLE_EQ(0.008, | 
 |                    regular.Measure(Measurement(MeasurementType::TIME_UNTIL, | 
 |                                                EventSpec("a", "some")))); | 
 |   EXPECT_DOUBLE_EQ(0.008, | 
 |                    reversed.Measure(Measurement(MeasurementType::TIME_UNTIL, | 
 |                                                 EventSpec("a", "some")))); | 
 |  | 
 |   EXPECT_DOUBLE_EQ(0.01, | 
 |                    regular.Measure(Measurement(MeasurementType::TIME_UNTIL, | 
 |                                                EventSpec("a", "other")))); | 
 |   EXPECT_DOUBLE_EQ(0.01, | 
 |                    reversed.Measure(Measurement(MeasurementType::TIME_UNTIL, | 
 |                                                 EventSpec("a", "other")))); | 
 |  | 
 |   EXPECT_DOUBLE_EQ(0.001, | 
 |                    regular.Measure(Measurement(MeasurementType::TIME_UNTIL, | 
 |                                                EventSpec("b", "some")))); | 
 |   EXPECT_DOUBLE_EQ(0.001, | 
 |                    reversed.Measure(Measurement(MeasurementType::TIME_UNTIL, | 
 |                                                 EventSpec("b", "some")))); | 
 | } | 
 |  | 
 | TEST_F(MeasurementsTest, MeasureTimeBetween) { | 
 |   // The results should be the same regardless of the order of events. | 
 |   Measurements regular(events_, base::TimeTicks::FromInternalValue(2)); | 
 |   Measurements reversed(reversed_, base::TimeTicks::FromInternalValue(2)); | 
 |  | 
 |   EXPECT_DOUBLE_EQ(0.0, regular.Measure(Measurement( | 
 |                             MeasurementType::TIME_BETWEEN, | 
 |                             EventSpec("a", "some"), EventSpec("a", "some")))); | 
 |   EXPECT_DOUBLE_EQ(0.0, reversed.Measure(Measurement( | 
 |                             MeasurementType::TIME_BETWEEN, | 
 |                             EventSpec("a", "some"), EventSpec("a", "some")))); | 
 |  | 
 |   EXPECT_DOUBLE_EQ( | 
 |       0.01, regular.Measure(Measurement( | 
 |                 MeasurementType::TIME_BETWEEN, EventSpec("instant", "another"), | 
 |                 EventSpec("multi_occurence", "another")))); | 
 |   EXPECT_DOUBLE_EQ( | 
 |       0.01, reversed.Measure(Measurement( | 
 |                 MeasurementType::TIME_BETWEEN, EventSpec("instant", "another"), | 
 |                 EventSpec("multi_occurence", "another")))); | 
 |  | 
 |   EXPECT_DOUBLE_EQ( | 
 |       -1.0, regular.Measure(Measurement(MeasurementType::TIME_BETWEEN, | 
 |                                         EventSpec("multi_occurence", "another"), | 
 |                                         EventSpec("instant", "another")))); | 
 |   EXPECT_DOUBLE_EQ(-1.0, reversed.Measure(Measurement( | 
 |                              MeasurementType::TIME_BETWEEN, | 
 |                              EventSpec("multi_occurence", "another"), | 
 |                              EventSpec("instant", "another")))); | 
 |  | 
 |   EXPECT_DOUBLE_EQ( | 
 |       0.01, regular.Measure(Measurement(MeasurementType::TIME_BETWEEN, | 
 |                                         EventSpec("a", "some"), | 
 |                                         EventSpec("instant", "another")))); | 
 |   EXPECT_DOUBLE_EQ( | 
 |       0.01, reversed.Measure(Measurement(MeasurementType::TIME_BETWEEN, | 
 |                                          EventSpec("a", "some"), | 
 |                                          EventSpec("instant", "another")))); | 
 | } | 
 |  | 
 | TEST_F(MeasurementsTest, MeasureAvgDuration) { | 
 |   // The results should be the same regardless of the order of events. | 
 |   Measurements regular(events_, base::TimeTicks::FromInternalValue(2)); | 
 |   Measurements reversed(reversed_, base::TimeTicks::FromInternalValue(2)); | 
 |  | 
 |   EXPECT_DOUBLE_EQ(0.003, | 
 |                    regular.Measure(Measurement(MeasurementType::AVG_DURATION, | 
 |                                                EventSpec("a", "some")))); | 
 |   EXPECT_DOUBLE_EQ(0.003, | 
 |                    reversed.Measure(Measurement(MeasurementType::AVG_DURATION, | 
 |                                                 EventSpec("a", "some")))); | 
 |  | 
 |   EXPECT_DOUBLE_EQ(0.008, | 
 |                    regular.Measure(Measurement(MeasurementType::AVG_DURATION, | 
 |                                                EventSpec("a", "other")))); | 
 |   EXPECT_DOUBLE_EQ(0.008, | 
 |                    reversed.Measure(Measurement(MeasurementType::AVG_DURATION, | 
 |                                                 EventSpec("a", "other")))); | 
 |  | 
 |   EXPECT_DOUBLE_EQ(0.024, | 
 |                    regular.Measure(Measurement(MeasurementType::AVG_DURATION, | 
 |                                                EventSpec("b", "some")))); | 
 |   EXPECT_DOUBLE_EQ(0.024, | 
 |                    reversed.Measure(Measurement(MeasurementType::AVG_DURATION, | 
 |                                                 EventSpec("b", "some")))); | 
 | } | 
 |  | 
 | TEST_F(MeasurementsTest, MeasurePercentileDuration) { | 
 |   // The results should be the same regardless of the order of events. | 
 |   Measurements regular(events_, base::TimeTicks::FromInternalValue(2)); | 
 |   Measurements reversed(reversed_, base::TimeTicks::FromInternalValue(2)); | 
 |  | 
 |   Measurement measurement(MeasurementType::PERCENTILE_DURATION, | 
 |                           EventSpec("c", "some")); | 
 |   measurement.param = 0.10; | 
 |   EXPECT_DOUBLE_EQ(0.010, regular.Measure(measurement)); | 
 |   measurement.param = 0.50; | 
 |   EXPECT_DOUBLE_EQ(0.011, regular.Measure(measurement)); | 
 |   measurement.param = 0.90; | 
 |   EXPECT_DOUBLE_EQ(0.012, regular.Measure(measurement)); | 
 |  | 
 |   measurement.param = 0.10; | 
 |   EXPECT_DOUBLE_EQ(0.010, reversed.Measure(measurement)); | 
 |   measurement.param = 0.50; | 
 |   EXPECT_DOUBLE_EQ(0.011, reversed.Measure(measurement)); | 
 |   measurement.param = 0.90; | 
 |   EXPECT_DOUBLE_EQ(0.012, reversed.Measure(measurement)); | 
 |  | 
 |   measurement.param = 1.0; | 
 |   EXPECT_DOUBLE_EQ(0.012, regular.Measure(measurement)); | 
 |   measurement.param = 0.0; | 
 |   EXPECT_DOUBLE_EQ(0.010, regular.Measure(measurement)); | 
 |  | 
 |   measurement.param = 1.0; | 
 |   EXPECT_DOUBLE_EQ(0.012, reversed.Measure(measurement)); | 
 |   measurement.param = 0.0; | 
 |   EXPECT_DOUBLE_EQ(0.010, reversed.Measure(measurement)); | 
 | } | 
 |  | 
 | TEST_F(MeasurementsTest, NoMatchingEvent) { | 
 |   // The results should be the same regardless of the order of events. | 
 |   Measurements empty(std::vector<Event>(), | 
 |                      base::TimeTicks::FromInternalValue(0)); | 
 |   Measurements regular(events_, base::TimeTicks::FromInternalValue(0)); | 
 |   Measurements reversed(reversed_, base::TimeTicks::FromInternalValue(0)); | 
 |  | 
 |   EXPECT_DOUBLE_EQ(-1.0, | 
 |                    empty.Measure(Measurement(MeasurementType::AVG_DURATION, | 
 |                                              EventSpec("miss", "cat")))); | 
 |   EXPECT_DOUBLE_EQ(-1.0, | 
 |                    regular.Measure(Measurement(MeasurementType::AVG_DURATION, | 
 |                                                EventSpec("miss", "cat")))); | 
 |   EXPECT_DOUBLE_EQ(-1.0, | 
 |                    reversed.Measure(Measurement(MeasurementType::AVG_DURATION, | 
 |                                                 EventSpec("miss", "cat")))); | 
 |  | 
 |   EXPECT_DOUBLE_EQ(-1.0, empty.Measure(Measurement(MeasurementType::TIME_UNTIL, | 
 |                                                    EventSpec("miss", "cat")))); | 
 |   EXPECT_DOUBLE_EQ(-1.0, | 
 |                    regular.Measure(Measurement(MeasurementType::TIME_UNTIL, | 
 |                                                EventSpec("miss", "cat")))); | 
 |   EXPECT_DOUBLE_EQ(-1.0, | 
 |                    reversed.Measure(Measurement(MeasurementType::TIME_UNTIL, | 
 |                                                 EventSpec("miss", "cat")))); | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | }  // namespace benchmark |