Implement a secure ICS protocol targeting LoRa Node151 microcontroller for controlling irrigation.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

111 lines
2.9 KiB

  1. # -*- coding: utf-8 -*-
  2. from .context import encdec8b10b
  3. from encdec8b10b import EncDec8B10B
  4. import random
  5. import unittest
  6. import sys
  7. if sys.version_info.major != 3:
  8. raise RuntimeError('invalid major version of python')
  9. class TestClass(unittest.TestCase):
  10. def test_to10b(self):
  11. to10b = EncDec8B10B._to10b
  12. self.assertEqual(to10b(0), '0' * 10)
  13. self.assertEqual(to10b(2**10-1), '1' * 10)
  14. self.assertEqual(to10b(0x20f), '1' * 4 + '000001')
  15. self.assertEqual(to10b(0x0ff), '1' * 8 + '00')
  16. dispminmax = [ 2, 3, 2, 3, 2, 1, 2, 1, 2, 1 ]
  17. def test_disparity(self):
  18. failures = []
  19. for i in range(512):
  20. disp = i >> 8
  21. din = i & 0xff
  22. ndisp, out = EncDec8B10B.enc_8b10b(din, disp)
  23. cnt = +1 if disp else -1
  24. for j in range(10):
  25. out, bit = divmod(out, 2)
  26. cnt += +1 if bit else -1
  27. minmax = self.dispminmax[j]
  28. if cnt < -minmax or cnt > minmax:
  29. failures.append((disp, din))
  30. if cnt != 1 if ndisp else cnt != -1:
  31. failures.append((disp, din))
  32. if failures:
  33. raise RuntimeError('failures(%d): %s' % (len(failures), repr(failures)))
  34. def test_bitdecoding(self):
  35. coder = EncDec8B10B()
  36. with self.assertRaises(ValueError):
  37. coder.decode('asioj')
  38. self.assertIsNone(coder.decode(''))
  39. self.assertFalse(coder.issyncd())
  40. self.assertIsNone(coder.decode('101011011010101101'))
  41. self.assertFalse(coder.issyncd())
  42. self.assertEqual(coder.decode(coder.encode(EncDec8B10B.COMMA)), EncDec8B10B.COMMA)
  43. self.assertTrue(coder.issyncd())
  44. astr = coder.encode(b'a')
  45. self.assertIsNone(coder.decode(astr[:5]))
  46. self.assertEqual(coder.decode(astr[5:]), b'a')
  47. self.assertEqual(coder.decode(coder.encode(b'abc123')), b'abc123')
  48. chrctrlstr = coder.encode(b'xx') + coder.encode(EncDec8B10B.K_28_0)
  49. self.assertIsNone(coder.decode(chrctrlstr[:5]))
  50. self.assertEqual(coder.decode(chrctrlstr[5:]), b'xx')
  51. self.assertEqual(coder.decode(''), EncDec8B10B.K_28_0)
  52. self.assertEqual(coder.decode(coder.encode(EncDec8B10B.K_28_2)), EncDec8B10B.K_28_2)
  53. # that when junk is delivered, it is ignored
  54. self.assertIsNone(coder.decode('111111111000011111'))
  55. # and is no longer synced
  56. self.assertFalse(coder.issyncd())
  57. commaastr = coder.encode(EncDec8B10B.COMMA) + \
  58. coder.encode(b'a')
  59. # But it will sync back up
  60. self.assertEqual(coder.decode(commaastr), EncDec8B10B.COMMA)
  61. self.assertEqual(coder.decode(''), b'a')
  62. self.assertIsNone(coder.decode(''))
  63. self.assertEqual(coder.decode(coder.encode(EncDec8B10B.COMMA)), EncDec8B10B.COMMA)
  64. def test_bitencoding(self):
  65. coder = EncDec8B10B()
  66. self.assertEqual(coder.encode(b'a'), '0111010011')
  67. # +
  68. s = ''.join((
  69. '1000101100', # a -
  70. '1011010011', # b +
  71. '1100010011', # c +
  72. '1000111001', # 1 +
  73. '0100111001', # 2 +
  74. '1100101001', # 3 +
  75. ))
  76. self.assertEqual(coder.encode(b'abc123'), s)
  77. self.assertEqual(coder.encode(EncDec8B10B.COMMA), '1100000101')
  78. self.assertEqual(coder.encode(EncDec8B10B.COMMA), '0011111010')