[libcamera-devel] [PATCH v5 23/23] tests: Test IPA serializer generation
Paul Elder
paul.elder at ideasonboard.com
Sat Dec 5 11:31:06 CET 2020
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 at ideasonboard.com>
---
Changes in v5:
- add dummy event to event interface
New in v4
---
.../generated_serializer_test.cpp | 128 ++++++++++++++++++
.../generated_serializer/meson.build | 49 +++++++
.../generated_serializer/vimc.mojom | 24 ++++
test/serialization/meson.build | 2 +
4 files changed, 203 insertions(+)
create mode 100644 test/serialization/generated_serializer/generated_serializer_test.cpp
create mode 100644 test/serialization/generated_serializer/meson.build
create mode 100644 test/serialization/generated_serializer/vimc.mojom
diff --git a/test/serialization/generated_serializer/generated_serializer_test.cpp b/test/serialization/generated_serializer/generated_serializer_test.cpp
new file mode 100644
index 00000000..57c61b02
--- /dev/null
+++ b/test/serialization/generated_serializer/generated_serializer_test.cpp
@@ -0,0 +1,128 @@
+/* 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 "vimc_test_ipa_interface.h"
+#include "vimc_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; \
+}
+
+ 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;
+
+ vector<uint8_t> serialized;
+
+ tie(serialized, ignore) =
+ IPADataSerializer<TestStruct>::serialize(t);
+
+ u = IPADataSerializer<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_);
+
+ 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)
diff --git a/test/serialization/generated_serializer/meson.build b/test/serialization/generated_serializer/meson.build
new file mode 100644
index 00000000..68bcf23d
--- /dev/null
+++ b/test/serialization/generated_serializer/meson.build
@@ -0,0 +1,49 @@
+# SPDX-License-Identifier: CC0-1.0
+
+# vimc.mojom-module
+mojom = custom_target('vimc_test_mojom_module',
+ input : 'vimc.mojom',
+ output : 'vimc.mojom-module',
+ command : [
+ mojom_parser,
+ '--output-root', meson.build_root(),
+ '--input-root', meson.source_root(),
+ '--mojoms', '@INPUT@'
+ ])
+
+# vimc_test_ipa_interface.h
+header = custom_target('vimc_test_ipa_interface_h',
+ input : mojom,
+ output : 'vimc_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@'
+ ])
+
+# vimc_test_ipa_serializer.h
+serializer = custom_target('vimc_test_ipa_serializer_h',
+ input : mojom,
+ output : 'vimc_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@'
+ ])
+
+exe = executable('generated_serializer_test',
+ ['generated_serializer_test.cpp', header, serializer],
+ dependencies : libcamera_dep,
+ link_with : test_libraries,
+ include_directories : test_includes_internal)
+
+test('generated_serializer_test', exe,
+ suite : 'generated_serializer', is_parallel : false)
diff --git a/test/serialization/generated_serializer/vimc.mojom b/test/serialization/generated_serializer/vimc.mojom
new file mode 100644
index 00000000..c6f29d61
--- /dev/null
+++ b/test/serialization/generated_serializer/vimc.mojom
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+struct IPASettings {};
+
+struct TestStruct {
+ map<string, string> m;
+ array<string> a;
+ string s1;
+ string s2;
+ int32 i;
+ string s3;
+};
+
+interface IPAVimcInterface {
+ init(IPASettings settings) => (int32 ret);
+ start() => (int32 ret);
+ stop();
+
+ test(TestStruct s);
+};
+
+interface IPAVimcEventInterface {
+ dummyEvent(uint32 val);
+};
diff --git a/test/serialization/meson.build b/test/serialization/meson.build
index c140a31c..57726b12 100644
--- a/test/serialization/meson.build
+++ b/test/serialization/meson.build
@@ -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' ],
--
2.27.0
More information about the libcamera-devel
mailing list