| // Copyright (c) 2018 Google LLC. |
| // |
| // 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 <unistd.h> |
| #include <sstream> |
| |
| #include "gtest/gtest.h" |
| #include "source/util/timer.h" |
| |
| namespace spvtools { |
| namespace utils { |
| namespace { |
| |
| // A mock class to mimic Timer class for a testing purpose. It has fixed |
| // CPU/WALL/USR/SYS time, RSS delta, and the delta of the number of page faults. |
| class MockTimer : public Timer { |
| public: |
| MockTimer(std::ostream* out, bool measure_mem_usage = false) |
| : Timer(out, measure_mem_usage) {} |
| double CPUTime() override { return 0.019123; } |
| double WallTime() override { return 0.019723; } |
| double UserTime() override { return 0.012723; } |
| double SystemTime() override { return 0.002723; } |
| long RSS() const override { return 360L; } |
| long PageFault() const override { return 3600L; } |
| }; |
| |
| // This unit test checks whether the actual output of MockTimer::Report() is the |
| // same as fixed CPU/WALL/USR/SYS time, RSS delta, and the delta of the number |
| // of page faults that are returned by MockTimer. |
| TEST(MockTimer, DoNothing) { |
| std::ostringstream buf; |
| |
| PrintTimerDescription(&buf); |
| MockTimer timer(&buf); |
| timer.Start(); |
| |
| // Do nothing. |
| |
| timer.Stop(); |
| timer.Report("TimerTest"); |
| |
| EXPECT_EQ(0.019123, timer.CPUTime()); |
| EXPECT_EQ(0.019723, timer.WallTime()); |
| EXPECT_EQ(0.012723, timer.UserTime()); |
| EXPECT_EQ(0.002723, timer.SystemTime()); |
| EXPECT_EQ( |
| " PASS name CPU time WALL time USR time" |
| " SYS time\n TimerTest 0.02 0.02" |
| " 0.01 0.00\n", |
| buf.str()); |
| } |
| |
| // This unit test checks whether the ScopedTimer<MockTimer> correctly reports |
| // the fixed CPU/WALL/USR/SYS time, RSS delta, and the delta of the number of |
| // page faults that are returned by MockTimer. |
| TEST(MockTimer, TestScopedTimer) { |
| std::ostringstream buf; |
| |
| { |
| ScopedTimer<MockTimer> scopedtimer(&buf, "ScopedTimerTest"); |
| // Do nothing. |
| } |
| |
| EXPECT_EQ( |
| " ScopedTimerTest 0.02 0.02 0.01" |
| " 0.00\n", |
| buf.str()); |
| } |
| |
| // A mock class to mimic CumulativeTimer class for a testing purpose. It has |
| // fixed CPU/WALL/USR/SYS time, RSS delta, and the delta of the number of page |
| // faults for each measurement (i.e., a pair of Start() and Stop()). If the |
| // number of measurements increases, it increases |count_stop_| by the number of |
| // calling Stop() and the amount of each resource usage is proportional to |
| // |count_stop_|. |
| class MockCumulativeTimer : public CumulativeTimer { |
| public: |
| MockCumulativeTimer(std::ostream* out, bool measure_mem_usage = false) |
| : CumulativeTimer(out, measure_mem_usage), count_stop_(0) {} |
| double CPUTime() override { return count_stop_ * 0.019123; } |
| double WallTime() override { return count_stop_ * 0.019723; } |
| double UserTime() override { return count_stop_ * 0.012723; } |
| double SystemTime() override { return count_stop_ * 0.002723; } |
| long RSS() const override { return count_stop_ * 360L; } |
| long PageFault() const override { return count_stop_ * 3600L; } |
| |
| // Calling Stop() does nothing but just increases |count_stop_| by 1. |
| void Stop() override { ++count_stop_; }; |
| |
| private: |
| unsigned int count_stop_; |
| }; |
| |
| // This unit test checks whether the MockCumulativeTimer correctly reports the |
| // cumulative CPU/WALL/USR/SYS time, RSS delta, and the delta of the number of |
| // page faults whose values are fixed for each measurement (i.e., a pair of |
| // Start() and Stop()). |
| TEST(MockCumulativeTimer, DoNothing) { |
| CumulativeTimer* ctimer; |
| std::ostringstream buf; |
| |
| { |
| ctimer = new MockCumulativeTimer(&buf); |
| ctimer->Start(); |
| |
| // Do nothing. |
| |
| ctimer->Stop(); |
| } |
| |
| { |
| ctimer->Start(); |
| |
| // Do nothing. |
| |
| ctimer->Stop(); |
| ctimer->Report("CumulativeTimerTest"); |
| } |
| |
| EXPECT_EQ( |
| " CumulativeTimerTest 0.04 0.04 0.03" |
| " 0.01\n", |
| buf.str()); |
| |
| if (ctimer) delete ctimer; |
| } |
| |
| } // namespace |
| } // namespace utils |
| } // namespace spvtools |