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