/*
* Copyright (C) 2017 The Android Open Source Project
*
* 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.
*/
#ifndef ANDROID_FRAMEWORK_ML_NN_RUNTIME_TEST_TESTGENERATED_H
#define ANDROID_FRAMEWORK_ML_NN_RUNTIME_TEST_TESTGENERATED_H
#include <gtest/gtest.h>
#include "TestCompliance.h"
#include "TestHarness.h"
#include "TestNeuralNetworksWrapper.h"
#ifdef NNTEST_CTS
#define NNTEST_COMPUTE_MODE
#endif
#ifdef NNTEST_COMPUTE_MODE
#define GENERATED_TESTS_BASE testing::TestWithParam<Execution::ComputeMode>
#undef TEST_F
#define TEST_F TEST_P
// Only generated tests include the TestGenerated.h header file, so only those
// tests will be affected by changing their TEST_F to TEST_P. If we
// accidentally change TEST_F to TEST_P in some other context, we will get a
// compile-time failure, because TEST_F requires a non-value-parameterized
// fixture class whereas TEST_P requires a value-parameterized fixture class.
//
// Example failure:
//
// clang-format off
// gtest-param-util.h:488:41: error: no type named 'ParamType' in '(anonymous namespace)::MemoryTest'
// using ParamType = typename TestSuite::ParamType;
// ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~
// TestMemory.cpp:43:1: note: in instantiation of template class 'testing::internal::ParameterizedTestSuiteInfo<(anonymous namespace)::MemoryTest>' requested here
// TEST_P(MemoryTest, TestFd) {
// ^
// gtest-param-test.h:428:11: note: expanded from macro 'TEST_P'
// clang-format on
#else
#define GENERATED_TESTS_BASE ::testing::Test
#endif
using namespace android::nn::test_wrapper;
using namespace test_helper;
namespace generated_tests {
class GeneratedTests : public GENERATED_TESTS_BASE {
protected:
virtual void SetUp() override;
virtual void TearDown() override;
Compilation compileModel(const Model* model);
void executeWithCompilation(const Model* model, Compilation* compilation,
std::function<bool(int)> isIgnored,
std::vector<MixedTypedExample>& examples, std::string dumpFile);
void executeOnce(const Model* model, std::function<bool(int)> isIgnored,
std::vector<MixedTypedExample>& examples, std::string dumpFile);
void executeMultithreadedOwnCompilation(const Model* model, std::function<bool(int)> isIgnored,
std::vector<MixedTypedExample>& examples);
void executeMultithreadedSharedCompilation(const Model* model,
std::function<bool(int)> isIgnored,
std::vector<MixedTypedExample>& examples);
// Test driver for those generated from ml/nn/runtime/test/spec
void execute(std::function<void(Model*)> createModel, std::function<bool(int)> isIgnored,
std::vector<MixedTypedExample>& examples, std::string dumpFile = "");
std::string mCacheDir;
std::vector<uint8_t> mToken;
bool mTestCompilationCaching;
#ifdef NNTEST_COMPUTE_MODE
// SetUp() uses Execution::setComputeMode() to establish a new ComputeMode,
// and saves off the previous ComputeMode here; TearDown() restores that
// previous ComputeMode, so that subsequent tests will not be affected by
// the SetUp() ComputeMode change.
Execution::ComputeMode mOldComputeMode;
#endif
};
// Tag for the dynamic output shape tests
class DynamicOutputShapeTest : public GeneratedTests {};
} // namespace generated_tests
using namespace generated_tests;
#endif // ANDROID_FRAMEWORK_ML_NN_RUNTIME_TEST_TESTGENERATED_H