From 775b36ee66f8fe646868cb07e424882b25c41737 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Thu, 14 Jan 2021 17:11:19 +0100 Subject: [PATCH] Verify we can load native modules and add job that verifies on aarch64 as well (#10933) Motivation: As shown in the past we need to verify we actually can load the native as otherwise we may introduce regressions. Modifications: - Add new maven module which tests loading of native modules - Add job that will also test loading on aarch64 Result: Less likely to introduce regressions related to loading native code in the future --- .github/workflows/ci-pr.yml | 51 +++++- pom.xml | 1 + testsuite-native/pom.xml | 166 ++++++++++++++++++ .../testsuite_native/NativeLoadingTest.java | 44 +++++ 4 files changed, 258 insertions(+), 4 deletions(-) create mode 100644 testsuite-native/pom.xml create mode 100644 testsuite-native/src/test/java/io/netty/testsuite_native/NativeLoadingTest.java diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index 54108c0a1a..ebaf677dc9 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -8,7 +8,7 @@ on: workflow_dispatch: jobs: - verify: + verify-pr: runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v2 @@ -16,7 +16,7 @@ jobs: uses: actions/setup-java@v1 with: java-version: 8 - # Cache .m2/repository + # Cache .m2/repository - uses: actions/cache@v2 env: cache-name: verify-cache-m2-repository @@ -26,10 +26,53 @@ jobs: restore-keys: | ${{ runner.os }}-pr-${{ env.cache-name }}- ${{ runner.os }}-pr- - - name: Verify with Maven run: mvn verify -B --file pom.xml -DskipTests=true + build-pr-aarch64: + name: linux-aarch64-verify-native + # The host should always be Linux + runs-on: ubuntu-20.04 + needs: verify-pr + steps: + - uses: actions/checkout@v2 + + # Cache .m2/repository + - uses: actions/cache@v2 + env: + cache-name: build-pr-aarch64-cache-m2-repository + with: + path: ~/.m2/repository + key: ${{ runner.os }}-pr-${{ env.cache-name }}-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-pr-${{ env.cache-name }}- + ${{ runner.os }}-pr- + + - uses: uraimo/run-on-arch-action@v2.0.5 + name: Run commands + id: runcmd + with: + arch: aarch64 + distro: ubuntu20.04 + + # Not required, but speeds up builds by storing container images in + # a GitHub package registry. + githubToken: ${{ github.token }} + + # Mount the .m2/repository + dockerRunArgs: | + --volume "/home/runner/.m2/repository/:/root/.m2/repository" + + # Install dependencies + install: | + apt-get update -q -y + apt-get install -q -y openjdk-11-jdk autoconf automake libtool make tar maven git + + # Compile native code and the modules it depend on and run NativeLoadingTest. This is enough to ensure + # we can load the native module on aarch64 + run: | + JAVA_HOME=/usr/lib/jvm/java-11-openjdk-arm64 mvn -pl testsuite-native -am clean package -DskipTests=true -Dcheckstyle.skip=true -DskipNativeTestsuite=false + build-pr: runs-on: ubuntu-latest strategy: @@ -49,7 +92,7 @@ jobs: docker-compose-run: "-f docker/docker-compose.yaml -f docker/docker-compose.centos-6.111.yaml run build-leak-boringssl-static" name: ${{ matrix.setup }} - needs: verify + needs: verify-pr steps: - uses: actions/checkout@v2 diff --git a/pom.xml b/pom.xml index 98c03f05af..17cc6ae0c7 100644 --- a/pom.xml +++ b/pom.xml @@ -442,6 +442,7 @@ testsuite-http2 testsuite-osgi testsuite-shading + testsuite-native testsuite-native-image testsuite-native-image-client testsuite-native-image-client-runtime-init diff --git a/testsuite-native/pom.xml b/testsuite-native/pom.xml new file mode 100644 index 0000000000..5b69ecfb25 --- /dev/null +++ b/testsuite-native/pom.xml @@ -0,0 +1,166 @@ + + + + + 4.0.0 + + io.netty + netty-parent + 4.1.59.Final-SNAPSHOT + + + netty-testsuite-native + jar + + Netty/Testsuite/Native + + + true + false + + + + + org.junit.jupiter + junit-jupiter-api + + + org.junit.jupiter + junit-jupiter-engine + + + org.junit.vintage + junit-vintage-engine + + + junit + junit + + + + + skipTests + + + skipTests + + + + true + + + + + default + + true + + + + ${project.groupId} + netty-transport-native-epoll + ${project.version} + compile + + + ${project.groupId} + netty-transport-native-kqueue + ${project.version} + compile + + + ${project.groupId} + netty-resolver-dns-native-macos + ${project.version} + compile + + + + + + linux + + + linux + + + + + ${project.groupId} + netty-transport-native-epoll + ${project.version} + ${jni.classifier} + compile + + + ${project.groupId} + netty-transport-native-kqueue + ${project.version} + compile + + + ${project.groupId} + netty-resolver-dns-native-macos + ${project.version} + compile + + + + + + mac + + + mac + + + + + ${project.groupId} + netty-transport-native-kqueue + ${project.version} + ${jni.classifier} + compile + + + ${project.groupId} + netty-resolver-dns-native-macos + ${project.version} + ${jni.classifier} + compile + + + ${project.groupId} + netty-transport-native-epoll + ${project.version} + compile + + + + + + + + + maven-surefire-plugin + + ${skipNativeTestsuite} + + + + + diff --git a/testsuite-native/src/test/java/io/netty/testsuite_native/NativeLoadingTest.java b/testsuite-native/src/test/java/io/netty/testsuite_native/NativeLoadingTest.java new file mode 100644 index 0000000000..ae279c6eab --- /dev/null +++ b/testsuite-native/src/test/java/io/netty/testsuite_native/NativeLoadingTest.java @@ -0,0 +1,44 @@ +/* + * Copyright 2020 The Netty Project + * + * The Netty Project licenses this file to you under the Apache License, + * version 2.0 (the "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at: + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package io.netty.testsuite_native; + +import io.netty.channel.epoll.Epoll; +import io.netty.channel.kqueue.KQueue; +import io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; + +public class NativeLoadingTest { + + @Test + @EnabledOnOs(OS.MAC) + public void testNativeLoadingKqueue() { + KQueue.ensureAvailability(); + } + + @Test + @EnabledOnOs(OS.MAC) + public void testNativeLoadingDnsServerAddressStreamProvider() { + MacOSDnsServerAddressStreamProvider.ensureAvailability(); + } + + @Test + @EnabledOnOs(OS.LINUX) + public void testNativeLoadingEpoll() { + Epoll.ensureAvailability(); + } +}