Files

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()