1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <stdint.h>
6 
7 #include <cobalt-client/cpp/timer.h>
8 #include <lib/fzl/time.h>
9 #include <lib/zx/time.h>
10 #include <unittest/unittest.h>
11 
12 namespace cobalt_client {
13 namespace internal {
14 namespace {
15 
16 class FakeClock {
17 public:
GetInstance()18     static FakeClock& GetInstance() {
19         static FakeClock clock;
20         return clock;
21     }
22 
now()23     static zx::ticks now() { return GetInstance().current(); }
24 
current() const25     zx::ticks current() const { return current_; }
26 
set_current(uint32_t current)27     void set_current(uint32_t current) { current_ = zx::ticks(current); }
28 
29 private:
30     zx::ticks current_ = zx::ticks(0);
31 };
32 
TestCollecting()33 bool TestCollecting() {
34     BEGIN_TEST;
35     FakeClock::GetInstance().set_current(1);
36     TimerBase<FakeClock> timer(true);
37     FakeClock::GetInstance().set_current(4);
38     ASSERT_EQ(timer.End().to_nsecs(), fzl::TicksToNs(zx::ticks(3)).to_nsecs());
39     END_TEST;
40 }
41 
TestNotCollecting()42 bool TestNotCollecting() {
43     BEGIN_TEST;
44     FakeClock::GetInstance().set_current(1);
45     TimerBase<FakeClock> timer(false);
46     FakeClock::GetInstance().set_current(4);
47     ASSERT_EQ(timer.End().to_nsecs(), fzl::TicksToNs(zx::ticks(0)).to_nsecs());
48     END_TEST;
49 }
50 
TestReset()51 bool TestReset() {
52     BEGIN_TEST;
53     FakeClock::GetInstance().set_current(1);
54     TimerBase<FakeClock> timer(true);
55     FakeClock::GetInstance().set_current(4);
56     timer.Reset();
57     FakeClock::GetInstance().set_current(8);
58     ASSERT_EQ(timer.End().to_nsecs(), fzl::TicksToNs(zx::ticks(4)).to_nsecs());
59     END_TEST;
60 }
61 
TestResetNotCollecting()62 bool TestResetNotCollecting() {
63     BEGIN_TEST;
64     FakeClock::GetInstance().set_current(1);
65     TimerBase<FakeClock> timer(false);
66     FakeClock::GetInstance().set_current(4);
67     timer.Reset();
68     FakeClock::GetInstance().set_current(8);
69     ASSERT_EQ(timer.End().to_nsecs(), fzl::TicksToNs(zx::ticks(0)).to_nsecs());
70     END_TEST;
71 }
72 
73 BEGIN_TEST_CASE(TimerTest)
74 RUN_TEST(TestCollecting)
75 RUN_TEST(TestNotCollecting)
76 RUN_TEST(TestReset)
77 RUN_TEST(TestResetNotCollecting)
78 END_TEST_CASE(TimerTest)
79 
80 } // namespace
81 } // namespace internal
82 } // namespace cobalt_client
83