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