blob: 3af37522c412e8425df3e808c11d2bd476e76719 [file] [log] [blame]
// Copyright 2018 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "src/main/cpp/util/profiler.h"
#include <thread> // NOLINT
#include "googletest/include/gtest/gtest.h"
namespace blaze_util {
namespace profiler {
static void SleepMeasurably() {
// The profiler should have at least 1 ms precision.
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
TEST(ProfilerTest, TestStopWatchMeasuresElapsedTime) {
StopWatch sw1, sw2;
SleepMeasurably();
Duration t1 = Duration::FromTicks(sw1.Elapsed());
SleepMeasurably();
Duration t2 = Duration::FromTicks(sw1.Elapsed());
// Assert that two sleeps show a longer elapsed time than one sleep.
ASSERT_GT(t2.micros_, t1.micros_);
sw2.Reset();
SleepMeasurably();
Duration t3_not_reset = Duration::FromTicks(sw1.Elapsed());
Duration t3_reset = Duration::FromTicks(sw2.Elapsed());
// Assert that sleeping the same amounts, a Reset() call results in less
// elapsed time in one StopWatch than in the other. (This way we don't rely on
// sleep completing in a timely manner.)
ASSERT_GT(t3_not_reset.micros_, t3_reset.micros_);
}
TEST(ProfilerTest, TestScopedTaskMeasuresElapsedTime) {
Task scope1("task 2"), scope2("task 2"), scope_both("tasks 1 and 2");
{
ScopedTask p1(&scope1), p2(&scope_both);
SleepMeasurably();
}
{
ScopedTask p1(&scope2), p2(&scope_both);
SleepMeasurably();
SleepMeasurably();
}
ASSERT_GT(scope_both.GetDuration().micros_, scope1.GetDuration().micros_);
ASSERT_GT(scope_both.GetDuration().micros_, scope2.GetDuration().micros_);
ASSERT_EQ(scope1.GetCalls(), 1u);
ASSERT_EQ(scope2.GetCalls(), 1u);
ASSERT_EQ(scope_both.GetCalls(), 2u);
}
} // namespace profiler
} // namespace blaze_util