34 lines
1.9 KiB
Python
34 lines
1.9 KiB
Python
import json
|
|
from pathlib import Path
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
from unittest.mock import patch
|
|
sys.path.insert(0,str(Path(__file__).resolve().parents[1]))
|
|
from reconcile_metrics import parse_metrics, FIELDS
|
|
from bcachefs_mqtt import Bridge
|
|
from test_mqtt_report import Client, UUID
|
|
|
|
class MetricsTest(unittest.TestCase):
|
|
def test_byte_values_and_missing_fields(self):
|
|
self.assertEqual(parse_metrics('bcachefs_reconcile,uuid=test scan_pending=0,target_data=123,erasure_code_data=456\n'),{'target_data':123,'erasure_code_data':456})
|
|
for data in ('', 'invalid', 'bcachefs_reconcile,uuid=test target_data=-1', 'bcachefs_reconcile,uuid=test target_data=NaN', 'bcachefs_reconcile,uuid=test scan_pending=0'):
|
|
with self.subTest(data=data), self.assertRaises(ValueError):parse_metrics(data)
|
|
|
|
def test_discovery_and_failed_collection(self):
|
|
with tempfile.TemporaryDirectory() as root:
|
|
options=Path(root)/UUID/'options'; options.mkdir(parents=True)
|
|
client=Client(); bridge=Bridge(client,UUID,root)
|
|
bridge.announce()
|
|
configs=[json.loads(payload) for topic,payload in client.messages if '/sensor/' in topic]
|
|
self.assertEqual(len(configs),16)
|
|
self.assertTrue(all(c['force_update'] and c['unit_of_measurement']=='B' for c in configs))
|
|
self.assertEqual({c['unique_id'] for c in configs}, {f'bcachefs_{UUID}_reconcile_{field}' for field in FIELDS})
|
|
with patch('bcachefs_mqtt.read_metrics',return_value={'target_data':123}):bridge.sample_reconcile('/mnt')
|
|
self.assertIn((bridge.base+'/reconcile/state','{"target_data": 123}'),client.messages)
|
|
with patch('bcachefs_mqtt.read_metrics',side_effect=subprocess.TimeoutExpired('collector',15)):bridge.sample_reconcile('/mnt')
|
|
self.assertEqual(client.messages[-1],(bridge.base+'/reconcile/availability','offline'))
|
|
|
|
if __name__=='__main__':unittest.main()
|