blob: 55f90d48ebfea66a9c495c7266941466b4cd5ac0 [file] [log] [blame]
Matteo Martincighac60d282019-07-25 15:25:44 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Matteo Martincighbc2e2102019-07-24 14:56:13 +01008#include <backendsCommon/DynamicBackend.hpp>
Matteo Martincighac60d282019-07-25 15:25:44 +01009#include <backendsCommon/DynamicBackendUtils.hpp>
10
Matteo Martincighbc2e2102019-07-24 14:56:13 +010011#include <string>
12#include <memory>
Matteo Martincighac60d282019-07-25 15:25:44 +010013
Matteo Martincigh986c1862019-07-26 15:12:47 +010014#include <string>
15
Matteo Martincighac60d282019-07-25 15:25:44 +010016#include <boost/test/unit_test.hpp>
Matteo Martincigh986c1862019-07-26 15:12:47 +010017#include <boost/filesystem.hpp>
Matteo Martincigha77d80e2019-07-31 11:05:16 +010018#include <boost/dll.hpp>
Matteo Martincigh986c1862019-07-26 15:12:47 +010019
Matteo Martincighd0dc7702019-08-01 17:09:03 +010020static std::string g_TestBaseDir = "src/backends/backendsCommon/test/";
Matteo Martincigh986c1862019-07-26 15:12:47 +010021
Matteo Martincighd0dc7702019-08-01 17:09:03 +010022static std::string g_TestSharedObjectSubDir = "testSharedObject/";
23static std::string g_TestDynamicBackendSubDir = "testDynamicBackend/";
24
25static std::string g_TestSharedObjectFileName = "libTestSharedObject.so";
26static std::string g_TestNoSharedObjectFileName = "libNoSharedObject.txt";
27
28static std::string g_TestValidTestDynamicBackendFileName = "libValidTestDynamicBackend.so";
29static std::string g_TestInvalidTestDynamicBackend1FileName = "libInvalidTestDynamicBackend1.so";
30static std::string g_TestInvalidTestDynamicBackend2FileName = "libInvalidTestDynamicBackend2.so";
31static std::string g_TestInvalidTestDynamicBackend3FileName = "libInvalidTestDynamicBackend3.so";
32static std::string g_TestInvalidTestDynamicBackend4FileName = "libInvalidTestDynamicBackend4.so";
33static std::string g_TestInvalidTestDynamicBackend5FileName = "libInvalidTestDynamicBackend5.so";
34static std::string g_TestInvalidTestDynamicBackend6FileName = "libInvalidTestDynamicBackend6.so";
35static std::string g_TestInvalidTestDynamicBackend7FileName = "libInvalidTestDynamicBackend7.so";
36
37std::string GetTestDirectoryBasePath()
Matteo Martincigh986c1862019-07-26 15:12:47 +010038{
39 using namespace boost::filesystem;
40
Matteo Martincigha77d80e2019-07-31 11:05:16 +010041 path programLocation = boost::dll::program_location().parent_path();
Matteo Martincighd0dc7702019-08-01 17:09:03 +010042 path sharedObjectPath = programLocation.append(g_TestBaseDir);
43 BOOST_CHECK(exists(sharedObjectPath));
Matteo Martincigh986c1862019-07-26 15:12:47 +010044
Matteo Martincighd0dc7702019-08-01 17:09:03 +010045 return sharedObjectPath.string();
46}
47
48std::string GetTestSubDirectory(const std::string& subdir)
49{
50 using namespace boost::filesystem;
51
52 std::string testDynamicBackendsBaseDir = GetTestDirectoryBasePath();
53 path testDynamicBackendsBasePath(testDynamicBackendsBaseDir);
54 path testDynamicBackendsSubDir = testDynamicBackendsBasePath.append(subdir);
55 // Do not check that the sub-directory exists because for testing reasons we may use non-existing paths
56
57 return testDynamicBackendsSubDir.string();
58}
59
60std::string GetTestFilePath(const std::string& directory, const std::string& fileName)
61{
62 using namespace boost::filesystem;
63
64 path directoryPath(directory);
65 path fileNamePath = directoryPath.append(fileName);
66 BOOST_CHECK(exists(fileNamePath));
67
68 return fileNamePath.string();
Matteo Martincigh986c1862019-07-26 15:12:47 +010069}
70
71void OpenCloseHandleTestImpl()
72{
73 using namespace armnn;
74
Matteo Martincighd0dc7702019-08-01 17:09:03 +010075 std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
76 std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
Matteo Martincigh986c1862019-07-26 15:12:47 +010077
78 void* sharedObjectHandle = nullptr;
79 BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
80 BOOST_TEST((sharedObjectHandle != nullptr));
81
82 DynamicBackendUtils::CloseHandle(sharedObjectHandle);
83}
84
85void CloseInvalidHandleTestImpl()
86{
87 using namespace armnn;
88
89 // This calls must silently handle invalid handles and complete successfully (no segfaults, etc.)
90 DynamicBackendUtils::CloseHandle(nullptr);
91}
92
93void OpenEmptyFileNameTestImpl()
94{
95 using namespace armnn;
96
97 void* sharedObjectHandle = nullptr;
98 BOOST_CHECK_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(""), RuntimeException);
99 BOOST_TEST((sharedObjectHandle == nullptr));
100}
101
102void OpenNotExistingFileTestImpl()
103{
104 using namespace armnn;
105
106 void* sharedObjectHandle = nullptr;
107 BOOST_CHECK_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle("NotExistingFileName"), RuntimeException);
108 BOOST_TEST((sharedObjectHandle == nullptr));
109}
110
111void OpenNotSharedObjectTestImpl()
112{
113 using namespace armnn;
114
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100115 std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
116 std::string notSharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestNoSharedObjectFileName);
Matteo Martincigh986c1862019-07-26 15:12:47 +0100117
118 void* sharedObjectHandle = nullptr;
119 BOOST_CHECK_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(notSharedObjectFilePath), RuntimeException);
120 BOOST_TEST((sharedObjectHandle == nullptr));
121}
122
123void GetValidEntryPointTestImpl()
124{
125 using namespace armnn;
126
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100127 std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
128 std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
Matteo Martincigh986c1862019-07-26 15:12:47 +0100129
130 void* sharedObjectHandle = nullptr;
131 BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
132 BOOST_TEST((sharedObjectHandle != nullptr));
133
134 using TestFunctionType = int(*)(int);
135 TestFunctionType testFunctionPointer = nullptr;
136 BOOST_CHECK_NO_THROW(testFunctionPointer = DynamicBackendUtils::GetEntryPoint<TestFunctionType>(sharedObjectHandle,
137 "TestFunction1"));
138 BOOST_TEST((testFunctionPointer != nullptr));
139 BOOST_TEST(testFunctionPointer(7) == 7);
140
141 DynamicBackendUtils::CloseHandle(sharedObjectHandle);
142}
143
144void GetNameMangledEntryPointTestImpl()
145{
146 using namespace armnn;
147
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100148 std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
149 std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
Matteo Martincigh986c1862019-07-26 15:12:47 +0100150
151 void* sharedObjectHandle = nullptr;
152 BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
153 BOOST_TEST((sharedObjectHandle != nullptr));
154
155 using TestFunctionType = int(*)(int);
156 TestFunctionType testFunctionPointer = nullptr;
157 BOOST_CHECK_THROW(testFunctionPointer = DynamicBackendUtils::GetEntryPoint<TestFunctionType>(sharedObjectHandle,
158 "TestFunction2"),
159 RuntimeException);
160 BOOST_TEST((testFunctionPointer == nullptr));
161
162 DynamicBackendUtils::CloseHandle(sharedObjectHandle);
163}
164
165void GetNoExternEntryPointTestImpl()
166{
167 using namespace armnn;
168
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100169 std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
170 std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
Matteo Martincigh986c1862019-07-26 15:12:47 +0100171
172 void* sharedObjectHandle = nullptr;
173 BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
174 BOOST_TEST((sharedObjectHandle != nullptr));
175
176 using TestFunctionType = int(*)(int);
177 TestFunctionType testFunctionPointer = nullptr;
178 BOOST_CHECK_THROW(testFunctionPointer = DynamicBackendUtils::GetEntryPoint<TestFunctionType>(sharedObjectHandle,
179 "TestFunction3"),
180 RuntimeException);
181 BOOST_TEST((testFunctionPointer == nullptr));
182
183 DynamicBackendUtils::CloseHandle(sharedObjectHandle);
184}
185
186void GetNotExistingEntryPointTestImpl()
187{
188 using namespace armnn;
189
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100190 std::string testSubDirectory = GetTestSubDirectory(g_TestSharedObjectSubDir);
191 std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestSharedObjectFileName);
Matteo Martincigh986c1862019-07-26 15:12:47 +0100192
193 void* sharedObjectHandle = nullptr;
194 BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
195 BOOST_TEST((sharedObjectHandle != nullptr));
196
197 using TestFunctionType = int(*)(int);
198 TestFunctionType testFunctionPointer = nullptr;
199 BOOST_CHECK_THROW(testFunctionPointer = DynamicBackendUtils::GetEntryPoint<TestFunctionType>(sharedObjectHandle,
200 "TestFunction4"),
201 RuntimeException);
202 BOOST_TEST((testFunctionPointer == nullptr));
203
204 DynamicBackendUtils::CloseHandle(sharedObjectHandle);
205}
Matteo Martincighac60d282019-07-25 15:25:44 +0100206
207void BackendVersioningTestImpl()
208{
Matteo Martincigh986c1862019-07-26 15:12:47 +0100209 using namespace armnn;
210
211 class TestDynamicBackendUtils : public DynamicBackendUtils
Matteo Martincighac60d282019-07-25 15:25:44 +0100212 {
213 public:
Matteo Martincigh986c1862019-07-26 15:12:47 +0100214 static bool IsBackendCompatibleTest(const BackendVersion& backendApiVersion,
215 const BackendVersion& backendVersion)
Matteo Martincighac60d282019-07-25 15:25:44 +0100216 {
217 return IsBackendCompatibleImpl(backendApiVersion, backendVersion);
218 }
219 };
220
221 // The backend API version used for the tests
Matteo Martincigh986c1862019-07-26 15:12:47 +0100222 BackendVersion backendApiVersion{ 2, 4 };
Matteo Martincighac60d282019-07-25 15:25:44 +0100223
224 // Same backend and backend API versions are compatible with the backend API
Matteo Martincigh986c1862019-07-26 15:12:47 +0100225 BackendVersion sameBackendVersion{ 2, 4 };
Matteo Martincighac60d282019-07-25 15:25:44 +0100226 BOOST_TEST(sameBackendVersion == backendApiVersion);
227 BOOST_TEST(sameBackendVersion <= backendApiVersion);
228 BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, sameBackendVersion) == true);
229
230 // Backend versions that differ from the backend API version by major revision are not compatible
231 // with the backend API
Matteo Martincigh986c1862019-07-26 15:12:47 +0100232 BackendVersion laterMajorBackendVersion{ 3, 4 };
Matteo Martincighac60d282019-07-25 15:25:44 +0100233 BOOST_TEST(!(laterMajorBackendVersion == backendApiVersion));
234 BOOST_TEST(!(laterMajorBackendVersion <= backendApiVersion));
235 BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, laterMajorBackendVersion) == false);
236
Matteo Martincigh986c1862019-07-26 15:12:47 +0100237 BackendVersion earlierMajorBackendVersion{ 1, 4 };
Matteo Martincighac60d282019-07-25 15:25:44 +0100238 BOOST_TEST(!(earlierMajorBackendVersion == backendApiVersion));
239 BOOST_TEST(earlierMajorBackendVersion <= backendApiVersion);
240 BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion,
241 earlierMajorBackendVersion) == false);
242
243 // Backend versions with the same major revision but later minor revision than
244 // the backend API version are not compatible with the backend API
Matteo Martincigh986c1862019-07-26 15:12:47 +0100245 BackendVersion laterMinorBackendVersion{ 2, 5 };
Matteo Martincighac60d282019-07-25 15:25:44 +0100246 BOOST_TEST(!(laterMinorBackendVersion == backendApiVersion));
247 BOOST_TEST(!(laterMinorBackendVersion <= backendApiVersion));
248 BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, laterMinorBackendVersion) == false);
249
250 // Backend versions with the same major revision but earlier minor revision than
251 // the backend API version are compatible with the backend API
Matteo Martincigh986c1862019-07-26 15:12:47 +0100252 BackendVersion earlierMinorBackendVersion{ 2, 3 };
Matteo Martincighac60d282019-07-25 15:25:44 +0100253 BOOST_TEST(!(earlierMinorBackendVersion == backendApiVersion));
254 BOOST_TEST(earlierMinorBackendVersion <= backendApiVersion);
255 BOOST_TEST(TestDynamicBackendUtils::IsBackendCompatibleTest(backendApiVersion, earlierMinorBackendVersion) == true);
256}
Matteo Martincighbc2e2102019-07-24 14:56:13 +0100257
258void CreateValidDynamicBackendObjectTestImpl()
259{
260 // Valid shared object handle
261 // Correct name mangling
262 // Correct interface
263 // Correct backend implementation
264
265 using namespace armnn;
266
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100267 std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
268 std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestValidTestDynamicBackendFileName);
Matteo Martincighbc2e2102019-07-24 14:56:13 +0100269
270 void* sharedObjectHandle = nullptr;
271 BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
272 BOOST_TEST((sharedObjectHandle != nullptr));
273
274 std::unique_ptr<DynamicBackend> dynamicBackend;
275 BOOST_CHECK_NO_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)));
276 BOOST_TEST((dynamicBackend != nullptr));
277
278 BackendId dynamicBackendId;
279 BOOST_CHECK_NO_THROW(dynamicBackendId = dynamicBackend->GetBackendId());
280 BOOST_TEST((dynamicBackendId == "ValidTestDynamicBackend"));
281
282 BackendVersion dynamicBackendVersion;
283 BOOST_CHECK_NO_THROW(dynamicBackendVersion = dynamicBackend->GetBackendVersion());
284 BOOST_TEST((dynamicBackendVersion == BackendVersion({ 1, 0 })));
285
286 IBackendInternalUniquePtr dynamicBackendInstance;
287 BOOST_CHECK_NO_THROW(dynamicBackendInstance = dynamicBackend->GetBackend());
288 BOOST_TEST((dynamicBackendInstance != nullptr));
289
290 BOOST_TEST((dynamicBackendInstance->GetId() == "ValidTestDynamicBackend"));
291}
292
293void CreateDynamicBackendObjectInvalidHandleTestImpl()
294{
295 // Invalid (null) shared object handle
296
297 using namespace armnn;
298
299 void* sharedObjectHandle = nullptr;
300 std::unique_ptr<DynamicBackend> dynamicBackend;
301 BOOST_CHECK_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), InvalidArgumentException);
302 BOOST_TEST((dynamicBackend == nullptr));
303}
304
305void CreateDynamicBackendObjectInvalidInterface1TestImpl()
306{
307 // Valid shared object handle
308 // Wrong (not C-style) name mangling
309
310 using namespace armnn;
311
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100312 std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
313 std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend1FileName);
Matteo Martincighbc2e2102019-07-24 14:56:13 +0100314
315 void* sharedObjectHandle = nullptr;
316 BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
317 BOOST_TEST((sharedObjectHandle != nullptr));
318
319 std::unique_ptr<DynamicBackend> dynamicBackend;
320 BOOST_CHECK_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
321 BOOST_TEST((dynamicBackend == nullptr));
322}
323
324void CreateDynamicBackendObjectInvalidInterface2TestImpl()
325{
326 // Valid shared object handle
327 // Correct name mangling
328 // Wrong interface (missing GetBackendId())
329
330 using namespace armnn;
331
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100332 std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
333 std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend2FileName);
Matteo Martincighbc2e2102019-07-24 14:56:13 +0100334
335 void* sharedObjectHandle = nullptr;
336 BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
337 BOOST_TEST((sharedObjectHandle != nullptr));
338
339 std::unique_ptr<DynamicBackend> dynamicBackend;
340 BOOST_CHECK_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
341 BOOST_TEST((dynamicBackend == nullptr));
342}
343
344void CreateDynamicBackendObjectInvalidInterface3TestImpl()
345{
346 // Valid shared object handle
347 // Correct name mangling
348 // Wrong interface (missing GetVersion())
349
350 using namespace armnn;
351
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100352 std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
353 std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend3FileName);
Matteo Martincighbc2e2102019-07-24 14:56:13 +0100354
355 void* sharedObjectHandle = nullptr;
356 BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
357 BOOST_TEST((sharedObjectHandle != nullptr));
358
359 std::unique_ptr<DynamicBackend> dynamicBackend;
360 BOOST_CHECK_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
361 BOOST_TEST((dynamicBackend == nullptr));
362}
363
364void CreateDynamicBackendObjectInvalidInterface4TestImpl()
365{
366 // Valid shared object handle
367 // Correct name mangling
368 // Wrong interface (missing BackendFactory())
369
370 using namespace armnn;
371
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100372 std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
373 std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend4FileName);
Matteo Martincighbc2e2102019-07-24 14:56:13 +0100374
375 void* sharedObjectHandle = nullptr;
376 BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
377 BOOST_TEST((sharedObjectHandle != nullptr));
378
379 std::unique_ptr<DynamicBackend> dynamicBackend;
380 BOOST_CHECK_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
381 BOOST_TEST((dynamicBackend == nullptr));
382}
383
384void CreateDynamicBackendObjectInvalidInterface5TestImpl()
385{
386 // Valid shared object handle
387 // Correct name mangling
388 // Correct interface
389 // Invalid (null) backend id returned by GetBackendId()
390
391 using namespace armnn;
392
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100393 std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
394 std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend5FileName);
Matteo Martincighbc2e2102019-07-24 14:56:13 +0100395
396 void* sharedObjectHandle = nullptr;
397 BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
398 BOOST_TEST((sharedObjectHandle != nullptr));
399
400 std::unique_ptr<DynamicBackend> dynamicBackend;
401 BOOST_CHECK_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
402 BOOST_TEST((dynamicBackend == nullptr));
403}
404
405void CreateDynamicBackendObjectInvalidInterface6TestImpl()
406{
407 // Valid shared object handle
408 // Correct name mangling
409 // Correct interface
410 // Invalid (null) backend instance returned by BackendFactory()
411
412 using namespace armnn;
413
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100414 std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
415 std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend6FileName);
Matteo Martincighbc2e2102019-07-24 14:56:13 +0100416
417 void* sharedObjectHandle = nullptr;
418 BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
419 BOOST_TEST((sharedObjectHandle != nullptr));
420
421 std::unique_ptr<DynamicBackend> dynamicBackend;
422 BOOST_CHECK_NO_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)));
423 BOOST_TEST((dynamicBackend != nullptr));
424
425 BackendId dynamicBackendId;
426 BOOST_CHECK_NO_THROW(dynamicBackendId = dynamicBackend->GetBackendId());
427 BOOST_TEST((dynamicBackendId == "InvalidTestDynamicBackend"));
428
429 BackendVersion dynamicBackendVersion;
430 BOOST_CHECK_NO_THROW(dynamicBackendVersion = dynamicBackend->GetBackendVersion());
431 BOOST_TEST((dynamicBackendVersion == BackendVersion({ 1, 0 })));
432
433 IBackendInternalUniquePtr dynamicBackendInstance;
434 BOOST_CHECK_THROW(dynamicBackendInstance = dynamicBackend->GetBackend(), RuntimeException);
435 BOOST_TEST((dynamicBackendInstance == nullptr));
436}
437
438void CreateDynamicBackendObjectInvalidInterface7TestImpl()
439{
440 // Valid shared object handle
441 // Correct name mangling
442 // Correct interface
443 // Invalid (incompatible backend API version) backend instance returned by BackendFactory()
444
445 using namespace armnn;
446
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100447 std::string testSubDirectory = GetTestSubDirectory(g_TestDynamicBackendSubDir);
448 std::string sharedObjectFilePath = GetTestFilePath(testSubDirectory, g_TestInvalidTestDynamicBackend7FileName);
Matteo Martincighbc2e2102019-07-24 14:56:13 +0100449
450 void* sharedObjectHandle = nullptr;
451 BOOST_CHECK_NO_THROW(sharedObjectHandle = DynamicBackendUtils::OpenHandle(sharedObjectFilePath));
452 BOOST_TEST((sharedObjectHandle != nullptr));
453
454 std::unique_ptr<DynamicBackend> dynamicBackend;
455 BOOST_CHECK_THROW(dynamicBackend.reset(new DynamicBackend(sharedObjectHandle)), RuntimeException);
456 BOOST_TEST((dynamicBackend == nullptr));
457}