xref: /aosp_15_r20/external/autotest/client/cros/cellular/pseudomodem/state_machine_factory.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5from . import cdma_activate_machine
6from . import connect_cdma_machine
7from . import connect_machine
8from . import disable_machine
9from . import disconnect_machine
10from . import enable_machine
11from . import pm_constants
12from . import register_cdma_machine
13from . import register_machine
14
15class StateMachineFactory(object):
16    """
17    State machines are created by the |Modem| objects by calling methods from
18    an object of type StateMachineFactory.
19
20    To supply your own state machines, simply pass in your own subclass of
21    |StateMachineFactory| that provides your implementations of the
22    state machine.
23
24    This default implementation allows tailoring the different state machines to
25    be interactive as needed.
26
27    """
28    def __init__(self):
29        self._bus = None
30        self._interactive = set()
31
32
33    def SetBus(self, bus):
34        """
35        Set the default dbus bus.
36
37        @param bus: The dbus bus.
38
39        """
40        self._bus = bus
41
42
43    def SetInteractiveAll(self):
44        """
45        Set all machines to be launched in interactive mode.
46
47        All core pseudomodem machines should appear here. If you add a state
48        machine to pseudomodem, please add it here so that tests can easily run
49        it in interactive mode.
50
51        """
52        self.SetInteractive(pm_constants.STATE_MACHINE_CDMA_ACTIVATE)
53        self.SetInteractive(pm_constants.STATE_MACHINE_CONNECT)
54        self.SetInteractive(pm_constants.STATE_MACHINE_CONNECT_CDMA)
55        self.SetInteractive(pm_constants.STATE_MACHINE_DISABLE)
56        self.SetInteractive(pm_constants.STATE_MACHINE_DISCONNECT)
57        self.SetInteractive(pm_constants.STATE_MACHINE_ENABLE)
58        self.SetInteractive(pm_constants.STATE_MACHINE_REGISTER)
59        self.SetInteractive(pm_constants.STATE_MACHINE_REGISTER_CDMA)
60
61
62    def SetInteractive(self, machine_name):
63        """
64        Set the given machine to be launched in interative mode.
65
66        @param machine_name: The name of the machine to be launched in
67                interactive mode.
68
69        """
70        self._interactive.add(machine_name)
71
72
73    def CreateMachine(self, machine_name, *args, **kwargs):
74        """
75        Create an instance of the given machine.
76
77        @param machine_name: The name of the machine to be created. All
78                supported machine names are exported as constants in the
79                |pm_constants| module.
80        @param *args, **kwargs: Arguments to pass to the machine constructor.
81        @returns: A new instance of the deseried machine
82
83        """
84        if machine_name == pm_constants.STATE_MACHINE_CDMA_ACTIVATE:
85            machine = cdma_activate_machine.CdmaActivateMachine(*args, **kwargs)
86        elif machine_name == pm_constants.STATE_MACHINE_CONNECT:
87            machine = connect_machine.ConnectMachine(*args, **kwargs)
88        elif machine_name == pm_constants.STATE_MACHINE_CONNECT_CDMA:
89            machine = connect_cdma_machine.ConnectCdmaMachine(*args, **kwargs)
90        elif machine_name == pm_constants.STATE_MACHINE_DISABLE:
91            machine = disable_machine.DisableMachine(*args, **kwargs)
92        elif machine_name == pm_constants.STATE_MACHINE_DISCONNECT:
93            machine = disconnect_machine.DisconnectMachine(*args, **kwargs)
94        elif machine_name == pm_constants.STATE_MACHINE_ENABLE:
95            machine = enable_machine.EnableMachine(*args, **kwargs)
96        elif machine_name == pm_constants.STATE_MACHINE_REGISTER:
97            machine = register_machine.RegisterMachine(*args, **kwargs)
98        elif machine_name == pm_constants.STATE_MACHINE_REGISTER_CDMA:
99            machine = register_cdma_machine.RegisterCdmaMachine(*args, **kwargs)
100        else:
101            # Reaching here is a non recoverable programming error.
102            assert False
103
104        if machine_name in self._interactive:
105            machine.EnterInteractiveMode(self._bus)
106        return machine
107