blob: 7076776a148ca4b025c081d6069a6d88121c8a7a [file] [log] [blame]
// 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