From f4ad548c08304503061e3a60d501a541f0d30b0a Mon Sep 17 00:00:00 2001 From: Esteban Zimanyi Date: Sun, 31 May 2026 10:35:45 +0200 Subject: [PATCH] build(meos): select the extended temporal-type families via MobilityDB/MEOS build flags + per-family smoke tests The extended families are selected at build time with the same uppercase flag names and ON|OFF (also 1|0) values as the MobilityDB/MEOS CMake build: NPOINT is included by default; CBUFFER, POSE, RGEO, and H3 are included with -D=ON (or =1) and dropped otherwise (RGEO needs POSE). Each family's MeosOps* facade sources and its per-family smoke test (MeosCbufferSmokeTest, MeosNpointSmokeTest, MeosPoseSmokeTest) are excluded when the family is off; the core and geo smoke checks remain in MeosFacadeSmokeTest. --- kafka-streams-app/pom.xml | 313 ++++++++++++++++++ .../kafka/meos/MeosCbufferSmokeTest.java | 40 +++ .../kafka/meos/MeosFacadeSmokeTest.java | 66 ++++ .../kafka/meos/MeosNpointSmokeTest.java | 39 +++ .../kafka/meos/MeosPoseSmokeTest.java | 40 +++ 5 files changed, 498 insertions(+) create mode 100644 kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosCbufferSmokeTest.java create mode 100644 kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosFacadeSmokeTest.java create mode 100644 kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosNpointSmokeTest.java create mode 100644 kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosPoseSmokeTest.java diff --git a/kafka-streams-app/pom.xml b/kafka-streams-app/pom.xml index e80d6d3..d3bdd40 100644 --- a/kafka-streams-app/pom.xml +++ b/kafka-streams-app/pom.xml @@ -116,4 +116,317 @@ + + + + cbuffer-exclude-unset + + !CBUFFER + + + + + maven-compiler-plugin + + + **/meos/MeosOpsTCbuffer.java + **/meos/MeosOpsFreeCbuffer.java + **/meos/MeosOpsCbufferSet.java + + + **/MeosCbufferSmokeTest.java + + + + + + + + cbuffer-exclude-off + + CBUFFEROFF + + + + + maven-compiler-plugin + + + **/meos/MeosOpsTCbuffer.java + **/meos/MeosOpsFreeCbuffer.java + **/meos/MeosOpsCbufferSet.java + + + **/MeosCbufferSmokeTest.java + + + + + + + + cbuffer-exclude-zero + + CBUFFER0 + + + + + maven-compiler-plugin + + + **/meos/MeosOpsTCbuffer.java + **/meos/MeosOpsFreeCbuffer.java + **/meos/MeosOpsCbufferSet.java + + + **/MeosCbufferSmokeTest.java + + + + + + + + pose-exclude-unset + + !POSE + + + + + maven-compiler-plugin + + + **/meos/MeosOpsTPose.java + **/meos/MeosOpsFreePose.java + **/meos/MeosOpsPoseSet.java + + + **/MeosPoseSmokeTest.java + + + + + + + + pose-exclude-off + + POSEOFF + + + + + maven-compiler-plugin + + + **/meos/MeosOpsTPose.java + **/meos/MeosOpsFreePose.java + **/meos/MeosOpsPoseSet.java + + + **/MeosPoseSmokeTest.java + + + + + + + + pose-exclude-zero + + POSE0 + + + + + maven-compiler-plugin + + + **/meos/MeosOpsTPose.java + **/meos/MeosOpsFreePose.java + **/meos/MeosOpsPoseSet.java + + + **/MeosPoseSmokeTest.java + + + + + + + + rgeo-exclude-unset + + !RGEO + + + + + maven-compiler-plugin + + + **/meos/MeosOpsTRGeometry.java + **/meos/MeosOpsTRGeometryInst.java + **/meos/MeosOpsFreeRgeo.java + + + + + + + + rgeo-exclude-off + + RGEOOFF + + + + + maven-compiler-plugin + + + **/meos/MeosOpsTRGeometry.java + **/meos/MeosOpsTRGeometryInst.java + **/meos/MeosOpsFreeRgeo.java + + + + + + + + rgeo-exclude-zero + + RGEO0 + + + + + maven-compiler-plugin + + + **/meos/MeosOpsTRGeometry.java + **/meos/MeosOpsTRGeometryInst.java + **/meos/MeosOpsFreeRgeo.java + + + + + + + + h3-exclude-unset + + !H3 + + + + + maven-compiler-plugin + + + **/meos/MeosOpsTh3index.java + **/meos/MeosOpsFreeH3.java + + + + + + + + h3-exclude-off + + H3OFF + + + + + maven-compiler-plugin + + + **/meos/MeosOpsTh3index.java + **/meos/MeosOpsFreeH3.java + + + + + + + + h3-exclude-zero + + H30 + + + + + maven-compiler-plugin + + + **/meos/MeosOpsTh3index.java + **/meos/MeosOpsFreeH3.java + + + + + + + + npoint-exclude-off + + NPOINTOFF + + + + + maven-compiler-plugin + + + **/meos/MeosOpsTNpoint.java + **/meos/MeosOpsTNpointInst.java + **/meos/MeosOpsFreeNpoint.java + **/meos/MeosOpsNpointSet.java + + + **/MeosNpointSmokeTest.java + + + + + + + + npoint-exclude-zero + + NPOINT0 + + + + + maven-compiler-plugin + + + **/meos/MeosOpsTNpoint.java + **/meos/MeosOpsTNpointInst.java + **/meos/MeosOpsFreeNpoint.java + **/meos/MeosOpsNpointSet.java + + + **/MeosNpointSmokeTest.java + + + + + + + diff --git a/kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosCbufferSmokeTest.java b/kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosCbufferSmokeTest.java new file mode 100644 index 0000000..90b5e99 --- /dev/null +++ b/kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosCbufferSmokeTest.java @@ -0,0 +1,40 @@ +package org.mobilitydb.kafka.meos; + +import functions.GeneratedFunctions; +import jnr.ffi.Pointer; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * Runtime check that the cbuffer facade family calls into libmeos and returns + * correct results. Compiled and run only when the build includes the cbuffer + * family ({@code -DCBUFFER=ON}); the family requires a libmeos built with + * {@code -DCBUFFER=ON}. + */ +@EnabledIfSystemProperty(named = "mobilitykafka.meos.enabled", matches = "true") +class MeosCbufferSmokeTest { + + @BeforeAll + static void init() { + GeneratedFunctions.meos_initialize_error_handler((level, code, message) -> { }); + GeneratedFunctions.meos_initialize(); + } + + @AfterAll + static void finalizeMeos() { + GeneratedFunctions.meos_finalize(); + } + + @Test + void cbuffer() { + Pointer cb = MeosOpsFreeCbuffer.cbuffer_make(MeosOpsFreeGeo.geom_in("POINT(1 1)", 0), 0.5); + assertNotNull(cb); + assertEquals(0.5, MeosOpsFreeCbuffer.cbuffer_radius(cb), 1e-9); + assertNotNull(MeosOpsFreeCbuffer.cbuffer_out(cb, 6)); + } +} diff --git a/kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosFacadeSmokeTest.java b/kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosFacadeSmokeTest.java new file mode 100644 index 0000000..c6b0aab --- /dev/null +++ b/kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosFacadeSmokeTest.java @@ -0,0 +1,66 @@ +package org.mobilitydb.kafka.meos; + +import functions.GeneratedFunctions; +import jnr.ffi.Pointer; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Runtime check that the always-built MEOS facade families (core and geo) call + * into libmeos and return correct results. Each constructs a value through a + * {@code MeosOps*} facade method and reads it back. Runs only with + * {@code -Dmobilitykafka.meos.enabled=true} and a libmeos on the load path. The + * optional families have their own gated smoke tests + * ({@link MeosCbufferSmokeTest}, {@link MeosNpointSmokeTest}, + * {@link MeosPoseSmokeTest}), each compiled only when its build flag includes + * the family. + */ +@EnabledIfSystemProperty(named = "mobilitykafka.meos.enabled", matches = "true") +class MeosFacadeSmokeTest { + + @BeforeAll + static void init() { + // No-op error handler so a parse error returns rather than terminating the JVM. + GeneratedFunctions.meos_initialize_error_handler((level, code, message) -> { }); + GeneratedFunctions.meos_initialize(); + } + + @AfterAll + static void finalizeMeos() { + GeneratedFunctions.meos_finalize(); + } + + @Test + void coreTbox() { + Pointer tbox = MeosOpsTBox.tbox_in("TBOX X([1, 2])"); + assertNotNull(tbox); + assertTrue(MeosOpsTBox.tbox_out(tbox, 6).contains("TBOX")); + } + + @Test + void coreIntspan() { + Pointer span = MeosOpsIntSpan.intspan_in("[1, 5)"); + assertNotNull(span); + String out = MeosOpsIntSpan.intspan_out(span); + assertTrue(out.contains("1") && out.contains("5")); + } + + @Test + void geoStbox() { + Pointer stbox = MeosOpsSTBox.stbox_in("STBOX X((1,1),(2,2))"); + assertNotNull(stbox); + assertTrue(MeosOpsSTBox.stbox_out(stbox, 6).contains("STBOX")); + } + + @Test + void geoGeometry() { + Pointer geom = MeosOpsFreeGeo.geom_in("POINT(1 1)", 0); + assertNotNull(geom); + assertTrue(MeosOpsFreeGeo.geo_as_text(geom, 6).toUpperCase().contains("POINT")); + } +} diff --git a/kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosNpointSmokeTest.java b/kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosNpointSmokeTest.java new file mode 100644 index 0000000..d8351ac --- /dev/null +++ b/kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosNpointSmokeTest.java @@ -0,0 +1,39 @@ +package org.mobilitydb.kafka.meos; + +import functions.GeneratedFunctions; +import jnr.ffi.Pointer; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * Runtime check that the npoint facade family calls into libmeos and returns + * correct results. Compiled and run when the build includes the npoint family + * (the default; dropped with {@code -DNPOINT=OFF}). + */ +@EnabledIfSystemProperty(named = "mobilitykafka.meos.enabled", matches = "true") +class MeosNpointSmokeTest { + + @BeforeAll + static void init() { + GeneratedFunctions.meos_initialize_error_handler((level, code, message) -> { }); + GeneratedFunctions.meos_initialize(); + } + + @AfterAll + static void finalizeMeos() { + GeneratedFunctions.meos_finalize(); + } + + @Test + void npoint() { + Pointer np = MeosOpsFreeNpoint.npoint_make(1, 0.5); + assertNotNull(np); + assertEquals(1, MeosOpsFreeNpoint.npoint_route(np)); + assertEquals(0.5, MeosOpsFreeNpoint.npoint_position(np), 1e-9); + } +} diff --git a/kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosPoseSmokeTest.java b/kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosPoseSmokeTest.java new file mode 100644 index 0000000..379c72d --- /dev/null +++ b/kafka-streams-app/src/test/java/org/mobilitydb/kafka/meos/MeosPoseSmokeTest.java @@ -0,0 +1,40 @@ +package org.mobilitydb.kafka.meos; + +import functions.GeneratedFunctions; +import jnr.ffi.Pointer; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * Runtime check that the pose facade family calls into libmeos and returns + * correct results. Compiled and run only when the build includes the pose + * family ({@code -DPOSE=ON}); the family requires a libmeos built with + * {@code -DPOSE=ON}. + */ +@EnabledIfSystemProperty(named = "mobilitykafka.meos.enabled", matches = "true") +class MeosPoseSmokeTest { + + @BeforeAll + static void init() { + GeneratedFunctions.meos_initialize_error_handler((level, code, message) -> { }); + GeneratedFunctions.meos_initialize(); + } + + @AfterAll + static void finalizeMeos() { + GeneratedFunctions.meos_finalize(); + } + + @Test + void pose() { + Pointer pose = MeosOpsFreePose.pose_in("Pose(Point(1 1), 0.5)"); + assertNotNull(pose); + assertNotNull(MeosOpsFreePose.pose_out(pose, 6)); + assertEquals(0.5, MeosOpsFreePose.pose_rotation(pose), 1e-9); + } +}