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