xref: /aosp_15_r20/external/cronet/net/cert/time_conversions_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2023 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/cert/time_conversions.h"
6 
7 #include "base/time/time.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 #include "third_party/boringssl/src/pki/parse_values.h"
10 
11 namespace net::test {
12 
TEST(TimeConversionsTest,EncodeTimeAsGeneralizedTime)13 TEST(TimeConversionsTest, EncodeTimeAsGeneralizedTime) {
14   // Fri, 24 Jun 2016 17:04:54 GMT
15   base::Time time = base::Time::UnixEpoch() + base::Seconds(1466787894);
16   bssl::der::GeneralizedTime generalized_time;
17   ASSERT_TRUE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
18   EXPECT_EQ(2016, generalized_time.year);
19   EXPECT_EQ(6, generalized_time.month);
20   EXPECT_EQ(24, generalized_time.day);
21   EXPECT_EQ(17, generalized_time.hours);
22   EXPECT_EQ(4, generalized_time.minutes);
23   EXPECT_EQ(54, generalized_time.seconds);
24 
25   time = base::Time::UnixEpoch() + base::Seconds(253402300799);
26   ASSERT_TRUE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
27   EXPECT_EQ(9999, generalized_time.year);
28   EXPECT_EQ(12, generalized_time.month);
29   EXPECT_EQ(31, generalized_time.day);
30   EXPECT_EQ(23, generalized_time.hours);
31   EXPECT_EQ(59, generalized_time.minutes);
32   EXPECT_EQ(59, generalized_time.seconds);
33 
34   time = base::Time::UnixEpoch() + base::Seconds(-62167219200);
35   ASSERT_TRUE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
36   EXPECT_EQ(0, generalized_time.year);
37   EXPECT_EQ(1, generalized_time.month);
38   EXPECT_EQ(1, generalized_time.day);
39   EXPECT_EQ(0, generalized_time.hours);
40   EXPECT_EQ(0, generalized_time.minutes);
41   EXPECT_EQ(0, generalized_time.seconds);
42 
43   time = base::Time::UnixEpoch() + base::Seconds(253402300800);
44   EXPECT_FALSE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
45 
46   time = base::Time::UnixEpoch() + base::Seconds(-62167219201);
47   EXPECT_FALSE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
48 
49   time = base::Time::Max();
50   EXPECT_FALSE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
51 
52   time = base::Time::Min();
53   EXPECT_FALSE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
54 }
55 
TEST(TimeConversionsTest,GeneralizedTimeToTime)56 TEST(TimeConversionsTest, GeneralizedTimeToTime) {
57   bssl::der::GeneralizedTime generalized_time;
58   generalized_time.year = 2016;
59   generalized_time.month = 6;
60   generalized_time.day = 24;
61   generalized_time.hours = 17;
62   generalized_time.minutes = 4;
63   generalized_time.seconds = 54;
64   base::Time time;
65   ASSERT_TRUE(GeneralizedTimeToTime(generalized_time, &time));
66   EXPECT_EQ(base::Time::UnixEpoch() + base::Seconds(1466787894), time);
67 
68   // Invalid and out of range values should be rejected
69   generalized_time.day = 0;
70   EXPECT_FALSE(GeneralizedTimeToTime(generalized_time, &time));
71   generalized_time.day = 24;
72   generalized_time.year = 10000;
73   EXPECT_FALSE(GeneralizedTimeToTime(generalized_time, &time));
74   generalized_time.year = -1;
75   EXPECT_FALSE(GeneralizedTimeToTime(generalized_time, &time));
76 }
77 
78 // A time from before the Windows epoch should work.
TEST(TimeConversionsTest,TimeBeforeWindowsEpoch)79 TEST(TimeConversionsTest, TimeBeforeWindowsEpoch) {
80   bssl::der::GeneralizedTime generalized_time;
81   generalized_time.year = 1570;
82   generalized_time.month = 1;
83   generalized_time.day = 1;
84   generalized_time.hours = 0;
85   generalized_time.minutes = 0;
86   generalized_time.seconds = 0;
87 
88   base::Time time;
89   ASSERT_TRUE(GeneralizedTimeToTime(generalized_time, &time));
90 
91   ASSERT_TRUE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
92   EXPECT_EQ(1570, generalized_time.year);
93   EXPECT_EQ(1, generalized_time.month);
94   EXPECT_EQ(1, generalized_time.day);
95   EXPECT_EQ(0, generalized_time.hours);
96   EXPECT_EQ(0, generalized_time.minutes);
97   EXPECT_EQ(0, generalized_time.seconds);
98 }
99 
100 // A time in seconds larger than a 32 bit signed integer should work.
TEST(TimeConversionsTest,TimeAfter32BitPosixMaxYear)101 TEST(TimeConversionsTest, TimeAfter32BitPosixMaxYear) {
102   bssl::der::GeneralizedTime generalized_time;
103   generalized_time.year = 2039;
104   generalized_time.month = 1;
105   generalized_time.day = 1;
106   generalized_time.hours = 0;
107   generalized_time.minutes = 0;
108   generalized_time.seconds = 0;
109 
110   base::Time time;
111   ASSERT_TRUE(GeneralizedTimeToTime(generalized_time, &time));
112 
113   ASSERT_TRUE(EncodeTimeAsGeneralizedTime(time, &generalized_time));
114   EXPECT_EQ(2039, generalized_time.year);
115   EXPECT_EQ(1, generalized_time.month);
116   EXPECT_EQ(1, generalized_time.day);
117   EXPECT_EQ(0, generalized_time.hours);
118   EXPECT_EQ(0, generalized_time.minutes);
119   EXPECT_EQ(0, generalized_time.seconds);
120 }
121 
122 }  // namespace net::test
123