From 3c3372c848392dea3795e0b74894b4ac16484498 Mon Sep 17 00:00:00 2001 From: Fredy Wijaya Date: Mon, 13 Nov 2023 19:22:25 +0000 Subject: [PATCH] mobile: Add initial unit tests for jni_utility.(h|cc) (#30849) This PR sets up an initial infrastructure for writing unit tests for `jni_utility.(h|cc)`. Signed-off-by: Fredy Wijaya --- mobile/library/common/jni/jni_utility.cc | 13 ++++++-- mobile/library/common/jni/jni_utility.h | 4 +++ mobile/test/common/jni/BUILD | 20 ++++++++++++ mobile/test/common/jni/jni_utility_test.cc | 17 ++++++++++ .../java/io/envoyproxy/envoymobile/jni/BUILD | 14 +++++++++ .../envoymobile/jni/JniUtilityTest.java | 31 +++++++++++++++++++ 6 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 mobile/test/common/jni/jni_utility_test.cc create mode 100644 mobile/test/java/io/envoyproxy/envoymobile/jni/JniUtilityTest.java diff --git a/mobile/library/common/jni/jni_utility.cc b/mobile/library/common/jni/jni_utility.cc index 0373cfa555bc..3105aa0d5be2 100644 --- a/mobile/library/common/jni/jni_utility.cc +++ b/mobile/library/common/jni/jni_utility.cc @@ -1,7 +1,7 @@ #include "library/common/jni/jni_utility.h" -#include -#include +#include +#include #include "source/common/common/assert.h" @@ -355,6 +355,15 @@ void javaByteArrayToProto(JniHelper& jni_helper, jbyteArray source, RELEASE_ASSERT(success, "Failed to parse protobuf message."); } +LocalRefUniquePtr protoToJavaByteArray(JniHelper& jni_helper, + const Envoy::Protobuf::MessageLite& source) { + size_t size = source.ByteSizeLong(); + LocalRefUniquePtr byte_array = jni_helper.newByteArray(size); + auto bytes = jni_helper.getByteArrayElements(byte_array.get(), nullptr); + source.SerializeToArray(bytes.get(), size); + return byte_array; +} + std::string javaStringToString(JniHelper& jni_helper, jstring java_string) { if (!java_string) { return ""; diff --git a/mobile/library/common/jni/jni_utility.h b/mobile/library/common/jni/jni_utility.h index 2939d1f91a1f..e7db6f4289a1 100644 --- a/mobile/library/common/jni/jni_utility.h +++ b/mobile/library/common/jni/jni_utility.h @@ -124,6 +124,10 @@ void javaByteArrayToString(JniHelper& jni_helper, jbyteArray jbytes, std::string void javaByteArrayToProto(JniHelper& jni_helper, jbyteArray source, Envoy::Protobuf::MessageLite* dest); +/** Converts from Proto to Java byte array. */ +LocalRefUniquePtr protoToJavaByteArray(JniHelper& jni_helper, + const Envoy::Protobuf::MessageLite& source); + /** Converts from Java `String` to C++ string. */ std::string javaStringToString(JniHelper& jni_helper, jstring java_string); diff --git a/mobile/test/common/jni/BUILD b/mobile/test/common/jni/BUILD index 52ccb1e2a29c..d2148673c33d 100644 --- a/mobile/test/common/jni/BUILD +++ b/mobile/test/common/jni/BUILD @@ -103,3 +103,23 @@ cc_binary( ":jni_helper_test_lib", ], ) + +cc_library( + name = "jni_utility_test_lib", + srcs = [ + "jni_utility_test.cc", + ], + deps = [ + "//library/common/jni:jni_utility_lib", + ], + alwayslink = True, +) + +cc_binary( + name = "libenvoy_jni_utility_test.so", + testonly = True, + linkshared = True, + deps = [ + ":jni_utility_test_lib", + ], +) diff --git a/mobile/test/common/jni/jni_utility_test.cc b/mobile/test/common/jni/jni_utility_test.cc new file mode 100644 index 000000000000..e81dc108727b --- /dev/null +++ b/mobile/test/common/jni/jni_utility_test.cc @@ -0,0 +1,17 @@ +#include + +#include "library/common/jni/jni_utility.h" + +// NOLINT(namespace-envoy) + +// This file contains JNI implementation used by +// `test/java/io/envoyproxy/envoymobile/jni/JniUtilityTest.java` unit tests. + +extern "C" JNIEXPORT jbyteArray JNICALL +Java_io_envoyproxy_envoymobile_jni_JniUtilityTest_protoJavaByteArrayConversion(JNIEnv* env, jclass, + jbyteArray source) { + Envoy::JNI::JniHelper jni_helper(env); + Envoy::ProtobufWkt::Struct s; + Envoy::JNI::javaByteArrayToProto(jni_helper, source, &s); + return Envoy::JNI::protoToJavaByteArray(jni_helper, s).release(); +} diff --git a/mobile/test/java/io/envoyproxy/envoymobile/jni/BUILD b/mobile/test/java/io/envoyproxy/envoymobile/jni/BUILD index b82998b551f8..b6044841af2a 100644 --- a/mobile/test/java/io/envoyproxy/envoymobile/jni/BUILD +++ b/mobile/test/java/io/envoyproxy/envoymobile/jni/BUILD @@ -10,3 +10,17 @@ envoy_mobile_android_test( ], native_lib_name = "envoy_jni_helper_test", ) + +envoy_mobile_android_test( + name = "jni_utility_test", + srcs = [ + "JniUtilityTest.java", + ], + native_deps = [ + "//test/common/jni:libenvoy_jni_utility_test.so", + ], + native_lib_name = "envoy_jni_utility_test", + deps = [ + "@maven//:com_google_protobuf_protobuf_javalite", + ], +) diff --git a/mobile/test/java/io/envoyproxy/envoymobile/jni/JniUtilityTest.java b/mobile/test/java/io/envoyproxy/envoymobile/jni/JniUtilityTest.java new file mode 100644 index 000000000000..9deb8164422b --- /dev/null +++ b/mobile/test/java/io/envoyproxy/envoymobile/jni/JniUtilityTest.java @@ -0,0 +1,31 @@ +package io.envoyproxy.envoymobile.jni; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.google.protobuf.Struct; +import com.google.protobuf.Value; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +@RunWith(RobolectricTestRunner.class) +public class JniUtilityTest { + public JniUtilityTest() { System.loadLibrary("envoy_jni_utility_test"); } + + //================================================================================ + // Native methods for testing. + //================================================================================ + public static native byte[] protoJavaByteArrayConversion(byte[] source); + + @Test + public void testProtoJavaByteArrayConversion() throws Exception { + Struct source = + Struct.newBuilder() + .putFields("string_key", Value.newBuilder().setStringValue("string_value").build()) + .putFields("num_key", Value.newBuilder().setNumberValue(123).build()) + .putFields("bool_key", Value.newBuilder().setBoolValue(true).build()) + .build(); + Struct dest = Struct.parseFrom(protoJavaByteArrayConversion(source.toByteArray())); + assertThat(source).isEqualTo(dest); + } +}