#!/usr/bin/env python3
import os
import glob
import signal
import subprocess
import time
import unittest
from common . basedir import BASEDIR
from common . timeout import Timeout
from tools . plotjuggler . juggle import install
PJ_DIR = os . path . join ( BASEDIR , " tools/plotjuggler " )
class TestPlotJuggler ( unittest . TestCase ) :
def test_demo ( self ) :
install ( )
pj = os . path . join ( PJ_DIR , " juggle.py " )
p = subprocess . Popen ( f ' QT_QPA_PLATFORM=offscreen { pj } --demo None 1 --qlog ' ,
stderr = subprocess . PIPE , shell = True , start_new_session = True )
# Wait for "Done reading Rlog data" signal from the plugin
output = " \n "
with Timeout ( 180 , error_msg = output ) :
while output . splitlines ( ) [ - 1 ] != " Done reading Rlog data " :
output + = p . stderr . readline ( ) . decode ( " utf-8 " )
# ensure plotjuggler didn't crash after exiting the plugin
time . sleep ( 15 )
self . assertEqual ( p . poll ( ) , None )
os . killpg ( os . getpgid ( p . pid ) , signal . SIGTERM )
# TODO: also test that layouts successfully load
def test_layouts ( self ) :
bad_strings = (
# if a previously loaded file is defined,
# PJ will throw a warning when loading the layout
" fileInfo " ,
" previouslyLoaded_Datafiles " ,
)
for fn in glob . glob ( os . path . join ( PJ_DIR , " layouts/* " ) ) :
name = os . path . basename ( fn )
with self . subTest ( layout = name ) :
with open ( fn ) as f :
layout = f . read ( )
violations = [ s for s in bad_strings if s in layout ]
assert len ( violations ) == 0 , f " These should be stripped out of the layout: { str ( violations ) } "
if __name__ == " __main__ " :
unittest . main ( )