From 6db5f20ade72896ebf0f6513a4832b8f2e917aa0 Mon Sep 17 00:00:00 2001 From: Matteo Martincigh Date: Thu, 5 Sep 2019 12:02:04 +0100 Subject: IVGCVSW-3691 Rework the CounterDirectory class to take into consideration the connections between components * Added constructors and connections to the profiling classes * Used hash table to keep track of the profiling objects by UID * Added register methods * Added find/check helper methods * Updated the makefile to include the profiling directory * Added unit tests for the CounterDirectory class * Added ICounterDirectory interface class for read-only use * Added custom macro to locally disable conversion warnings Change-Id: I3f53a68663ee77b8d03ac0ef7dc01e90c6893511 Signed-off-by: Matteo Martincigh --- src/profiling/test/ProfilingTests.cpp | 942 ++++++++++++++++++++++++++++++++-- 1 file changed, 911 insertions(+), 31 deletions(-) (limited to 'src/profiling/test/ProfilingTests.cpp') diff --git a/src/profiling/test/ProfilingTests.cpp b/src/profiling/test/ProfilingTests.cpp index 55524a4dfe..d16479a46c 100644 --- a/src/profiling/test/ProfilingTests.cpp +++ b/src/profiling/test/ProfilingTests.cpp @@ -3,23 +3,24 @@ // SPDX-License-Identifier: MIT // -#include "../CommandHandlerKey.hpp" -#include "../CommandHandlerFunctor.hpp" -#include "../CommandHandlerRegistry.hpp" -#include "../EncodeVersion.hpp" -#include "../Holder.hpp" -#include "../Packet.hpp" -#include "../PacketVersionResolver.hpp" -#include "../ProfilingService.hpp" -#include "../ProfilingStateMachine.hpp" -#include "../PeriodicCounterSelectionCommandHandler.hpp" -#include "../ProfilingUtils.hpp" -#include "../SocketProfilingConnection.hpp" -#include "../IPeriodicCounterCapture.hpp" #include "SendCounterPacketTests.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include #include #include @@ -538,30 +539,909 @@ BOOST_AUTO_TEST_CASE(CheckProfilingServiceEnabledRuntime) BOOST_CHECK(service.GetCurrentState() == ProfilingState::WaitingForAck); } -void GetNextUidTestImpl(uint16_t& outUid) +BOOST_AUTO_TEST_CASE(CheckProfilingObjectUids) { - outUid = GetNextUid(); + uint16_t uid = 0; + BOOST_CHECK_NO_THROW(uid = GetNextUid()); + BOOST_CHECK(uid >= 1); + + uint16_t nextUid = 0; + BOOST_CHECK_NO_THROW(nextUid = GetNextUid()); + BOOST_CHECK(nextUid > uid); + + std::vector counterUids; + BOOST_CHECK_NO_THROW(counterUids = GetNextCounterUids(0)); + BOOST_CHECK(counterUids.size() == 1); + BOOST_CHECK(counterUids[0] >= 0); + + std::vector nextCounterUids; + BOOST_CHECK_NO_THROW(nextCounterUids = GetNextCounterUids(1)); + BOOST_CHECK(nextCounterUids.size() == 1); + BOOST_CHECK(nextCounterUids[0] > counterUids[0]); + + std::vector counterUidsMultiCore; + uint16_t numberOfCores = 13; + BOOST_CHECK_NO_THROW(counterUidsMultiCore = GetNextCounterUids(numberOfCores)); + BOOST_CHECK(counterUidsMultiCore.size() == numberOfCores); + BOOST_CHECK(counterUidsMultiCore.front() >= nextCounterUids[0]); + for (size_t i = 1; i < numberOfCores; i ++) + { + BOOST_CHECK(counterUidsMultiCore[i] == counterUidsMultiCore[i - 1] + 1); + } + BOOST_CHECK(counterUidsMultiCore.back() == counterUidsMultiCore.front() + numberOfCores - 1); } -BOOST_AUTO_TEST_CASE(GetNextUidTest) +BOOST_AUTO_TEST_CASE(CheckCounterDirectoryRegisterCategory) { - uint16_t uid0 = 0; - uint16_t uid1 = 0; - uint16_t uid2 = 0; + CounterDirectory counterDirectory; + BOOST_CHECK(counterDirectory.GetCategoryCount() == 0); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 0); + BOOST_CHECK(counterDirectory.GetCounterSetCount() == 0); + BOOST_CHECK(counterDirectory.GetCounterCount() == 0); + + // Register a category with an invalid name + const Category* noCategory = nullptr; + BOOST_CHECK_THROW(noCategory = counterDirectory.RegisterCategory(""), armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 0); + BOOST_CHECK(!noCategory); + + // Register a category with an invalid name + BOOST_CHECK_THROW(noCategory = counterDirectory.RegisterCategory("invalid category"), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 0); + BOOST_CHECK(!noCategory); + + // Register a new category + const std::string categoryName = "some_category"; + const Category* category = nullptr; + BOOST_CHECK_NO_THROW(category = counterDirectory.RegisterCategory(categoryName)); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 1); + BOOST_CHECK(category); + BOOST_CHECK(category->m_Name == categoryName); + BOOST_CHECK(category->m_Counters.empty()); + BOOST_CHECK(category->m_DeviceUid == 0); + BOOST_CHECK(category->m_CounterSetUid == 0); + + // Get the registered category + const Category* registeredCategory = counterDirectory.GetCategory(categoryName); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 1); + BOOST_CHECK(registeredCategory); + BOOST_CHECK(registeredCategory == category); + + // Try to get a category not registered + const Category* notRegisteredCategory = counterDirectory.GetCategory("not_registered_category"); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 1); + BOOST_CHECK(!notRegisteredCategory); + + // Register a category already registered + const Category* anotherCategory = nullptr; + BOOST_CHECK_THROW(anotherCategory = counterDirectory.RegisterCategory(categoryName), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 1); + BOOST_CHECK(!anotherCategory); + + // Register a device for testing + const std::string deviceName = "some_device"; + const Device* device = nullptr; + BOOST_CHECK_NO_THROW(device = counterDirectory.RegisterDevice(deviceName)); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 1); + BOOST_CHECK(device); + BOOST_CHECK(device->m_Uid >= 1); + BOOST_CHECK(device->m_Name == deviceName); + BOOST_CHECK(device->m_Cores == 0); + + // Register a new category not associated to any device + const std::string categoryWoDeviceName = "some_category_without_device"; + const Category* categoryWoDevice = nullptr; + BOOST_CHECK_NO_THROW(categoryWoDevice = counterDirectory.RegisterCategory(categoryWoDeviceName, 0)); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 2); + BOOST_CHECK(categoryWoDevice); + BOOST_CHECK(categoryWoDevice->m_Name == categoryWoDeviceName); + BOOST_CHECK(categoryWoDevice->m_Counters.empty()); + BOOST_CHECK(categoryWoDevice->m_DeviceUid == 0); + BOOST_CHECK(categoryWoDevice->m_CounterSetUid == 0); + + // Register a new category associated to an invalid device + const std::string categoryWInvalidDeviceName = "some_category_with_invalid_device"; + + ARMNN_NO_CONVERSION_WARN_BEGIN + uint16_t invalidDeviceUid = device->m_Uid + 10; + ARMNN_NO_CONVERSION_WARN_END + + const Category* categoryWInvalidDevice = nullptr; + BOOST_CHECK_THROW(categoryWInvalidDevice + = counterDirectory.RegisterCategory(categoryWInvalidDeviceName, + invalidDeviceUid), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 2); + BOOST_CHECK(!categoryWInvalidDevice); + + // Register a new category associated to a valid device + const std::string categoryWValidDeviceName = "some_category_with_valid_device"; + const Category* categoryWValidDevice = nullptr; + BOOST_CHECK_NO_THROW(categoryWValidDevice + = counterDirectory.RegisterCategory(categoryWValidDeviceName, + device->m_Uid)); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 3); + BOOST_CHECK(categoryWValidDevice); + BOOST_CHECK(categoryWValidDevice != category); + BOOST_CHECK(categoryWValidDevice->m_Name == categoryWValidDeviceName); + BOOST_CHECK(categoryWValidDevice->m_DeviceUid == device->m_Uid); + BOOST_CHECK(categoryWValidDevice->m_CounterSetUid == 0); + + // Register a counter set for testing + const std::string counterSetName = "some_counter_set"; + const CounterSet* counterSet = nullptr; + BOOST_CHECK_NO_THROW(counterSet = counterDirectory.RegisterCounterSet(counterSetName)); + BOOST_CHECK(counterDirectory.GetCounterSetCount() == 1); + BOOST_CHECK(counterSet); + BOOST_CHECK(counterSet->m_Uid >= 1); + BOOST_CHECK(counterSet->m_Name == counterSetName); + BOOST_CHECK(counterSet->m_Count == 0); + + // Register a new category not associated to any counter set + const std::string categoryWoCounterSetName = "some_category_without_counter_set"; + const Category* categoryWoCounterSet = nullptr; + BOOST_CHECK_NO_THROW(categoryWoCounterSet + = counterDirectory.RegisterCategory(categoryWoCounterSetName, + armnn::EmptyOptional(), + 0)); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 4); + BOOST_CHECK(categoryWoCounterSet); + BOOST_CHECK(categoryWoCounterSet->m_Name == categoryWoCounterSetName); + BOOST_CHECK(categoryWoCounterSet->m_DeviceUid == 0); + BOOST_CHECK(categoryWoCounterSet->m_CounterSetUid == 0); + + // Register a new category associated to an invalid counter set + const std::string categoryWInvalidCounterSetName = "some_category_with_invalid_counter_set"; + + ARMNN_NO_CONVERSION_WARN_BEGIN + uint16_t invalidCunterSetUid = counterSet->m_Uid + 10; + ARMNN_NO_CONVERSION_WARN_END + + const Category* categoryWInvalidCounterSet = nullptr; + BOOST_CHECK_THROW(categoryWInvalidCounterSet + = counterDirectory.RegisterCategory(categoryWInvalidCounterSetName, + armnn::EmptyOptional(), + invalidCunterSetUid), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 4); + BOOST_CHECK(!categoryWInvalidCounterSet); + + // Register a new category associated to a valid counter set + const std::string categoryWValidCounterSetName = "some_category_with_valid_counter_set"; + const Category* categoryWValidCounterSet = nullptr; + BOOST_CHECK_NO_THROW(categoryWValidCounterSet + = counterDirectory.RegisterCategory(categoryWValidCounterSetName, + armnn::EmptyOptional(), + counterSet->m_Uid)); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 5); + BOOST_CHECK(categoryWValidCounterSet); + BOOST_CHECK(categoryWValidCounterSet != category); + BOOST_CHECK(categoryWValidCounterSet->m_Name == categoryWValidCounterSetName); + BOOST_CHECK(categoryWValidCounterSet->m_DeviceUid == 0); + BOOST_CHECK(categoryWValidCounterSet->m_CounterSetUid == counterSet->m_Uid); + + // Register a new category associated to a valid device and counter set + const std::string categoryWValidDeviceAndValidCounterSetName = "some_category_with_valid_device_and_counter_set"; + const Category* categoryWValidDeviceAndValidCounterSet = nullptr; + BOOST_CHECK_NO_THROW(categoryWValidDeviceAndValidCounterSet + = counterDirectory.RegisterCategory(categoryWValidDeviceAndValidCounterSetName, + device->m_Uid, + counterSet->m_Uid)); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 6); + BOOST_CHECK(categoryWValidDeviceAndValidCounterSet); + BOOST_CHECK(categoryWValidDeviceAndValidCounterSet != category); + BOOST_CHECK(categoryWValidDeviceAndValidCounterSet->m_Name == categoryWValidDeviceAndValidCounterSetName); + BOOST_CHECK(categoryWValidDeviceAndValidCounterSet->m_DeviceUid == device->m_Uid); + BOOST_CHECK(categoryWValidDeviceAndValidCounterSet->m_CounterSetUid == counterSet->m_Uid); +} - std::thread thread1(GetNextUidTestImpl, std::ref(uid0)); - std::thread thread2(GetNextUidTestImpl, std::ref(uid1)); - std::thread thread3(GetNextUidTestImpl, std::ref(uid2)); - thread1.join(); - thread2.join(); - thread3.join(); +BOOST_AUTO_TEST_CASE(CheckCounterDirectoryRegisterDevice) +{ + CounterDirectory counterDirectory; + BOOST_CHECK(counterDirectory.GetCategoryCount() == 0); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 0); + BOOST_CHECK(counterDirectory.GetCounterSetCount() == 0); + BOOST_CHECK(counterDirectory.GetCounterCount() == 0); + + // Register a device with an invalid name + const Device* noDevice = nullptr; + BOOST_CHECK_THROW(noDevice = counterDirectory.RegisterDevice(""), armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 0); + BOOST_CHECK(!noDevice); + + // Register a device with an invalid name + BOOST_CHECK_THROW(noDevice = counterDirectory.RegisterDevice("inv@lid nam€"), armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 0); + BOOST_CHECK(!noDevice); + + // Register a new device with no cores or parent category + const std::string deviceName = "some_device"; + const Device* device = nullptr; + BOOST_CHECK_NO_THROW(device = counterDirectory.RegisterDevice(deviceName)); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 1); + BOOST_CHECK(device); + BOOST_CHECK(device->m_Name == deviceName); + BOOST_CHECK(device->m_Uid >= 1); + BOOST_CHECK(device->m_Cores == 0); + + // Get the registered device + const Device* registeredDevice = counterDirectory.GetDevice(device->m_Uid); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 1); + BOOST_CHECK(registeredDevice); + BOOST_CHECK(registeredDevice == device); + + // Register a new device with cores and no parent category + const std::string deviceWCoresName = "some_device_with_cores"; + const Device* deviceWCores = nullptr; + BOOST_CHECK_NO_THROW(deviceWCores = counterDirectory.RegisterDevice(deviceWCoresName, 2)); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 2); + BOOST_CHECK(deviceWCores); + BOOST_CHECK(deviceWCores->m_Name == deviceWCoresName); + BOOST_CHECK(deviceWCores->m_Uid >= 1); + BOOST_CHECK(deviceWCores->m_Uid > device->m_Uid); + BOOST_CHECK(deviceWCores->m_Cores == 2); + + // Get the registered device + const Device* registeredDeviceWCores = counterDirectory.GetDevice(deviceWCores->m_Uid); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 2); + BOOST_CHECK(registeredDeviceWCores); + BOOST_CHECK(registeredDeviceWCores == deviceWCores); + BOOST_CHECK(registeredDeviceWCores != device); + + // Register a new device with cores and invalid parent category + const std::string deviceWCoresWInvalidParentCategoryName = "some_device_with_cores_with_invalid_parent_category"; + const Device* deviceWCoresWInvalidParentCategory = nullptr; + BOOST_CHECK_THROW(deviceWCoresWInvalidParentCategory + = counterDirectory.RegisterDevice(deviceWCoresWInvalidParentCategoryName, + 3, + std::string("")), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 2); + BOOST_CHECK(!deviceWCoresWInvalidParentCategory); + + // Register a new device with cores and invalid parent category + const std::string deviceWCoresWInvalidParentCategoryName2 = "some_device_with_cores_with_invalid_parent_category2"; + const Device* deviceWCoresWInvalidParentCategory2 = nullptr; + BOOST_CHECK_THROW(deviceWCoresWInvalidParentCategory2 + = counterDirectory.RegisterDevice(deviceWCoresWInvalidParentCategoryName2, + 3, + std::string("invalid_parent_category")), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 2); + BOOST_CHECK(!deviceWCoresWInvalidParentCategory2); + + // Register a category for testing + const std::string categoryName = "some_category"; + const Category* category = nullptr; + BOOST_CHECK_NO_THROW(category = counterDirectory.RegisterCategory(categoryName)); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 1); + BOOST_CHECK(category); + BOOST_CHECK(category->m_Name == categoryName); + BOOST_CHECK(category->m_Counters.empty()); + BOOST_CHECK(category->m_DeviceUid == 0); + BOOST_CHECK(category->m_CounterSetUid == 0); + + // Register a new device with cores and valid parent category + const std::string deviceWCoresWValidParentCategoryName = "some_device_with_cores_with_valid_parent_category"; + const Device* deviceWCoresWValidParentCategory = nullptr; + BOOST_CHECK_NO_THROW(deviceWCoresWValidParentCategory + = counterDirectory.RegisterDevice(deviceWCoresWValidParentCategoryName, + 4, + categoryName)); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 3); + BOOST_CHECK(deviceWCoresWValidParentCategory); + BOOST_CHECK(deviceWCoresWValidParentCategory->m_Name == deviceWCoresWValidParentCategoryName); + BOOST_CHECK(deviceWCoresWValidParentCategory->m_Uid >= 1); + BOOST_CHECK(deviceWCoresWValidParentCategory->m_Uid > device->m_Uid); + BOOST_CHECK(deviceWCoresWValidParentCategory->m_Uid > deviceWCores->m_Uid); + BOOST_CHECK(deviceWCoresWValidParentCategory->m_Cores == 4); + BOOST_CHECK(category->m_DeviceUid == deviceWCoresWValidParentCategory->m_Uid); +} + +BOOST_AUTO_TEST_CASE(CheckCounterDirectoryRegisterCounterSet) +{ + CounterDirectory counterDirectory; + BOOST_CHECK(counterDirectory.GetCategoryCount() == 0); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 0); + BOOST_CHECK(counterDirectory.GetCounterSetCount() == 0); + BOOST_CHECK(counterDirectory.GetCounterCount() == 0); + + // Register a counter set with an invalid name + const CounterSet* noCounterSet = nullptr; + BOOST_CHECK_THROW(noCounterSet = counterDirectory.RegisterCounterSet(""), armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterSetCount() == 0); + BOOST_CHECK(!noCounterSet); + + // Register a counter set with an invalid name + BOOST_CHECK_THROW(noCounterSet = counterDirectory.RegisterCounterSet("invalid name"), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterSetCount() == 0); + BOOST_CHECK(!noCounterSet); + + // Register a new counter set with no count or parent category + const std::string counterSetName = "some_counter_set"; + const CounterSet* counterSet = nullptr; + BOOST_CHECK_NO_THROW(counterSet = counterDirectory.RegisterCounterSet(counterSetName)); + BOOST_CHECK(counterDirectory.GetCounterSetCount() == 1); + BOOST_CHECK(counterSet); + BOOST_CHECK(counterSet->m_Name == counterSetName); + BOOST_CHECK(counterSet->m_Uid >= 1); + BOOST_CHECK(counterSet->m_Count == 0); + + // Get the registered counter set + const CounterSet* registeredCounterSet = counterDirectory.GetCounterSet(counterSet->m_Uid); + BOOST_CHECK(counterDirectory.GetCounterSetCount() == 1); + BOOST_CHECK(registeredCounterSet); + BOOST_CHECK(registeredCounterSet == counterSet); + + // Register a new counter set with count and no parent category + const std::string counterSetWCountName = "some_counter_set_with_count"; + const CounterSet* counterSetWCount = nullptr; + BOOST_CHECK_NO_THROW(counterSetWCount = counterDirectory.RegisterCounterSet(counterSetWCountName, 37)); + BOOST_CHECK(counterDirectory.GetCounterSetCount() == 2); + BOOST_CHECK(counterSetWCount); + BOOST_CHECK(counterSetWCount->m_Name == counterSetWCountName); + BOOST_CHECK(counterSetWCount->m_Uid >= 1); + BOOST_CHECK(counterSetWCount->m_Uid > counterSet->m_Uid); + BOOST_CHECK(counterSetWCount->m_Count == 37); + + // Get the registered counter set + const CounterSet* registeredCounterSetWCount = counterDirectory.GetCounterSet(counterSetWCount->m_Uid); + BOOST_CHECK(counterDirectory.GetCounterSetCount() == 2); + BOOST_CHECK(registeredCounterSetWCount); + BOOST_CHECK(registeredCounterSetWCount == counterSetWCount); + BOOST_CHECK(registeredCounterSetWCount != counterSet); + + // Register a new counter set with count and invalid parent category + const std::string counterSetWCountWInvalidParentCategoryName = "some_counter_set_with_count_" + "with_invalid_parent_category"; + const CounterSet* counterSetWCountWInvalidParentCategory = nullptr; + BOOST_CHECK_THROW(counterSetWCountWInvalidParentCategory + = counterDirectory.RegisterCounterSet(counterSetWCountWInvalidParentCategoryName, + 42, + std::string("")), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterSetCount() == 2); + BOOST_CHECK(!counterSetWCountWInvalidParentCategory); + + // Register a new counter set with count and invalid parent category + const std::string counterSetWCountWInvalidParentCategoryName2 = "some_counter_set_with_count_" + "with_invalid_parent_category2"; + const CounterSet* counterSetWCountWInvalidParentCategory2 = nullptr; + BOOST_CHECK_THROW(counterSetWCountWInvalidParentCategory2 + = counterDirectory.RegisterCounterSet(counterSetWCountWInvalidParentCategoryName2, + 42, + std::string("invalid_parent_category")), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterSetCount() == 2); + BOOST_CHECK(!counterSetWCountWInvalidParentCategory2); + + // Register a category for testing + const std::string categoryName = "some_category"; + const Category* category = nullptr; + BOOST_CHECK_NO_THROW(category = counterDirectory.RegisterCategory(categoryName)); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 1); + BOOST_CHECK(category); + BOOST_CHECK(category->m_Name == categoryName); + BOOST_CHECK(category->m_Counters.empty()); + BOOST_CHECK(category->m_DeviceUid == 0); + BOOST_CHECK(category->m_CounterSetUid == 0); + + // Register a new counter set with count and valid parent category + const std::string counterSetWCountWValidParentCategoryName = "some_counter_set_with_count_" + "with_valid_parent_category"; + const CounterSet* counterSetWCountWValidParentCategory = nullptr; + BOOST_CHECK_NO_THROW(counterSetWCountWValidParentCategory + = counterDirectory.RegisterCounterSet(counterSetWCountWValidParentCategoryName, + 42, + std::string(categoryName))); + BOOST_CHECK(counterDirectory.GetCounterSetCount() == 3); + BOOST_CHECK(counterSetWCountWValidParentCategory); + BOOST_CHECK(counterSetWCountWValidParentCategory->m_Name == counterSetWCountWValidParentCategoryName); + BOOST_CHECK(counterSetWCountWValidParentCategory->m_Uid >= 1); + BOOST_CHECK(counterSetWCountWValidParentCategory->m_Uid > counterSet->m_Uid); + BOOST_CHECK(counterSetWCountWValidParentCategory->m_Uid > counterSetWCount->m_Uid); + BOOST_CHECK(counterSetWCountWValidParentCategory->m_Count == 42); + BOOST_CHECK(category->m_CounterSetUid == counterSetWCountWValidParentCategory->m_Uid); +} + +BOOST_AUTO_TEST_CASE(CheckCounterDirectoryRegisterCounter) +{ + CounterDirectory counterDirectory; + BOOST_CHECK(counterDirectory.GetCategoryCount() == 0); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 0); + BOOST_CHECK(counterDirectory.GetCounterSetCount() == 0); + BOOST_CHECK(counterDirectory.GetCounterCount() == 0); + + // Register a counter with an invalid parent category name + const Counter* noCounter = nullptr; + BOOST_CHECK_THROW(noCounter = counterDirectory.RegisterCounter("", + 0, + 1, + 123.45f, + "valid name", + "valid description"), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterCount() == 0); + BOOST_CHECK(!noCounter); + + // Register a counter with an invalid parent category name + BOOST_CHECK_THROW(noCounter = counterDirectory.RegisterCounter("invalid parent category", + 0, + 1, + 123.45f, + "valid name", + "valid description"), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterCount() == 0); + BOOST_CHECK(!noCounter); + + // Register a counter with an invalid class + BOOST_CHECK_THROW(noCounter = counterDirectory.RegisterCounter("valid_parent_category", + 2, + 1, + 123.45f, + "valid name", + "valid description"), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterCount() == 0); + BOOST_CHECK(!noCounter); + + // Register a counter with an invalid interpolation + BOOST_CHECK_THROW(noCounter = counterDirectory.RegisterCounter("valid_parent_category", + 0, + 3, + 123.45f, + "valid name", + "valid description"), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterCount() == 0); + BOOST_CHECK(!noCounter); + + // Register a counter with an invalid multiplier + BOOST_CHECK_THROW(noCounter = counterDirectory.RegisterCounter("valid_parent_category", + 0, + 1, + .0f, + "valid name", + "valid description"), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterCount() == 0); + BOOST_CHECK(!noCounter); + + // Register a counter with an invalid name + BOOST_CHECK_THROW(noCounter = counterDirectory.RegisterCounter("valid_parent_category", + 0, + 1, + 123.45f, + "", + "valid description"), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterCount() == 0); + BOOST_CHECK(!noCounter); + + // Register a counter with an invalid name + BOOST_CHECK_THROW(noCounter = counterDirectory.RegisterCounter("valid_parent_category", + 0, + 1, + 123.45f, + "invalid nam€", + "valid description"), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterCount() == 0); + BOOST_CHECK(!noCounter); + + // Register a counter with an invalid description + BOOST_CHECK_THROW(noCounter = counterDirectory.RegisterCounter("valid_parent_category", + 0, + 1, + 123.45f, + "valid name", + ""), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterCount() == 0); + BOOST_CHECK(!noCounter); + + // Register a counter with an invalid description + BOOST_CHECK_THROW(noCounter = counterDirectory.RegisterCounter("valid_parent_category", + 0, + 1, + 123.45f, + "valid name", + "inv@lid description"), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterCount() == 0); + BOOST_CHECK(!noCounter); + + // Register a counter with an invalid unit2 + BOOST_CHECK_THROW(noCounter = counterDirectory.RegisterCounter("valid_parent_category", + 0, + 1, + 123.45f, + "valid name", + "valid description", + std::string("Mb/s2")), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterCount() == 0); + BOOST_CHECK(!noCounter); + + // Register a counter with a non-existing parent category name + BOOST_CHECK_THROW(noCounter = counterDirectory.RegisterCounter("invalid_parent_category", + 0, + 1, + 123.45f, + "valid name", + "valid description"), + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterCount() == 0); + BOOST_CHECK(!noCounter); + + // Register a category for testing + const std::string categoryName = "some_category"; + const Category* category = nullptr; + BOOST_CHECK_NO_THROW(category = counterDirectory.RegisterCategory(categoryName)); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 1); + BOOST_CHECK(category); + BOOST_CHECK(category->m_Name == categoryName); + BOOST_CHECK(category->m_Counters.empty()); + BOOST_CHECK(category->m_DeviceUid == 0); + BOOST_CHECK(category->m_CounterSetUid == 0); + + // Register a counter with a valid parent category name + const Counter* counter = nullptr; + BOOST_CHECK_NO_THROW(counter = counterDirectory.RegisterCounter(categoryName, + 0, + 1, + 123.45f, + "valid name", + "valid description")); + BOOST_CHECK(counterDirectory.GetCounterCount() == 1); + BOOST_CHECK(counter); + BOOST_CHECK(counter->m_Uid >= 0); + BOOST_CHECK(counter->m_MaxCounterUid == counter->m_Uid); + BOOST_CHECK(counter->m_Class == 0); + BOOST_CHECK(counter->m_Interpolation == 1); + BOOST_CHECK(counter->m_Multiplier == 123.45f); + BOOST_CHECK(counter->m_Name == "valid name"); + BOOST_CHECK(counter->m_Description == "valid description"); + BOOST_CHECK(counter->m_Units == ""); + BOOST_CHECK(counter->m_DeviceUid == 0); + BOOST_CHECK(counter->m_CounterSetUid == 0); + BOOST_CHECK(category->m_Counters.size() == 1); + BOOST_CHECK(category->m_Counters.back() == counter->m_Uid); + + // Register a counter with a valid parent category name and units + const Counter* counterWUnits = nullptr; + BOOST_CHECK_NO_THROW(counterWUnits = counterDirectory.RegisterCounter(categoryName, + 0, + 1, + 123.45f, + "valid name 2", + "valid description", + std::string("Mnnsq2"))); // Units + BOOST_CHECK(counterDirectory.GetCounterCount() == 2); + BOOST_CHECK(counterWUnits); + BOOST_CHECK(counterWUnits->m_Uid >= 0); + BOOST_CHECK(counterWUnits->m_Uid > counter->m_Uid); + BOOST_CHECK(counterWUnits->m_MaxCounterUid == counterWUnits->m_Uid); + BOOST_CHECK(counterWUnits->m_Class == 0); + BOOST_CHECK(counterWUnits->m_Interpolation == 1); + BOOST_CHECK(counterWUnits->m_Multiplier == 123.45f); + BOOST_CHECK(counterWUnits->m_Name == "valid name 2"); + BOOST_CHECK(counterWUnits->m_Description == "valid description"); + BOOST_CHECK(counterWUnits->m_Units == "Mnnsq2"); + BOOST_CHECK(counterWUnits->m_DeviceUid == 0); + BOOST_CHECK(counterWUnits->m_CounterSetUid == 0); + BOOST_CHECK(category->m_Counters.size() == 2); + BOOST_CHECK(category->m_Counters.back() == counterWUnits->m_Uid); + + // Register a counter with a valid parent category name and not associated with a device + const Counter* counterWoDevice = nullptr; + BOOST_CHECK_NO_THROW(counterWoDevice = counterDirectory.RegisterCounter(categoryName, + 0, + 1, + 123.45f, + "valid name 3", + "valid description", + armnn::EmptyOptional(), // Units + armnn::EmptyOptional(), // Number of cores + 0)); // Device UID + BOOST_CHECK(counterDirectory.GetCounterCount() == 3); + BOOST_CHECK(counterWoDevice); + BOOST_CHECK(counterWoDevice->m_Uid >= 0); + BOOST_CHECK(counterWoDevice->m_Uid > counter->m_Uid); + BOOST_CHECK(counterWoDevice->m_MaxCounterUid == counterWoDevice->m_Uid); + BOOST_CHECK(counterWoDevice->m_Class == 0); + BOOST_CHECK(counterWoDevice->m_Interpolation == 1); + BOOST_CHECK(counterWoDevice->m_Multiplier == 123.45f); + BOOST_CHECK(counterWoDevice->m_Name == "valid name 3"); + BOOST_CHECK(counterWoDevice->m_Description == "valid description"); + BOOST_CHECK(counterWoDevice->m_Units == ""); + BOOST_CHECK(counterWoDevice->m_DeviceUid == 0); + BOOST_CHECK(counterWoDevice->m_CounterSetUid == 0); + BOOST_CHECK(category->m_Counters.size() == 3); + BOOST_CHECK(category->m_Counters.back() == counterWoDevice->m_Uid); + + // Register a counter with a valid parent category name and associated to an invalid device + BOOST_CHECK_THROW(noCounter = counterDirectory.RegisterCounter(categoryName, + 0, + 1, + 123.45f, + "valid name 4", + "valid description", + armnn::EmptyOptional(), // Units + armnn::EmptyOptional(), // Number of cores + 100), // Device UID + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterCount() == 3); + BOOST_CHECK(!noCounter); + + // Register a device for testing + const std::string deviceName = "some_device"; + const Device* device = nullptr; + BOOST_CHECK_NO_THROW(device = counterDirectory.RegisterDevice(deviceName)); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 1); + BOOST_CHECK(device); + BOOST_CHECK(device->m_Name == deviceName); + BOOST_CHECK(device->m_Uid >= 1); + BOOST_CHECK(device->m_Cores == 0); + + // Register a counter with a valid parent category name and associated to a device + const Counter* counterWDevice = nullptr; + BOOST_CHECK_NO_THROW(counterWDevice = counterDirectory.RegisterCounter(categoryName, + 0, + 1, + 123.45f, + "valid name 5", + "valid description", + armnn::EmptyOptional(), // Units + armnn::EmptyOptional(), // Number of cores + device->m_Uid)); // Device UID + BOOST_CHECK(counterDirectory.GetCounterCount() == 4); + BOOST_CHECK(counterWDevice); + BOOST_CHECK(counterWDevice->m_Uid >= 0); + BOOST_CHECK(counterWDevice->m_Uid > counter->m_Uid); + BOOST_CHECK(counterWDevice->m_MaxCounterUid == counterWDevice->m_Uid); + BOOST_CHECK(counterWDevice->m_Class == 0); + BOOST_CHECK(counterWDevice->m_Interpolation == 1); + BOOST_CHECK(counterWDevice->m_Multiplier == 123.45f); + BOOST_CHECK(counterWDevice->m_Name == "valid name 5"); + BOOST_CHECK(counterWDevice->m_Description == "valid description"); + BOOST_CHECK(counterWDevice->m_Units == ""); + BOOST_CHECK(counterWDevice->m_DeviceUid == device->m_Uid); + BOOST_CHECK(counterWDevice->m_CounterSetUid == 0); + BOOST_CHECK(category->m_Counters.size() == 4); + BOOST_CHECK(category->m_Counters.back() == counterWDevice->m_Uid); + + // Register a counter with a valid parent category name and not associated with a counter set + const Counter* counterWoCounterSet = nullptr; + BOOST_CHECK_NO_THROW(counterWoCounterSet + = counterDirectory.RegisterCounter(categoryName, + 0, + 1, + 123.45f, + "valid name 6", + "valid description", + armnn::EmptyOptional(), // Units + armnn::EmptyOptional(), // Number of cores + armnn::EmptyOptional(), // Device UID + 0)); // Counter set UID + BOOST_CHECK(counterDirectory.GetCounterCount() == 5); + BOOST_CHECK(counterWoCounterSet); + BOOST_CHECK(counterWoCounterSet->m_Uid >= 0); + BOOST_CHECK(counterWoCounterSet->m_Uid > counter->m_Uid); + BOOST_CHECK(counterWoCounterSet->m_MaxCounterUid == counterWoCounterSet->m_Uid); + BOOST_CHECK(counterWoCounterSet->m_Class == 0); + BOOST_CHECK(counterWoCounterSet->m_Interpolation == 1); + BOOST_CHECK(counterWoCounterSet->m_Multiplier == 123.45f); + BOOST_CHECK(counterWoCounterSet->m_Name == "valid name 6"); + BOOST_CHECK(counterWoCounterSet->m_Description == "valid description"); + BOOST_CHECK(counterWoCounterSet->m_Units == ""); + BOOST_CHECK(counterWoCounterSet->m_DeviceUid == 0); + BOOST_CHECK(counterWoCounterSet->m_CounterSetUid == 0); + BOOST_CHECK(category->m_Counters.size() == 5); + BOOST_CHECK(category->m_Counters.back() == counterWoCounterSet->m_Uid); + + // Register a counter with a valid parent category name and associated to an invalid counter set + BOOST_CHECK_THROW(noCounter = counterDirectory.RegisterCounter(categoryName, + 0, + 1, + 123.45f, + "valid name 7", + "valid description", + armnn::EmptyOptional(), // Units + armnn::EmptyOptional(), // Number of cores + armnn::EmptyOptional(), // Device UID + 100), // Counter set UID + armnn::InvalidArgumentException); + BOOST_CHECK(counterDirectory.GetCounterCount() == 5); + BOOST_CHECK(!noCounter); + + // Register a counter with a valid parent category name and with a given number of cores + const Counter* counterWNumberOfCores = nullptr; + uint16_t numberOfCores = 15; + BOOST_CHECK_NO_THROW(counterWNumberOfCores + = counterDirectory.RegisterCounter(categoryName, + 0, + 1, + 123.45f, + "valid name 8", + "valid description", + armnn::EmptyOptional(), // Units + numberOfCores, // Number of cores + armnn::EmptyOptional(), // Device UID + armnn::EmptyOptional())); // Counter set UID + BOOST_CHECK(counterDirectory.GetCounterCount() == 20); + BOOST_CHECK(counterWNumberOfCores); + BOOST_CHECK(counterWNumberOfCores->m_Uid >= 0); + BOOST_CHECK(counterWNumberOfCores->m_Uid > counter->m_Uid); + BOOST_CHECK(counterWNumberOfCores->m_MaxCounterUid == counterWNumberOfCores->m_Uid + numberOfCores - 1); + BOOST_CHECK(counterWNumberOfCores->m_Class == 0); + BOOST_CHECK(counterWNumberOfCores->m_Interpolation == 1); + BOOST_CHECK(counterWNumberOfCores->m_Multiplier == 123.45f); + BOOST_CHECK(counterWNumberOfCores->m_Name == "valid name 8"); + BOOST_CHECK(counterWNumberOfCores->m_Description == "valid description"); + BOOST_CHECK(counterWNumberOfCores->m_Units == ""); + BOOST_CHECK(counterWNumberOfCores->m_DeviceUid == 0); + BOOST_CHECK(counterWNumberOfCores->m_CounterSetUid == 0); + BOOST_CHECK(category->m_Counters.size() == 20); + for (size_t i = 0; i < numberOfCores; i ++) + { + BOOST_CHECK(category->m_Counters[category->m_Counters.size() - numberOfCores + i] == + counterWNumberOfCores->m_Uid + i); + } + + // Register a multi-core device for testing + const std::string multiCoreDeviceName = "some_multi_core_device"; + const Device* multiCoreDevice = nullptr; + BOOST_CHECK_NO_THROW(multiCoreDevice = counterDirectory.RegisterDevice(multiCoreDeviceName, 4)); + BOOST_CHECK(counterDirectory.GetDeviceCount() == 2); + BOOST_CHECK(multiCoreDevice); + BOOST_CHECK(multiCoreDevice->m_Name == multiCoreDeviceName); + BOOST_CHECK(multiCoreDevice->m_Uid >= 1); + BOOST_CHECK(multiCoreDevice->m_Cores == 4); + + // Register a counter with a valid parent category name and associated to the multi-core device + const Counter* counterWMultiCoreDevice = nullptr; + BOOST_CHECK_NO_THROW(counterWMultiCoreDevice + = counterDirectory.RegisterCounter(categoryName, + 0, + 1, + 123.45f, + "valid name 9", + "valid description", + armnn::EmptyOptional(), // Units + armnn::EmptyOptional(), // Number of cores + multiCoreDevice->m_Uid, // Device UID + armnn::EmptyOptional())); // Counter set UID + BOOST_CHECK(counterDirectory.GetCounterCount() == 24); + BOOST_CHECK(counterWMultiCoreDevice); + BOOST_CHECK(counterWMultiCoreDevice->m_Uid >= 0); + BOOST_CHECK(counterWMultiCoreDevice->m_Uid > counter->m_Uid); + BOOST_CHECK(counterWMultiCoreDevice->m_MaxCounterUid == + counterWMultiCoreDevice->m_Uid + multiCoreDevice->m_Cores - 1); + BOOST_CHECK(counterWMultiCoreDevice->m_Class == 0); + BOOST_CHECK(counterWMultiCoreDevice->m_Interpolation == 1); + BOOST_CHECK(counterWMultiCoreDevice->m_Multiplier == 123.45f); + BOOST_CHECK(counterWMultiCoreDevice->m_Name == "valid name 9"); + BOOST_CHECK(counterWMultiCoreDevice->m_Description == "valid description"); + BOOST_CHECK(counterWMultiCoreDevice->m_Units == ""); + BOOST_CHECK(counterWMultiCoreDevice->m_DeviceUid == multiCoreDevice->m_Uid); + BOOST_CHECK(counterWMultiCoreDevice->m_CounterSetUid == 0); + BOOST_CHECK(category->m_Counters.size() == 24); + for (size_t i = 0; i < 4; i ++) + { + BOOST_CHECK(category->m_Counters[category->m_Counters.size() - 4 + i] == counterWMultiCoreDevice->m_Uid + i); + } - BOOST_TEST(uid0 > 0); - BOOST_TEST(uid1 > 0); - BOOST_TEST(uid2 > 0); - BOOST_TEST(uid0 != uid1); - BOOST_TEST(uid0 != uid2); - BOOST_TEST(uid1 != uid2); + // Register a counter set for testing + const std::string counterSetName = "some_counter_set"; + const CounterSet* counterSet = nullptr; + BOOST_CHECK_NO_THROW(counterSet = counterDirectory.RegisterCounterSet(counterSetName)); + BOOST_CHECK(counterDirectory.GetCounterSetCount() == 1); + BOOST_CHECK(counterSet); + BOOST_CHECK(counterSet->m_Name == counterSetName); + BOOST_CHECK(counterSet->m_Uid >= 1); + BOOST_CHECK(counterSet->m_Count == 0); + + // Register a counter with a valid parent category name and associated to a counter set + const Counter* counterWCounterSet = nullptr; + BOOST_CHECK_NO_THROW(counterWCounterSet + = counterDirectory.RegisterCounter(categoryName, + 0, + 1, + 123.45f, + "valid name 10", + "valid description", + armnn::EmptyOptional(), // Units + armnn::EmptyOptional(), // Number of cores + armnn::EmptyOptional(), // Device UID + counterSet->m_Uid)); // Counter set UID + BOOST_CHECK(counterDirectory.GetCounterCount() == 25); + BOOST_CHECK(counterWCounterSet); + BOOST_CHECK(counterWCounterSet->m_Uid >= 0); + BOOST_CHECK(counterWCounterSet->m_Uid > counter->m_Uid); + BOOST_CHECK(counterWCounterSet->m_MaxCounterUid == counterWCounterSet->m_Uid); + BOOST_CHECK(counterWCounterSet->m_Class == 0); + BOOST_CHECK(counterWCounterSet->m_Interpolation == 1); + BOOST_CHECK(counterWCounterSet->m_Multiplier == 123.45f); + BOOST_CHECK(counterWCounterSet->m_Name == "valid name 10"); + BOOST_CHECK(counterWCounterSet->m_Description == "valid description"); + BOOST_CHECK(counterWCounterSet->m_Units == ""); + BOOST_CHECK(counterWCounterSet->m_DeviceUid == 0); + BOOST_CHECK(counterWCounterSet->m_CounterSetUid == counterSet->m_Uid); + BOOST_CHECK(category->m_Counters.size() == 25); + BOOST_CHECK(category->m_Counters.back() == counterWCounterSet->m_Uid); + + // Register a counter with a valid parent category name and associated to a device and a counter set + const Counter* counterWDeviceWCounterSet = nullptr; + BOOST_CHECK_NO_THROW(counterWDeviceWCounterSet + = counterDirectory.RegisterCounter(categoryName, + 0, + 1, + 123.45f, + "valid name 11", + "valid description", + armnn::EmptyOptional(), // Units + armnn::EmptyOptional(), // Number of cores + device->m_Uid, // Device UID + counterSet->m_Uid)); // Counter set UID + BOOST_CHECK(counterDirectory.GetCounterCount() == 26); + BOOST_CHECK(counterWDeviceWCounterSet); + BOOST_CHECK(counterWDeviceWCounterSet->m_Uid >= 0); + BOOST_CHECK(counterWDeviceWCounterSet->m_Uid > counter->m_Uid); + BOOST_CHECK(counterWDeviceWCounterSet->m_MaxCounterUid == counterWDeviceWCounterSet->m_Uid); + BOOST_CHECK(counterWDeviceWCounterSet->m_Class == 0); + BOOST_CHECK(counterWDeviceWCounterSet->m_Interpolation == 1); + BOOST_CHECK(counterWDeviceWCounterSet->m_Multiplier == 123.45f); + BOOST_CHECK(counterWDeviceWCounterSet->m_Name == "valid name 11"); + BOOST_CHECK(counterWDeviceWCounterSet->m_Description == "valid description"); + BOOST_CHECK(counterWDeviceWCounterSet->m_Units == ""); + BOOST_CHECK(counterWDeviceWCounterSet->m_DeviceUid == device->m_Uid); + BOOST_CHECK(counterWDeviceWCounterSet->m_CounterSetUid == counterSet->m_Uid); + BOOST_CHECK(category->m_Counters.size() == 26); + BOOST_CHECK(category->m_Counters.back() == counterWDeviceWCounterSet->m_Uid); + + // Register another category for testing + const std::string anotherCategoryName = "some_other_category"; + const Category* anotherCategory = nullptr; + BOOST_CHECK_NO_THROW(anotherCategory = counterDirectory.RegisterCategory(anotherCategoryName)); + BOOST_CHECK(counterDirectory.GetCategoryCount() == 2); + BOOST_CHECK(anotherCategory); + BOOST_CHECK(anotherCategory != category); + BOOST_CHECK(anotherCategory->m_Name == anotherCategoryName); + BOOST_CHECK(anotherCategory->m_Counters.empty()); + BOOST_CHECK(anotherCategory->m_DeviceUid == 0); + BOOST_CHECK(anotherCategory->m_CounterSetUid == 0); + + // Register a counter to the other category + const Counter* anotherCounter = nullptr; + BOOST_CHECK_NO_THROW(anotherCounter = counterDirectory.RegisterCounter(anotherCategoryName, + 1, + 0, + .00043f, + "valid name", + "valid description", + armnn::EmptyOptional(), // Units + armnn::EmptyOptional(), // Number of cores + device->m_Uid, // Device UID + counterSet->m_Uid)); // Counter set UID + BOOST_CHECK(counterDirectory.GetCounterCount() == 27); + BOOST_CHECK(anotherCounter); + BOOST_CHECK(anotherCounter->m_Uid >= 0); + BOOST_CHECK(anotherCounter->m_MaxCounterUid == anotherCounter->m_Uid); + BOOST_CHECK(anotherCounter->m_Class == 1); + BOOST_CHECK(anotherCounter->m_Interpolation == 0); + BOOST_CHECK(anotherCounter->m_Multiplier == .00043f); + BOOST_CHECK(anotherCounter->m_Name == "valid name"); + BOOST_CHECK(anotherCounter->m_Description == "valid description"); + BOOST_CHECK(anotherCounter->m_Units == ""); + BOOST_CHECK(anotherCounter->m_DeviceUid == device->m_Uid); + BOOST_CHECK(anotherCounter->m_CounterSetUid == counterSet->m_Uid); + BOOST_CHECK(anotherCategory->m_Counters.size() == 1); + BOOST_CHECK(anotherCategory->m_Counters.back() == anotherCounter->m_Uid); } BOOST_AUTO_TEST_CASE(CounterSelectionCommandHandlerParseData) -- cgit v1.2.1