From 59203c74531dab6239e5655480db7e59d9961251 Mon Sep 17 00:00:00 2001 From: Hanno Cornelius <68783915+jm-clius@users.noreply.github.com> Date: Tue, 21 Feb 2023 14:52:30 +0200 Subject: [PATCH] fix: allow higher resolution timestamps (#1570) * fix: allow higher resolution timestamps * fix: higher precision requires coarser test --- tests/v2/test_utils_time.nim | 35 +++++++++++++++++++++ tests/v2/waku_archive/test_waku_archive.nim | 2 +- waku/v2/utils/time.nim | 14 ++------- 3 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 tests/v2/test_utils_time.nim diff --git a/tests/v2/test_utils_time.nim b/tests/v2/test_utils_time.nim new file mode 100644 index 000000000..e99af727e --- /dev/null +++ b/tests/v2/test_utils_time.nim @@ -0,0 +1,35 @@ +{.used.} + +import + stew/results, + testutils/unittests +import + ../../waku/v2/utils/time + +suite "Utils - Time": + + test "Test timestamp conversion": + ## Given + let + nanoseconds = 1676562429123456789.int64 + secondsPart = nanoseconds div 1_000_000_000 + nanosecondsPart = nanoseconds mod 1_000_000_000 + secondsFloat = secondsPart.float64 + (nanosecondsPart.float64 / 1_000_000_000.float64) + lowResTimestamp = Timestamp(secondsPart.int64 * 1_000_000_000.int64) # 1676562429000000000 + highResTimestamp = Timestamp(secondsFloat * 1_000_000_000.float64) # 1676562429123456789 + + require highResTimestamp > lowResTimestamp # Sanity check + + ## When + let + timeInSecondsInt = secondsPart.int + timeInSecondsInt64 = secondsPart.int64 + timeInSecondsFloat = float(secondsFloat) + timeInSecondsFloat64 = float64(secondsFloat) + + ## Then + check: + getNanosecondTime(timeInSecondsInt) == lowResTimestamp + getNanosecondTime(timeInSecondsInt64) == lowResTimestamp + getNanosecondTime(timeInSecondsFloat) == highResTimestamp + getNanosecondTime(timeInSecondsFloat64) == highResTimestamp diff --git a/tests/v2/waku_archive/test_waku_archive.nim b/tests/v2/waku_archive/test_waku_archive.nim index aee51932f..ea5f04811 100644 --- a/tests/v2/waku_archive/test_waku_archive.nim +++ b/tests/v2/waku_archive/test_waku_archive.nim @@ -100,7 +100,7 @@ suite "Waku Archive - message handling": ## Given let now = now() - invalidSenderTime = now + MaxMessageTimestampVariance + 1 + invalidSenderTime = now + MaxMessageTimestampVariance + 1_000_000_000 # 1 second over the max variance let message = fakeWakuMessage(ts=invalidSenderTime) diff --git a/waku/v2/utils/time.nim b/waku/v2/utils/time.nim index 915d619ed..b773ad3d4 100644 --- a/waku/v2/utils/time.nim +++ b/waku/v2/utils/time.nim @@ -8,20 +8,12 @@ import std/times, metrics -type Timestamp* = int64 +type Timestamp* = int64 # A nanosecond precision timestamp -proc getNanosecondTime*[T](timeInSeconds: T): Timestamp = - var ns = Timestamp(timeInSeconds.int64 * 1000_000_000.int64) +proc getNanosecondTime*[T: SomeNumber](timeInSeconds: T): Timestamp = + var ns = Timestamp(timeInSeconds * 1_000_000_000.T) return ns -proc getMicrosecondTime*[T](timeInSeconds: T): Timestamp = - var us = Timestamp(timeInSeconds.int64 * 1000_000.int64) - return us - -proc getMillisecondTime*[T](timeInSeconds: T): Timestamp = - var ms = Timestamp(timeInSeconds.int64 * 1000.int64) - return ms - proc nowInUnixFloat(): float = return getTime().toUnixFloat()