From 50cc8d9e8a440ba518412c1bdf3c7989e7b24034 Mon Sep 17 00:00:00 2001
From: Hadi Esiely <hadi.esiely-barrera@jhuapl.edu>
Date: Thu, 30 Jul 2015 13:01:51 -0400
Subject: [PATCH] Addition of Opaque Objects Integration Tests

Tests that opaque objects can be properly registered, retrieved, and destroyed.
---
 .../integration/services/test_integration.py  | 96 +++++++++++++++++++
 1 file changed, 96 insertions(+)

diff --git a/kmip/tests/integration/services/test_integration.py b/kmip/tests/integration/services/test_integration.py
index 3c7c7c2..4b94fde 100644
--- a/kmip/tests/integration/services/test_integration.py
+++ b/kmip/tests/integration/services/test_integration.py
@@ -27,6 +27,7 @@ from kmip.core.enums import KeyFormatType as KeyFormatTypeEnum
 from kmip.core.enums import CertificateTypeEnum
 from kmip.core.enums import NameType
 from kmip.core.enums import ObjectType
+from kmip.core.enums import OpaqueDataType
 from kmip.core.enums import SecretDataType
 from kmip.core.enums import ResultStatus
 from kmip.core.enums import ResultReason
@@ -54,6 +55,7 @@ from kmip.core.secrets import PrivateKey
 from kmip.core.secrets import PublicKey
 from kmip.core.secrets import Certificate
 from kmip.core.secrets import SecretData
+from kmip.core.secrets import OpaqueObject
 
 import pytest
 
@@ -1056,3 +1058,97 @@ class TestIntegration(TestCase):
         pass_observed = type(pass_result_destroyed_result.result_reason.enum)
 
         self.assertEqual(expected, pass_observed)
+
+    def test_opaque_data_register_get_destroy(self):
+        """
+        Tests that opaque objects can be properly registered, retrieved,
+        and destroyed
+        """
+
+        opaque_obj_type = ObjectType.OPAQUE_DATA
+        opaque_obj_data_type = OpaqueObject.OpaqueDataType(OpaqueDataType.NONE)
+
+        name = Attribute.AttributeName('Name')
+        opaque_obj_name = 'Integration Test - Register-Get-Destroy Opaque Data'
+
+        opaque_obj_name_value = Name.NameValue(opaque_obj_name)
+
+        name_type = Name.NameType(NameType.UNINTERPRETED_TEXT_STRING)
+        opaque_obj_value = Name(name_value=opaque_obj_name_value,
+                                name_type=name_type)
+
+        opaque_obj_name_attr = Attribute(attribute_name=name,
+                                         attribute_value=opaque_obj_value)
+
+        opaque_obj_attributes = [opaque_obj_name_attr]
+
+        opaque_obj_template_attribute = TemplateAttribute(
+            attributes=opaque_obj_attributes)
+
+        opaque_obj_data = OpaqueObject.OpaqueDataValue((
+            b'\x30\x82\x03\x12\x30\x82\x01\xFA\xA0\x03\x02\x01\x02\x02\x01\x01'
+            b'\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05\x05\x00\x30'
+            b'\x3B\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x0D'
+            b'\x30\x0B\x06\x03\x55\x04\x0A\x13\x04\x54\x45\x53\x54\x31\x0E\x30'
+        ))
+
+        opaque_obj = OpaqueObject(opaque_data_type=opaque_obj_data_type,
+                                  opaque_data_value=opaque_obj_data)
+
+        opaque_obj_result = self.client.register(opaque_obj_type,
+                                                 opaque_obj_template_attribute,
+                                                 opaque_obj, credential=None)
+
+        self._check_result_status(opaque_obj_result, ResultStatus,
+                                  ResultStatus.SUCCESS)
+
+        self._check_uuid(opaque_obj_result.uuid.value, str)
+
+        # Check that the returned key bytes match what was provided
+        opaque_obj_uuid = opaque_obj_result.uuid.value
+
+        opaque_obj_result = self.client.get(uuid=opaque_obj_uuid,
+                                            credential=None)
+
+        self._check_result_status(opaque_obj_result, ResultStatus,
+                                  ResultStatus.SUCCESS)
+
+        self._check_object_type(opaque_obj_result.object_type.enum, ObjectType,
+                                ObjectType.OPAQUE_DATA)
+
+        self._check_uuid(opaque_obj_result.uuid.value, str)
+
+        # Check the secret type
+        opaque_obj_secret = opaque_obj_result.secret
+
+        opaque_obj_secret_expected = OpaqueObject
+
+        self.assertIsInstance(opaque_obj_secret, opaque_obj_secret_expected)
+
+        opaque_obj_material = opaque_obj_result.secret.opaque_data_value.value
+        expected = opaque_obj_data.value
+
+        self.assertEqual(expected, opaque_obj_material)
+
+        self.logger.debug('Destroying opaque object: ' + opaque_obj_name +
+                          '\nWith " "UUID: ' + opaque_obj_result.uuid.value)
+
+        opaque_obj_result = self.client.destroy(opaque_obj_result.uuid.value)
+
+        self._check_result_status(opaque_obj_result, ResultStatus,
+                                  ResultStatus.SUCCESS)
+
+        self._check_uuid(opaque_obj_result.uuid.value, str)
+
+        # Verify the secret was destroyed
+        opaque_obj_result_destroyed_result = self.client.get(
+            uuid=opaque_obj_uuid, credential=None)
+
+        self._check_result_status(opaque_obj_result_destroyed_result,
+                                  ResultStatus, ResultStatus.OPERATION_FAILED)
+
+        expected = ResultReason
+        opaque_obj_observed = \
+            type(opaque_obj_result_destroyed_result.result_reason.enum)
+
+        self.assertEqual(expected, opaque_obj_observed)