test_tuning.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. # -*- coding:utf-8 -*-
  2. from configparser import ConfigParser
  3. import pytest
  4. from dw_base.datax.tuning import _parse_hhmm, load_tuning_conf, merge_speed
  5. def test_parse_hhmm_standard():
  6. assert _parse_hhmm('07:50') == 750
  7. assert _parse_hhmm('19:00') == 1900
  8. assert _parse_hhmm('00:00') == 0
  9. assert _parse_hhmm('23:59') == 2359
  10. assert _parse_hhmm('00:05') == 5
  11. def test_parse_hhmm_invalid():
  12. with pytest.raises(ValueError, match='HH:MM'):
  13. _parse_hhmm('0750')
  14. with pytest.raises(ValueError, match='越界'):
  15. _parse_hhmm('24:00')
  16. with pytest.raises(ValueError, match='越界'):
  17. _parse_hhmm('07:60')
  18. with pytest.raises(ValueError, match='非数字'):
  19. _parse_hhmm('ab:cd')
  20. def test_load_tuning_conf(tmp_path):
  21. p = tmp_path / 'tuning.conf'
  22. p.write_text(
  23. '# 注释\n'
  24. 'key.a value1\n'
  25. '\n'
  26. 'key.b value with spaces\n'
  27. 'key.c\t42\n',
  28. encoding='utf-8'
  29. )
  30. cfg = load_tuning_conf(str(p))
  31. assert cfg['key.a'] == 'value1'
  32. assert cfg['key.b'] == 'value with spaces'
  33. assert cfg['key.c'] == '42'
  34. def _mk_l1():
  35. return {
  36. 'speed.relaxed_period.start': '06:00',
  37. 'speed.relaxed_period.stop': '12:00',
  38. 'speed.strict.channel': '10',
  39. 'speed.strict.byte': '10485760',
  40. 'speed.strict.record': '40000',
  41. 'speed.relaxed.channel': '6',
  42. 'speed.relaxed.byte': '268435456',
  43. 'speed.relaxed.record': '100000',
  44. }
  45. def test_merge_speed_l1_relaxed_period():
  46. """now=1000 在宽松区间 [600, 1200) 内,走 L1 relaxed 档。"""
  47. ini = ConfigParser()
  48. speed = merge_speed(_mk_l1(), ini, now_hhmm=1000)
  49. assert speed == {'channel': 6, 'byte': 268435456, 'record': 100000}
  50. def test_merge_speed_l1_strict_period():
  51. """now=1300 在宽松区间外,走 L1 strict 档。"""
  52. ini = ConfigParser()
  53. speed = merge_speed(_mk_l1(), ini, now_hhmm=1300)
  54. assert speed == {'channel': 10, 'byte': 10485760, 'record': 40000}
  55. def test_merge_speed_boundary_relaxed_start_inclusive():
  56. """now 恰 == relaxed_start(左闭)属宽松。"""
  57. ini = ConfigParser()
  58. speed = merge_speed(_mk_l1(), ini, now_hhmm=600)
  59. assert speed['channel'] == 6 # relaxed
  60. def test_merge_speed_boundary_relaxed_stop_exclusive():
  61. """now 恰 == relaxed_stop(右开)属严格。"""
  62. ini = ConfigParser()
  63. speed = merge_speed(_mk_l1(), ini, now_hhmm=1200)
  64. assert speed['channel'] == 10 # strict
  65. def test_merge_speed_l2_ini_overrides_l1_per_field():
  66. """L2 只写 channel,byte/record 回落 L1 当前时段。"""
  67. ini = ConfigParser()
  68. ini.add_section('speed')
  69. ini.set('speed', 'channel', '20')
  70. speed = merge_speed(_mk_l1(), ini, now_hhmm=1000)
  71. assert speed == {'channel': 20, 'byte': 268435456, 'record': 100000}
  72. def test_merge_speed_l3_cli_overrides_l2_l1():
  73. """L3 CLI 覆盖 L2 ini;CLI 里 None 的字段不覆盖。"""
  74. ini = ConfigParser()
  75. ini.add_section('speed')
  76. ini.set('speed', 'channel', '20')
  77. cli = {'channel': 30, 'byte': None, 'record': 50000}
  78. speed = merge_speed(_mk_l1(), ini, cli_overrides=cli, now_hhmm=1000)
  79. # channel: L3=30 胜;byte: None 不覆盖,回落 L1 relaxed;record: L3=50000
  80. assert speed == {'channel': 30, 'byte': 268435456, 'record': 50000}
  81. def test_merge_speed_l3_only_without_ini_section():
  82. """ini 没 [speed] 段也能正常工作,L3 直接覆盖 L1。"""
  83. ini = ConfigParser()
  84. cli = {'channel': 15, 'byte': None, 'record': None}
  85. speed = merge_speed(_mk_l1(), ini, cli_overrides=cli, now_hhmm=1000)
  86. assert speed == {'channel': 15, 'byte': 268435456, 'record': 100000}