[Git][NTPsec/ntpsec][master] Added tests and tweaks for ControlPacket()

Ian Bruene gitlab at mg.gitlab.com
Mon Aug 21 03:11:00 UTC 2017


Ian Bruene pushed to branch master at NTPsec / ntpsec


Commits:
51ec6156 by Ian Bruene at 2017-08-20T22:09:38-05:00
Added tests and tweaks for ControlPacket()

- - - - -


2 changed files:

- pylib/packet.py
- tests/pylib/test_packet.py


Changes:

=====================================
pylib/packet.py
=====================================
--- a/pylib/packet.py
+++ b/pylib/packet.py
@@ -606,8 +606,9 @@ class ControlPacket(Packet):
     def end(self):
         return self.count + self.offset
 
-    def stats(self, idx):
+    def stats(self, idx=None):
         "Return statistics on a fragment."
+        # idx is default None until I can confirm that it is useless
         return "%5d %5d\t%3d octets\n" % (self.offset, self.end(), self.count)
 
     def analyze(self, rawdata):
@@ -621,6 +622,8 @@ class ControlPacket(Packet):
          self.count) = struct.unpack(ControlPacket.format,
                                      rawdata[:ControlPacket.HEADER_LEN])
         self.data = rawdata[ControlPacket.HEADER_LEN:]
+        # TODO: This method does not handle .extension
+        #  fix this, use .data or .extension?
         return (self.sequence, self.status, self.associd, self.offset)
 
     def flatten(self):


=====================================
tests/pylib/test_packet.py
=====================================
--- a/tests/pylib/test_packet.py
+++ b/tests/pylib/test_packet.py
@@ -611,6 +611,115 @@ class TestMisc(unittest.TestCase):
                          "now=0x01234567.89ABCDEF>")
 
 
+class TestControlPacket(unittest.TestCase):
+    target = ntp.packet.ControlPacket
+    session = ntp.packet.ControlSession
+
+    def test___init__(self):
+        ses = self.session()
+        cls = self.target(ses)
+        self.assertEqual(cls.r_e_m_op, 0)
+        self.assertEqual(cls.sequence, 1)
+        self.assertEqual(cls.status, 0)
+        self.assertEqual(cls.associd, 0)
+        self.assertEqual(cls.offset, 0)
+        self.assertEqual(cls.extension, "")
+        self.assertEqual(cls.count, 0)
+
+    def test_is_response(self):
+        cls = self.target(self.session())
+        # Test True
+        cls.r_e_m_op = 0x80
+        self.assertEqual(cls.is_response(), True)
+        # Test False
+        cls.r_e_m_op = 0x7F
+        self.assertEqual(cls.is_response(), False)
+
+    def test_is_error(self):
+        cls = self.target(self.session())
+        # Test True
+        cls.r_e_m_op = 0x40
+        self.assertEqual(cls.is_error(), True)
+        # Test False
+        cls.r_e_m_op = 0xBF
+        self.assertEqual(cls.is_error(), False)
+
+    def test_more(self):
+        cls = self.target(self.session())
+        # Test True
+        cls.r_e_m_op = 0x20
+        self.assertEqual(cls.more(), True)
+        # Test False
+        cls.r_e_m_op = 0xDF
+        self.assertEqual(cls.more(), False)
+
+    def test_opcode(self):
+        cls = self.target(self.session())
+        # Test normal
+        cls.r_e_m_op = 0x06
+        self.assertEqual(cls.opcode(), 6)
+        # Test maximum
+        cls.r_e_m_op = 0xFF
+        self.assertEqual(cls.opcode(), 31)
+        # Test maximum, no bits
+        cls.r_e_m_op = 0x1F
+        self.assertEqual(cls.opcode(), 31)
+
+    def test_errcode(self):
+        cls = self.target(self.session())
+        # Test none
+        cls.status = 0x00FF
+        self.assertEqual(cls.errcode(), 0)
+        # Test midling
+        cls.status = 0x11FF
+        self.assertEqual(cls.errcode(), 17)
+        # Test maximum
+        cls.status = 0xFF00
+        self.assertEqual(cls.errcode(), 255)
+
+    def test_end(self):
+        cls = self.target(self.session())
+        cls.count = 5
+        cls.offset = 10
+        self.assertEqual(cls.end(), 15)
+
+    def test_stats(self):
+        cls = self.target(self.session())
+        cls.count = 25
+        cls.offset = 10
+        self.assertEqual(cls.stats(), "   10    35\t 25 octets\n")
+
+    def test_analyze_flatten_send(self):
+        cls = self.target(self.session())
+        header = "\x8A\x3F\x00\x01\x00\x02\x00\x03\x00\x20\x00\x10"
+        payload = "\x00\x11\x22\x33\x44\x55\x66\x77" \
+                  "\x88\x99\xAA\xBB\xCC\xDD\xEE\xFF"
+        ext = "\x01\x02\x03\x04" \
+              "\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7" \
+              "\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF"
+        totaldata = header + payload + ext
+        # Test analyze
+        result = cls.analyze(totaldata)
+        self.assertEqual(result, (1, 2, 3, 32))
+        self.assertEqual(cls.li_vn_mode, 0x8A)
+        self.assertEqual(cls.r_e_m_op, 0x3F)
+        self.assertEqual(cls.sequence, 1)
+        self.assertEqual(cls.status, 2)
+        self.assertEqual(cls.associd, 3)
+        self.assertEqual(cls.offset, 32)
+        self.assertEqual(cls.count, 16)
+        # Test flatten
+        self.assertEqual(cls.flatten(), header)
+        # Test send
+        send_data = []
+
+        def send_jig(pkt):
+            send_data.append(pkt)
+        cls.session.sendpkt = send_jig
+        cls.send()
+        self.assertEqual(send_data, [header])
+
+
 class TestControlSession(unittest.TestCase):
     target = ntp.packet.ControlSession
 



View it on GitLab: https://gitlab.com/NTPsec/ntpsec/commit/51ec61568b5e1e2c062e4d4a0a98057876a6ba43

---
View it on GitLab: https://gitlab.com/NTPsec/ntpsec/commit/51ec61568b5e1e2c062e4d4a0a98057876a6ba43
You're receiving this email because of your account on gitlab.com.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ntpsec.org/pipermail/vc/attachments/20170821/26366422/attachment.html>


More information about the vc mailing list