[ATFT] Log at-attest-uuid to log.

Test: Local test. Verify at-attest-uuid appears in log.
Bug: b/76169025
Change-Id: I8fc89a201b9eff8746da4f34a41b37b7a5f07a51
diff --git a/at-factory-tool/atft.py b/at-factory-tool/atft.py
index 56276e6..a471f06 100644
--- a/at-factory-tool/atft.py
+++ b/at-factory-tool/atft.py
@@ -3242,6 +3242,9 @@
       self._EndOperation(target)
 
     self._SendOperationSucceedEvent(operation, target)
+    self.log.Info(
+      'Key Provisioning',
+      'Device: ' + str(target) + ' AT-ATTEST-UUID: ' + target.at_attest_uuid)
     self._CheckLowKeyAlert()
 
   def _HandleStateTransition(self, target):
diff --git a/at-factory-tool/atft_unittest.py b/at-factory-tool/atft_unittest.py
index 09bf015..1897216 100644
--- a/at-factory-tool/atft_unittest.py
+++ b/at-factory-tool/atft_unittest.py
@@ -70,6 +70,7 @@
     self.time_set = False
     self.operation_lock = MagicMock()
     self.operation = None
+    self.at_attest_uuid = None
 
   def __eq__(self, other):
     return (self.serial_number == other.serial_number and
@@ -98,6 +99,7 @@
   TEST_PASSWORD1 = 'password 1'
   TEST_PASSWORD2 = 'PassWord 2!'
   TEST_FILENAME = 'filename'
+  TEST_ATTEST_UUID = 'test attest uuid'
 
   def setUp(self):
     self.test_target_devs = []
@@ -1025,6 +1027,7 @@
 
   def MockSuccessProvision(self, target):
     self.atfa_keys -= 1
+    self.MockSetAttestUuid(target)
 
   def MockFailedProvision(self, target):
     pass
@@ -1159,6 +1162,9 @@
     mock_atft._Shutdown()
     mock_atft._HandleException.assert_called_once()
 
+  def MockSetAttestUuid(self, target):
+    target.at_attest_uuid = self.TEST_ATTEST_UUID
+
   # Test atft._ManualProvision
   def testManualProvision(self):
     mock_atft = MockAtft()
@@ -1168,6 +1174,7 @@
     mock_atft._SendSucceedMessageEvent = MagicMock()
     mock_atft._HandleException = MagicMock()
     mock_atft.atft_manager.Provision = MagicMock()
+    mock_atft.atft_manager.Provision.side_effect = self.MockSetAttestUuid
     mock_atft._SendAlertEvent = MagicMock()
     mock_atft._CheckLowKeyAlert = MagicMock()
     mock_atft.atft_manager.GetTargetDevice.side_effect = (
@@ -1206,6 +1213,7 @@
     mock_atft._SendSucceedMessageEvent = MagicMock()
     mock_atft._HandleException = MagicMock()
     mock_atft.atft_manager.Provision = MagicMock()
+    mock_atft.atft_manager.Provision.side_effect = self.MockSetAttestUuid
     mock_atft._SendAlertEvent = MagicMock()
     mock_atft._CheckLowKeyAlert = MagicMock()
     mock_atft.atft_manager.GetTargetDevice.side_effect = (
@@ -1251,6 +1259,7 @@
     mock_atft._SendSucceedMessageEvent = MagicMock()
     mock_atft._HandleException = MagicMock()
     mock_atft.atft_manager.Provision = MagicMock()
+    mock_atft.atft_manager.Provision.side_effect = self.MockSetAttestUuid
     mock_atft._SendAlertEvent = MagicMock()
     mock_atft._CheckLowKeyAlert = MagicMock()
     mock_atft.atft_manager.GetTargetDevice.side_effect = (
diff --git a/at-factory-tool/atftman.py b/at-factory-tool/atftman.py
index 92fc3e5..2006349 100644
--- a/at-factory-tool/atftman.py
+++ b/at-factory-tool/atftman.py
@@ -157,6 +157,8 @@
     self.operation_lock = threading.Lock()
     # Current operation.
     self.operation = None
+    # The at-attest-uuid for the provisioned key in this device.
+    self.at_attest_uuid = None
 
   def Copy(self):
     return DeviceInfo(None, self.serial_number, self.location,
@@ -544,6 +546,7 @@
     # TODO(shanyu): We only need empty string here
     # NOT_PROVISIONED is for test purpose.
     if at_attest_uuid and at_attest_uuid != 'NOT_PROVISIONED':
+      target_dev.at_attest_uuid = at_attest_uuid
       target_dev.provision_status = ProvisionStatus.PROVISION_SUCCESS
       status_set = True
       target_dev.provision_state.provisioned = True