@@ -43,6 +43,47 @@ fn __system_time_size_check() {
43
43
}
44
44
45
45
46
+ /// **Call this function on startup to ensure that all assumptions about the platform are valid.**
47
+ ///
48
+ /// Unfortunately we have to make assumptions about the upper bounds of the `SystemTime` type on
49
+ /// your platform which we can't fully verify at compile time and which isn't part of it's contract.
50
+ /// To our best knowledge our assumptions hold for all platforms officially supported by rust, but
51
+ /// since this check is fast we recommend to do it anyway.
52
+ ///
53
+ /// If this function fails this is considered a bug. Please open an issue describing your
54
+ /// platform and stating your current system time.
55
+ ///
56
+ /// # Panics
57
+ /// If the check fails this function panics. By calling this function on startup you ensure that
58
+ /// this wont happen at an arbitrary later point in time.
59
+ pub fn check_platform ( ) {
60
+ use std:: time:: { Duration , SystemTime , UNIX_EPOCH } ;
61
+
62
+ // The upper and lower bounds of `SystemTime` are not part of its public contract and are
63
+ // platform specific. That's why we have to test if our assumptions regarding these bounds
64
+ // hold on the target platform.
65
+ //
66
+ // If this test fails on your platform, please don't use the library and open an issue
67
+ // instead so we can resolve the situation. Currently this library is tested on:
68
+ // * Linux (64bit)
69
+ let fail_date = UNIX_EPOCH + Duration :: from_secs ( SYSTEM_TIME_MAX_UNIX_TIMESTAMP ) ;
70
+ let year = Duration :: from_secs ( 60 * 60 * 24 * 365 ) ;
71
+
72
+ // Make sure that the library will keep working for another year
73
+ assert ! ( fail_date. duration_since( SystemTime :: now( ) ) . unwrap( ) > year) ;
74
+
75
+ let max_ts = PositiveTimestamp :: from_unix_timestamp (
76
+ SYSTEM_TIME_MAX_UNIX_TIMESTAMP - MAX_EXPIRY_TIME
77
+ ) . unwrap ( ) ;
78
+ let max_exp = :: ExpiryTime :: from_seconds ( MAX_EXPIRY_TIME ) . unwrap ( ) ;
79
+
80
+ assert_eq ! (
81
+ ( * max_ts. as_time( ) + * max_exp. as_duration( ) ) . duration_since( UNIX_EPOCH ) . unwrap( ) . as_secs( ) ,
82
+ SYSTEM_TIME_MAX_UNIX_TIMESTAMP
83
+ ) ;
84
+ }
85
+
86
+
46
87
/// Builder for `Invoice`s. It's the most convenient and advised way to use this library. It ensures
47
88
/// that only a semantically and syntactically correct Invoice can be built using it.
48
89
///
@@ -1126,30 +1167,7 @@ mod test {
1126
1167
1127
1168
#[ test]
1128
1169
fn test_system_time_bounds_assumptions ( ) {
1129
- use std:: time:: { Duration , SystemTime , UNIX_EPOCH } ;
1130
-
1131
- // The upper and lower bounds of `SystemTime` are not part of its public contract and are
1132
- // platform specific. That's why we have to test if our assumptions regarding these bounds
1133
- // hold on the target platform.
1134
- //
1135
- // If this test fails on your platform, please don't use the library and open an issue
1136
- // instead so we can resolve the situation. Currently this library is tested on:
1137
- // * Linux (64bit)
1138
- let fail_date = UNIX_EPOCH + Duration :: from_secs ( :: SYSTEM_TIME_MAX_UNIX_TIMESTAMP ) ;
1139
- let year = Duration :: from_secs ( 60 * 60 * 24 * 365 ) ;
1140
-
1141
- // Make sure that the library will keep working for another year
1142
- assert ! ( fail_date. duration_since( SystemTime :: now( ) ) . unwrap( ) > year) ;
1143
-
1144
- let max_ts = :: PositiveTimestamp :: from_unix_timestamp (
1145
- :: SYSTEM_TIME_MAX_UNIX_TIMESTAMP - :: MAX_EXPIRY_TIME
1146
- ) . unwrap ( ) ;
1147
- let max_exp = :: ExpiryTime :: from_seconds ( :: MAX_EXPIRY_TIME ) . unwrap ( ) ;
1148
-
1149
- assert_eq ! (
1150
- ( * max_ts. as_time( ) + * max_exp. as_duration( ) ) . duration_since( UNIX_EPOCH ) . unwrap( ) . as_secs( ) ,
1151
- :: SYSTEM_TIME_MAX_UNIX_TIMESTAMP
1152
- ) ;
1170
+ :: check_platform ( ) ;
1153
1171
1154
1172
assert_eq ! (
1155
1173
:: PositiveTimestamp :: from_unix_timestamp( :: SYSTEM_TIME_MAX_UNIX_TIMESTAMP + 1 ) ,
0 commit comments