| // 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 |