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