1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.net.ntp;
18
19 import static org.junit.jupiter.api.Assertions.assertEquals;
20 import static org.junit.jupiter.api.Assertions.assertNotNull;
21 import static org.junit.jupiter.api.Assertions.assertTrue;
22 import static org.junit.jupiter.api.Assertions.fail;
23
24 import java.io.IOException;
25 import java.net.InetAddress;
26 import java.time.Duration;
27
28 import org.apache.commons.lang3.ThreadUtils;
29 import org.apache.commons.net.examples.ntp.SimpleNTPServer;
30 import org.junit.jupiter.api.AfterAll;
31 import org.junit.jupiter.api.BeforeAll;
32 import org.junit.jupiter.api.Test;
33
34
35
36
37 class TestNtpClient {
38
39 private static SimpleNTPServer server;
40
41 @BeforeAll
42 public static void oneTimeSetUp() throws IOException {
43
44 server = new SimpleNTPServer(0);
45 server.connect();
46
47 try {
48 server.start();
49 } catch (final IOException e) {
50 fail("failed to start NTP server: " + e);
51 }
52 assertTrue(server.isStarted());
53
54 boolean running = false;
55 for (int retries = 0; retries < 5; retries++) {
56 running = server.isRunning();
57 if (running) {
58 break;
59 }
60
61 ThreadUtils.sleepQuietly(Duration.ofMillis(2000));
62 }
63 assertTrue(running);
64 }
65
66 @AfterAll
67 public static void oneTimeTearDown() {
68
69 if (server != null) {
70 server.stop();
71 server = null;
72 }
73 }
74
75 @Test
76 void testGetTime() throws IOException {
77 final long currentTimeMillis = System.currentTimeMillis();
78 final NTPUDPClient client = new NTPUDPClient();
79
80 client.setDefaultTimeout(Duration.ofSeconds(2));
81 try {
82
83 final InetAddress addr = InetAddress.getByAddress("loopback", new byte[] { 127, 0, 0, 1 });
84 final TimeInfo timeInfo = client.getTime(addr, server.getPort());
85 assertNotNull(timeInfo);
86 assertTrue(timeInfo.getReturnTime() >= currentTimeMillis);
87 final NtpV3Packet message = timeInfo.getMessage();
88 assertNotNull(message);
89
90 final TimeStamp rcvTimeStamp = message.getReceiveTimeStamp();
91 final TimeStamp xmitTimeStamp = message.getTransmitTimeStamp();
92 assertTrue(xmitTimeStamp.compareTo(rcvTimeStamp) >= 0);
93
94 final TimeStamp originateTimeStamp = message.getOriginateTimeStamp();
95 assertNotNull(originateTimeStamp);
96 assertTrue(originateTimeStamp.getTime() >= currentTimeMillis);
97
98 assertEquals(NtpV3Packet.MODE_SERVER, message.getMode());
99
100
101
102 final TimeStamp referenceTimeStamp = message.getReferenceTimeStamp();
103 assertNotNull(referenceTimeStamp);
104 assertTrue(referenceTimeStamp.getTime() >= currentTimeMillis);
105
106 assertEquals(NtpV3Packet.VERSION_3, message.getVersion());
107 assertEquals(1, message.getStratum());
108
109 assertEquals("LCL", NtpUtils.getReferenceClock(message));
110 } finally {
111 client.close();
112 }
113 }
114
115 }