blob: be35f31c3670d22bf3728dae0e9769e199c9935a [file] [log] [blame]
Jan Tattermuschf6410f52015-07-22 16:21:57 -07001#region Copyright notice and license
2
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003// Copyright 2015 gRPC authors.
Jan Tattermuschf6410f52015-07-22 16:21:57 -07004//
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
Jan Tattermuschf6410f52015-07-22 16:21:57 -07008//
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009// http://www.apache.org/licenses/LICENSE-2.0
Jan Tattermuschf6410f52015-07-22 16:21:57 -070010//
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
Jan Tattermuschf6410f52015-07-22 16:21:57 -070016
17#endregion
18
19using System;
20using System.Runtime.InteropServices;
21using Grpc.Core.Internal;
Jan Tattermusch452ca9b2015-10-29 10:38:03 -070022using Grpc.Core.Utils;
Jan Tattermuschf6410f52015-07-22 16:21:57 -070023using NUnit.Framework;
24
25namespace Grpc.Core.Internal.Tests
26{
27 public class TimespecTest
28 {
29 [Test]
Jan Tattermusch4113ba52015-07-22 18:37:35 -070030 public void Now_IsInUtc()
31 {
32 Assert.AreEqual(DateTimeKind.Utc, Timespec.Now.ToDateTime().Kind);
33 }
34
35 [Test]
36 public void Now_AgreesWithUtcNow()
Jan Tattermuschf6410f52015-07-22 16:21:57 -070037 {
38 var timespec = Timespec.Now;
Jan Tattermusch4113ba52015-07-22 18:37:35 -070039 var utcNow = DateTime.UtcNow;
40
41 TimeSpan difference = utcNow - timespec.ToDateTime();
42
43 // This test is inherently a race - but the two timestamps
44 // should really be way less that a minute apart.
45 Assert.IsTrue(difference.TotalSeconds < 60);
Jan Tattermuschf6410f52015-07-22 16:21:57 -070046 }
47
48 [Test]
Jan Tattermuscha7db28f2016-05-18 12:26:16 -070049 public void InfFutureMatchesNativeValue()
Jan Tattermuschf6410f52015-07-22 16:21:57 -070050 {
Jan Tattermuscha7db28f2016-05-18 12:26:16 -070051 Assert.AreEqual(Timespec.NativeInfFuture, Timespec.InfFuture);
Jan Tattermuschf6410f52015-07-22 16:21:57 -070052 }
53
54 [Test]
Jan Tattermuscha7db28f2016-05-18 12:26:16 -070055 public void InfPastMatchesNativeValue()
Jan Tattermuschf6410f52015-07-22 16:21:57 -070056 {
Jan Tattermuscha7db28f2016-05-18 12:26:16 -070057 Assert.AreEqual(Timespec.NativeInfPast, Timespec.InfPast);
Jan Tattermuschf6410f52015-07-22 16:21:57 -070058 }
59
60 [Test]
61 public void TimespecSizeIsNativeSize()
62 {
Jan Tattermusch92102932017-08-10 09:07:53 +020063 #pragma warning disable 0618
64 // We need to use the obsolete non-generic version of Marshal.SizeOf because the generic version is not available in net45
65 Assert.AreEqual(Timespec.NativeSize, Marshal.SizeOf(typeof(Timespec)));
66 #pragma warning restore 0618
Jan Tattermuschf6410f52015-07-22 16:21:57 -070067 }
68
69 [Test]
70 public void ToDateTime()
71 {
72 Assert.AreEqual(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc),
Jan Tattermusch88086372015-12-10 10:54:12 -080073 new Timespec(0, 0).ToDateTime());
Jan Tattermuschf6410f52015-07-22 16:21:57 -070074
75 Assert.AreEqual(new DateTime(1970, 1, 1, 0, 0, 10, DateTimeKind.Utc).AddTicks(50),
Jan Tattermusch88086372015-12-10 10:54:12 -080076 new Timespec(10, 5000).ToDateTime());
Jan Tattermuschf6410f52015-07-22 16:21:57 -070077
78 Assert.AreEqual(new DateTime(2015, 7, 21, 4, 21, 48, DateTimeKind.Utc),
Jan Tattermusch88086372015-12-10 10:54:12 -080079 new Timespec(1437452508, 0).ToDateTime());
Jan Tattermuschf6410f52015-07-22 16:21:57 -070080
81 // before epoch
82 Assert.AreEqual(new DateTime(1969, 12, 31, 23, 59, 55, DateTimeKind.Utc).AddTicks(10),
Jan Tattermusch88086372015-12-10 10:54:12 -080083 new Timespec(-5, 1000).ToDateTime());
Jan Tattermuschf6410f52015-07-22 16:21:57 -070084
Jan Tattermusch50b83652015-07-23 13:37:46 -070085 // infinity
86 Assert.AreEqual(DateTime.MaxValue, Timespec.InfFuture.ToDateTime());
87 Assert.AreEqual(DateTime.MinValue, Timespec.InfPast.ToDateTime());
88
89 // nanos are rounded to ticks are rounded up
Jan Tattermuschf6410f52015-07-22 16:21:57 -070090 Assert.AreEqual(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddTicks(1),
Jan Tattermusch88086372015-12-10 10:54:12 -080091 new Timespec(0, 99).ToDateTime());
Jan Tattermuschf6410f52015-07-22 16:21:57 -070092
Jan Tattermusch50b83652015-07-23 13:37:46 -070093 // Illegal inputs
Jan Tattermuschf6410f52015-07-22 16:21:57 -070094 Assert.Throws(typeof(InvalidOperationException),
Jan Tattermusch88086372015-12-10 10:54:12 -080095 () => new Timespec(0, -2).ToDateTime());
Jan Tattermuschf6410f52015-07-22 16:21:57 -070096 Assert.Throws(typeof(InvalidOperationException),
Jan Tattermusch88086372015-12-10 10:54:12 -080097 () => new Timespec(0, 1000 * 1000 * 1000).ToDateTime());
Jan Tattermuschf6410f52015-07-22 16:21:57 -070098 Assert.Throws(typeof(InvalidOperationException),
Jan Tattermusche0af2862016-05-18 21:02:03 -070099 () => new Timespec(0, 0, ClockType.Monotonic).ToDateTime());
Jan Tattermuschf6410f52015-07-22 16:21:57 -0700100 }
101
102 [Test]
103 public void ToDateTime_ReturnsUtc()
104 {
Jan Tattermusch88086372015-12-10 10:54:12 -0800105 Assert.AreEqual(DateTimeKind.Utc, new Timespec(1437452508, 0).ToDateTime().Kind);
106 Assert.AreNotEqual(DateTimeKind.Unspecified, new Timespec(1437452508, 0).ToDateTime().Kind);
Jan Tattermuschf6410f52015-07-22 16:21:57 -0700107 }
108
109 [Test]
Jan Tattermusch50b83652015-07-23 13:37:46 -0700110 public void ToDateTime_Overflow()
Jan Tattermusch88086372015-12-10 10:54:12 -0800111 {
112 var timespec = new Timespec(long.MaxValue - 100, 0);
113 Assert.AreNotEqual(Timespec.InfFuture, timespec);
114 Assert.AreEqual(DateTime.MaxValue, timespec.ToDateTime());
Jan Tattermuschf6410f52015-07-22 16:21:57 -0700115
Jan Tattermusch88086372015-12-10 10:54:12 -0800116 Assert.AreEqual(DateTime.MinValue, new Timespec(long.MinValue + 100, 0).ToDateTime());
Jan Tattermuschf6410f52015-07-22 16:21:57 -0700117 }
118
119 [Test]
Jan Tattermusch50b83652015-07-23 13:37:46 -0700120 public void ToDateTime_OutOfDateTimeRange()
Jan Tattermuschf6410f52015-07-22 16:21:57 -0700121 {
Jan Tattermusch88086372015-12-10 10:54:12 -0800122 // DateTime range goes up to year 9999, 20000 years from now should
123 // be out of range.
124 long seconds = 20000L * 365L * 24L * 3600L;
Jan Tattermuschf6410f52015-07-22 16:21:57 -0700125
Jan Tattermusch88086372015-12-10 10:54:12 -0800126 var timespec = new Timespec(seconds, 0);
127 Assert.AreNotEqual(Timespec.InfFuture, timespec);
128 Assert.AreEqual(DateTime.MaxValue, timespec.ToDateTime());
Jan Tattermuschf6410f52015-07-22 16:21:57 -0700129
Jan Tattermusch88086372015-12-10 10:54:12 -0800130 Assert.AreEqual(DateTime.MinValue, new Timespec(-seconds, 0).ToDateTime());
Jan Tattermuschf6410f52015-07-22 16:21:57 -0700131 }
Jan Tattermusch50b83652015-07-23 13:37:46 -0700132
133 [Test]
134 public void FromDateTime()
135 {
Jan Tattermusch88086372015-12-10 10:54:12 -0800136 Assert.AreEqual(new Timespec(0, 0),
Jan Tattermusch50b83652015-07-23 13:37:46 -0700137 Timespec.FromDateTime(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)));
138
Jan Tattermusch88086372015-12-10 10:54:12 -0800139 Assert.AreEqual(new Timespec(10, 5000),
Jan Tattermusch50b83652015-07-23 13:37:46 -0700140 Timespec.FromDateTime(new DateTime(1970, 1, 1, 0, 0, 10, DateTimeKind.Utc).AddTicks(50)));
141
Jan Tattermusch88086372015-12-10 10:54:12 -0800142 Assert.AreEqual(new Timespec(1437452508, 0),
Jan Tattermusch50b83652015-07-23 13:37:46 -0700143 Timespec.FromDateTime(new DateTime(2015, 7, 21, 4, 21, 48, DateTimeKind.Utc)));
144
145 // before epoch
Jan Tattermusch88086372015-12-10 10:54:12 -0800146 Assert.AreEqual(new Timespec(-5, 1000),
Jan Tattermusch50b83652015-07-23 13:37:46 -0700147 Timespec.FromDateTime(new DateTime(1969, 12, 31, 23, 59, 55, DateTimeKind.Utc).AddTicks(10)));
148
149 // infinity
150 Assert.AreEqual(Timespec.InfFuture, Timespec.FromDateTime(DateTime.MaxValue));
151 Assert.AreEqual(Timespec.InfPast, Timespec.FromDateTime(DateTime.MinValue));
152
153 // illegal inputs
154 Assert.Throws(typeof(ArgumentException),
155 () => Timespec.FromDateTime(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Unspecified)));
156 }
Jan Tattermusch452ca9b2015-10-29 10:38:03 -0700157
Jan Tattermusch3ac274f2015-12-11 15:27:58 -0800158 [Test]
159 [Category("Performance")]
160 [Ignore("Prevent running on Jenkins")]
Jan Tattermusch452ca9b2015-10-29 10:38:03 -0700161 public void NowBenchmark()
162 {
163 // approx Timespec.Now latency <33ns
164 BenchmarkUtil.RunBenchmark(10000000, 1000000000, () => { var now = Timespec.Now; });
165 }
Jan Tattermusch3ac274f2015-12-11 15:27:58 -0800166
167 [Test]
168 [Category("Performance")]
169 [Ignore("Prevent running on Jenkins")]
Jan Tattermusch452ca9b2015-10-29 10:38:03 -0700170 public void PreciseNowBenchmark()
171 {
172 // approx Timespec.PreciseNow latency <18ns (when compiled with GRPC_TIMERS_RDTSC)
173 BenchmarkUtil.RunBenchmark(10000000, 1000000000, () => { var now = Timespec.PreciseNow; });
174 }
Jan Tattermuschf6410f52015-07-22 16:21:57 -0700175 }
176}