@@ -26,9 +26,12 @@ start() ->
2626 ok = test_system_time (second , 1001 ),
2727 ok = test_system_time (millisecond , 10 ),
2828 ok = test_system_time (microsecond , 1 ),
29- ok = test_system_time ( nanosecond , 1 ),
29+ ok = test_nanosecond_system_time ( ),
3030 ok = test_native_system_time (),
3131
32+ ok = test_erlang_monotonic_time_0 (),
33+ ok = test_erlang_system_time_0 (),
34+ ok = test_os_system_time (),
3235 ok = test_time_unit_ratios (),
3336
3437 ok = expect (fun () -> erlang :system_time (not_a_time_unit ) end , badarg ),
@@ -44,31 +47,47 @@ test_system_time(Unit, SleepMs) ->
4447 true = (After > Before ),
4548 ok .
4649
50+ test_erlang_monotonic_time_0 () ->
51+ T = erlang :monotonic_time (),
52+ true = is_integer (T ),
53+ ok .
54+
55+ test_erlang_system_time_0 () ->
56+ T = erlang :system_time (),
57+ true = is_integer (T ) andalso T > 0 ,
58+ ok .
59+
60+ test_os_system_time () ->
61+ T0 = os :system_time (),
62+ true = is_integer (T0 ) andalso T0 > 0 ,
63+ ok = test_system_time_unit (os_system_time_second , fun () -> os :system_time (second ) end ),
64+ ok = test_system_time_unit (os_system_time_millisecond , fun () -> os :system_time (millisecond ) end ),
65+ ok = test_system_time_unit (os_system_time_microsecond , fun () -> os :system_time (microsecond ) end ),
66+ ok = test_os_system_time_native (),
67+ ok .
68+
4769test_system_time_unit (_Name , Fun ) ->
4870 T = Fun (),
4971 true = is_integer (T ) andalso T > 0 ,
5072 ok .
5173
5274% Readings are taken coarsest-to-finest so the finer value is always >= the
53- % coarser value * its scale factor. The upper-bound allows for at most 1 ms
75+ % coarser value * its scale factor. The upper-bound allows for at most 1 s
5476% of wall-clock time between consecutive calls.
5577test_time_unit_ratios () ->
5678 S = erlang :system_time (second ),
5779 Ms = erlang :system_time (millisecond ),
5880 Us = erlang :system_time (microsecond ),
59- Ns = erlang :system_time (nanosecond ),
6081
6182 true = Ms >= S * 1000 ,
62- % within 1 s of each other
83+ % within 1 s
6384 true = Ms < S * 1000 + 1000 ,
6485
6586 true = Us >= Ms * 1000 ,
66- % within 1 ms
87+ % within 1 s
6788 true = Us < Ms * 1000 + 1000000 ,
6889
69- true = Ns >= Us * 1000 ,
70- % within 1 ms
71- true = Ns < Us * 1000 + 1000000 ,
90+ ok = test_ns_ratio (),
7291
7392 ok .
7493
@@ -95,7 +114,7 @@ test_system_time_to_universal_time() ->
95114 {{1970 , 1 , 1 }, {0 , 0 , 1 }} = calendar :system_time_to_universal_time (1 , second ),
96115
97116 {{1970 , 1 , 1 }, {0 , 0 , 0 }} = calendar :system_time_to_universal_time (0 , millisecond ),
98- {{1970 , 1 , 1 }, {0 , 0 , 0 }} = calendar :system_time_to_universal_time (0 , millisecond ),
117+ {{1970 , 1 , 1 }, {0 , 0 , 0 }} = calendar :system_time_to_universal_time (1 , millisecond ),
99118 {{1970 , 1 , 1 }, {0 , 0 , 1 }} = calendar :system_time_to_universal_time (1000 , millisecond ),
100119 {{1970 , 1 , 1 }, {0 , 0 , 1 }} = calendar :system_time_to_universal_time (1001 , millisecond ),
101120
@@ -108,27 +127,50 @@ test_system_time_to_universal_time() ->
108127
109128 {{1969 , 12 , 31 }, {23 , 59 , 59 }} = calendar :system_time_to_universal_time (- 1 , second ),
110129
130+ ok = test_nanosecond_universal_time (),
131+ ok = test_native_universal_time (),
132+
133+ ok .
134+
135+ -if (? OTP_RELEASE >= 22 ).
136+ test_nanosecond_system_time () ->
137+ ok = test_system_time (nanosecond , 1 ).
138+
139+ test_native_system_time () ->
140+ ok = test_system_time (native , 1 ).
141+
142+ test_os_system_time_native () ->
143+ ok = test_system_time_unit (os_system_time_nanosecond , fun () -> os :system_time (nanosecond ) end ),
144+ ok = test_system_time_unit (os_system_time_native , fun () -> os :system_time (native ) end ),
145+ ok .
146+
147+ test_ns_ratio () ->
148+ Us = erlang :system_time (microsecond ),
149+ Ns = erlang :system_time (nanosecond ),
150+ true = Ns >= Us * 1000 ,
151+ % within 1 ms
152+ true = Ns < Us * 1000 + 1000000 ,
153+ ok .
154+
155+ test_nanosecond_universal_time () ->
111156 {{1970 , 1 , 1 }, {0 , 0 , 0 }} = calendar :system_time_to_universal_time (0 , nanosecond ),
112157 {{1970 , 1 , 1 }, {0 , 0 , 0 }} = calendar :system_time_to_universal_time (1 , nanosecond ),
113158 {{1970 , 1 , 1 }, {0 , 0 , 1 }} = calendar :system_time_to_universal_time (1000000000 , nanosecond ),
114159 {{1970 , 1 , 1 }, {0 , 0 , 1 }} = calendar :system_time_to_universal_time (1001000000 , nanosecond ),
115160 {{2023 , 7 , 8 }, {20 , 19 , 39 }} = calendar :system_time_to_universal_time (
116161 1688847579000000000 , nanosecond
117162 ),
118-
119- ok = test_native_universal_time (),
120-
121163 ok .
122164
123- -if (? OTP_RELEASE >= 22 ).
124- test_native_system_time () ->
125- ok = test_system_time (native , 1 ).
126-
127165test_native_universal_time () ->
128166 {{1970 , 1 , 1 }, {0 , 0 , 0 }} = calendar :system_time_to_universal_time (0 , native ),
129167 {{1970 , 1 , 1 }, {0 , 0 , 1 }} = calendar :system_time_to_universal_time (1000000000 , native ),
130168 ok .
131169-else .
170+ test_nanosecond_system_time () -> ok .
132171test_native_system_time () -> ok .
172+ test_os_system_time_native () -> ok .
173+ test_ns_ratio () -> ok .
174+ test_nanosecond_universal_time () -> ok .
133175test_native_universal_time () -> ok .
134176-endif .
0 commit comments