tests: Test IPA serializer generation
Add a test to confirm that serializer and header generation works properly for mojom definition files, and that the serializer works properly. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
f70d5b14d6
commit
817a4b4472
5 changed files with 250 additions and 0 deletions
|
@ -0,0 +1,156 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Copyright (C) 2020, Google Inc.
|
||||
*
|
||||
* generated_serializer_test.cpp - Test generated serializer
|
||||
*/
|
||||
|
||||
#include <algorithm>
|
||||
#include <tuple>
|
||||
#include <vector>
|
||||
|
||||
#include "test.h"
|
||||
|
||||
#include "test_ipa_interface.h"
|
||||
#include "test_ipa_serializer.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace libcamera;
|
||||
|
||||
class IPAGeneratedSerializerTest : public Test
|
||||
{
|
||||
protected:
|
||||
int init() override
|
||||
{
|
||||
return TestPass;
|
||||
}
|
||||
|
||||
int run() override
|
||||
{
|
||||
|
||||
#define TEST_FIELD_EQUALITY(struct1, struct2, field) \
|
||||
if (struct1.field != struct2.field) { \
|
||||
cerr << #field << " field incorrect: expected \"" \
|
||||
<< t.field << "\", got \"" << u.field << "\"" << endl;\
|
||||
return TestFail; \
|
||||
}
|
||||
|
||||
ipa::test::TestStruct t, u;
|
||||
|
||||
t.m = {
|
||||
{ "a", "z" },
|
||||
{ "b", "z" },
|
||||
{ "c", "z" },
|
||||
{ "d", "z" },
|
||||
{ "e", "z" },
|
||||
};
|
||||
|
||||
t.a = { "a", "b", "c", "d", "e" };
|
||||
|
||||
t.s1 = "hello world";
|
||||
t.s2 = "goodbye";
|
||||
t.s3 = "lorem ipsum";
|
||||
t.i = 58527;
|
||||
|
||||
std::vector<uint8_t> serialized;
|
||||
|
||||
std::tie(serialized, ignore) =
|
||||
IPADataSerializer<ipa::test::TestStruct>::serialize(t);
|
||||
|
||||
u = IPADataSerializer<ipa::test::TestStruct>::deserialize(serialized);
|
||||
|
||||
if (!equals(t.m, u.m))
|
||||
return TestFail;
|
||||
|
||||
if (!equals(t.a, u.a))
|
||||
return TestFail;
|
||||
|
||||
TEST_FIELD_EQUALITY(t, u, s1);
|
||||
TEST_FIELD_EQUALITY(t, u, s2);
|
||||
TEST_FIELD_EQUALITY(t, u, s3);
|
||||
TEST_FIELD_EQUALITY(t, u, i);
|
||||
|
||||
|
||||
/* Test vector of generated structs */
|
||||
std::vector<ipa::test::TestStruct> v = { t, u };
|
||||
std::vector<ipa::test::TestStruct> w;
|
||||
|
||||
std::tie(serialized, ignore) =
|
||||
IPADataSerializer<vector<ipa::test::TestStruct>>::serialize(v);
|
||||
|
||||
w = IPADataSerializer<vector<ipa::test::TestStruct>>::deserialize(serialized);
|
||||
|
||||
if (!equals(v[0].m, w[0].m) ||
|
||||
!equals(v[1].m, w[1].m))
|
||||
return TestFail;
|
||||
|
||||
if (!equals(v[0].a, w[0].a) ||
|
||||
!equals(v[1].a, w[1].a))
|
||||
return TestFail;
|
||||
|
||||
TEST_FIELD_EQUALITY(v[0], w[0], s1);
|
||||
TEST_FIELD_EQUALITY(v[0], w[0], s2);
|
||||
TEST_FIELD_EQUALITY(v[0], w[0], s3);
|
||||
TEST_FIELD_EQUALITY(v[0], w[0], i);
|
||||
|
||||
TEST_FIELD_EQUALITY(v[1], w[1], s1);
|
||||
TEST_FIELD_EQUALITY(v[1], w[1], s2);
|
||||
TEST_FIELD_EQUALITY(v[1], w[1], s3);
|
||||
TEST_FIELD_EQUALITY(v[1], w[1], i);
|
||||
|
||||
return TestPass;
|
||||
}
|
||||
|
||||
private:
|
||||
bool equals(const map<string, string> &lhs, const map<string, string> &rhs)
|
||||
{
|
||||
bool eq = lhs.size() == rhs.size() &&
|
||||
equal(lhs.begin(), lhs.end(), rhs.begin(),
|
||||
[](auto &a, auto &b) { return a.first == b.first &&
|
||||
a.second == b.second; });
|
||||
|
||||
if (eq)
|
||||
return true;
|
||||
|
||||
cerr << "lhs:" << endl;
|
||||
for (const auto &pair : lhs)
|
||||
cerr << "- " << pair.first << ": "
|
||||
<< pair.second << endl;
|
||||
|
||||
cerr << "rhs:" << endl;
|
||||
for (const auto &pair : rhs)
|
||||
cerr << "- " << pair.first << ": "
|
||||
<< pair.second << endl;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool equals(const vector<string> &lhs, const vector<string> &rhs)
|
||||
{
|
||||
bool eq = lhs.size() == rhs.size();
|
||||
|
||||
if (!eq) {
|
||||
cerr << "sizes not equal" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < lhs.size(); i++)
|
||||
if (lhs[i] != rhs[i])
|
||||
eq = false;
|
||||
|
||||
if (eq)
|
||||
return true;
|
||||
|
||||
cerr << "lhs:" << endl;
|
||||
for (const auto &str : lhs)
|
||||
cerr << "- " << str << endl;
|
||||
|
||||
cerr << "rhs:" << endl;
|
||||
for (const auto &str : rhs)
|
||||
cerr << "- " << str << endl;
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_REGISTER(IPAGeneratedSerializerTest)
|
|
@ -0,0 +1,40 @@
|
|||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
# test.mojom-module
|
||||
mojom = custom_target('test_mojom_module',
|
||||
input : 'test.mojom',
|
||||
output : 'test.mojom-module',
|
||||
command : [
|
||||
mojom_parser,
|
||||
'--output-root', meson.build_root(),
|
||||
'--input-root', meson.source_root(),
|
||||
'--mojoms', '@INPUT@'
|
||||
])
|
||||
|
||||
# test_ipa_interface.h
|
||||
generated_test_header = custom_target('test_ipa_interface_h',
|
||||
input : mojom,
|
||||
output : 'test_ipa_interface.h',
|
||||
depends : mojom_templates,
|
||||
command : [
|
||||
mojom_generator, 'generate',
|
||||
'-g', 'libcamera',
|
||||
'--bytecode_path', mojom_templates_dir,
|
||||
'--libcamera_generate_header',
|
||||
'--libcamera_output_path=@OUTPUT@',
|
||||
'./' +'@INPUT@'
|
||||
])
|
||||
|
||||
# test_ipa_serializer.h
|
||||
generated_test_serializer = custom_target('test_ipa_serializer_h',
|
||||
input : mojom,
|
||||
output : 'test_ipa_serializer.h',
|
||||
depends : mojom_templates,
|
||||
command : [
|
||||
mojom_generator, 'generate',
|
||||
'-g', 'libcamera',
|
||||
'--bytecode_path', mojom_templates_dir,
|
||||
'--libcamera_generate_serializer',
|
||||
'--libcamera_output_path=@OUTPUT@',
|
||||
'./' +'@INPUT@'
|
||||
])
|
|
@ -0,0 +1,33 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
module ipa.test;
|
||||
|
||||
enum IPAOperationCode {
|
||||
IPAOperationNone,
|
||||
IPAOperationInit,
|
||||
IPAOperationStart,
|
||||
IPAOperationStop,
|
||||
};
|
||||
|
||||
struct IPASettings {};
|
||||
|
||||
struct TestStruct {
|
||||
map<string, string> m;
|
||||
array<string> a;
|
||||
string s1;
|
||||
string s2;
|
||||
int32 i;
|
||||
string s3;
|
||||
};
|
||||
|
||||
interface IPATestInterface {
|
||||
init(IPASettings settings) => (int32 ret);
|
||||
start() => (int32 ret);
|
||||
stop();
|
||||
|
||||
test(TestStruct s);
|
||||
};
|
||||
|
||||
interface IPATestEventInterface {
|
||||
dummyEvent(uint32 val);
|
||||
};
|
19
test/serialization/generated_serializer/meson.build
Normal file
19
test/serialization/generated_serializer/meson.build
Normal file
|
@ -0,0 +1,19 @@
|
|||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
subdir('include/libcamera/ipa')
|
||||
|
||||
exe = executable('generated_serializer_test',
|
||||
[
|
||||
'generated_serializer_test.cpp',
|
||||
generated_test_header,
|
||||
generated_test_serializer,
|
||||
],
|
||||
dependencies : libcamera_dep,
|
||||
link_with : test_libraries,
|
||||
include_directories : [
|
||||
test_includes_internal,
|
||||
'./include',
|
||||
])
|
||||
|
||||
test('generated_serializer_test', exe,
|
||||
suite : 'generated_serializer', is_parallel : false)
|
|
@ -1,5 +1,7 @@
|
|||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
subdir('generated_serializer')
|
||||
|
||||
serialization_tests = [
|
||||
['control_serialization', 'control_serialization.cpp'],
|
||||
['ipa_data_serializer_test', 'ipa_data_serializer_test.cpp'],
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue