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 <stdbool.h>
6
7#include <unittest/unittest.h>
8#include <zircon/syscalls.h>
9#include <zircon/time.h>
10#include <zircon/types.h>
11
12static bool clock_monotonic_test(void) {
13    BEGIN_TEST;
14
15    const zx_time_t zero = 0;
16
17    zx_time_t previous = zx_clock_get_monotonic();
18
19    for (int idx = 0; idx < 100; ++idx) {
20        zx_time_t current = zx_clock_get_monotonic();
21        ASSERT_GT(current, zero, "monotonic time should be a positive number of nanoseconds");
22        ASSERT_GE(current, previous, "monotonic time should only advance");
23
24        // This calls zx_nanosleep directly rather than using
25        // zx_deadline_after, which internally gets the monotonic
26        // clock.
27        zx_nanosleep(zx_time_add_duration(current, 1000u));
28
29        previous = current;
30    }
31
32    END_TEST;
33}
34
35BEGIN_TEST_CASE(clock_tests)
36RUN_TEST(clock_monotonic_test)
37END_TEST_CASE(clock_tests)
38
39#ifndef BUILD_COMBINED_TESTS
40int main(int argc, char** argv) {
41    return unittest_run_all_tests(argc, argv) ? 0 : -1;
42}
43#endif
44