Macro for defining unit tests that require an accelerated device This provides a device named 'device' to your code
ALGORITHM_TYPED_TEST_P(RfiTester, single_band_interference_spike) { // you have access to the device via
#ifndef SKA_CHEETAH_TEST_UTILS_ALGORITHMTESTER_H
#define SKA_CHEETAH_TEST_UTILS_ALGORITHMTESTER_H
#include "panda/System.h"
#include "panda/arch/nvidia/Nvidia.h"
#include "panda/test/TestResourcePool.h"
#include <gtest/gtest.h>
#include <functional>
#define ALGORITHM_TYPED_TEST_P(CaseName ,TestName) \
template<typename TestTraits> void _algorithm_test_case_##CaseName##TestName(typename TestTraits::DeviceType&); \
TYPED_TEST_P(CaseName , TestName) \
{ \
ASSERT_NE(0U, this->devices().size()) << "no suitable devices"; \
unsigned count = 0; \
for( auto & device : this->devices()) { \
std::cout << "running on device " << count++ << std::endl; \
device->run([](typename std::decay<decltype(device)>::type::element_type & device) { _algorithm_test_case_##CaseName##TestName<TypeParam>(device); } ); \
} \
} \
template<typename TypeParam> void _algorithm_test_case_##CaseName##TestName(typename TypeParam::DeviceType& device)
#define POOL_ALGORITHM_TYPED_TEST_P(CaseName ,TestName) \
template<typename TestTraits> void _pool_algorithm_test_case_##CaseName##TestName(typename TestTraits::PoolType); \
TYPED_TEST_P(CaseName , TestName) \
{ \
ASSERT_NE(0U, this->devices().size()) << "no suitable devices"; \
unsigned count = 0; \
for( auto & device : this->devices()) { \
typename TypeParam::PoolType pool; \
pool.template add_resource<typename TypeParam::Arch>(device); \
std::cout << "running on pool with device " << count++ << std::endl; \
_pool_algorithm_test_case_##CaseName##TestName<TypeParam>(std::move(pool)); \
} \
} \
template<typename TypeParam> void _pool_algorithm_test_case_##CaseName##TestName(typename TypeParam::PoolType pool)
namespace cheetah {
namespace utils {
namespace test {
template <typename DeviceType, typename Traits>
struct supports {
static bool compatible(DeviceType const&);
};
template <typename ArchitectureType,
typename CapabilityType,
typename DeviceTypeParam=panda::PoolResource<ArchitectureType>
>
struct AlgorithmTesterTraits {
typedef ArchitectureType Arch;
typedef DeviceTypeParam DeviceType;
typedef CapabilityType Capability;
typedef std::shared_ptr<panda::PoolResource<Arch>> TestParam;
};
template <typename ArchitectureType,
typename CapabilityType=void,
typename DeviceTypeParam=panda::PoolResource<ArchitectureType>,
typename PoolTypeParam=panda::test::TestResourcePool<ArchitectureType>>
struct PoolAlgorithmTesterTraits {
typedef ArchitectureType Arch;
typedef CapabilityType Capability;
typedef DeviceTypeParam DeviceType;
typedef PoolTypeParam PoolType;
typedef PoolType TestParam;
};
template <typename Traits>
class AlgorithmTester : public ::testing::TestWithParam<typename Traits::TestParam>
{
public:
typedef Traits AlgorithmTraits;
typedef std::shared_ptr<panda::PoolResource<typename Traits::Arch>> DeviceType;
public:
AlgorithmTester();
virtual ~AlgorithmTester();
protected:
std::vector<DeviceType>& devices() { return _devices; }
private:
std::vector<DeviceType> _devices;
};
}
}
}
}
#include "cheetah/utils/test_utils/detail/AlgorithmTester.cpp"
#endif // SKA_CHEETAH_TEST_UTILS_ALGORITHMTESTER_H