11import argparse
22from dataclasses import dataclass , field
3+ from abc import ABC , abstractmethod
34from typing import ClassVar
45from enum import Enum
56import logging
@@ -429,16 +430,17 @@ class TestPlanLogger:
429430
430431 decorator_line_len = 41
431432
432- def __init__ (self ):
433- pass
433+ # def __init__(self):
434+ # pass
434435
435- def test_plan_info (self , board , test_plan_file , hil_devs_file ):
436+ def test_plan_info (self , test_plan_file , hil_devs_file = None , board = None ):
436437 print (
437438 f"{ TestPlanLogger .blue_on } "
438439 + "#" * TestPlanLogger .decorator_line_len
439440 + f"{ TestPlanLogger .color_off } "
440441 )
441- print (f"{ TestPlanLogger .blue_on } > board : { board } { TestPlanLogger .color_off } " )
442+ if board :
443+ print (f"{ TestPlanLogger .blue_on } > board : { board } { TestPlanLogger .color_off } " )
442444 print (f"test plan file : { os .path .relpath (test_plan_file )} " )
443445 if hil_devs_file :
444446 print (f"hil devs file : { os .path .relpath (hil_devs_file )} " )
@@ -534,32 +536,21 @@ def test_summary_info(self, pass_test_name_list, fail_test_name_list, skip_test_
534536 )
535537
536538
537- class TestPlanRunner :
538- def __init__ (
539- self , test_plan_file , hil_devs_file , max_retries = 0 , dut_port = None , stub_port = None
540- ):
539+ class TestPlanRunner (ABC ):
540+ def __init__ (self , test_plan_file ):
541541 self .test_plan_file = test_plan_file
542- self .hil_devs_file = hil_devs_file
543- self .max_retries = max_retries
544542 self .logger = TestPlanLogger ()
545543
546- self .dut_port = dut_port
547- self .stub_port = stub_port
548- self .direct_mode = True if (self .dut_port is not None ) else False
549- print ("Direct mode:" , self .direct_mode )
550-
551- def run (self , board , test_name_list = []):
544+ def run (self , test_name_list = [], max_retries = 0 ):
552545 test_list = self .get_test_list (test_name_list )
553546
554- self .logger .test_plan_info (board , self .test_plan_file , self .hil_devs_file )
555-
556547 pass_test_name_list = []
557548 skip_test_name_list = []
558549 fail_test_name_list = []
559550 pending_retries = True
560551 while pending_retries :
561552 for test in test_list :
562- dut_port , stub_port = self .get_test_device_ports (test , board )
553+ dut_port , stub_port = self .get_test_device_ports (test )
563554
564555 if not test .are_required_devs_available (dut_port , stub_port ):
565556 skip_test_name_list .append (test .name )
@@ -569,11 +560,10 @@ def run(self, board, test_name_list=[]):
569560 # TODO: Add device.switch management.
570561
571562 self .logger .test_info (test .name , dut_port , stub_port )
572-
573563 ret_code = test .run (dut_port , stub_port )
574564
575565 if ret_code != 0 :
576- TestRunnerRetries .update_upon_fail (test .name , self . max_retries )
566+ TestRunnerRetries .update_upon_fail (test .name , max_retries )
577567 self .logger .test_fail_info (test .name )
578568 else :
579569 TestRunnerRetries .update_upon_success (test .name )
@@ -594,34 +584,49 @@ def run(self, board, test_name_list=[]):
594584 if fail_test_name_list :
595585 sys .exit (1 )
596586
597- def get_test_device_ports (self , test , board ):
598- def get_ports_for_role (test , board , device_role ):
599- allowed_board_list = test .get_allowed_board_list (device_role , board )
587+ def get_test_list (self , test_name_list = []):
588+ test_plan_list = TestRunner .load_list_from_yaml (self .test_plan_file )
600589
601- logging .debug (
602- f'ALLOWED { device_role } board list for test "{ test .name } ": { allowed_board_list } '
603- )
590+ if test_name_list == []:
591+ return test_plan_list
604592
605- port_list = []
606- for device in allowed_board_list :
607- available_ports = get_devices_port (
608- device .get ("board" ), self .hil_devs_file , device .get ("version" , None )
609- )
610- port_list .extend (available_ports )
593+ test_list = []
594+ for test_name in test_name_list :
595+ for test in test_plan_list :
596+ if test .name == test_name :
597+ test_list .append (test )
598+
599+ logging .debug (f"Selected test list: { [test .name for test in test_list ]} " )
600+
601+ return test_list
602+
603+ @abstractmethod
604+ def get_test_device_ports (self , test ):
605+ pass
606+
607+
608+ class TestPlanRunnerHIL (TestPlanRunner ):
609+ def __init__ (self , test_plan_file , hil_devs_file , board ):
610+ super ().__init__ (test_plan_file )
611+ self .hil_devs_file = hil_devs_file
612+ self .board = board
611613
612- logging .debug (f'AVAILABLE { device_role } ports for test "{ test .name } ": { port_list } ' )
614+ def set_board (self , board ):
615+ self .board = board
613616
614- return port_list
617+ def run (self , test_name_list = [], max_retries = 0 ):
618+ self .logger .test_plan_info (self .test_plan_file , self .hil_devs_file , self .board )
619+ return super ().run (test_name_list , max_retries )
615620
621+ """
622+ Private methods
623+ """
624+
625+ def get_test_device_ports (self , test ):
616626 dut_port = None
617627 stub_port = None
618628
619- if self .direct_mode :
620- dut_port = self .dut_port
621- stub_port = self .stub_port
622- return dut_port , stub_port
623-
624- dut_port_list = get_ports_for_role (test , board , TestRunner .DeviceRole .DUT )
629+ dut_port_list = self .get_ports_for_role (test , self .board , TestRunner .DeviceRole .DUT )
625630
626631 if not dut_port_list :
627632 return dut_port , stub_port
@@ -630,37 +635,52 @@ def get_ports_for_role(test, board, device_role):
630635 dut_port = dut_port_list [0 ]
631636
632637 if test .requires_multiple_devs ():
633- stub_port_list = get_ports_for_role (test , board , TestRunner .DeviceRole .STUB )
638+ stub_port_list = self . get_ports_for_role (test , self . board , TestRunner .DeviceRole .STUB )
634639
635640 # Take any element from stub_port_list that is not dut_port
636641 for port in stub_port_list :
637642 if port != dut_port :
638643 stub_port = port
639644 break
640645
641- if not stub_port :
642- return dut_port , stub_port
643-
644646 return dut_port , stub_port
645647
646- def get_test_list (self , test_name_list = [] ):
647- test_plan_list = TestRunner . load_list_from_yaml ( self . test_plan_file )
648+ def get_ports_for_role (self , test , board , device_role ):
649+ allowed_board_list = test . get_allowed_board_list ( device_role , board )
648650
649- if test_name_list == []:
650- return test_plan_list
651+ port_list = []
652+ for device in allowed_board_list :
653+ available_ports = get_devices_port (
654+ device .get ("board" ), self .hil_devs_file , device .get ("version" , None )
655+ )
656+ port_list .extend (available_ports )
651657
652- test_list = []
653- for test_name in test_name_list :
654- for test in test_plan_list :
655- if test .name == test_name :
656- test_list .append (test )
658+ return port_list
657659
658- logging .debug (f"Selected test list: { [test .name for test in test_list ]} " )
659660
660- return test_list
661+ class TestPlanRunnerPorts (TestPlanRunner ):
662+ def __init__ (self , test_plan_file , dut_port , stub_port ):
663+ super ().__init__ (test_plan_file )
664+ self .dut_port = dut_port
665+ self .stub_port = stub_port
666+
667+ def set_ports (self , dut_port , stub_port ):
668+ self .dut_port = dut_port
669+ self .stub_port = stub_port
661670
671+ def run (self , test_name_list = [], max_retries = 0 ):
672+ self .logger .test_plan_info (self .test_plan_file )
673+ return super ().run (test_name_list , max_retries )
662674
663- class TestPlanCLI :
675+ """
676+ Private methods
677+ """
678+
679+ def get_test_device_ports (self , test ):
680+ return self .dut_port , self .stub_port
681+
682+
683+ class TestPlanRunnerCLI :
664684 def __init__ (self ):
665685 self .parser = argparse .ArgumentParser (description = "MicroPython test suites runner." )
666686 self .parser .add_argument ("test_suite" , nargs = "*" , type = str , help = "Test suite to run." )
@@ -747,13 +767,16 @@ def set_validate_args(self, args):
747767
748768
749769if __name__ == "__main__" :
750- test_plan_cli = TestPlanCLI ()
751- cli_args = test_plan_cli .parse ()
752- test_plan_runner = TestPlanRunner (
753- cli_args .test_plan ,
754- cli_args .hil_devs ,
755- cli_args .max_retries ,
756- cli_args .dut_port ,
757- cli_args .stub_port ,
758- )
759- test_plan_runner .run (cli_args .board , cli_args .test_suite )
770+ test_plan_runner_cli = TestPlanRunnerCLI ()
771+ tpr_args = test_plan_runner_cli .parse ()
772+
773+ # HIL device file based mode
774+ if tpr_args .hil_devs :
775+ test_plan_runner = TestPlanRunnerHIL (tpr_args .test_plan , tpr_args .hil_devs , tpr_args .board )
776+ # Direct port passing mode
777+ elif tpr_args .dut_port :
778+ test_plan_runner = TestPlanRunnerPorts (
779+ tpr_args .test_plan , tpr_args .dut_port , tpr_args .stub_port
780+ )
781+
782+ test_plan_runner .run (tpr_args .test_suite , tpr_args .max_retries )
0 commit comments