summaryrefslogtreecommitdiffstats
path: root/src/usr/targeting/test/testAttribute.H
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/targeting/test/testAttribute.H')
-rw-r--r--src/usr/targeting/test/testAttribute.H1271
1 files changed, 1271 insertions, 0 deletions
diff --git a/src/usr/targeting/test/testAttribute.H b/src/usr/targeting/test/testAttribute.H
new file mode 100644
index 000000000..8014f1397
--- /dev/null
+++ b/src/usr/targeting/test/testAttribute.H
@@ -0,0 +1,1271 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/targeting/test/testAttribute.H $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2011,2019 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+
+#ifndef __TEST_ATTRIBUTE_H
+#define __TEST_ATTRIBUTE_H
+
+/**
+ * @file targeting/test/testAttribute.H
+ *
+ * @brief Unit test for TARGETING::AttributeTank::Attribute
+ */
+
+//******************************************************************************
+// Includes
+//******************************************************************************
+
+// CXX TEST
+#include <cxxtest/TestSuite.H>
+
+#include <targeting/common/attributeTank.H>
+
+using namespace TARGETING;
+
+class AttributeTest: public CxxTest::TestSuite
+{
+public:
+ /**
+ * @test Tests the setters and getter methods
+ */
+ void testSimpleSettersAndGetters(void);
+
+ /**
+ * @test Test setting the Attribute Value
+ */
+ void testSettingAndGettingValue(void);
+
+ /**
+ * @test Test Serialize and Deserialize methods
+ */
+ void testSerializeAndDeserializeMethod(void);
+
+ /**
+ * @test Test the Operator Equal method
+ */
+ void testOperatorEqual(void);
+
+ /**
+ * @test Test the Copy Constructor Method
+ */
+ void testCopyConstructor(void);
+
+ private:
+
+ /**
+ * @test Compare the Attribute Header for the two given attributes
+ *
+ * @param[in] l_attribute1 Attribute to compare with
+ * @param[in] l_attribute2 Attribute to compare with
+ *
+ * @return true if Attribute Header's match, false otherwise
+ */
+ bool compareAttributeHeader(
+ const AttributeTank::Attribute* const l_attribute1,
+ const AttributeTank::Attribute* const l_attribute2);
+
+ /**
+ * @test Compare the Attribute Values for the two given attributes
+ *
+ * @param[in] l_attribute1 Attribute to compare with
+ * @param[in] l_attribute2 Attribute to compare with
+ *
+ * @return true if Attribute Values` match, false otherwise
+ */
+ bool compareAttributeValues(
+ const AttributeTank::Attribute* const l_attribute1,
+ const AttributeTank::Attribute* const l_attribute2);
+}; // end class AttributeTest
+
+
+// testSimpleSettersAndGetters
+void AttributeTest::testSimpleSettersAndGetters(void)
+{
+ TRACFCOMP( g_trac_test, ENTER_MRK "testSimpleSettersAndGetters" );
+
+ // Test stats
+ uint8_t l_numTests(0);
+ uint8_t l_numFails(0);
+
+ // Create an Attribute to test against
+ TARGETING::AttributeTank::Attribute l_attribute;
+
+ // Get a reference to the Attribute Header to test that
+ // what is returned is truly a reference and not a copy
+ const TARGETING::AttributeTank::AttributeHeader &l_attributeHeader =
+ l_attribute.getHeader();
+
+ // Test setting/getting the Attribute ID
+ ++l_numTests;
+ l_attribute.setId(0x1001);
+ if (0x1001 != l_attribute.getHeader().iv_attrId)
+ {
+ TS_FAIL("testSimpleSettersAndGetters: Test 1 - "
+ "set/get Attribute ID failed; "
+ "expected 0x1001 but got back 0x%X",
+ l_attribute.getHeader().iv_attrId);
+ ++l_numFails;
+ }
+
+ ++l_numTests;
+ if (0x1001 != l_attributeHeader.iv_attrId)
+ {
+ TS_FAIL("testSimpleSettersAndGetters: Test 2 - get Attribute ID "
+ "via Attribute Header reference failed; "
+ "expected 0x1001 but got back 0x%X",
+ l_attributeHeader.iv_attrId);
+ ++l_numFails;
+ }
+
+ // Test setting/getting the Attribute Target Type
+ ++l_numTests;
+ l_attribute.setTargetType(0x2002);
+ if (0x2002 != l_attribute.getHeader().iv_targetType)
+ {
+ TS_FAIL("testSimpleSettersAndGetters: Test 3 - "
+ "set/get Attribute Target Type failed; "
+ "expected 0x2002 but got back 0x%X",
+ l_attribute.getHeader().iv_targetType);
+ ++l_numFails;
+ }
+
+ ++l_numTests;
+ if (0x2002 != l_attributeHeader.iv_targetType)
+ {
+ TS_FAIL("testSimpleSettersAndGetters: Test 4 - get Attribute "
+ "Target Type via Attribute Header reference failed; "
+ "expected 0x2002 but got back 0x%X",
+ l_attributeHeader.iv_targetType);
+ ++l_numFails;
+ }
+
+ // Test setting/getting the Attribute Position
+ ++l_numTests;
+ l_attribute.setPosition(0x3003);
+ if (0x3003 != l_attribute.getHeader().iv_pos)
+ {
+ TS_FAIL("testSimpleSettersAndGetters: Test 5 - "
+ "set/get Attribute Position failed; "
+ "expected 0x3003 but got back 0x%X",
+ l_attribute.getHeader().iv_pos);
+ ++l_numFails;
+ }
+
+ ++l_numTests;
+ if (0x3003 != l_attributeHeader.iv_pos)
+ {
+ TS_FAIL("testSimpleSettersAndGetters: Test 6 - get Attribute Position "
+ "via Attribute Header reference failed; "
+ "expected 0x3003 but got back 0x%X",
+ l_attributeHeader.iv_pos);
+ ++l_numFails;
+ }
+
+ // Test setting/getting the Attribute Unit Position
+ ++l_numTests;
+ l_attribute.setUnitPosition(0x4);
+ if (0x4 != l_attribute.getHeader().iv_unitPos)
+ {
+ TS_FAIL("testSimpleSettersAndGetters: Test 7 - "
+ "set/get Attribute Unit Position failed; "
+ "expected 0x4 but got back 0x%X",
+ l_attribute.getHeader().iv_unitPos);
+ ++l_numFails;
+ }
+
+ ++l_numTests;
+ if (0x4 != l_attributeHeader.iv_unitPos)
+ {
+ TS_FAIL("testSimpleSettersAndGetters: Test 8 - "
+ "get Attribute Unit Position via Attribute Header reference "
+ "failed; expected 0x4 but got back 0x%X",
+ l_attributeHeader.iv_unitPos);
+ ++l_numFails;
+ }
+
+ // Test setting/getting the Attribute Node
+ ++l_numTests;
+ l_attribute.setNode(0x5);
+ if (0x5 != l_attribute.getHeader().iv_node)
+ {
+ TS_FAIL("testSimpleSettersAndGetters: Test 9 - "
+ "set/get Attribute Node failed; "
+ "expected 0x5 but got back 0x%X",
+ l_attribute.getHeader().iv_node);
+ ++l_numFails;
+ }
+
+ ++l_numTests;
+ if (0x5 != l_attributeHeader.iv_node)
+ {
+ TS_FAIL("testSimpleSettersAndGetters: Test 10 - get Attribute Node "
+ "via Attribute Header reference failed; "
+ "expected 0x5 but got back 0x%X",
+ l_attributeHeader.iv_node);
+ ++l_numFails;
+ }
+
+ // Test setting/getting the Attribute Flags
+ ++l_numTests;
+ l_attribute.setFlags(0x6);
+ if (0x6 != l_attribute.getHeader().iv_flags)
+ {
+ TS_FAIL("testSimpleSettersAndGetters: Test 11 - "
+ "set/get Attribute Flags failed; "
+ "expected 0x6 but got back 0x%X",
+ l_attribute.getHeader().iv_flags);
+ ++l_numFails;
+ }
+
+ ++l_numTests;
+ if (0x6 != l_attributeHeader.iv_flags)
+ {
+ TS_FAIL("testSimpleSettersAndGetters: Test 12 - get Attribute Flags "
+ "via Attribute Header reference failed; "
+ "expected 0x6 but got back 0x%X",
+ l_attributeHeader.iv_flags);
+ ++l_numFails;
+ }
+
+ TRACFCOMP( g_trac_test, EXIT_MRK "testSimpleSettersAndGetters "
+ "num tests = %d / num fails = %d", l_numTests, l_numFails);
+} // end testSimpleSettersAndGetters
+
+
+// testSettingAndGettingValue
+void AttributeTest::testSettingAndGettingValue(void)
+{
+ TRACFCOMP( g_trac_test, ENTER_MRK "testSettingAndGettingValue" );
+
+ // Test stats
+ uint8_t l_numTests(0);
+ uint8_t l_numFails(0);
+
+ // Create an Attribute to test with
+ TARGETING::AttributeTank::Attribute l_attribute;
+
+ /// Test getting Size of the Attribute when no Value exists/has been set
+ ++l_numTests;
+ if (l_attribute.getSize() !=
+ sizeof(TARGETING::AttributeTank::AttributeHeader))
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 1 - "
+ "get Attribute Size failed, when no value set; "
+ "expected size %d but got back size %d",
+ sizeof(TARGETING::AttributeTank::AttributeHeader),
+ l_attribute.getSize());
+ ++l_numFails;
+ }
+
+ /// Test cloning the value when no Value exists/has been set
+ // First create a buffer
+ uint32_t l_bufferSize = 3;
+ uint8_t l_buffer[l_bufferSize] = { 0 };
+ uint8_t l_compareBuffer[l_bufferSize] = { 0 };
+
+ uint32_t l_returnedSize = l_attribute.cloneValue(l_buffer, l_bufferSize);
+ // Make sure 0 is returned
+ ++l_numTests;
+ if (0 != l_returnedSize)
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 2 - "
+ "Attribute clone value failed, with buffer size 0; "
+ "expected size 0 but got back size %d",
+ l_returnedSize);
+ ++l_numFails;
+ }
+
+ // Make sure cloned data is correct
+ ++l_numTests;
+ if (0 != memcmp(l_buffer, l_compareBuffer, l_bufferSize))
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 3 - "
+ "Attribute clone value failed, with buffer size 0; "
+ "incorrect data returned");
+ ++l_numFails;
+ }
+
+ /// Test clearing the Value
+ l_returnedSize = l_attribute.setValue(nullptr, 0);
+ // Make sure 0 is returned
+ ++l_numTests;
+ if (0 != l_returnedSize)
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 4 - "
+ "returned Attribute Size failed, sent a value of size 0; "
+ "expected size 0 but got back size %d",
+ l_returnedSize);
+ ++l_numFails;
+ }
+
+ // Make sure size is only the Attribute Header size
+ ++l_numTests;
+ if (l_attribute.getSize() !=
+ sizeof(TARGETING::AttributeTank::AttributeHeader))
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 5 - "
+ "get Attribute Size failed, sent a value of size 0; "
+ "expected size %d but got back size %d",
+ sizeof(TARGETING::AttributeTank::AttributeHeader),
+ l_attribute.getSize());
+ ++l_numFails;
+ }
+
+ // Make sure value is NULL
+ ++l_numTests;
+ if (nullptr != l_attribute.getValue())
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 6 - "
+ "get Attribute Value failed, sent a value of size 0; "
+ "expected nullptr but got back %p",
+ l_attribute.getValue());
+ ++l_numFails;
+ }
+
+ /// Send in buffer with smaller size than actual size of buffer
+ // Add data o the buffer
+ l_buffer[0] = 0xAA;
+ l_buffer[1] = 0xBB;
+ l_buffer[2] = 0xCC;
+
+ // Set the Attribute Value to the buffer's first element
+ l_returnedSize = l_attribute.setValue(l_buffer, 1);
+ // Make sure only 1 is returned
+ ++l_numTests;
+ if (1 != l_returnedSize)
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 7 - "
+ "returned Attribute Size failed, sent a value of size 1; "
+ "expected size 1 but got back size %d",
+ l_returnedSize);
+ ++l_numFails;
+ }
+
+ // Make sure Attribute Value size is size of Attribute Header plus one
+ ++l_numTests;
+ if (l_attribute.getSize() !=
+ (sizeof(TARGETING::AttributeTank::AttributeHeader) + 1))
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 8 - "
+ "get Attribute Size failed, sent a Value of size 1 "
+ "expected size %d but got back size %d",
+ sizeof(TARGETING::AttributeTank::AttributeHeader) + 1,
+ l_attribute.getSize());
+ ++l_numFails;
+ }
+
+ // Get a handle to the Value to do some testing on it
+ const uint8_t* const l_value =
+ reinterpret_cast<const uint8_t* const>(l_attribute.getValue());
+
+ // Make sure Value is not NULL
+ ++l_numTests;
+ if (nullptr == l_value)
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 9 - "
+ "get Attribute Value failed; "
+ "expected a non-null pointer but got back a null pointer");
+ ++l_numFails;
+ }
+
+ // Make sure the first value is what we expect
+ ++l_numTests;
+ if (l_value[0] != 0xAA)
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 10 - "
+ "Accessing first value in Attribute Value failed; "
+ "expected 0xAA but got back 0x%X",
+ l_value[0]);
+ ++l_numFails;
+ }
+
+ // Test cloning with Attribute
+ uint8_t l_clonedBuffer[l_bufferSize] = { 0 };
+ memset(l_compareBuffer, 0, l_bufferSize);
+ l_compareBuffer[0] = 0xAA;
+ l_returnedSize = l_attribute.cloneValue(l_clonedBuffer, l_bufferSize);
+ // Make sure 1 is returned
+ ++l_numTests;
+ if (1 != l_returnedSize)
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 11 - "
+ "Attribute clone value failed, with buffer size 1; "
+ "expected size 1 but got back size %d",
+ l_returnedSize);
+ ++l_numFails;
+ }
+
+ // Make sure the cloned data is correct
+ ++l_numTests;
+ if (0 != memcmp(l_clonedBuffer, l_compareBuffer, l_bufferSize))
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 12 - "
+ "Attribute clone value failed, with buffer size 1; "
+ "incorrect data returned");
+ ++l_numFails;
+ }
+
+ /// Send in buffer with actual size of said buffer
+ // First set the buffer's values
+ l_buffer[0] = 0xDD;
+ l_buffer[1] = 0xEE;
+ l_buffer[2] = 0xFF;
+ l_returnedSize = l_attribute.setValue(l_buffer, l_bufferSize);
+
+ // Make sure buffer size is returned correctly
+ ++l_numTests;
+ if (l_bufferSize != l_returnedSize)
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 13 - "
+ "returned Attribute Size failed, sent a buffer of size %d; "
+ "expected size %d but got back size %d",
+ l_bufferSize,
+ l_bufferSize,
+ l_returnedSize);
+ ++l_numFails;
+ }
+
+ // Make sure Attribute Value size is size of Attribute Header
+ // plus buffer size
+ ++l_numTests;
+ if (l_attribute.getSize() !=
+ (sizeof(TARGETING::AttributeTank::AttributeHeader) + l_bufferSize))
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 14 - "
+ "get Attribute Size failed, sent a buffer of size %d; "
+ "expected size %d but got back size %d",
+ l_bufferSize,
+ sizeof(TARGETING::AttributeTank::AttributeHeader) + l_bufferSize,
+ l_attribute.getSize());
+ ++l_numFails;
+ }
+
+ // Get a handle to the Value to do some testing on it
+ const uint8_t* const l_value2 =
+ reinterpret_cast<const uint8_t* const>(l_attribute.getValue());
+
+ // Make sure Value is not NULL
+ ++l_numTests;
+ if (nullptr == l_value2)
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 15 - "
+ "get Attribute Value failed, sent a buffer of size %d "
+ "expected a non-null pointer but got back a null pointer",
+ l_bufferSize);
+ ++l_numFails;
+ }
+
+ // Make sure the first value is what we expect
+ ++l_numTests;
+ if (l_value2[0] != 0xDD)
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 16 - "
+ "Accessing first value in Attribute Value failed, "
+ "for a Value of size %d; "
+ "expected 0xDD but got back 0x%X",
+ l_bufferSize,
+ l_value2[0]);
+ ++l_numFails;
+ }
+
+ // Make sure the second value is what we expect
+ ++l_numTests;
+ if (l_value2[1] != 0xEE)
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 17 - "
+ "Accessing second value in Attribute Value failed, "
+ "for a Value of size %d; "
+ "expected 0xEE but got back 0x%X",
+ l_bufferSize,
+ l_value2[1]);
+ ++l_numFails;
+ }
+
+ // Make sure the third value is what we expect
+ ++l_numTests;
+ if (l_value2[2] != 0xFF)
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 18 - "
+ "Accessing third value in Attribute Value failed, "
+ "for a Value of size %d; "
+ "expected 0xFF but got back 0x%X",
+ l_bufferSize,
+ l_value2[2]);
+ ++l_numFails;
+ }
+
+ /// Make sure previously cloned data is an actually cloned and not
+ /// a copy
+ ++l_numTests;
+ if (0 != memcmp(l_clonedBuffer, l_compareBuffer, l_bufferSize))
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 19 - "
+ "Attribute clone value failed, with buffer size 1; "
+ "data not cloned but is a reference a pointer");
+ ++l_numFails;
+ }
+
+ l_returnedSize = l_attribute.cloneValue(l_clonedBuffer, l_bufferSize);
+ // Make sure 3 is returned
+ ++l_numTests;
+ if (3 != l_returnedSize)
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 20 - "
+ "returned Attribute clone value failed, with buffer size 3; "
+ "expected size 3 but got back size %d",
+ l_returnedSize);
+ ++l_numFails;
+ }
+
+ /// Make sure previously cloned data is correct
+ ++l_numTests;
+ if (0 != memcmp(l_clonedBuffer, l_buffer, l_bufferSize))
+ {
+ TS_FAIL("testSettingAndGettingValue: Test 21 - "
+ "Attribute clone value failed, with buffer size 3 ; "
+ "incorrect data returned");
+ ++l_numFails;
+ }
+
+ TRACFCOMP( g_trac_test, EXIT_MRK "testSettingAndGettingValue "
+ "num tests = %d / num fails = %d", l_numTests, l_numFails);
+} // end AttributeTest::testSettingAndGettingValue
+
+
+// testSerializeAndDeserializeMethod
+void AttributeTest::testSerializeAndDeserializeMethod(void)
+{
+ TRACFCOMP( g_trac_test, ENTER_MRK "testSerializeAndDeserializeMethod" );
+
+ // Test stats
+ uint8_t l_numTests(0);
+ uint8_t l_numFails(0);
+
+ // Create an Attribute to test with
+ AttributeTank::Attribute l_attribute;
+ // Get a copy of the Attribute Size for later purposes
+ uint32_t l_attributeSize(l_attribute.getSize());
+
+ /// Test serializing when attribute has no data at all
+ {
+ // Create a buffer to hold serialized data
+ uint8_t* l_serializedData = new uint8_t[l_attributeSize];
+ // Get the serialized data
+ uint32_t l_returnedSize = l_attribute.serialize(l_serializedData,
+ l_attributeSize);
+
+ // Make sure serialized data is the size expected
+ ++l_numTests;
+ if (l_returnedSize != l_attributeSize)
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 1 - "
+ "Attribute Serialize failed, with a 0 size Data Value; "
+ "expected size %d but got back size %d",
+ l_attributeSize,
+ l_returnedSize);
+ ++l_numFails;
+ }
+
+ // Make sure the serialized Attribute Header
+ // matches original Attribute Header
+ // Get a handle to Attribute Header
+ AttributeTank::Attribute* l_attribute2 =
+ reinterpret_cast<AttributeTank::Attribute*>(l_serializedData);
+ const AttributeTank::AttributeHeader & l_attributeHeader2 =
+ l_attribute2->getHeader();
+
+ // Compare the two different Attribute Header for a match
+ ++l_numTests;
+ if (!compareAttributeHeader(l_attribute2, &l_attribute))
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 2 - "
+ "Attribute Serialize failed, with a 0 size Data Value; "
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+
+ // Make sure that the size of the Attribute Values is zero
+ ++l_numTests;
+ if (0 != l_attributeHeader2.iv_valSize)
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 3 - "
+ "Attribute Serialize failed, with a 0 size Data Value; "
+ "Expected 0 size Data Value but %d was returned",
+ l_attributeHeader2.iv_valSize);
+ ++l_numFails;
+ }
+
+ // Test deserialize
+ {
+ AttributeTank::Attribute l_attribute3;
+ uint32_t l_returnedSize2 =
+ l_attribute3.deserialize(l_serializedData, l_returnedSize);
+
+ // Make sure data size copied is correct
+ ++l_numTests;
+ if (l_returnedSize2 != l_returnedSize)
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 4 - "
+ "Attribute Deserialize failed, with a 0 size Data Value; "
+ "expected size %d but got back size %d",
+ l_returnedSize,
+ l_returnedSize2);
+ ++l_numFails;
+ }
+
+ // Make sure the Attribute Header matches original data
+ ++l_numTests;
+ if (!compareAttributeHeader(&l_attribute3, &l_attribute))
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 5 - "
+ "Attribute deserialize failed, with a 0 size Data Value; "
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+
+ // Test when buffer is too small
+ ++l_numTests;
+ AttributeTank::Attribute l_attribute4;
+ l_returnedSize2 = l_attribute4.deserialize(l_serializedData,
+ l_returnedSize - 1);
+ if (0 != l_returnedSize2)
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 6 - "
+ "Attribute Deserialize failed, with too small of buffer;"
+ "expected size 0 but got back size %d",
+ l_returnedSize2);
+ ++l_numFails;
+ }
+ }
+ // Cleanup memory used for this test
+ delete []l_serializedData;
+ l_serializedData = nullptr;
+ }
+
+ /// Test serializing when Attribute has Attribute Header data
+ /// and no Attribute Values
+ // Set some values for the Attribute Header
+ l_attribute.setId(0x1001);
+ l_attribute.setTargetType(0x2002);
+ l_attribute.setPosition(0x3003);
+ l_attribute.setUnitPosition(0x4);
+ l_attribute.setNode(0x5);
+ l_attribute.setFlags(0x6);
+ {
+ // Create a buffer to hold serialized data
+ uint8_t* l_serializedData = new uint8_t[l_attributeSize];
+ // Get the serialized data
+ uint32_t l_returnedSize = l_attribute.serialize(l_serializedData,
+ l_attributeSize);
+
+ // Make sure serialized data is the size expected
+ ++l_numTests;
+ if (l_returnedSize != l_attributeSize)
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 7 - "
+ "Attribute Serialize failed, with valid Attribute "
+ "Header data and no Data Value;"
+ "expected size %d but got back size %d",
+ l_attributeSize,
+ l_returnedSize);
+ ++l_numFails;
+ }
+
+ // Make sure the serialized Attribute Header
+ // matches original Attribute Header
+ // Get a handle to Attribute Header
+ AttributeTank::Attribute* l_attribute2 =
+ reinterpret_cast<AttributeTank::Attribute*>(l_serializedData);
+ const AttributeTank::AttributeHeader & l_attributeHeader2 =
+ l_attribute2->getHeader();
+ // Compare the two different Attribute Header for a match
+ ++l_numTests;
+ if (!compareAttributeHeader(l_attribute2, &l_attribute))
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 8 - "
+ "Attribute Serialize failed, with valid Attribute "
+ "Header data and no Data Value;"
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+
+ // Make sure that the size of the Attribute Values is zero
+ ++l_numTests;
+ if (0 != l_attributeHeader2.iv_valSize)
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 9 - "
+ "Attribute Serialize failed, with valid Attribute "
+ "Header data and no Data Value;"
+ "Expected 0 size Data Value but %d was returned",
+ l_attributeHeader2.iv_valSize);
+ ++l_numFails;
+ }
+
+ // Test deserialize
+ {
+ AttributeTank::Attribute l_attribute3;
+ uint32_t l_returnedSize2 =
+ l_attribute3.deserialize(l_serializedData, l_returnedSize);
+
+ // Make sure data size copied is correct
+ ++l_numTests;
+ if (l_returnedSize2 != l_returnedSize)
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 10 - "
+ "Attribute Deserialize failed, with valid Attribute "
+ "Header data and no Data Value;"
+ "expected size %d but got back size %d",
+ l_returnedSize,
+ l_returnedSize2);
+ ++l_numFails;
+ }
+
+ // Make sure the Attribute Header matches original data
+ ++l_numTests;
+ if (!compareAttributeHeader(&l_attribute3, &l_attribute))
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 11 - "
+ "Attribute Deserialize failed, with valid Attribute "
+ "Header data and no Data Value;"
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+ }
+
+ // Cleanup memory used for this test
+ delete []l_serializedData;
+ l_serializedData = nullptr;
+ }
+
+ /// Test serializing when Attribute has Attribute Header data
+ /// and a single Attribute Value
+ // Give the Attribute a single Attribute Value
+ uint8_t l_dataBuffer[1] = { 0 };
+ l_dataBuffer[0] = 0x44;
+ l_attribute.setValue(l_dataBuffer, 1);
+ l_attributeSize = l_attribute.getSize();
+ {
+ // Create a buffer to hold serialized data
+ uint8_t* l_serializedData = new uint8_t[l_attributeSize];
+ // Get the serialized data
+ uint32_t l_returnedSize = l_attribute.serialize(l_serializedData,
+ l_attributeSize);
+
+ // Make sure serialized data is the size expected
+ ++l_numTests;
+ if (l_returnedSize != l_attributeSize)
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 12 - "
+ "Attribute Serialize failed, with a size 1 Data Value; "
+ "expected size %d but got back size %d",
+ l_attributeSize,
+ l_returnedSize);
+ ++l_numFails;
+ }
+
+ // Make sure the serialized Attribute Header
+ // matches original Attribute Header
+ // Get a handle to Attribute Header
+ AttributeTank::Attribute* l_attribute2 =
+ reinterpret_cast<AttributeTank::Attribute*>(l_serializedData);
+ const AttributeTank::AttributeHeader & l_attributeHeader2 =
+ l_attribute2->getHeader();
+ // Compare the two different Attribute Header for a match
+ ++l_numTests;
+ if (!compareAttributeHeader(l_attribute2, &l_attribute))
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 13 - "
+ "Attribute Serialize failed, with a size 1 Data Value; "
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+
+ // Make sure that the size of the Attribute Values is 1
+ ++l_numTests;
+ if (1 != l_attributeHeader2.iv_valSize)
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 14 - "
+ "Attribute Serialize failed, with a size 1 Data Value; "
+ "Expected 1 size Data Value but %d was returned",
+ l_attributeHeader2.iv_valSize);
+ ++l_numFails;
+ }
+
+ // Point to the Attribute Values
+ l_serializedData += sizeof(AttributeTank::AttributeHeader);
+
+ // Compare the two different Attribute Value
+ ++l_numTests;
+ if (0 != memcmp(l_serializedData, &l_dataBuffer, 1))
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 15 - "
+ "Attribute Serialize failed, with a size 1 Data Value; "
+ "incorrect Attribute Data Value returned");
+ ++l_numFails;
+ }
+
+ // Reset the Serialized Data for next test
+ l_serializedData -= sizeof(AttributeTank::AttributeHeader);
+
+ // Test deserialize
+ {
+ AttributeTank::Attribute l_attribute3;
+ uint32_t l_returnedSize2 =
+ l_attribute3.deserialize(l_serializedData, l_returnedSize);
+ // Make sure data size copied is correct
+ ++l_numTests;
+ if (l_returnedSize2 != l_returnedSize)
+ {
+
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 16 - "
+ "Attribute Deserialize failed, with a size 1 Data Value; "
+ "expected size %d but got back size %d",
+ l_returnedSize,
+ l_returnedSize2);
+ ++l_numFails;
+ }
+
+ // Make sure the Attribute Header matches original data
+ ++l_numTests;
+ if (!compareAttributeHeader(&l_attribute3, &l_attribute))
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 17 - "
+ "Attribute deserialize failed, with a size 1 Data Value; "
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+
+ // Test when buffer is too small
+ AttributeTank::Attribute l_attribute4;
+ l_returnedSize2 = l_attribute4.deserialize(l_serializedData,
+ l_returnedSize - 1);
+
+ // Make sure returned size is 0
+ ++l_numTests;
+ if (0 != l_returnedSize2)
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 18 - "
+ "Attribute Deserialize failed, with too small of buffer "
+ "for 1 data value; expected size 0 but got back size %d",
+ l_returnedSize2);
+ ++l_numFails;
+ }
+ }
+
+ // Cleanup memory used for this test
+ delete []l_serializedData;
+ l_serializedData = nullptr;
+ }
+
+ /// Test serializing when Attribute has Attribute Header data
+ /// and a several Attribute Values
+ // Give the Attribute several Attribute Values
+ uint32_t l_bufferSize(3);
+ uint8_t l_dataBuffer2[l_bufferSize] = { 0 };
+ l_dataBuffer2[0] = 0x55;
+ l_dataBuffer2[1] = 0x66;
+ l_dataBuffer2[2] = 0x77;
+ l_attribute.setValue(l_dataBuffer2, l_bufferSize);
+ l_attributeSize = l_attribute.getSize();
+ {
+ // Create a buffer to hold serialized data
+ uint8_t* l_serializedData = new uint8_t[l_attributeSize];
+ // Get the serialized data
+ uint32_t l_returnedSize = l_attribute.serialize(l_serializedData,
+ l_attributeSize);
+
+ // Make sure serialized data is the size expected
+ ++l_numTests;
+ if (l_returnedSize != l_attributeSize)
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 19 - "
+ "Attribute Serialize failed, with a size 3 Data Value; "
+ "expected size %d but got back size %d",
+ l_attributeSize,
+ l_returnedSize);
+ ++l_numFails;
+ }
+
+ // Make sure the serialized Attribute Header
+ // matches original Attribute Header
+ // Get a handle to Attribute Header
+ AttributeTank::Attribute* l_attribute2 =
+ reinterpret_cast<AttributeTank::Attribute*>(l_serializedData);
+
+ // Compare the two different Attribute Header for a match
+ ++l_numTests;
+ if (!compareAttributeHeader(l_attribute2, &l_attribute))
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 20 - "
+ "Attribute Serialize failed, with a size 3 Data Value; "
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+
+ // Make sure that the size of the Attribute Values is 3
+ ++l_numTests;
+ if (l_bufferSize != l_attribute2->getHeader().iv_valSize)
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 21 - "
+ "Attribute Serialize failed, with a size 3 Data Value; "
+ "Expected %d size Data Value but %d was returned",
+ l_bufferSize,
+ l_attribute2->getHeader().iv_valSize);
+
+ ++l_numFails;
+ }
+
+ // Point to the Attribute Values
+ l_serializedData += sizeof(AttributeTank::AttributeHeader);
+
+
+ // Compare the two different Attribute Value
+ ++l_numTests;
+ if (0 != memcmp(l_serializedData, &l_dataBuffer2, l_bufferSize))
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 22 - "
+ "Attribute Serialize failed, with a size 3 Data Value; "
+ "incorrect Attribute Data Values returned");
+ ++l_numFails;
+ }
+
+ // Reset the Serialized Data for next test
+ l_serializedData -= sizeof(AttributeTank::AttributeHeader);
+
+ // Test deserialize
+ {
+ AttributeTank::Attribute l_attribute3;
+ uint32_t l_returnedSize2 =
+ l_attribute3.deserialize(l_serializedData, l_returnedSize);
+
+ // Make sure data size copied is correct
+ ++l_numTests;
+ if (l_returnedSize2 != l_returnedSize)
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 23 - "
+ "Attribute Deserialize failed, with a size 3 Data Value; "
+ "expected size %d but got back size %d",
+ l_returnedSize,
+ l_returnedSize2);
+ ++l_numFails;
+ }
+
+ // Make sure the Attribute Header matches original data
+ ++l_numTests;
+ if (!compareAttributeHeader(&l_attribute3, &l_attribute))
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 24 - "
+ "Attribute Deserialize failed, with a size 3 Data Value; "
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+
+ // Test when buffer is too small
+ AttributeTank::Attribute l_attribute4;
+ l_returnedSize2 = l_attribute4.deserialize(l_serializedData,
+ l_returnedSize - 1);
+
+ // Make sure returned size is 0
+ ++l_numTests;
+ if (0 != l_returnedSize2)
+ {
+ TS_FAIL("testSerializeAndDeserializeMethod: Test 25 - "
+ "Attribute Deserialize failed, with too small of buffer "
+ "for 3 data values; expected size 0 but got back size %d",
+ l_returnedSize2);
+ ++l_numFails;
+ }
+ }
+
+ // Cleanup memory used for this test
+ delete []l_serializedData;
+ l_serializedData = nullptr;
+ }
+
+ TRACFCOMP( g_trac_test, EXIT_MRK "testSerializeAndDeserializeMethod "
+ "num tests = %d / num fails = %d", l_numTests, l_numFails);
+} // end AttributeTest::testSerializeAndDeserializeMethod
+
+// testOperatorEqual
+void AttributeTest::testOperatorEqual(void)
+{
+ TRACFCOMP( g_trac_test, ENTER_MRK "testOperatorEqual" );
+
+ // Test stats
+ uint8_t l_numTests(0);
+ uint8_t l_numFails(0);
+
+ // Create an Attribute to test against
+ AttributeTank::Attribute l_attribute1;
+
+ // Test with an empty attribute
+ AttributeTank::Attribute l_attribute2;
+ // Invoke Operator Equal
+ l_attribute2 = l_attribute1;
+
+ // Make sure the Attribute Header match
+ ++l_numTests;
+ if (!compareAttributeHeader(&l_attribute1, &l_attribute2))
+ {
+ TS_FAIL("testOperatorEqual: Test 1 - "
+ "Attribute Operator = failed, with default values; "
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+
+ // Modify the data
+ l_attribute1.setId(0x1001);
+ l_attribute1.setTargetType(0x2002);
+ l_attribute1.setPosition(0x3003);
+ l_attribute1.setUnitPosition(0x4);
+ l_attribute1.setNode(0x5);
+ l_attribute1.setFlags(0x6);
+
+ // Test with modified data
+ AttributeTank::Attribute l_attribute3;
+ // Invoke Operator Equal
+ l_attribute3 = l_attribute1;
+
+ // Make sure the Attribute Header match
+ ++l_numTests;
+ if (!compareAttributeHeader(&l_attribute1, &l_attribute3))
+ {
+ TS_FAIL("testOperatorEqual: Test 2 - "
+ "Attribute Operator = failed, with modifed values; "
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+
+ // Add attribute values
+ uint32_t l_bufferSize(3);
+ uint8_t l_buffer[l_bufferSize];
+ l_buffer[0] = 0x66;
+ l_buffer[0] = 0x77;
+ l_buffer[0] = 0x88;
+ l_attribute1.setValue(l_buffer, l_bufferSize);
+
+ // Test with modified data
+ AttributeTank::Attribute l_attribute4;
+ // Invoke Operator Equal
+ l_attribute4 = l_attribute1;
+
+ // Make sure the Attribute Header match
+ ++l_numTests;
+ if (!compareAttributeHeader(&l_attribute1, &l_attribute4))
+ {
+ TS_FAIL("testOperatorEqual: Test 3 - "
+ "Attribute Operator = failed, with data values; "
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+
+ // Make sure the Attribute Values match
+ ++l_numTests;
+ if (!compareAttributeValues(&l_attribute1, &l_attribute4))
+ {
+ TS_FAIL("testOperatorEqual: Test 4 - "
+ "Attribute Operator = failed, with data values; "
+ "incorrect Attribute Values data returned");
+ ++l_numFails;
+ }
+
+ // Update the Attribute Values and test again
+ l_buffer[0] = 0x22;
+ l_buffer[0] = 0x33;
+ l_buffer[0] = 0x55;
+ l_attribute1.setValue(l_buffer, l_bufferSize);
+
+ // Make sure the Attribute Header match original data
+ ++l_numTests;
+ if (!compareAttributeHeader(&l_attribute1, &l_attribute4))
+ {
+ TS_FAIL("testOperatorEqual: Test 5 - "
+ "Attribute Operator = failed, with data values updated; "
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+
+ // Make sure the Attribute Values DO NOT match
+ ++l_numTests;
+ if (compareAttributeValues(&l_attribute1, &l_attribute4))
+ {
+ TS_FAIL("testOperatorEqual: Test 6 - "
+ "Attribute Operator = failed, with data values updated; "
+ "incorrect Attribute Values data returned");
+ ++l_numFails;
+ }
+
+ TRACFCOMP( g_trac_test, EXIT_MRK "testOperatorEqual "
+ "num tests = %d / num fails = %d", l_numTests, l_numFails);
+} // end testOperatorEqual
+
+// testCopyConstructor
+void AttributeTest::testCopyConstructor(void)
+{
+ TRACFCOMP( g_trac_test, ENTER_MRK "testCopyConstructor" );
+
+ // Test stats
+ uint8_t l_numTests(0);
+ uint8_t l_numFails(0);
+
+ // Create an Attribute to test against
+ AttributeTank::Attribute l_attribute1;
+
+ l_attribute1.setId(0x1001);
+ l_attribute1.setFlags(0x5);
+
+ // Test with an empty attribute, invoke copy constructor
+ AttributeTank::Attribute l_attribute2 = l_attribute1;
+
+ // Make sure the Attribute Header match
+ ++l_numTests;
+ if (!compareAttributeHeader(&l_attribute1, &l_attribute2))
+ {
+ TS_FAIL("testCopyConstructor: Test 1 - "
+ "Attribute Copy Ctor failed, with default values; "
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+
+ // Modify the data
+ l_attribute1.setId(0x1001);
+ l_attribute1.setTargetType(0x2002);
+ l_attribute1.setPosition(0x3003);
+ l_attribute1.setUnitPosition(0x4);
+ l_attribute1.setNode(0x5);
+ l_attribute1.setFlags(0x6);
+
+ // Test with modified data, invoke copy constructor
+ AttributeTank::Attribute l_attribute3 = l_attribute1;
+
+ // Make sure the Attribute Header match
+ ++l_numTests;
+ if (!compareAttributeHeader(&l_attribute1, &l_attribute3))
+ {
+ TS_FAIL("testCopyConstructor: Test 2 - "
+ "Attribute Copy Ctor failed, with modifed values; "
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+
+ // Add attribute values
+ uint32_t l_bufferSize(3);
+ uint8_t l_buffer[l_bufferSize];
+ l_buffer[0] = 0x66;
+ l_buffer[0] = 0x77;
+ l_buffer[0] = 0x88;
+ l_attribute1.setValue(l_buffer, l_bufferSize);
+
+ // Test with modified data, invoke copy constructor
+ AttributeTank::Attribute l_attribute4 = l_attribute1;
+
+ // Make sure the Attribute Header match
+ ++l_numTests;
+ if (!compareAttributeHeader(&l_attribute1, &l_attribute4))
+ {
+ TS_FAIL("testCopyConstructor: Test 3 - "
+ "Attribute Copy Ctor failed, with data values; "
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+
+ // Make sure the Attribute Values match
+ ++l_numTests;
+ if (!compareAttributeValues(&l_attribute1, &l_attribute4))
+ {
+ TS_FAIL("testCopyConstructor: Test 4 - "
+ "Attribute Copy Ctor failed, with data values; "
+ "incorrect Attribute Values data returned");
+ ++l_numFails;
+ }
+
+ // Update the Attribute Values and test again
+ l_buffer[0] = 0x22;
+ l_buffer[0] = 0x33;
+ l_buffer[0] = 0x55;
+ l_attribute1.setValue(l_buffer, l_bufferSize);
+
+ // Make sure the Attribute Header match original data
+ ++l_numTests;
+ if (!compareAttributeHeader(&l_attribute1, &l_attribute4))
+ {
+ TS_FAIL("testCopyConstructor: Test 5 - "
+ "Attribute Copy Ctor failed, with data values updated; "
+ "incorrect Attribute Header data returned");
+ ++l_numFails;
+ }
+
+ // Make sure the Attribute Values DO NOT match
+ ++l_numTests;
+ if (compareAttributeValues(&l_attribute1, &l_attribute4))
+ {
+ TS_FAIL("testCopyConstructor: Test 6 - "
+ "Attribute Copy Ctor failed, with data values updated; "
+ "incorrect Attribute Values data returned");
+ ++l_numFails;
+ }
+
+ TRACFCOMP( g_trac_test, EXIT_MRK "testCopyConstructor "
+ "num tests = %d / num fails = %d", l_numTests, l_numFails);
+} // end testCopyConstructor
+
+// compareAttributeHeader
+bool AttributeTest::compareAttributeHeader(
+ const AttributeTank::Attribute* const l_attribute1,
+ const AttributeTank::Attribute* const l_attribute2)
+{
+ bool retVal(true);
+
+ // Make sure the Attribute Header matches original data
+ if (0 != memcmp(&(l_attribute1->getHeader()),
+ &(l_attribute2->getHeader()),
+ sizeof(AttributeTank::AttributeHeader)))
+ {
+ retVal = false;
+ }
+
+ return retVal;
+
+} // end compareAttributeHeader
+
+// compareAttributeValues
+bool AttributeTest::compareAttributeValues(
+ const AttributeTank::Attribute* const l_attribute1,
+ const AttributeTank::Attribute* const l_attribute2)
+{
+ bool retVal(true);
+
+ // Compare the Attribute Values for a match
+ if (0 != memcmp(l_attribute1->getValue(),
+ l_attribute2->getValue(),
+ l_attribute2->getHeader().iv_valSize))
+ {
+ retVal = false;
+ }
+
+ return retVal;
+
+} // end compareAttributeValues
+
+#endif // end __TEST_ATTRIBUTE_H
OpenPOWER on IntegriCloud