[ATFT] Fix a bug while purging keys.

Test: Local tests and unit tests.
Bug: None.
Change-Id: Ic78f2b605d85429d8f74ca9a6b685e53d58f2aaf
diff --git a/at-factory-tool/atft.py b/at-factory-tool/atft.py
index ead0d9a..16b6e37 100644
--- a/at-factory-tool/atft.py
+++ b/at-factory-tool/atft.py
@@ -3604,7 +3604,8 @@
     if not self._StartOperation(operation, self.atft_manager.atfa_dev):
       return
     try:
-      self.atft_manager.PurgeATFAKey()
+      is_som_key = self.atft_manager.som_info is not None
+      self.atft_manager.PurgeATFAKey(is_som_key)
       self._SendOperationSucceedEvent(operation)
       self._UpdateKeysLeftInATFA()
     except ProductNotSpecifiedException as e:
diff --git a/at-factory-tool/atftman.py b/at-factory-tool/atftman.py
index 6232d02..91badc9 100644
--- a/at-factory-tool/atftman.py
+++ b/at-factory-tool/atftman.py
@@ -1288,7 +1288,8 @@
 
       raise FastbootFailure('ATFA device response has invalid format')
     except FastbootFailure as e:
-      if 'No matching available products' in e.msg:
+      if ('No matching available products' in e.msg or
+          'No matching available SoMs' in e.msg):
         # If there's no matching product key, we set keys left to 0.
         self.atft_manager.atfa_dev.keys_left = 0
         return
@@ -1307,10 +1308,10 @@
       FastbootFailure: When fastboot command fails.
       ProductNotSpecifiedException: When product is not specified.
     """
-    if not is_som_key and self.product_info:
+    if not is_som_key and self.atft_manager.product_info:
       product_som_id = self.atft_manager.product_info.product_id
       command = 'purge '
-    elif is_som_key and self.som_info:
+    elif is_som_key and self.atft_manager.som_info:
       product_som_id = self.atft_manager.som_info.som_id
       command = 'purge-som '
     else:
diff --git a/at-factory-tool/atftman_unittest.py b/at-factory-tool/atftman_unittest.py
index 64f7d21..429f60c 100644
--- a/at-factory-tool/atftman_unittest.py
+++ b/at-factory-tool/atftman_unittest.py
@@ -828,6 +828,66 @@
     test_atfa_device_manager.UpdateKeysLeft(False)
     self.assertEqual(0, mock_atfa_dev.keys_left)
 
+  def testUpdateKeysLeftNoMatchingSoM(self):
+    atft_manager = atftman.AtftManager(self.FastbootDeviceTemplate,
+                                       self.mock_serial_mapper, self.configs)
+    mock_atfa_dev = MagicMock()
+    atft_manager.atfa_dev = mock_atfa_dev
+    test_atfa_device_manager = atftman.AtfaDeviceManager(atft_manager)
+    atft_manager.som_info = MagicMock()
+    atft_manager.som_info.som_id = self.TEST_ID
+    mock_atfa_dev.Oem.side_effect = FastbootFailure(
+        'No matching available SoMs')
+    test_atfa_device_manager.UpdateKeysLeft(True)
+    self.assertEqual(0, mock_atfa_dev.keys_left)
+
+  # Test AtfaDeviceManager.PurgeKey
+  def testPurgeKeyProduct(self):
+    atft_manager = atftman.AtftManager(self.FastbootDeviceTemplate,
+                                       self.mock_serial_mapper, self.configs)
+    mock_atfa_dev = MagicMock()
+    atft_manager.atfa_dev = mock_atfa_dev
+    test_atfa_device_manager = atftman.AtfaDeviceManager(atft_manager)
+    atft_manager.product_info = MagicMock()
+    atft_manager.product_info.product_id = self.TEST_ID
+    test_atfa_device_manager.PurgeKey(False)
+    mock_atfa_dev.Oem.assert_called_once_with('purge ' + self.TEST_ID)
+
+  def testPurgeKeySoM(self):
+    atft_manager = atftman.AtftManager(self.FastbootDeviceTemplate,
+                                       self.mock_serial_mapper, self.configs)
+    mock_atfa_dev = MagicMock()
+    atft_manager.atfa_dev = mock_atfa_dev
+    test_atfa_device_manager = atftman.AtfaDeviceManager(atft_manager)
+    atft_manager.som_info = MagicMock()
+    atft_manager.som_info.som_id = self.TEST_ID
+    test_atfa_device_manager.PurgeKey(True)
+    mock_atfa_dev.Oem.assert_called_once_with('purge-som ' + self.TEST_ID)
+
+  def testPurgeKeyProductNotSelected(self):
+    atft_manager = atftman.AtftManager(self.FastbootDeviceTemplate,
+                                       self.mock_serial_mapper, self.configs)
+    mock_atfa_dev = MagicMock()
+    atft_manager.atfa_dev = mock_atfa_dev
+    test_atfa_device_manager = atftman.AtfaDeviceManager(atft_manager)
+    atft_manager.product_info = None
+    atft_manager.som_info = None
+    with self.assertRaises(ProductNotSpecifiedException):
+      test_atfa_device_manager.PurgeKey(False)
+    mock_atfa_dev.Oem.assert_not_called()
+
+  def testPurgeKeySoMNotSelected(self):
+    atft_manager = atftman.AtftManager(self.FastbootDeviceTemplate,
+                                       self.mock_serial_mapper, self.configs)
+    mock_atfa_dev = MagicMock()
+    atft_manager.atfa_dev = mock_atfa_dev
+    test_atfa_device_manager = atftman.AtfaDeviceManager(atft_manager)
+    atft_manager.product_info = None
+    atft_manager.som_info = None
+    with self.assertRaises(ProductNotSpecifiedException):
+      test_atfa_device_manager.PurgeKey(True)
+    mock_atfa_dev.Oem.assert_not_called()
+
   # Test AtftManager.CheckProvisionStatus
   def MockGetVar(self, variable):
     return self.status_map.get(variable)