diff --git a/GuerrillaNtp.sln b/GuerrillaNtp.sln
index 8fb77e7..fc25461 100644
--- a/GuerrillaNtp.sln
+++ b/GuerrillaNtp.sln
@@ -5,6 +5,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GuerrillaNtp", "GuerrillaNt
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NtpCommand", "NtpCommand\NtpCommand.csproj", "{5B76615E-2B5E-45B7-9850-20D05AEFCEAD}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GuerrillaNtpTests", "GuerrillaNtpTests\GuerrillaNtpTests.csproj", "{4969DA50-E64D-42E6-823C-3383EDA51E8A}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -19,5 +21,9 @@ Global
{5B76615E-2B5E-45B7-9850-20D05AEFCEAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5B76615E-2B5E-45B7-9850-20D05AEFCEAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5B76615E-2B5E-45B7-9850-20D05AEFCEAD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4969DA50-E64D-42E6-823C-3383EDA51E8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4969DA50-E64D-42E6-823C-3383EDA51E8A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4969DA50-E64D-42E6-823C-3383EDA51E8A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4969DA50-E64D-42E6-823C-3383EDA51E8A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
diff --git a/GuerrillaNtpTests/GuerrillaNtpTests.csproj b/GuerrillaNtpTests/GuerrillaNtpTests.csproj
new file mode 100644
index 0000000..9257f7c
--- /dev/null
+++ b/GuerrillaNtpTests/GuerrillaNtpTests.csproj
@@ -0,0 +1,46 @@
+
+
+
+ Debug
+ AnyCPU
+ {4969DA50-E64D-42E6-823C-3383EDA51E8A}
+ Library
+ GuerrillaNtpTests
+ GuerrillaNtpTests
+ v4.6.1
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+
+
+ true
+ bin\Release
+ prompt
+ 4
+
+
+
+
+ ..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll
+
+
+
+
+
+
+
+ {33509321-B1A1-41C0-9578-D7D50904462E}
+ GuerrillaNtp
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/GuerrillaNtpTests/NtpClientTests.cs b/GuerrillaNtpTests/NtpClientTests.cs
new file mode 100644
index 0000000..d74db19
--- /dev/null
+++ b/GuerrillaNtpTests/NtpClientTests.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Diagnostics;
+using System.Net;
+using System.Net.Sockets;
+using NUnit.Framework;
+using GuerrillaNtp;
+
+namespace Tests
+{
+ [TestFixture]
+ public class NtpClientTests
+ {
+ private IPAddress server = Dns.GetHostEntry("pool.ntp.org").AddressList[0];
+
+ [Test]
+ public void Test_can_get_correction_offset()
+ {
+ const int tries = 10;
+ int hits = 0;
+ using (var client = new NtpClient(server))
+ {
+ for (int i = 0; i < tries; i++)
+ {
+ try
+ {
+ Console.WriteLine($"Offset #{i + 1}: {client.GetCorrectionOffset()}");
+ ++hits;
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"Offset #{i + 1}: {ex}");
+ }
+ }
+ }
+ Console.WriteLine($"Got {hits} of {tries} replies");
+ Assert.GreaterOrEqual(2 * hits, tries);
+ }
+
+ [Test]
+ public void Test_Timeout_expires()
+ {
+ var timeout = TimeSpan.FromMilliseconds(500);
+
+ // Note: pick a host that *drops* packets. The test will fail if the host merely *rejects* packets.
+ using (var client = new NtpClient(IPAddress.Parse("8.8.8.8")))
+ {
+ client.Timeout = timeout;
+
+ var timer = Stopwatch.StartNew();
+
+ try
+ {
+ client.GetCorrectionOffset();
+ Assert.Fail("Shouldn't get here. Expecting timeout!");
+ }
+ catch (SocketException ex) when (ex.ErrorCode == 10060 || ex.ErrorCode == 10035)
+ {
+ // We expect a socket timeout error
+ }
+
+ timer.Stop();
+
+ Assert.IsTrue(timer.Elapsed >= timeout, timer.Elapsed.ToString());
+ Assert.IsTrue(timer.Elapsed < timeout + timeout, timer.Elapsed.ToString());
+ }
+ }
+ }
+}
diff --git a/GuerrillaNtpTests/packages.config b/GuerrillaNtpTests/packages.config
new file mode 100644
index 0000000..b93fa21
--- /dev/null
+++ b/GuerrillaNtpTests/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Tests/NtpClientTests.cs b/Tests/NtpClientTests.cs
deleted file mode 100644
index 46307e4..0000000
--- a/Tests/NtpClientTests.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.Net;
-using System.Net.Sockets;
-
-using GuerrillaNtp;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-
-namespace Tests {
- [TestClass]
- public class NtpClientTests {
- private IPAddress server = Dns.GetHostEntry("pool.ntp.org").AddressList[0];
-
- [TestMethod]
- public void Test_can_get_correction_offset() {
- using (var client = new NtpClient(server)) {
- for (int i = 0; i < 10; i++)
- Trace.WriteLine($"Offset #{i+1}: {client.GetCorrectionOffset()}");
- }
- }
-
- [TestMethod]
- public void Test_Timeout_expires() {
- var timeout = TimeSpan.FromMilliseconds(500);
-
- // Note: pick a host that *drops* packets. The test will fail if the host merely *rejects* packets.
- using (var client = new NtpClient(IPAddress.Parse("8.8.8.8"))) {
- client.Timeout = timeout;
-
- var timer = Stopwatch.StartNew();
-
- try {
- client.GetCorrectionOffset();
- Assert.Fail("Shouldn't get here. Expecting timeout!");
- }
- catch (SocketException ex) when (ex.ErrorCode == 10060) { /* We expect a socket timeout error */ }
-
- timer.Stop();
-
- Assert.IsTrue(timer.Elapsed >= timeout, timer.Elapsed.ToString());
- Assert.IsTrue(timer.Elapsed < 2 * timeout, timer.Elapsed.ToString());
- }
- }
- }
-}
diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj
deleted file mode 100644
index f919eac..0000000
--- a/Tests/Tests.csproj
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
- netcoreapp2.0
-
- false
-
-
-
-
-
-
-
-
-
-
-
-
-