View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * 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.
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.assertNotEquals;
21  import static org.junit.jupiter.api.Assertions.assertNotNull;
22  import static org.junit.jupiter.api.Assertions.assertThrows;
23  import static org.junit.jupiter.api.Assertions.assertTrue;
24  
25  import java.net.DatagramPacket;
26  
27  import org.junit.jupiter.api.Test;
28  
29  class TestNtpPacket {
30  
31      // pre-canned NTP packet
32      // [version:3, mode:4, poll:4, refId=0x81531472, precision:-17, delay:100, dispersion(ms):51.605224609375,
33      // id:129.83.20.114, xmitTime:Thu, May 30 2013 17:46:01.295, etc. ]
34      static final byte[] ntpPacket = hexStringToByteArray("1c0304ef0000006400000d3681531472d552447fec1d6000d5524718ac49ba5ed55247194b6d9000d55247194b797000");
35  
36      private static byte[] hexStringToByteArray(final String s) {
37          final int len = s.length();
38          final byte[] data = new byte[len / 2];
39          for (int i = 0; i < len; i += 2) {
40              data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16));
41          }
42          return data;
43      }
44  
45      @Test
46      void testCreate() {
47          final NtpV3Packet message = new NtpV3Impl();
48          message.setLeapIndicator(0); // byte 0 [bit numbers 7-6]
49          message.setVersion(NtpV3Packet.VERSION_3); // byte 0 [bit numbers 5-4]
50          message.setMode(4); // byte 0 [bit numbers 3-0]
51          message.setStratum(3); // byte 1
52          message.setPoll(4); // byte 2
53          message.setPrecision(-17); // byte 3
54          message.setRootDelay(100); // bytes 4-7
55          message.setRootDispersion(3382); // bytes 8-11
56          message.setReferenceId(0x81531472); // byte 12-15
57          message.setReferenceTime(new TimeStamp(0xd552447fec1d6000L));
58          message.setOriginateTimeStamp(new TimeStamp(0xd5524718ac49ba5eL));
59          message.setReceiveTimeStamp(new TimeStamp(0xd55247194b6d9000L));
60          message.setTransmitTime(new TimeStamp(0xd55247194b797000L));
61  
62          assertEquals(-17, message.getPrecision());
63          assertEquals(4, message.getPoll());
64          assertEquals(100, message.getRootDelay());
65          assertEquals(3382, message.getRootDispersion());
66          assertEquals(0x81531472, message.getReferenceId());
67          assertNotNull(message.getReferenceTimeStamp());
68          assertEquals("NTP", message.getType());
69          assertEquals("Server", message.getModeName());
70          assertEquals("129.83.20.114", message.getReferenceIdString());
71          assertEquals(51, message.getRootDispersionInMillis());
72          assertEquals(message.getRootDelay() / 65.536, message.getRootDelayInMillisDouble(), 1e-13);
73  
74          final DatagramPacket dp = message.getDatagramPacket(); // this creates a new datagram
75          assertNotNull(dp);
76          assertEquals(48, dp.getLength()); // fixed 48-byte length
77  
78          final NtpV3Packet message2 = new NtpV3Impl();
79          final DatagramPacket dp2 = new DatagramPacket(ntpPacket, ntpPacket.length);
80          message2.setDatagramPacket(dp2);
81  
82          assertEquals(message2, message);
83          assertEquals(message2.hashCode(), message.hashCode());
84          assertEquals(message2.toString(), message.toString());
85      }
86  
87      @Test
88      void testCreateAndSetByte0() {
89          // LI + VN + Mode all part of first byte -- make sure set order does not matter
90          final NtpV3Packet message = new NtpV3Impl();
91  
92          message.setLeapIndicator(2);
93          message.setMode(4);
94          message.setVersion(NtpV3Packet.VERSION_3);
95  
96          assertEquals(4, message.getMode());
97          assertEquals(NtpV3Packet.VERSION_3, message.getVersion());
98          assertEquals(2, message.getLeapIndicator());
99  
100         message.setLeapIndicator(2);
101         message.setVersion(NtpV3Packet.VERSION_3);
102         message.setMode(4);
103 
104         assertEquals(4, message.getMode());
105         assertEquals(NtpV3Packet.VERSION_3, message.getVersion());
106         assertEquals(2, message.getLeapIndicator());
107 
108         message.setMode(4);
109         message.setLeapIndicator(2);
110         message.setVersion(NtpV3Packet.VERSION_3);
111 
112         assertEquals(4, message.getMode());
113         assertEquals(NtpV3Packet.VERSION_3, message.getVersion());
114         assertEquals(2, message.getLeapIndicator());
115 
116         message.setMode(4);
117         message.setVersion(NtpV3Packet.VERSION_3);
118         message.setLeapIndicator(2);
119 
120         assertEquals(4, message.getMode());
121         assertEquals(NtpV3Packet.VERSION_3, message.getVersion());
122         assertEquals(2, message.getLeapIndicator());
123 
124         message.setVersion(NtpV3Packet.VERSION_3);
125         message.setMode(4);
126         message.setLeapIndicator(2);
127 
128         assertEquals(4, message.getMode());
129         assertEquals(NtpV3Packet.VERSION_3, message.getVersion());
130         assertEquals(2, message.getLeapIndicator());
131 
132         message.setVersion(NtpV3Packet.VERSION_3);
133         message.setLeapIndicator(2);
134         message.setMode(4);
135 
136         assertEquals(4, message.getMode());
137         assertEquals(NtpV3Packet.VERSION_3, message.getVersion());
138         assertEquals(2, message.getLeapIndicator());
139     }
140 
141     @Test
142     void testCreateFromBadPacket() {
143         final NtpV3Packet message = new NtpV3Impl();
144         final DatagramPacket dp = new DatagramPacket(ntpPacket, ntpPacket.length - 4); // drop 4-bytes from packet
145         assertThrows(IllegalArgumentException.class, () -> message.setDatagramPacket(dp));
146     }
147 
148     @Test
149     void testCreateFromBytes() {
150         final NtpV3Packet message = new NtpV3Impl();
151         final DatagramPacket dp = new DatagramPacket(ntpPacket, ntpPacket.length);
152         message.setDatagramPacket(dp);
153         assertEquals(4, message.getMode());
154     }
155 
156     @Test
157     void testCreateFromNullPacket() {
158         final NtpV3Packet message = new NtpV3Impl();
159         assertThrows(IllegalArgumentException.class, () -> message.setDatagramPacket(null));
160     }
161 
162     @Test
163     void testCreateNtpV4() {
164         final NtpV3Packet message = new NtpV3Impl();
165         message.setVersion(NtpV3Packet.VERSION_4);
166         message.setStratum(3);
167         message.setReferenceId(0x81531472);
168         // force hex-string reference id string
169         assertEquals("81531472", message.getReferenceIdString());
170 
171         message.setVersion(NtpV3Packet.VERSION_4);
172         message.setStratum(1);
173         message.setReferenceId(0x55534E4F); // USNO
174         // force raw-string reference id string
175         assertEquals("USNO", message.getReferenceIdString());
176 
177         message.setReferenceId(0x47505300); // GPS
178         assertEquals("GPS", message.getReferenceIdString());
179     }
180 
181     @Test
182     void testEquals() {
183         final NtpV3Packet message1 = new NtpV3Impl();
184         final DatagramPacket dp = new DatagramPacket(ntpPacket, ntpPacket.length);
185         message1.setDatagramPacket(dp);
186         final NtpV3Packet message2 = new NtpV3Impl();
187         message2.setDatagramPacket(dp);
188         assertEquals(message1.hashCode(), message2.hashCode(), "hashCode");
189         assertEquals(message1, message2);
190 
191         // now change the packet to force equals() => false
192         message2.setMode(2);
193         assertTrue(message1.getMode() != message2.getMode());
194         assertNotEquals(message1, message2);
195 
196         final NtpV3Packet message3 = null;
197         assertNotEquals(message3, message1);
198     }
199 
200 }