blob: cc0f8bbe02827e373354597d1679d1f88e005ecb [file] [log] [blame]
/*
*
* Copyright (c) 2020-2021 Project CHIP Authors
* Copyright (c) 2016-2017 Nest Labs, Inc.
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file
* This file implements a process to effect a functional test for
* the CHIP date and time support utilities.
*
*/
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <nlunit-test.h>
#include <lib/support/TimeUtils.h>
#include <lib/support/UnitTestRegistration.h>
#include <lib/support/logging/CHIPLogging.h>
using namespace chip;
#define TestAssert(cond, message) \
do \
{ \
if (!(cond)) \
{ \
ChipLogError(NotSpecified, "%s", (message)); \
} \
NL_TEST_ASSERT(inSuite, (cond)); \
\
if (!(cond)) \
return; \
} while (0)
struct OrdinalDateTestValue
{
uint16_t DayOfYear;
uint8_t Month;
uint8_t DayOfMonth;
};
// clang-format off
OrdinalDateTestValue StandardYearOrdinalDates[] =
{
{ 1, 1, 1 },
{ 2, 1, 2 },
{ 3, 1, 3 },
{ 4, 1, 4 },
{ 5, 1, 5 },
{ 6, 1, 6 },
{ 7, 1, 7 },
{ 8, 1, 8 },
{ 9, 1, 9 },
{ 10, 1, 10 },
{ 11, 1, 11 },
{ 12, 1, 12 },
{ 13, 1, 13 },
{ 14, 1, 14 },
{ 15, 1, 15 },
{ 16, 1, 16 },
{ 17, 1, 17 },
{ 18, 1, 18 },
{ 19, 1, 19 },
{ 20, 1, 20 },
{ 21, 1, 21 },
{ 22, 1, 22 },
{ 23, 1, 23 },
{ 24, 1, 24 },
{ 25, 1, 25 },
{ 26, 1, 26 },
{ 27, 1, 27 },
{ 28, 1, 28 },
{ 29, 1, 29 },
{ 30, 1, 30 },
{ 31, 1, 31 },
{ 32, 2, 1 },
{ 33, 2, 2 },
{ 34, 2, 3 },
{ 35, 2, 4 },
{ 36, 2, 5 },
{ 37, 2, 6 },
{ 38, 2, 7 },
{ 39, 2, 8 },
{ 40, 2, 9 },
{ 41, 2, 10 },
{ 42, 2, 11 },
{ 43, 2, 12 },
{ 44, 2, 13 },
{ 45, 2, 14 },
{ 46, 2, 15 },
{ 47, 2, 16 },
{ 48, 2, 17 },
{ 49, 2, 18 },
{ 50, 2, 19 },
{ 51, 2, 20 },
{ 52, 2, 21 },
{ 53, 2, 22 },
{ 54, 2, 23 },
{ 55, 2, 24 },
{ 56, 2, 25 },
{ 57, 2, 26 },
{ 58, 2, 27 },
{ 59, 2, 28 },
{ 60, 3, 1 },
{ 61, 3, 2 },
{ 62, 3, 3 },
{ 63, 3, 4 },
{ 64, 3, 5 },
{ 65, 3, 6 },
{ 66, 3, 7 },
{ 67, 3, 8 },
{ 68, 3, 9 },
{ 69, 3, 10 },
{ 70, 3, 11 },
{ 71, 3, 12 },
{ 72, 3, 13 },
{ 73, 3, 14 },
{ 74, 3, 15 },
{ 75, 3, 16 },
{ 76, 3, 17 },
{ 77, 3, 18 },
{ 78, 3, 19 },
{ 79, 3, 20 },
{ 80, 3, 21 },
{ 81, 3, 22 },
{ 82, 3, 23 },
{ 83, 3, 24 },
{ 84, 3, 25 },
{ 85, 3, 26 },
{ 86, 3, 27 },
{ 87, 3, 28 },
{ 88, 3, 29 },
{ 89, 3, 30 },
{ 90, 3, 31 },
{ 91, 4, 1 },
{ 92, 4, 2 },
{ 93, 4, 3 },
{ 94, 4, 4 },
{ 95, 4, 5 },
{ 96, 4, 6 },
{ 97, 4, 7 },
{ 98, 4, 8 },
{ 99, 4, 9 },
{ 100, 4, 10 },
{ 101, 4, 11 },
{ 102, 4, 12 },
{ 103, 4, 13 },
{ 104, 4, 14 },
{ 105, 4, 15 },
{ 106, 4, 16 },
{ 107, 4, 17 },
{ 108, 4, 18 },
{ 109, 4, 19 },
{ 110, 4, 20 },
{ 111, 4, 21 },
{ 112, 4, 22 },
{ 113, 4, 23 },
{ 114, 4, 24 },
{ 115, 4, 25 },
{ 116, 4, 26 },
{ 117, 4, 27 },
{ 118, 4, 28 },
{ 119, 4, 29 },
{ 120, 4, 30 },
{ 121, 5, 1 },
{ 122, 5, 2 },
{ 123, 5, 3 },
{ 124, 5, 4 },
{ 125, 5, 5 },
{ 126, 5, 6 },
{ 127, 5, 7 },
{ 128, 5, 8 },
{ 129, 5, 9 },
{ 130, 5, 10 },
{ 131, 5, 11 },
{ 132, 5, 12 },
{ 133, 5, 13 },
{ 134, 5, 14 },
{ 135, 5, 15 },
{ 136, 5, 16 },
{ 137, 5, 17 },
{ 138, 5, 18 },
{ 139, 5, 19 },
{ 140, 5, 20 },
{ 141, 5, 21 },
{ 142, 5, 22 },
{ 143, 5, 23 },
{ 144, 5, 24 },
{ 145, 5, 25 },
{ 146, 5, 26 },
{ 147, 5, 27 },
{ 148, 5, 28 },
{ 149, 5, 29 },
{ 150, 5, 30 },
{ 151, 5, 31 },
{ 152, 6, 1 },
{ 153, 6, 2 },
{ 154, 6, 3 },
{ 155, 6, 4 },
{ 156, 6, 5 },
{ 157, 6, 6 },
{ 158, 6, 7 },
{ 159, 6, 8 },
{ 160, 6, 9 },
{ 161, 6, 10 },
{ 162, 6, 11 },
{ 163, 6, 12 },
{ 164, 6, 13 },
{ 165, 6, 14 },
{ 166, 6, 15 },
{ 167, 6, 16 },
{ 168, 6, 17 },
{ 169, 6, 18 },
{ 170, 6, 19 },
{ 171, 6, 20 },
{ 172, 6, 21 },
{ 173, 6, 22 },
{ 174, 6, 23 },
{ 175, 6, 24 },
{ 176, 6, 25 },
{ 177, 6, 26 },
{ 178, 6, 27 },
{ 179, 6, 28 },
{ 180, 6, 29 },
{ 181, 6, 30 },
{ 182, 7, 1 },
{ 183, 7, 2 },
{ 184, 7, 3 },
{ 185, 7, 4 },
{ 186, 7, 5 },
{ 187, 7, 6 },
{ 188, 7, 7 },
{ 189, 7, 8 },
{ 190, 7, 9 },
{ 191, 7, 10 },
{ 192, 7, 11 },
{ 193, 7, 12 },
{ 194, 7, 13 },
{ 195, 7, 14 },
{ 196, 7, 15 },
{ 197, 7, 16 },
{ 198, 7, 17 },
{ 199, 7, 18 },
{ 200, 7, 19 },
{ 201, 7, 20 },
{ 202, 7, 21 },
{ 203, 7, 22 },
{ 204, 7, 23 },
{ 205, 7, 24 },
{ 206, 7, 25 },
{ 207, 7, 26 },
{ 208, 7, 27 },
{ 209, 7, 28 },
{ 210, 7, 29 },
{ 211, 7, 30 },
{ 212, 7, 31 },
{ 213, 8, 1 },
{ 214, 8, 2 },
{ 215, 8, 3 },
{ 216, 8, 4 },
{ 217, 8, 5 },
{ 218, 8, 6 },
{ 219, 8, 7 },
{ 220, 8, 8 },
{ 221, 8, 9 },
{ 222, 8, 10 },
{ 223, 8, 11 },
{ 224, 8, 12 },
{ 225, 8, 13 },
{ 226, 8, 14 },
{ 227, 8, 15 },
{ 228, 8, 16 },
{ 229, 8, 17 },
{ 230, 8, 18 },
{ 231, 8, 19 },
{ 232, 8, 20 },
{ 233, 8, 21 },
{ 234, 8, 22 },
{ 235, 8, 23 },
{ 236, 8, 24 },
{ 237, 8, 25 },
{ 238, 8, 26 },
{ 239, 8, 27 },
{ 240, 8, 28 },
{ 241, 8, 29 },
{ 242, 8, 30 },
{ 243, 8, 31 },
{ 244, 9, 1 },
{ 245, 9, 2 },
{ 246, 9, 3 },
{ 247, 9, 4 },
{ 248, 9, 5 },
{ 249, 9, 6 },
{ 250, 9, 7 },
{ 251, 9, 8 },
{ 252, 9, 9 },
{ 253, 9, 10 },
{ 254, 9, 11 },
{ 255, 9, 12 },
{ 256, 9, 13 },
{ 257, 9, 14 },
{ 258, 9, 15 },
{ 259, 9, 16 },
{ 260, 9, 17 },
{ 261, 9, 18 },
{ 262, 9, 19 },
{ 263, 9, 20 },
{ 264, 9, 21 },
{ 265, 9, 22 },
{ 266, 9, 23 },
{ 267, 9, 24 },
{ 268, 9, 25 },
{ 269, 9, 26 },
{ 270, 9, 27 },
{ 271, 9, 28 },
{ 272, 9, 29 },
{ 273, 9, 30 },
{ 274, 10, 1 },
{ 275, 10, 2 },
{ 276, 10, 3 },
{ 277, 10, 4 },
{ 278, 10, 5 },
{ 279, 10, 6 },
{ 280, 10, 7 },
{ 281, 10, 8 },
{ 282, 10, 9 },
{ 283, 10, 10 },
{ 284, 10, 11 },
{ 285, 10, 12 },
{ 286, 10, 13 },
{ 287, 10, 14 },
{ 288, 10, 15 },
{ 289, 10, 16 },
{ 290, 10, 17 },
{ 291, 10, 18 },
{ 292, 10, 19 },
{ 293, 10, 20 },
{ 294, 10, 21 },
{ 295, 10, 22 },
{ 296, 10, 23 },
{ 297, 10, 24 },
{ 298, 10, 25 },
{ 299, 10, 26 },
{ 300, 10, 27 },
{ 301, 10, 28 },
{ 302, 10, 29 },
{ 303, 10, 30 },
{ 304, 10, 31 },
{ 305, 11, 1 },
{ 306, 11, 2 },
{ 307, 11, 3 },
{ 308, 11, 4 },
{ 309, 11, 5 },
{ 310, 11, 6 },
{ 311, 11, 7 },
{ 312, 11, 8 },
{ 313, 11, 9 },
{ 314, 11, 10 },
{ 315, 11, 11 },
{ 316, 11, 12 },
{ 317, 11, 13 },
{ 318, 11, 14 },
{ 319, 11, 15 },
{ 320, 11, 16 },
{ 321, 11, 17 },
{ 322, 11, 18 },
{ 323, 11, 19 },
{ 324, 11, 20 },
{ 325, 11, 21 },
{ 326, 11, 22 },
{ 327, 11, 23 },
{ 328, 11, 24 },
{ 329, 11, 25 },
{ 330, 11, 26 },
{ 331, 11, 27 },
{ 332, 11, 28 },
{ 333, 11, 29 },
{ 334, 11, 30 },
{ 335, 12, 1 },
{ 336, 12, 2 },
{ 337, 12, 3 },
{ 338, 12, 4 },
{ 339, 12, 5 },
{ 340, 12, 6 },
{ 341, 12, 7 },
{ 342, 12, 8 },
{ 343, 12, 9 },
{ 344, 12, 10 },
{ 345, 12, 11 },
{ 346, 12, 12 },
{ 347, 12, 13 },
{ 348, 12, 14 },
{ 349, 12, 15 },
{ 350, 12, 16 },
{ 351, 12, 17 },
{ 352, 12, 18 },
{ 353, 12, 19 },
{ 354, 12, 20 },
{ 355, 12, 21 },
{ 356, 12, 22 },
{ 357, 12, 23 },
{ 358, 12, 24 },
{ 359, 12, 25 },
{ 360, 12, 26 },
{ 361, 12, 27 },
{ 362, 12, 28 },
{ 363, 12, 29 },
{ 364, 12, 30 },
{ 365, 12, 31 },
{ 0, 0, 0 }
};
OrdinalDateTestValue LeapYearOrdinalDates[] =
{
{ 1, 1, 1 },
{ 2, 1, 2 },
{ 3, 1, 3 },
{ 4, 1, 4 },
{ 5, 1, 5 },
{ 6, 1, 6 },
{ 7, 1, 7 },
{ 8, 1, 8 },
{ 9, 1, 9 },
{ 10, 1, 10 },
{ 11, 1, 11 },
{ 12, 1, 12 },
{ 13, 1, 13 },
{ 14, 1, 14 },
{ 15, 1, 15 },
{ 16, 1, 16 },
{ 17, 1, 17 },
{ 18, 1, 18 },
{ 19, 1, 19 },
{ 20, 1, 20 },
{ 21, 1, 21 },
{ 22, 1, 22 },
{ 23, 1, 23 },
{ 24, 1, 24 },
{ 25, 1, 25 },
{ 26, 1, 26 },
{ 27, 1, 27 },
{ 28, 1, 28 },
{ 29, 1, 29 },
{ 30, 1, 30 },
{ 31, 1, 31 },
{ 32, 2, 1 },
{ 33, 2, 2 },
{ 34, 2, 3 },
{ 35, 2, 4 },
{ 36, 2, 5 },
{ 37, 2, 6 },
{ 38, 2, 7 },
{ 39, 2, 8 },
{ 40, 2, 9 },
{ 41, 2, 10 },
{ 42, 2, 11 },
{ 43, 2, 12 },
{ 44, 2, 13 },
{ 45, 2, 14 },
{ 46, 2, 15 },
{ 47, 2, 16 },
{ 48, 2, 17 },
{ 49, 2, 18 },
{ 50, 2, 19 },
{ 51, 2, 20 },
{ 52, 2, 21 },
{ 53, 2, 22 },
{ 54, 2, 23 },
{ 55, 2, 24 },
{ 56, 2, 25 },
{ 57, 2, 26 },
{ 58, 2, 27 },
{ 59, 2, 28 },
{ 60, 2, 29 },
{ 61, 3, 1 },
{ 62, 3, 2 },
{ 63, 3, 3 },
{ 64, 3, 4 },
{ 65, 3, 5 },
{ 66, 3, 6 },
{ 67, 3, 7 },
{ 68, 3, 8 },
{ 69, 3, 9 },
{ 70, 3, 10 },
{ 71, 3, 11 },
{ 72, 3, 12 },
{ 73, 3, 13 },
{ 74, 3, 14 },
{ 75, 3, 15 },
{ 76, 3, 16 },
{ 77, 3, 17 },
{ 78, 3, 18 },
{ 79, 3, 19 },
{ 80, 3, 20 },
{ 81, 3, 21 },
{ 82, 3, 22 },
{ 83, 3, 23 },
{ 84, 3, 24 },
{ 85, 3, 25 },
{ 86, 3, 26 },
{ 87, 3, 27 },
{ 88, 3, 28 },
{ 89, 3, 29 },
{ 90, 3, 30 },
{ 91, 3, 31 },
{ 92, 4, 1 },
{ 93, 4, 2 },
{ 94, 4, 3 },
{ 95, 4, 4 },
{ 96, 4, 5 },
{ 97, 4, 6 },
{ 98, 4, 7 },
{ 99, 4, 8 },
{ 100, 4, 9 },
{ 101, 4, 10 },
{ 102, 4, 11 },
{ 103, 4, 12 },
{ 104, 4, 13 },
{ 105, 4, 14 },
{ 106, 4, 15 },
{ 107, 4, 16 },
{ 108, 4, 17 },
{ 109, 4, 18 },
{ 110, 4, 19 },
{ 111, 4, 20 },
{ 112, 4, 21 },
{ 113, 4, 22 },
{ 114, 4, 23 },
{ 115, 4, 24 },
{ 116, 4, 25 },
{ 117, 4, 26 },
{ 118, 4, 27 },
{ 119, 4, 28 },
{ 120, 4, 29 },
{ 121, 4, 30 },
{ 122, 5, 1 },
{ 123, 5, 2 },
{ 124, 5, 3 },
{ 125, 5, 4 },
{ 126, 5, 5 },
{ 127, 5, 6 },
{ 128, 5, 7 },
{ 129, 5, 8 },
{ 130, 5, 9 },
{ 131, 5, 10 },
{ 132, 5, 11 },
{ 133, 5, 12 },
{ 134, 5, 13 },
{ 135, 5, 14 },
{ 136, 5, 15 },
{ 137, 5, 16 },
{ 138, 5, 17 },
{ 139, 5, 18 },
{ 140, 5, 19 },
{ 141, 5, 20 },
{ 142, 5, 21 },
{ 143, 5, 22 },
{ 144, 5, 23 },
{ 145, 5, 24 },
{ 146, 5, 25 },
{ 147, 5, 26 },
{ 148, 5, 27 },
{ 149, 5, 28 },
{ 150, 5, 29 },
{ 151, 5, 30 },
{ 152, 5, 31 },
{ 153, 6, 1 },
{ 154, 6, 2 },
{ 155, 6, 3 },
{ 156, 6, 4 },
{ 157, 6, 5 },
{ 158, 6, 6 },
{ 159, 6, 7 },
{ 160, 6, 8 },
{ 161, 6, 9 },
{ 162, 6, 10 },
{ 163, 6, 11 },
{ 164, 6, 12 },
{ 165, 6, 13 },
{ 166, 6, 14 },
{ 167, 6, 15 },
{ 168, 6, 16 },
{ 169, 6, 17 },
{ 170, 6, 18 },
{ 171, 6, 19 },
{ 172, 6, 20 },
{ 173, 6, 21 },
{ 174, 6, 22 },
{ 175, 6, 23 },
{ 176, 6, 24 },
{ 177, 6, 25 },
{ 178, 6, 26 },
{ 179, 6, 27 },
{ 180, 6, 28 },
{ 181, 6, 29 },
{ 182, 6, 30 },
{ 183, 7, 1 },
{ 184, 7, 2 },
{ 185, 7, 3 },
{ 186, 7, 4 },
{ 187, 7, 5 },
{ 188, 7, 6 },
{ 189, 7, 7 },
{ 190, 7, 8 },
{ 191, 7, 9 },
{ 192, 7, 10 },
{ 193, 7, 11 },
{ 194, 7, 12 },
{ 195, 7, 13 },
{ 196, 7, 14 },
{ 197, 7, 15 },
{ 198, 7, 16 },
{ 199, 7, 17 },
{ 200, 7, 18 },
{ 201, 7, 19 },
{ 202, 7, 20 },
{ 203, 7, 21 },
{ 204, 7, 22 },
{ 205, 7, 23 },
{ 206, 7, 24 },
{ 207, 7, 25 },
{ 208, 7, 26 },
{ 209, 7, 27 },
{ 210, 7, 28 },
{ 211, 7, 29 },
{ 212, 7, 30 },
{ 213, 7, 31 },
{ 214, 8, 1 },
{ 215, 8, 2 },
{ 216, 8, 3 },
{ 217, 8, 4 },
{ 218, 8, 5 },
{ 219, 8, 6 },
{ 220, 8, 7 },
{ 221, 8, 8 },
{ 222, 8, 9 },
{ 223, 8, 10 },
{ 224, 8, 11 },
{ 225, 8, 12 },
{ 226, 8, 13 },
{ 227, 8, 14 },
{ 228, 8, 15 },
{ 229, 8, 16 },
{ 230, 8, 17 },
{ 231, 8, 18 },
{ 232, 8, 19 },
{ 233, 8, 20 },
{ 234, 8, 21 },
{ 235, 8, 22 },
{ 236, 8, 23 },
{ 237, 8, 24 },
{ 238, 8, 25 },
{ 239, 8, 26 },
{ 240, 8, 27 },
{ 241, 8, 28 },
{ 242, 8, 29 },
{ 243, 8, 30 },
{ 244, 8, 31 },
{ 245, 9, 1 },
{ 246, 9, 2 },
{ 247, 9, 3 },
{ 248, 9, 4 },
{ 249, 9, 5 },
{ 250, 9, 6 },
{ 251, 9, 7 },
{ 252, 9, 8 },
{ 253, 9, 9 },
{ 254, 9, 10 },
{ 255, 9, 11 },
{ 256, 9, 12 },
{ 257, 9, 13 },
{ 258, 9, 14 },
{ 259, 9, 15 },
{ 260, 9, 16 },
{ 261, 9, 17 },
{ 262, 9, 18 },
{ 263, 9, 19 },
{ 264, 9, 20 },
{ 265, 9, 21 },
{ 266, 9, 22 },
{ 267, 9, 23 },
{ 268, 9, 24 },
{ 269, 9, 25 },
{ 270, 9, 26 },
{ 271, 9, 27 },
{ 272, 9, 28 },
{ 273, 9, 29 },
{ 274, 9, 30 },
{ 275, 10, 1 },
{ 276, 10, 2 },
{ 277, 10, 3 },
{ 278, 10, 4 },
{ 279, 10, 5 },
{ 280, 10, 6 },
{ 281, 10, 7 },
{ 282, 10, 8 },
{ 283, 10, 9 },
{ 284, 10, 10 },
{ 285, 10, 11 },
{ 286, 10, 12 },
{ 287, 10, 13 },
{ 288, 10, 14 },
{ 289, 10, 15 },
{ 290, 10, 16 },
{ 291, 10, 17 },
{ 292, 10, 18 },
{ 293, 10, 19 },
{ 294, 10, 20 },
{ 295, 10, 21 },
{ 296, 10, 22 },
{ 297, 10, 23 },
{ 298, 10, 24 },
{ 299, 10, 25 },
{ 300, 10, 26 },
{ 301, 10, 27 },
{ 302, 10, 28 },
{ 303, 10, 29 },
{ 304, 10, 30 },
{ 305, 10, 31 },
{ 306, 11, 1 },
{ 307, 11, 2 },
{ 308, 11, 3 },
{ 309, 11, 4 },
{ 310, 11, 5 },
{ 311, 11, 6 },
{ 312, 11, 7 },
{ 313, 11, 8 },
{ 314, 11, 9 },
{ 315, 11, 10 },
{ 316, 11, 11 },
{ 317, 11, 12 },
{ 318, 11, 13 },
{ 319, 11, 14 },
{ 320, 11, 15 },
{ 321, 11, 16 },
{ 322, 11, 17 },
{ 323, 11, 18 },
{ 324, 11, 19 },
{ 325, 11, 20 },
{ 326, 11, 21 },
{ 327, 11, 22 },
{ 328, 11, 23 },
{ 329, 11, 24 },
{ 330, 11, 25 },
{ 331, 11, 26 },
{ 332, 11, 27 },
{ 333, 11, 28 },
{ 334, 11, 29 },
{ 335, 11, 30 },
{ 336, 12, 1 },
{ 337, 12, 2 },
{ 338, 12, 3 },
{ 339, 12, 4 },
{ 340, 12, 5 },
{ 341, 12, 6 },
{ 342, 12, 7 },
{ 343, 12, 8 },
{ 344, 12, 9 },
{ 345, 12, 10 },
{ 346, 12, 11 },
{ 347, 12, 12 },
{ 348, 12, 13 },
{ 349, 12, 14 },
{ 350, 12, 15 },
{ 351, 12, 16 },
{ 352, 12, 17 },
{ 353, 12, 18 },
{ 354, 12, 19 },
{ 355, 12, 20 },
{ 356, 12, 21 },
{ 357, 12, 22 },
{ 358, 12, 23 },
{ 359, 12, 24 },
{ 360, 12, 25 },
{ 361, 12, 26 },
{ 362, 12, 27 },
{ 363, 12, 28 },
{ 364, 12, 29 },
{ 365, 12, 30 },
{ 366, 12, 31 },
{ 0, 0, 0 }
};
// clang-format on
void TestOrdinalDateConversion(nlTestSuite * inSuite, void * inContext)
{
for (uint16_t year = 0; year <= 10000; year++)
{
OrdinalDateTestValue * testValue = (IsLeapYear(year)) ? LeapYearOrdinalDates : StandardYearOrdinalDates;
for (; testValue->DayOfYear != 0; testValue++)
{
uint16_t outDayOfYear = 0;
uint8_t outMonth = 0, outDayOfMonth = 0;
OrdinalDateToCalendarDate(year, testValue->DayOfYear, outMonth, outDayOfMonth);
TestAssert(outMonth == testValue->Month, "OrdinalDateToCalendarDate returned invalid month");
TestAssert(outDayOfMonth == testValue->DayOfMonth, "OrdinalDateToCalendarDate returned invalid day-of-month");
CalendarDateToOrdinalDate(year, testValue->Month, testValue->DayOfMonth, outDayOfYear);
TestAssert(outDayOfYear == testValue->DayOfYear, "CalendarDateToOrdinalDate returned invalid day-of-year");
}
}
}
void TestDaysSinceEpochConversion(nlTestSuite * inSuite, void * inContext)
{
uint32_t daysSinceEpoch = 0;
for (uint16_t year = kUnixEpochYear; year <= kMaxYearInDaysSinceUnixEpoch32; year++)
{
for (uint8_t month = kJanuary; month <= kDecember; month++)
{
for (uint8_t dayOfMonth = 1; dayOfMonth <= DaysInMonth(year, month); dayOfMonth++)
{
// Test CalendarDateToDaysSinceUnixEpoch()
{
uint32_t calculatedDaysSinceEpoch;
CalendarDateToDaysSinceUnixEpoch(year, month, dayOfMonth, calculatedDaysSinceEpoch);
if (calculatedDaysSinceEpoch != daysSinceEpoch)
printf("%04u/%02u/%02u %" PRIu32 " %" PRIu32 "\n", year, month, dayOfMonth, daysSinceEpoch,
calculatedDaysSinceEpoch);
TestAssert(calculatedDaysSinceEpoch == daysSinceEpoch,
"CalendarDateToDaysSinceUnixEpoch() returned unexpected value");
}
// Test DaysSinceUnixEpochToCalendarDate()
{
uint16_t calculatedYear;
uint8_t calculatedMonth, calculatedDayOfMonth;
DaysSinceUnixEpochToCalendarDate(daysSinceEpoch, calculatedYear, calculatedMonth, calculatedDayOfMonth);
if (calculatedYear != year || calculatedMonth != month || calculatedDayOfMonth != dayOfMonth)
printf("%04u/%02u/%02u %04u/%02u/%02u\n", year, month, dayOfMonth, calculatedYear, calculatedMonth,
calculatedDayOfMonth);
TestAssert(calculatedYear == year, "DaysSinceUnixEpochToCalendarDate() returned unexpected year value");
TestAssert(calculatedMonth == month, "DaysSinceUnixEpochToCalendarDate() returned unexpected month value");
TestAssert(calculatedDayOfMonth == dayOfMonth,
"DaysSinceUnixEpochToCalendarDate() returned unexpected dayOfMonth value");
}
daysSinceEpoch++;
}
}
}
}
void TestSecondsSinceEpochConversion(nlTestSuite * inSuite, void * inContext)
{
uint32_t daysSinceEpoch = 0;
uint32_t timeOfDay = 0; // in seconds
for (uint16_t year = kUnixEpochYear; year <= kMaxYearInSecondsSinceUnixEpoch32; year++)
{
for (uint8_t month = kJanuary; month <= kDecember; month++)
{
for (uint8_t dayOfMonth = 1; dayOfMonth <= DaysInMonth(year, month); dayOfMonth++)
{
// Test 10 different times of day per calendar day (this keeps the total runtime manageable).
for (uint8_t i = 0; i < 10; i++)
{
uint32_t secondsSinceEpoch = daysSinceEpoch * kSecondsPerDay + timeOfDay;
uint8_t hour = static_cast<uint8_t>(timeOfDay / kSecondsPerHour);
uint8_t minute = static_cast<uint8_t>((timeOfDay - (hour * kSecondsPerHour)) / kSecondsPerMinute);
uint8_t second = static_cast<uint8_t>(timeOfDay - (hour * kSecondsPerHour + minute * kSecondsPerMinute));
#define VERIFY_TEST_AGAINST_GMTTIME 0
#if VERIFY_TEST_AGAINST_GMTTIME
{
time_t epochTimeT = static_cast<time_t>(secondsSinceEpoch);
struct tm * gmt = gmtime(&epochTimeT);
TestAssert(year == gmt->tm_year + 1900, "gmtime() mismatch: year");
TestAssert(month == gmt->tm_mon + 1, "gmtime() mismatch: month");
TestAssert(dayOfMonth == gmt->tm_mday, "gmtime() mismatch: dayOfMonth");
TestAssert(hour == gmt->tm_hour, "gmtime() mismatch: hour");
TestAssert(minute == gmt->tm_min, "gmtime() mismatch: minute");
TestAssert(second == gmt->tm_sec, "gmtime() mismatch: second");
}
#endif
// Test SecondsSinceUnixEpochToCalendarTime()
{
uint16_t calculatedYear;
uint8_t calculatedMonth, calculatedDayOfMonth, calculatedHour, calculatedMinute, calculatedSecond;
SecondsSinceUnixEpochToCalendarTime(secondsSinceEpoch, calculatedYear, calculatedMonth,
calculatedDayOfMonth, calculatedHour, calculatedMinute,
calculatedSecond);
TestAssert(calculatedYear == year, "SecondsSinceUnixEpochToCalendarTime() returned unexpected year value");
TestAssert(calculatedMonth == month,
"SecondsSinceUnixEpochToCalendarTime() returned unexpected month value");
TestAssert(calculatedDayOfMonth == dayOfMonth,
"SecondsSinceUnixEpochToCalendarTime() returned unexpected dayOfMonth value");
TestAssert(calculatedHour == hour, "SecondsSinceUnixEpochToCalendarTime() returned unexpected hour value");
TestAssert(calculatedMinute == minute,
"SecondsSinceUnixEpochToCalendarTime() returned unexpected minute value");
TestAssert(calculatedSecond == second,
"SecondsSinceUnixEpochToCalendarTime() returned unexpected second value");
}
// Test CalendarTimeToSecondsSinceUnixEpoch()
{
uint32_t calculatedSecondsSinceEpoch;
CalendarTimeToSecondsSinceUnixEpoch(year, month, dayOfMonth, hour, minute, second,
calculatedSecondsSinceEpoch);
TestAssert(calculatedSecondsSinceEpoch == secondsSinceEpoch,
"CalendarTimeToSecondsSinceUnixEpoch() returned unexpected value");
}
// Iterate through times of day by skipping a large prime number of seconds.
timeOfDay = (timeOfDay + 10007) % kSecondsPerDay;
}
daysSinceEpoch++;
}
}
}
}
void TestChipEpochTimeConversion(nlTestSuite * inSuite, void * inContext)
{
uint32_t daysSinceEpoch = 0;
uint32_t timeOfDay = 0; // in seconds
for (uint16_t year = kChipEpochBaseYear; year <= kChipEpochMaxYear; year++)
{
for (uint8_t month = kJanuary; month <= kDecember; month++)
{
for (uint8_t dayOfMonth = 1; dayOfMonth <= DaysInMonth(year, month); dayOfMonth++)
{
// Test 10 different times of day per calendar day (this keeps the total runtime manageable).
for (uint8_t i = 0; i < 10; i++)
{
uint32_t chipEpochTime = daysSinceEpoch * kSecondsPerDay + timeOfDay;
uint8_t hour = static_cast<uint8_t>(timeOfDay / kSecondsPerHour);
uint8_t minute = static_cast<uint8_t>((timeOfDay - (hour * kSecondsPerHour)) / kSecondsPerMinute);
uint8_t second = static_cast<uint8_t>(timeOfDay - (hour * kSecondsPerHour + minute * kSecondsPerMinute));
#if VERIFY_TEST_AGAINST_GMTTIME
{
time_t epochTimeT = static_cast<time_t>(chipEpochTime) + kChipEpochSecondsSinceUnixEpoch;
struct tm * gmt = gmtime(&epochTimeT);
TestAssert(year == gmt->tm_year + 1900, "chip epoch gmtime() mismatch: year");
TestAssert(month == gmt->tm_mon + 1, "chip epoch gmtime() mismatch: month");
TestAssert(dayOfMonth == gmt->tm_mday, "chip epoch gmtime() mismatch: dayOfMonth");
TestAssert(hour == gmt->tm_hour, "chip epoch gmtime() mismatch: hour");
TestAssert(minute == gmt->tm_min, "chip epoch gmtime() mismatch: minute");
TestAssert(second == gmt->tm_sec, "chip epoch gmtime() mismatch: second");
}
#endif
// Test ChipEpochToCalendarTime()
{
uint16_t calculatedYear;
uint8_t calculatedMonth, calculatedDayOfMonth, calculatedHour, calculatedMinute, calculatedSecond;
ChipEpochToCalendarTime(chipEpochTime, calculatedYear, calculatedMonth, calculatedDayOfMonth,
calculatedHour, calculatedMinute, calculatedSecond);
TestAssert(calculatedYear == year, "ChipEpochToCalendarTime() returned unexpected year value");
TestAssert(calculatedMonth == month, "ChipEpochToCalendarTime() returned unexpected month value");
TestAssert(calculatedDayOfMonth == dayOfMonth,
"ChipEpochToCalendarTime() returned unexpected dayOfMonth value");
TestAssert(calculatedHour == hour, "ChipEpochToCalendarTime() returned unexpected hour value");
TestAssert(calculatedMinute == minute, "ChipEpochToCalendarTime() returned unexpected minute value");
TestAssert(calculatedSecond == second, "ChipEpochToCalendarTime() returned unexpected second value");
}
// Test CalendarTimeToSecondsSinceUnixEpoch()
{
uint32_t calculatedChipEpochTime;
CalendarToChipEpochTime(year, month, dayOfMonth, hour, minute, second, calculatedChipEpochTime);
TestAssert(calculatedChipEpochTime == chipEpochTime,
"CalendarTimeToSecondsSinceUnixEpoch() returned unexpected value");
}
// Iterate through times of day by skipping a large prime number of seconds.
timeOfDay = (timeOfDay + 10007) % kSecondsPerDay;
}
daysSinceEpoch++;
}
}
}
}
void TestChipEpochTimeEdgeConditions(nlTestSuite * inSuite, void * inContext)
{
uint32_t chip_epoch_time_sec = 0;
NL_TEST_ASSERT(inSuite, UnixEpochToChipEpochTime(INT32_MAX, chip_epoch_time_sec));
NL_TEST_ASSERT(inSuite, chip_epoch_time_sec < INT32_MAX);
// TODO(#30990): Bring back tests when implementation fixed.
#if 0
constexpr uint32_t kUnix2000Jan1 = 946702800; // Start of CHIP epoch.
chip_epoch_time_sec = INT32_MAX;
NL_TEST_ASSERT(inSuite, UnixEpochToChipEpochTime(kUnix2000Jan1, chip_epoch_time_sec) == true);
NL_TEST_ASSERT(inSuite, chip_epoch_time_sec == 0);
chip_epoch_time_sec = 0;
NL_TEST_ASSERT(inSuite, UnixEpochToChipEpochTime(kUnix2000Jan1 - 1, chip_epoch_time_sec) == false);
#endif
}
// clang-format off
static const nlTest g_all_tests[] =
{
NL_TEST_DEF("Test Ordinal Date conversion", TestOrdinalDateConversion),
NL_TEST_DEF("Test DaysSinceEpoch conversion", TestDaysSinceEpochConversion),
NL_TEST_DEF("Test SecondsSinceEpoch conversion", TestSecondsSinceEpochConversion),
NL_TEST_DEF("Test ChipEpochTime conversion", TestChipEpochTimeConversion),
NL_TEST_DEF("Test edge conditions of time conversions", TestChipEpochTimeEdgeConditions),
NL_TEST_SENTINEL()
};
// clang-format on
int TestTimeUtils()
{
// clang-format off
nlTestSuite theSuite =
{
"Test common time utilities",
&g_all_tests[0],
nullptr,
nullptr
};
// clang-format on
nlTestRunner(&theSuite, nullptr);
return nlTestRunnerStats(&theSuite);
}
CHIP_REGISTER_TEST_SUITE(TestTimeUtils);