Add native tests for Android binding code.

Bug: None
Change-Id: I83c589205dfbe91686a8cc6512dd03d00936598d
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/207555
Reviewed-by: Alex Benton <bentonian@google.com>
Commit-Queue: Alex Benton <bentonian@google.com>
diff --git a/tools/android/webgpu/build.gradle b/tools/android/webgpu/build.gradle
index 8d6ea0a..4c11d52 100644
--- a/tools/android/webgpu/build.gradle
+++ b/tools/android/webgpu/build.gradle
@@ -29,6 +29,7 @@
     id 'com.android.library'
     id 'maven-publish'
     id 'org.jetbrains.kotlin.android'
+    id 'com.android.application' apply false
 }
 
 android {
@@ -41,25 +42,26 @@
             cmake {
                 arguments '-DANDROID_STL=c++_shared'
                 version '3.22.1'
-                targets 'webgpu_c_bundled'
+                targets 'webgpu_c_bundled', 'webgpu_wrapper_tests'
             }
         }
     }
-
     externalNativeBuild {
         cmake {
             path file('src/main/cpp/CMakeLists.txt')
         }
     }
-
     buildFeatures {
+        prefab true
         prefabPublishing true
     }
-
     prefab {
         webgpu_c_bundled {
             headers "src/main/cpp/gen/include"
         }
+        webgpu_wrapper_tests {
+            name "webgpu_wrapper_tests"
+        }
     }
     kotlinOptions {
         jvmTarget = '17'
@@ -75,11 +77,19 @@
             java.srcDirs += "$project.projectDir/../../../out/Debug/gen/java"
         }
     }
+    packagingOptions {
+        pickFirst 'lib/x86/libc++_shared.so'
+        pickFirst 'lib/x86_64/libc++_shared.so'
+        pickFirst 'lib/armeabi-v7a/libc++_shared.so'
+        pickFirst 'lib/arm64-v8a/libc++_shared.so'
+    }
     ndkVersion '27.0.12077973'
 }
 
 dependencies {
     implementation 'androidx.core:core-ktx:1.13.1'
+    implementation 'androidx.test.ext:junit-gtest:1.0.0-alpha01'
+    implementation 'com.android.ndk.thirdparty:googletest:1.11.0-beta-1'
 
     testImplementation 'junit:junit:4.13.2'
     testImplementation 'org.reflections:reflections:0.10.2'
diff --git a/tools/android/webgpu/src/androidTest/cpp/webgpu_wrapper_tests.cpp b/tools/android/webgpu/src/androidTest/cpp/webgpu_wrapper_tests.cpp
new file mode 100644
index 0000000..fb70c69
--- /dev/null
+++ b/tools/android/webgpu/src/androidTest/cpp/webgpu_wrapper_tests.cpp
@@ -0,0 +1,45 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <functional>
+#include <optional>
+#include <ostream>
+#include <queue>
+#include <thread>
+#include <vector>
+
+#include "gtest/gtest.h"
+
+/**
+ * The test suite class for the WebGPU wrapper native code.
+ *
+ * The unit tests are implemented using the GTest framework
+ * and called via Android Instrumented Test mechanism from gradle.
+ */
+class WebGPUWrapperTestSuite : public ::testing::Test {
+  protected:
+};
diff --git a/tools/android/webgpu/src/androidTest/java/android/dawn/NativeTests.kt b/tools/android/webgpu/src/androidTest/java/android/dawn/NativeTests.kt
new file mode 100644
index 0000000..0468d0b
--- /dev/null
+++ b/tools/android/webgpu/src/androidTest/java/android/dawn/NativeTests.kt
@@ -0,0 +1,13 @@
+package android.dawn
+
+import androidx.test.ext.junitgtest.GtestRunner;
+import androidx.test.ext.junitgtest.TargetLibrary;
+import org.junit.runner.RunWith;
+
+/**
+ * Runs the native tests. No implmentation is needed in Kotlin.
+ * The tests are defined in the 'webgpu_wrapper_tests' native library.
+ */
+@RunWith(GtestRunner.class)
+@TargetLibrary(libraryName = "webgpu_wrapper_tests")
+public class NativeTests
\ No newline at end of file
diff --git a/tools/android/webgpu/src/main/cpp/CMakeLists.txt b/tools/android/webgpu/src/main/cpp/CMakeLists.txt
index 8c875e4..56a239c 100644
--- a/tools/android/webgpu/src/main/cpp/CMakeLists.txt
+++ b/tools/android/webgpu/src/main/cpp/CMakeLists.txt
@@ -66,3 +66,21 @@
                    COMMAND ${CMAKE_COMMAND} -E copy
                            ${CMAKE_CURRENT_BINARY_DIR}/dawn/gen/include/dawn/webgpu.h
                            ${CMAKE_SOURCE_DIR}/gen/include/dawn/webgpu.h)
+
+# Add unit test build configuration
+# To run use the following command:
+# ./gradlew -i connectedAndroidTest
+find_package(googletest REQUIRED CONFIG)
+find_package(junit-gtest REQUIRED CONFIG)
+add_library(webgpu_wrapper_tests SHARED ./../../androidTest/cpp/webgpu_wrapper_tests.cpp)
+target_include_directories(webgpu_wrapper_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
+target_link_libraries(webgpu_wrapper_tests
+  PRIVATE
+    webgpu_c_bundled
+    android
+    atomic
+    log
+    googletest::gtest
+    googletest::gmock
+    junit-gtest::junit-gtest
+)