Implement a secure ICS protocol targeting LoRa Node151 microcontroller for controlling irrigation.
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

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