video_monitor/monitor_runtime/diagnostics.py

68 lines
2.9 KiB
Python
Raw Permalink Normal View History

2026-09-04 18:16:14 +08:00
"""Offline dependency and frozen-spawn smoke test, with no camera/model access."""
import json
import multiprocessing
from monitor_runtime.paths import data, resource, atomic_json
def spawn_probe(queue):
import numpy as np
import cv2
queue.put({'resized': list(cv2.resize(np.zeros((4,4,3),dtype=np.uint8),(2,2)).shape)})
def run():
from monitor_runtime.bootstrap import prepare_files, initialize_database
prepare_files()
initialize_database()
import django
import cv2
import numpy as np
import torch
import torchvision
import onnxruntime
import openvino as ov
from ultralytics import YOLO
from ultralytics.utils import USER_CONFIG_DIR
assert USER_CONFIG_DIR.resolve().is_relative_to(data('').resolve())
import pystray
import whitenoise
result = {'django':django.get_version(),'opencv':cv2.__version__,'torch':torch.__version__,
'torchvision':torchvision.__version__,'onnxruntime':onnxruntime.__version__,
'openvino':ov.__version__}
assert torch.version.cuda is None
assert (torch.ones(2,2) @ torch.ones(2,2)).tolist() == [[2.,2.],[2.,2.]]
assert 'CPUExecutionProvider' in onnxruntime.get_available_providers()
# Architecture-only random weights: no model download, no customer model or pickle.
detector = YOLO('yolo26n.yaml', task='detect')
predictions = detector.predict(np.zeros((64,64,3), dtype=np.uint8), imgsz=64, device='cpu', verbose=False)
assert len(predictions) == 1 and predictions[0].orig_shape == (64,64)
result['yolo_cpu_inference'] = 'passed (random weights; no accuracy claim)'
parameter = ov.opset13.parameter([1],np.float32)
model = ov.Model([ov.opset13.relu(parameter)],[parameter])
compiled = ov.Core().compile_model(model,'CPU')
assert float(compiled([np.array([-1],dtype=np.float32)])[0][0]) == 0
ctx=multiprocessing.get_context('spawn')
queue=ctx.Queue()
process=ctx.Process(target=spawn_probe,args=(queue,))
process.start()
try:
assert queue.get(timeout=60)['resized']==[2,2,3]
process.join(timeout=20)
assert process.exitcode==0
finally:
if process.is_alive():
process.terminate()
process.join(timeout=10)
queue.close()
from django.test import Client
client=Client(HTTP_HOST='localhost')
response=client.get('/setup',REMOTE_ADDR='127.0.0.1')
assert response.status_code in (200,403)
assert resource('public-static/lib/js/app.js').is_file()
assert resource('zlm/monitor_zlm.exe').is_file()
assert resource('tools/ffmpeg.exe').is_file()
from monitor_runtime.licensing import machine_identity
assert machine_identity()['fingerprint'].startswith('v1:')
result.update(status='passed',spawn='passed',cpu='passed',resources='passed',
writable_caches='ProgramData/test data root')
atomic_json(data('.runtime/self-test.json'),result)
return 0