faft: Refactoring soft reset test

Moved the states_list to be part of the plankton PD device class
similar to the changes for the hard_reset() method. In addition
added try/except clauses to method calls in the soft_reset test
script.

BRANCH=none
BUG=chrome-os-partner:50178
TEST=Manual
Tested with Samus to Plankton. Verfied that soft resets are initiated
and the state transition history can be used to verify expected operation.

Change-Id: I131f6b2784c77cfdb69210250d3dd5c11fd739c9
Signed-off-by: Scott <scollyer@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/340248
Commit-Ready: Scott Collyer <scollyer@chromium.org>
Tested-by: Scott Collyer <scollyer@chromium.org>
Reviewed-by: Todd Broch <tbroch@chromium.org>
diff --git a/server/cros/servo/pd_device.py b/server/cros/servo/pd_device.py
index 7f9d5c9..0d0d51a 100644
--- a/server/cros/servo/pd_device.py
+++ b/server/cros/servo/pd_device.py
@@ -91,10 +91,9 @@
         raise NotImplementedError(
                 'vbus_request should be implemented in derived class')
 
-    def soft_reset(self, states_list=None):
+    def soft_reset(self):
         """Initates a PD soft reset sequence
 
-        @param states_list: list of expected PD state transitions
         """
         raise NotImplementedError(
                 'soft_reset should be implemented in derived class')
@@ -277,7 +276,7 @@
             val = 'off'
         return bool(val == m[0][1])
 
-    def soft_reset(self, states_list=None):
+    def soft_reset(self):
         """Initates a PD soft reset sequence
 
         To verify that a soft reset sequence was initiated, the
@@ -285,8 +284,6 @@
         was acknowledged by its port pair. The connect state should
         be same as it was prior to issuing the reset command.
 
-        @param states_list: list of expected PD state transitions
-
         @returns True if the port pair acknowledges the the reset message
         and if following the command, the device returns to the same
         connected state. False otherwise.
@@ -480,13 +477,36 @@
         m = self.utils.send_pd_command_get_output(cmd, reply_exp)
         return self._verify_state_sequence(states_list, m[0][0])
 
-    def soft_reset(self, states_list):
+    def soft_reset(self):
         """Initates a PD soft reset sequence
 
-        @param states_list: list of expected PD state transitions
-
         @returns True if state transitions match, False otherwise
         """
+        snk_reset_states = [
+            'SOFT_RESET',
+            'SNK_DISCOVERY',
+            'SNK_REQUESTED',
+            'SNK_TRANSITION',
+            'SNK_READY'
+        ]
+
+        src_reset_states = [
+            'SOFT_RESET',
+            'SRC_DISCOVERY',
+            'SRC_NEGOCIATE',
+            'SRC_ACCEPTED',
+            'SRC_POWERED',
+            'SRC_TRANSITION',
+            'SRC_READY'
+        ]
+
+        if self.is_src():
+            states_list = src_reset_states
+        elif self.is_snk():
+            states_list = snk_reset_states
+        else:
+            raise error.TestFail('Port Pair not in a connected state')
+
         cmd = 'pd %d soft' % self.port
         return self._reset(cmd, states_list)
 
diff --git a/server/site_tests/firmware_PDResetSoft/firmware_PDResetSoft.py b/server/site_tests/firmware_PDResetSoft/firmware_PDResetSoft.py
index 72546d8..c53ace9 100644
--- a/server/site_tests/firmware_PDResetSoft/firmware_PDResetSoft.py
+++ b/server/site_tests/firmware_PDResetSoft/firmware_PDResetSoft.py
@@ -20,26 +20,8 @@
 
     """
     version = 1
-
     RESET_ITERATIONS = 5
 
-    snk_reset_states = [
-        'SOFT_RESET',
-        'SNK_DISCOVERY',
-        'SNK_REQUESTED',
-        'SNK_TRANSITION',
-        'SNK_READY'
-    ]
-
-    src_reset_states = [
-        'SOFT_RESET',
-        'SRC_DISCOVERY',
-        'SRC_NEGOCIATE',
-        'SRC_ACCEPTED',
-        'SRC_POWERED',
-        'SRC_TRANSITION',
-        'SRC_READY'
-    ]
 
     def _test_soft_reset(self, port_pair):
         """Tests soft reset initated by both Plankton and the DUT
@@ -48,15 +30,12 @@
         """
         for dev in port_pair:
             for _ in xrange(self.RESET_ITERATIONS):
-                # Select the appropriate state transition table
-                if dev.is_src():
-                    states_list = self.src_reset_states
-                elif dev.is_snk():
-                    states_list = self.snk_reset_states
-                else:
-                    raise error.TestFail('Port Pair not in a connected state')
-                if dev.soft_reset(states_list) == False:
-                    raise error.TestFail('Soft Reset Failed')
+                try:
+                    if dev.soft_reset() == False:
+                        raise error.TestFail('Soft Reset Failed')
+                except NotImplementedError:
+                    logging.warn('Device cant soft reset ... skipping')
+                    break
 
     def initialize(self, host, cmdline_args):
         super(firmware_PDResetSoft, self).initialize(host, cmdline_args)
@@ -92,9 +71,12 @@
         # Test soft resets initiated by both ends
         self._test_soft_reset(port_pair)
         # Attempt to swap power roles
-        if port_pair[0].pr_swap() == False:
-            logging.warn('Power role not swapped, ending test')
+        try:
+            if port_pair[0].pr_swap() == False:
+                logging.warn('Power role not swapped, ending test')
+                return
+        except NotImplementedError:
+            logging.warn('device cant send power role swap command, end test')
             return
         # Power role has been swapped, retest.
         self._test_soft_reset(port_pair)
-