Implement a secure ICS protocol targeting LoRa Node151 microcontroller for controlling irrigation.
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

111 Zeilen
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')