blob: f4ca369fa2e994d7302674fd4f25c0f1bfaa1563 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <lib/fzl/time.h>
#include <fbl/algorithm.h>
#include <unittest/unittest.h>
#include <zircon/syscalls.h>
namespace {
template <typename T>
bool AlmostEqual(T t0, T t1, T e) {
BEGIN_HELPER;
char buf[128];
snprintf(buf, sizeof(buf), "%zu != %zu (within error of %zu)", t0, t1, e);
ASSERT_TRUE(fbl::min(t0, t1) + e >= fbl::max(t0, t1), buf);
END_HELPER;
}
bool TickConverter(zx::ticks ticks, zx::ticks err) {
BEGIN_HELPER;
ASSERT_TRUE(AlmostEqual(ticks.get(), fzl::NsToTicks(fzl::TicksToNs(ticks)).get(), err.get()));
ASSERT_TRUE(AlmostEqual(ticks.get(), ns_to_ticks(ticks_to_ns(ticks.get())), err.get()));
END_HELPER;
}
bool NsConverter(zx::duration ns, zx::duration err) {
BEGIN_HELPER;
ASSERT_TRUE(AlmostEqual(ns.get(), fzl::TicksToNs(fzl::NsToTicks(ns)).get(), err.get()));
ASSERT_TRUE(AlmostEqual(ns.get(), ticks_to_ns(ns_to_ticks(ns.get())), err.get()));
END_HELPER;
}
bool TimeTest() {
BEGIN_TEST;
zx::ticks tps = zx::ticks::per_second();
zx::duration nps = zx::sec(1);
zx::ticks tick_loss = fbl::max(zx::ticks(tps.get() / nps.get()), zx::ticks(1));
zx::duration duration_loss = fbl::max(zx::duration(nps.get() / tps.get()), zx::duration(1));
ASSERT_TRUE(TickConverter(zx::ticks(0), zx::ticks(0)));
ASSERT_TRUE(TickConverter(zx::ticks(50), tick_loss));
ASSERT_TRUE(TickConverter(zx::ticks(100), tick_loss));
ASSERT_TRUE(TickConverter(zx::ticks(100000), tick_loss));
ASSERT_TRUE(TickConverter(zx::ticks(1000000000), tick_loss));
ASSERT_TRUE(TickConverter(zx::ticks(10000000000000), tick_loss));
ASSERT_TRUE(NsConverter(zx::duration(0), zx::duration(0)));
ASSERT_TRUE(NsConverter(zx::duration(50), duration_loss));
ASSERT_TRUE(NsConverter(zx::duration(100), duration_loss));
ASSERT_TRUE(NsConverter(zx::duration(100000), duration_loss));
ASSERT_TRUE(NsConverter(zx::duration(1000000000), duration_loss));
ASSERT_TRUE(NsConverter(zx::duration(10000000000000), duration_loss));
END_TEST;
}
} // namespace
BEGIN_TEST_CASE(libfzl_tests)
RUN_TEST(TimeTest)
END_TEST_CASE(libfzl_tests)
int main(int argc, char** argv) {
bool success = unittest_run_all_tests(argc, argv);
return success ? 0 : -1;
}