> > date_test_iter (void) > > { > > - grub_int32_t tests[] = { -1, 0, +1, -2133156255, GRUB_INT32_MIN, > > + grub_int32_t tests[] = { -1, 0, +1, 978224552, -2133156255, > -2110094321, GRUB_INT32_MIN, > > GRUB_INT32_MAX }; > > I think "tests" array update begs for a comment here and a blurb in the > commit message. Will do, I'll make that update in a v5.
> > + if (sizeof (time_t) > 4) > > + { > > + for (i = 0; i < ARRAY_SIZE (tests64); i++) > > + date_test (tests64[i]); > > + for (i = 0; i < 10000000; i++) > > + { > > + /* Ranges from 0064 to 6869. */ > > This "Ranges" is still not explained. > > > + grub_int64_t x = rand () + (rand () % 100 - 28) * > (grub_uint64_t) GRUB_INT32_MAX; > > Where 100 and 28 come from? @Vladimir Serbinenko - do you happen to remember any background on the year test range for this and the use of 100 / 28 in the calculation? I tried to figure it out last night and the best I could come up with was it was a big range that covers pretty much any conceivable valid date - especially since the Gregorian calendar really starts in the 1500s. If not, I'll take another crack at understanding this tonight and add some commentary for it in v5. Thanks, Andrew On Tue, Aug 26, 2025 at 10:25 AM Daniel Kiper <daniel.ki...@oracle.com> wrote: > > On Mon, Aug 25, 2025 at 10:17:38PM -0500, Andrew Hamilton wrote: > > Add tests outside the date range possible with 32-bit time > > calculation. > > > > Signed-off-by: Vladimir Serbinenko <phco...@gmail.com> > > Signed-off-by: Andrew Hamilton <adham...@gmail.com> > > --- > > tests/date_unit_test.c | 44 +++++++++++++++++++++++++++++++++--------- > > 1 file changed, 35 insertions(+), 9 deletions(-) > > > > diff --git a/tests/date_unit_test.c b/tests/date_unit_test.c > > index 99774f199..aec3dc3e4 100644 > > --- a/tests/date_unit_test.c > > +++ b/tests/date_unit_test.c > > @@ -25,12 +25,13 @@ > > #include <grub/test.h> > > > > static void > > -date_test (grub_int32_t v) > > +date_test (grub_int64_t v) > > { > > struct grub_datetime dt; > > time_t t = v; > > struct tm *g; > > int w; > > + grub_int64_t back = 0; > > > > g = gmtime (&t); > > > > @@ -38,28 +39,41 @@ date_test (grub_int32_t v) > > > > w = grub_get_weekday (&dt); > > > > - grub_test_assert (g->tm_sec == dt.second, "time %d bad second: %d vs > > %d", v, > > + grub_datetime2unixtime (&dt, &back); > > + > > + grub_test_assert (g->tm_sec == dt.second, "time %lld bad second: %d vs > > %d", (long long) v, > > g->tm_sec, dt.second); > > - grub_test_assert (g->tm_min == dt.minute, "time %d bad minute: %d vs > > %d", v, > > + grub_test_assert (g->tm_min == dt.minute, "time %lld bad minute: %d vs > > %d", (long long) v, > > g->tm_min, dt.minute); > > - grub_test_assert (g->tm_hour == dt.hour, "time %d bad hour: %d vs %d", v, > > + grub_test_assert (g->tm_hour == dt.hour, "time %lld bad hour: %d vs %d", > > (long long) v, > > g->tm_hour, dt.hour); > > - grub_test_assert (g->tm_mday == dt.day, "time %d bad day: %d vs %d", v, > > + grub_test_assert (g->tm_mday == dt.day, "time %lld bad day: %d vs %d", > > (long long) v, > > g->tm_mday, dt.day); > > - grub_test_assert (g->tm_mon + 1 == dt.month, "time %d bad month: %d vs > > %d", v, > > + grub_test_assert (g->tm_mon + 1 == dt.month, "time %lld bad month: %d vs > > %d",(long long) v, > > g->tm_mon + 1, dt.month); > > grub_test_assert (g->tm_year + 1900 == dt.year, > > - "time %d bad year: %d vs %d", v, > > + "time %lld bad year: %d vs %d", (long long) v, > > g->tm_year + 1900, dt.year); > > - grub_test_assert (g->tm_wday == w, "time %d bad week day: %d vs %d", v, > > + grub_test_assert (g->tm_wday == w, "time %lld bad week day: %d vs %d", > > (long long) v, > > g->tm_wday, w); > > + grub_test_assert (back == v, "time %lld bad back transform: %lld", (long > > long) v, > > + (long long) back); > > } > > > > static void > > date_test_iter (void) > > { > > - grub_int32_t tests[] = { -1, 0, +1, -2133156255, GRUB_INT32_MIN, > > + grub_int32_t tests[] = { -1, 0, +1, 978224552, -2133156255, -2110094321, > > GRUB_INT32_MIN, > > GRUB_INT32_MAX }; > > I think "tests" array update begs for a comment here and a blurb in the > commit message. > > > + /* > > + * Test several known UNIX timestamps outside 32-bit time: > > + * 1. 5774965200: 2152-12-31 21:00:00 - Leap year > > + * 2. 4108700725: 2100-03-14 09:45:25 - Not a leap year > > + * 3. -5029179792: 1810-08-19 21:36:48 - Not a leap year > > + */ > > + grub_int64_t tests64[] = { (grub_int64_t) 5774965200, > > + (grub_int64_t) 4108700725, > > + (grub_int64_t) -5029179792 }; > > unsigned i; > > > > for (i = 0; i < ARRAY_SIZE (tests); i++) > > @@ -71,6 +85,18 @@ date_test_iter (void) > > date_test (x); > > date_test (-x); > > } > > + > > + if (sizeof (time_t) > 4) > > + { > > + for (i = 0; i < ARRAY_SIZE (tests64); i++) > > + date_test (tests64[i]); > > + for (i = 0; i < 10000000; i++) > > + { > > + /* Ranges from 0064 to 6869. */ > > This "Ranges" is still not explained. > > > + grub_int64_t x = rand () + (rand () % 100 - 28) * > > (grub_uint64_t) GRUB_INT32_MAX; > > Where 100 and 28 come from? > > Daniel _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel