1bf215546Sopenharmony_ci/* 2bf215546Sopenharmony_ci * Copyright © 2016 Collabora, Ltd. 3bf215546Sopenharmony_ci * 4bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining 5bf215546Sopenharmony_ci * a copy of this software and associated documentation files (the 6bf215546Sopenharmony_ci * "Software"), to deal in the Software without restriction, including 7bf215546Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish, 8bf215546Sopenharmony_ci * distribute, sublicense, and/or sell copies of the Software, and to 9bf215546Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to 10bf215546Sopenharmony_ci * the following conditions: 11bf215546Sopenharmony_ci * 12bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the 13bf215546Sopenharmony_ci * next paragraph) shall be included in all copies or substantial 14bf215546Sopenharmony_ci * portions of the Software. 15bf215546Sopenharmony_ci * 16bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17bf215546Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18bf215546Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19bf215546Sopenharmony_ci * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 20bf215546Sopenharmony_ci * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 21bf215546Sopenharmony_ci * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22bf215546Sopenharmony_ci * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23bf215546Sopenharmony_ci * SOFTWARE. 24bf215546Sopenharmony_ci */ 25bf215546Sopenharmony_ci 26bf215546Sopenharmony_ci#include <gtest/gtest.h> 27bf215546Sopenharmony_ci 28bf215546Sopenharmony_ci#include "c11/time.h" 29bf215546Sopenharmony_ci#include "util/timespec.h" 30bf215546Sopenharmony_ci 31bf215546Sopenharmony_ci#include <limits> 32bf215546Sopenharmony_ci 33bf215546Sopenharmony_ciTEST(timespec_test, timespec_add) 34bf215546Sopenharmony_ci{ 35bf215546Sopenharmony_ci struct timespec a, b, r; 36bf215546Sopenharmony_ci 37bf215546Sopenharmony_ci a.tv_sec = 1; 38bf215546Sopenharmony_ci a.tv_nsec = NSEC_PER_SEC - 1; 39bf215546Sopenharmony_ci b.tv_sec = 1; 40bf215546Sopenharmony_ci b.tv_nsec = 2; 41bf215546Sopenharmony_ci timespec_add(&r, &a, &b); 42bf215546Sopenharmony_ci EXPECT_EQ(r.tv_sec, 3); 43bf215546Sopenharmony_ci EXPECT_EQ(r.tv_nsec, 1); 44bf215546Sopenharmony_ci} 45bf215546Sopenharmony_ci 46bf215546Sopenharmony_ciTEST(timespec_test, timespec_sub) 47bf215546Sopenharmony_ci{ 48bf215546Sopenharmony_ci struct timespec a, b, r; 49bf215546Sopenharmony_ci 50bf215546Sopenharmony_ci a.tv_sec = 1; 51bf215546Sopenharmony_ci a.tv_nsec = 1; 52bf215546Sopenharmony_ci b.tv_sec = 0; 53bf215546Sopenharmony_ci b.tv_nsec = 2; 54bf215546Sopenharmony_ci timespec_sub(&r, &a, &b); 55bf215546Sopenharmony_ci EXPECT_EQ(r.tv_sec, 0); 56bf215546Sopenharmony_ci EXPECT_EQ(r.tv_nsec, NSEC_PER_SEC - 1); 57bf215546Sopenharmony_ci} 58bf215546Sopenharmony_ci 59bf215546Sopenharmony_ciTEST(timespec_test, timespec_to_nsec) 60bf215546Sopenharmony_ci{ 61bf215546Sopenharmony_ci struct timespec a; 62bf215546Sopenharmony_ci 63bf215546Sopenharmony_ci a.tv_sec = 4; 64bf215546Sopenharmony_ci a.tv_nsec = 4; 65bf215546Sopenharmony_ci EXPECT_EQ(timespec_to_nsec(&a), (NSEC_PER_SEC * 4ULL) + 4); 66bf215546Sopenharmony_ci} 67bf215546Sopenharmony_ci 68bf215546Sopenharmony_ciTEST(timespec_test, timespec_to_usec) 69bf215546Sopenharmony_ci{ 70bf215546Sopenharmony_ci struct timespec a; 71bf215546Sopenharmony_ci 72bf215546Sopenharmony_ci a.tv_sec = 4; 73bf215546Sopenharmony_ci a.tv_nsec = 4000; 74bf215546Sopenharmony_ci EXPECT_EQ(timespec_to_usec(&a), (4000000ULL) + 4); 75bf215546Sopenharmony_ci} 76bf215546Sopenharmony_ci 77bf215546Sopenharmony_ciTEST(timespec_test, timespec_to_msec) 78bf215546Sopenharmony_ci{ 79bf215546Sopenharmony_ci struct timespec a; 80bf215546Sopenharmony_ci 81bf215546Sopenharmony_ci a.tv_sec = 4; 82bf215546Sopenharmony_ci a.tv_nsec = 4000000; 83bf215546Sopenharmony_ci EXPECT_EQ(timespec_to_msec(&a), (4000ULL) + 4); 84bf215546Sopenharmony_ci} 85bf215546Sopenharmony_ci 86bf215546Sopenharmony_ciTEST(timespec_test, timespec_to_proto) 87bf215546Sopenharmony_ci{ 88bf215546Sopenharmony_ci struct timespec a; 89bf215546Sopenharmony_ci uint32_t tv_sec_hi; 90bf215546Sopenharmony_ci uint32_t tv_sec_lo; 91bf215546Sopenharmony_ci uint32_t tv_nsec; 92bf215546Sopenharmony_ci 93bf215546Sopenharmony_ci a.tv_sec = 0; 94bf215546Sopenharmony_ci a.tv_nsec = 0; 95bf215546Sopenharmony_ci timespec_to_proto(&a, &tv_sec_hi, &tv_sec_lo, &tv_nsec); 96bf215546Sopenharmony_ci EXPECT_EQ(0, tv_sec_hi); 97bf215546Sopenharmony_ci EXPECT_EQ(0, tv_sec_lo); 98bf215546Sopenharmony_ci EXPECT_EQ(0, tv_nsec); 99bf215546Sopenharmony_ci 100bf215546Sopenharmony_ci a.tv_sec = 1234; 101bf215546Sopenharmony_ci a.tv_nsec = NSEC_PER_SEC - 1; 102bf215546Sopenharmony_ci timespec_to_proto(&a, &tv_sec_hi, &tv_sec_lo, &tv_nsec); 103bf215546Sopenharmony_ci EXPECT_EQ(0, tv_sec_hi); 104bf215546Sopenharmony_ci EXPECT_EQ(1234, tv_sec_lo); 105bf215546Sopenharmony_ci EXPECT_EQ(NSEC_PER_SEC - 1, tv_nsec); 106bf215546Sopenharmony_ci 107bf215546Sopenharmony_ci a.tv_sec = (time_t)0x7000123470005678LL; 108bf215546Sopenharmony_ci a.tv_nsec = 1; 109bf215546Sopenharmony_ci timespec_to_proto(&a, &tv_sec_hi, &tv_sec_lo, &tv_nsec); 110bf215546Sopenharmony_ci EXPECT_EQ((uint64_t)a.tv_sec >> 32, tv_sec_hi); 111bf215546Sopenharmony_ci EXPECT_EQ(0x70005678, tv_sec_lo); 112bf215546Sopenharmony_ci EXPECT_EQ(1, tv_nsec); 113bf215546Sopenharmony_ci} 114bf215546Sopenharmony_ci 115bf215546Sopenharmony_ciTEST(timespec_test, millihz_to_nsec) 116bf215546Sopenharmony_ci{ 117bf215546Sopenharmony_ci EXPECT_EQ(millihz_to_nsec(60000), 16666666); 118bf215546Sopenharmony_ci} 119bf215546Sopenharmony_ci 120bf215546Sopenharmony_ciTEST(timespec_test, time_t_max) 121bf215546Sopenharmony_ci{ 122bf215546Sopenharmony_ci /* The TIME_T_MAX macro assumes it's no more than 64 bits */ 123bf215546Sopenharmony_ci EXPECT_LE(sizeof(time_t), sizeof(uint64_t)); 124bf215546Sopenharmony_ci 125bf215546Sopenharmony_ci time_t t = TIME_T_MAX; 126bf215546Sopenharmony_ci EXPECT_EQ((uint64_t)t, (uint64_t)TIME_T_MAX); 127bf215546Sopenharmony_ci 128bf215546Sopenharmony_ci /* Since the tests are C++ code, we have std::numeric_limits */ 129bf215546Sopenharmony_ci EXPECT_EQ(std::numeric_limits<time_t>::max(), TIME_T_MAX); 130bf215546Sopenharmony_ci} 131bf215546Sopenharmony_ci 132bf215546Sopenharmony_ciTEST(timespec_test, timespec_add_nsec) 133bf215546Sopenharmony_ci{ 134bf215546Sopenharmony_ci struct timespec a, r; 135bf215546Sopenharmony_ci 136bf215546Sopenharmony_ci a.tv_sec = 0; 137bf215546Sopenharmony_ci a.tv_nsec = NSEC_PER_SEC - 1; 138bf215546Sopenharmony_ci EXPECT_FALSE(timespec_add_nsec(&r, &a, 1)); 139bf215546Sopenharmony_ci EXPECT_EQ(1, r.tv_sec); 140bf215546Sopenharmony_ci EXPECT_EQ(0, r.tv_nsec); 141bf215546Sopenharmony_ci 142bf215546Sopenharmony_ci EXPECT_FALSE(timespec_add_nsec(&r, &a, 2)); 143bf215546Sopenharmony_ci EXPECT_EQ(1, r.tv_sec); 144bf215546Sopenharmony_ci EXPECT_EQ(1, r.tv_nsec); 145bf215546Sopenharmony_ci 146bf215546Sopenharmony_ci EXPECT_FALSE(timespec_add_nsec(&r, &a, (NSEC_PER_SEC * 2ULL))); 147bf215546Sopenharmony_ci EXPECT_EQ(2, r.tv_sec); 148bf215546Sopenharmony_ci EXPECT_EQ(NSEC_PER_SEC - 1, r.tv_nsec); 149bf215546Sopenharmony_ci 150bf215546Sopenharmony_ci EXPECT_FALSE(timespec_add_nsec(&r, &a, (NSEC_PER_SEC * 2ULL) + 2)); 151bf215546Sopenharmony_ci EXPECT_EQ(r.tv_sec, 3); 152bf215546Sopenharmony_ci EXPECT_EQ(r.tv_nsec, 1); 153bf215546Sopenharmony_ci 154bf215546Sopenharmony_ci r.tv_sec = 4; 155bf215546Sopenharmony_ci r.tv_nsec = 0; 156bf215546Sopenharmony_ci EXPECT_FALSE(timespec_add_nsec(&r, &r, NSEC_PER_SEC + 10ULL)); 157bf215546Sopenharmony_ci EXPECT_EQ(5, r.tv_sec); 158bf215546Sopenharmony_ci EXPECT_EQ(10, r.tv_nsec); 159bf215546Sopenharmony_ci 160bf215546Sopenharmony_ci EXPECT_FALSE(timespec_add_nsec(&r, &r, (NSEC_PER_SEC * 3ULL) - 9ULL)); 161bf215546Sopenharmony_ci EXPECT_EQ(8, r.tv_sec); 162bf215546Sopenharmony_ci EXPECT_EQ(1, r.tv_nsec); 163bf215546Sopenharmony_ci 164bf215546Sopenharmony_ci EXPECT_FALSE(timespec_add_nsec(&r, &r, (NSEC_PER_SEC * 7ULL) + 165bf215546Sopenharmony_ci (NSEC_PER_SEC - 1ULL))); 166bf215546Sopenharmony_ci EXPECT_EQ(16, r.tv_sec); 167bf215546Sopenharmony_ci EXPECT_EQ(0, r.tv_nsec); 168bf215546Sopenharmony_ci 169bf215546Sopenharmony_ci a.tv_sec = TIME_T_MAX; 170bf215546Sopenharmony_ci a.tv_nsec = 0; 171bf215546Sopenharmony_ci EXPECT_TRUE(timespec_add_nsec(&r, &a, UINT64_MAX)); 172bf215546Sopenharmony_ci 173bf215546Sopenharmony_ci a.tv_sec = TIME_T_MAX; 174bf215546Sopenharmony_ci a.tv_nsec = 0; 175bf215546Sopenharmony_ci EXPECT_TRUE(timespec_add_nsec(&r, &a, NSEC_PER_SEC)); 176bf215546Sopenharmony_ci 177bf215546Sopenharmony_ci a.tv_sec = TIME_T_MAX; 178bf215546Sopenharmony_ci a.tv_nsec = NSEC_PER_SEC / 2; 179bf215546Sopenharmony_ci EXPECT_TRUE(timespec_add_nsec(&r, &a, NSEC_PER_SEC / 2)); 180bf215546Sopenharmony_ci} 181bf215546Sopenharmony_ci 182bf215546Sopenharmony_ciTEST(timespec_test, timespec_add_msec) 183bf215546Sopenharmony_ci{ 184bf215546Sopenharmony_ci struct timespec a, r; 185bf215546Sopenharmony_ci 186bf215546Sopenharmony_ci a.tv_sec = 1000; 187bf215546Sopenharmony_ci a.tv_nsec = 1; 188bf215546Sopenharmony_ci timespec_add_msec(&r, &a, 2002); 189bf215546Sopenharmony_ci EXPECT_EQ(1002, r.tv_sec); 190bf215546Sopenharmony_ci EXPECT_EQ(2000001, r.tv_nsec); 191bf215546Sopenharmony_ci} 192bf215546Sopenharmony_ci 193bf215546Sopenharmony_ciTEST(timespec_test, timespec_sub_to_nsec) 194bf215546Sopenharmony_ci{ 195bf215546Sopenharmony_ci struct timespec a, b; 196bf215546Sopenharmony_ci 197bf215546Sopenharmony_ci a.tv_sec = 1000; 198bf215546Sopenharmony_ci a.tv_nsec = 1; 199bf215546Sopenharmony_ci b.tv_sec = 1; 200bf215546Sopenharmony_ci b.tv_nsec = 2; 201bf215546Sopenharmony_ci EXPECT_EQ((999LL * NSEC_PER_SEC) - 1, timespec_sub_to_nsec(&a, &b)); 202bf215546Sopenharmony_ci} 203bf215546Sopenharmony_ci 204bf215546Sopenharmony_ciTEST(timespec_test, timespec_sub_to_msec) 205bf215546Sopenharmony_ci{ 206bf215546Sopenharmony_ci struct timespec a, b; 207bf215546Sopenharmony_ci 208bf215546Sopenharmony_ci a.tv_sec = 1000; 209bf215546Sopenharmony_ci a.tv_nsec = 2000000L; 210bf215546Sopenharmony_ci b.tv_sec = 2; 211bf215546Sopenharmony_ci b.tv_nsec = 1000000L; 212bf215546Sopenharmony_ci EXPECT_EQ((998 * 1000) + 1, timespec_sub_to_msec(&a, &b)); 213bf215546Sopenharmony_ci} 214bf215546Sopenharmony_ci 215bf215546Sopenharmony_ciTEST(timespec_test, timespec_from_nsec) 216bf215546Sopenharmony_ci{ 217bf215546Sopenharmony_ci struct timespec a; 218bf215546Sopenharmony_ci 219bf215546Sopenharmony_ci timespec_from_nsec(&a, 0); 220bf215546Sopenharmony_ci EXPECT_EQ(0, a.tv_sec); 221bf215546Sopenharmony_ci EXPECT_EQ(0, a.tv_nsec); 222bf215546Sopenharmony_ci 223bf215546Sopenharmony_ci timespec_from_nsec(&a, NSEC_PER_SEC - 1); 224bf215546Sopenharmony_ci EXPECT_EQ(0, a.tv_sec); 225bf215546Sopenharmony_ci EXPECT_EQ(NSEC_PER_SEC - 1, a.tv_nsec); 226bf215546Sopenharmony_ci 227bf215546Sopenharmony_ci timespec_from_nsec(&a, NSEC_PER_SEC); 228bf215546Sopenharmony_ci EXPECT_EQ(1, a.tv_sec); 229bf215546Sopenharmony_ci EXPECT_EQ(0, a.tv_nsec); 230bf215546Sopenharmony_ci 231bf215546Sopenharmony_ci timespec_from_nsec(&a, (5LL * NSEC_PER_SEC) + 1); 232bf215546Sopenharmony_ci EXPECT_EQ(5, a.tv_sec); 233bf215546Sopenharmony_ci EXPECT_EQ(1, a.tv_nsec); 234bf215546Sopenharmony_ci 235bf215546Sopenharmony_ci timespec_from_nsec(&a, UINT64_MAX); 236bf215546Sopenharmony_ci EXPECT_EQ(a.tv_nsec, UINT64_MAX % NSEC_PER_SEC); 237bf215546Sopenharmony_ci EXPECT_EQ(a.tv_sec, (time_t)(UINT64_MAX / NSEC_PER_SEC)); 238bf215546Sopenharmony_ci} 239bf215546Sopenharmony_ci 240bf215546Sopenharmony_ciTEST(timespec_test, timespec_from_usec) 241bf215546Sopenharmony_ci{ 242bf215546Sopenharmony_ci struct timespec a; 243bf215546Sopenharmony_ci 244bf215546Sopenharmony_ci timespec_from_usec(&a, 0); 245bf215546Sopenharmony_ci EXPECT_EQ(0, a.tv_sec); 246bf215546Sopenharmony_ci EXPECT_EQ(0, a.tv_nsec); 247bf215546Sopenharmony_ci 248bf215546Sopenharmony_ci timespec_from_usec(&a, 999999); 249bf215546Sopenharmony_ci EXPECT_EQ(0, a.tv_sec); 250bf215546Sopenharmony_ci EXPECT_EQ(999999 * 1000, a.tv_nsec); 251bf215546Sopenharmony_ci 252bf215546Sopenharmony_ci timespec_from_usec(&a, 1000000); 253bf215546Sopenharmony_ci EXPECT_EQ(1, a.tv_sec); 254bf215546Sopenharmony_ci EXPECT_EQ(0, a.tv_nsec); 255bf215546Sopenharmony_ci 256bf215546Sopenharmony_ci timespec_from_usec(&a, 5000001); 257bf215546Sopenharmony_ci EXPECT_EQ(5, a.tv_sec); 258bf215546Sopenharmony_ci EXPECT_EQ(1000, a.tv_nsec); 259bf215546Sopenharmony_ci} 260bf215546Sopenharmony_ci 261bf215546Sopenharmony_ciTEST(timespec_test, timespec_from_msec) 262bf215546Sopenharmony_ci{ 263bf215546Sopenharmony_ci struct timespec a; 264bf215546Sopenharmony_ci 265bf215546Sopenharmony_ci timespec_from_msec(&a, 0); 266bf215546Sopenharmony_ci EXPECT_EQ(0, a.tv_sec); 267bf215546Sopenharmony_ci EXPECT_EQ(0, a.tv_nsec); 268bf215546Sopenharmony_ci 269bf215546Sopenharmony_ci timespec_from_msec(&a, 999); 270bf215546Sopenharmony_ci EXPECT_EQ(0, a.tv_sec); 271bf215546Sopenharmony_ci EXPECT_EQ(999 * 1000000, a.tv_nsec); 272bf215546Sopenharmony_ci 273bf215546Sopenharmony_ci timespec_from_msec(&a, 1000); 274bf215546Sopenharmony_ci EXPECT_EQ(1, a.tv_sec); 275bf215546Sopenharmony_ci EXPECT_EQ(0, a.tv_nsec); 276bf215546Sopenharmony_ci 277bf215546Sopenharmony_ci timespec_from_msec(&a, 5001); 278bf215546Sopenharmony_ci EXPECT_EQ(5, a.tv_sec); 279bf215546Sopenharmony_ci EXPECT_EQ(1000000, a.tv_nsec); 280bf215546Sopenharmony_ci} 281bf215546Sopenharmony_ci 282bf215546Sopenharmony_ciTEST(timespec_test, timespec_from_proto) 283bf215546Sopenharmony_ci{ 284bf215546Sopenharmony_ci struct timespec a; 285bf215546Sopenharmony_ci 286bf215546Sopenharmony_ci timespec_from_proto(&a, 0, 0, 0); 287bf215546Sopenharmony_ci EXPECT_EQ(0, a.tv_sec); 288bf215546Sopenharmony_ci EXPECT_EQ(0, a.tv_nsec); 289bf215546Sopenharmony_ci 290bf215546Sopenharmony_ci timespec_from_proto(&a, 0, 1234, 9999); 291bf215546Sopenharmony_ci EXPECT_EQ(1234, a.tv_sec); 292bf215546Sopenharmony_ci EXPECT_EQ(9999, a.tv_nsec); 293bf215546Sopenharmony_ci 294bf215546Sopenharmony_ci timespec_from_proto(&a, 0x1234, 0x5678, 1); 295bf215546Sopenharmony_ci EXPECT_EQ((time_t)0x0000123400005678LL, a.tv_sec); 296bf215546Sopenharmony_ci EXPECT_EQ(1, a.tv_nsec); 297bf215546Sopenharmony_ci} 298bf215546Sopenharmony_ci 299bf215546Sopenharmony_ciTEST(timespec_test, timespec_is_zero) 300bf215546Sopenharmony_ci{ 301bf215546Sopenharmony_ci struct timespec zero = { 0 }; 302bf215546Sopenharmony_ci struct timespec non_zero_sec = { 1, 0 }; 303bf215546Sopenharmony_ci struct timespec non_zero_nsec = { 0, 1 }; 304bf215546Sopenharmony_ci 305bf215546Sopenharmony_ci EXPECT_TRUE(timespec_is_zero(&zero)); 306bf215546Sopenharmony_ci EXPECT_FALSE(timespec_is_zero(&non_zero_nsec)); 307bf215546Sopenharmony_ci EXPECT_FALSE(timespec_is_zero(&non_zero_sec)); 308bf215546Sopenharmony_ci} 309bf215546Sopenharmony_ci 310bf215546Sopenharmony_ciTEST(timespec_test, timespec_eq) 311bf215546Sopenharmony_ci{ 312bf215546Sopenharmony_ci struct timespec a = { 2, 1 }; 313bf215546Sopenharmony_ci struct timespec b = { -1, 2 }; 314bf215546Sopenharmony_ci 315bf215546Sopenharmony_ci EXPECT_TRUE(timespec_eq(&a, &a)); 316bf215546Sopenharmony_ci EXPECT_TRUE(timespec_eq(&b, &b)); 317bf215546Sopenharmony_ci 318bf215546Sopenharmony_ci EXPECT_FALSE(timespec_eq(&a, &b)); 319bf215546Sopenharmony_ci EXPECT_FALSE(timespec_eq(&b, &a)); 320bf215546Sopenharmony_ci} 321bf215546Sopenharmony_ci 322bf215546Sopenharmony_ciTEST(timespec_test, timespec_get) 323bf215546Sopenharmony_ci{ 324bf215546Sopenharmony_ci struct timespec a; 325bf215546Sopenharmony_ci struct timespec b; 326bf215546Sopenharmony_ci time_t t; 327bf215546Sopenharmony_ci timespec_get(&a, TIME_UTC); 328bf215546Sopenharmony_ci time(&t); 329bf215546Sopenharmony_ci timespec_get(&b, TIME_UTC); 330bf215546Sopenharmony_ci /* `t + 1` and `t - 1` are used intentionally for avoid flakes */ 331bf215546Sopenharmony_ci EXPECT_LE(a.tv_sec, t + 1); 332bf215546Sopenharmony_ci EXPECT_LE(t - 1, b.tv_sec); 333bf215546Sopenharmony_ci} 334