diff options
author | Robert <rw@users.noreply.github.com> | 2018-11-29 22:03:06 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-29 22:03:06 -0800 |
commit | 79cd55bd3a8ada49ff35a0b00df12bff30d6f318 (patch) | |
tree | 270002083c4a572a9a368da37ab47e2a62fee82f | |
parent | b378b8eb69810cd82a353c09eabdb98e6842fcae (diff) | |
download | flatbuffers-79cd55bd3a8ada49ff35a0b00df12bff30d6f318.tar.gz flatbuffers-79cd55bd3a8ada49ff35a0b00df12bff30d6f318.tar.bz2 flatbuffers-79cd55bd3a8ada49ff35a0b00df12bff30d6f318.zip |
CI: Dockerized language port tests (#5066)
This runs a script in TravisCI that executes a bunch of small Docker image
scripts to test the language ports in isolated environments. This allows us to
test multiple language versions with little additional complexity.
Covers:
+ Java OpenJDK 10.0.2
+ Java OpenJDK 11.0.1
+ Node 10.13.0
+ Node 11.2.0
+ Python CPython 2.7.15
+ Python CPython 3.7.1
+ Rust 1.30.1
15 files changed, 142 insertions, 7 deletions
diff --git a/.travis.yml b/.travis.yml index 6207f1b5..b6ab9952 100644 --- a/.travis.yml +++ b/.travis.yml @@ -61,6 +61,17 @@ matrix: os: - linux + addons: + apt: + packages: + - docker-ce + script: + - bash .travis/build-and-run-docker-test-containers.sh + + - language: cpp + os: + - linux + compiler: - gcc diff --git a/.travis/build-and-run-docker-test-containers.sh b/.travis/build-and-run-docker-test-containers.sh new file mode 100755 index 00000000..e6039bf6 --- /dev/null +++ b/.travis/build-and-run-docker-test-containers.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# +# Copyright 2018 Google Inc. All rights reserved. +# +# Licensed 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 +# +# http://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. +set -e + +# build flatc on debian once to speed up the test loop below +docker build -t build_flatc_debian_stretch -f tests/docker/Dockerfile.testing.build_flatc_debian_stretch . +BUILD_CONTAINER_ID=$(docker create --read-only build_flatc_debian_stretch) +docker cp ${BUILD_CONTAINER_ID}:/code/flatc flatc_debian_stretch + +for f in $(ls tests/docker/languages | sort) +do + # docker pull sometimes fails for unknown reasons, probably travisci-related. this retries the pull we need a few times. + REQUIRED_BASE_IMAGE=$(cat tests/docker/languages/${f} | head -n 1 | awk ' { print $2 } ') + + set +e + n=0 + until [ $n -ge 5 ] + do + docker pull $REQUIRED_BASE_IMAGE && break + n=$[$n+1] + sleep 1 + done + set -e + + docker build -t $(echo ${f} | cut -f 3- -d .) -f tests/docker/languages/${f} . + echo "TEST OK: ${f}" +done diff --git a/tests/docker/Dockerfile.testing.build_flatc_debian_stretch b/tests/docker/Dockerfile.testing.build_flatc_debian_stretch new file mode 100644 index 00000000..197a5557 --- /dev/null +++ b/tests/docker/Dockerfile.testing.build_flatc_debian_stretch @@ -0,0 +1,9 @@ +FROM debian:9.6-slim as base +RUN apt -qq update >/dev/null +RUN apt -qq install -y cmake make build-essential >/dev/null +FROM base +WORKDIR /code +ADD . . +RUN cmake -G "Unix Makefiles" +RUN make flatc +RUN ls flatc diff --git a/tests/docker/TODO.Dockerfile.testing.python.cpython_with_conda b/tests/docker/TODO.Dockerfile.testing.python.cpython_with_conda new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/tests/docker/TODO.Dockerfile.testing.python.cpython_with_conda diff --git a/tests/docker/TODO.Dockerfile.testing.python.cpython_with_numpy b/tests/docker/TODO.Dockerfile.testing.python.cpython_with_numpy new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/tests/docker/TODO.Dockerfile.testing.python.cpython_with_numpy diff --git a/tests/docker/TODO.Dockerfile.testing.python.pypy_6_0_0_py2 b/tests/docker/TODO.Dockerfile.testing.python.pypy_6_0_0_py2 new file mode 100644 index 00000000..849b92e8 --- /dev/null +++ b/tests/docker/TODO.Dockerfile.testing.python.pypy_6_0_0_py2 @@ -0,0 +1,7 @@ +FROM pypy:2-6.0.0-slim as base +WORKDIR /code +ADD . . +RUN cp flatc_debian_stretch flatc +WORKDIR /code/tests +RUN pypy --version +RUN ./PythonTest.sh diff --git a/tests/docker/TODO.Dockerfile.testing.python.pypy_6_0_0_py3 b/tests/docker/TODO.Dockerfile.testing.python.pypy_6_0_0_py3 new file mode 100644 index 00000000..2df6b2aa --- /dev/null +++ b/tests/docker/TODO.Dockerfile.testing.python.pypy_6_0_0_py3 @@ -0,0 +1,7 @@ +FROM pypy:3-6.0.0-slim as base +WORKDIR /code +ADD . . +RUN cp flatc_debian_stretch flatc +WORKDIR /code/tests +RUN pypy --version +RUN ./PythonTest.sh diff --git a/tests/docker/languages/Dockerfile.testing.java.openjdk_10_0_2 b/tests/docker/languages/Dockerfile.testing.java.openjdk_10_0_2 new file mode 100644 index 00000000..82c3adda --- /dev/null +++ b/tests/docker/languages/Dockerfile.testing.java.openjdk_10_0_2 @@ -0,0 +1,7 @@ +FROM openjdk:10.0.2-jdk-slim-sid as base +WORKDIR /code +ADD . . +RUN cp flatc_debian_stretch flatc +WORKDIR /code/tests +RUN java -version +RUN ./JavaTest.sh diff --git a/tests/docker/languages/Dockerfile.testing.java.openjdk_11_0_1 b/tests/docker/languages/Dockerfile.testing.java.openjdk_11_0_1 new file mode 100644 index 00000000..ac1c3cc9 --- /dev/null +++ b/tests/docker/languages/Dockerfile.testing.java.openjdk_11_0_1 @@ -0,0 +1,7 @@ +FROM openjdk:11.0.1-jdk-slim-sid as base +WORKDIR /code +ADD . . +RUN cp flatc_debian_stretch flatc +WORKDIR /code/tests +RUN java -version +RUN ./JavaTest.sh diff --git a/tests/docker/languages/Dockerfile.testing.node.10_13_0 b/tests/docker/languages/Dockerfile.testing.node.10_13_0 new file mode 100644 index 00000000..b821105d --- /dev/null +++ b/tests/docker/languages/Dockerfile.testing.node.10_13_0 @@ -0,0 +1,8 @@ +FROM node:10.13.0-stretch as base +WORKDIR /code +ADD . . +RUN cp flatc_debian_stretch flatc +WORKDIR /code/tests +RUN node --version +RUN ../flatc -b -I include_test monster_test.fbs unicode_test.json +RUN node JavaScriptTest ./monster_test_generated diff --git a/tests/docker/languages/Dockerfile.testing.node.11_2_0 b/tests/docker/languages/Dockerfile.testing.node.11_2_0 new file mode 100644 index 00000000..f6b48e6e --- /dev/null +++ b/tests/docker/languages/Dockerfile.testing.node.11_2_0 @@ -0,0 +1,8 @@ +FROM node:11.2.0-stretch as base +WORKDIR /code +ADD . . +RUN cp flatc_debian_stretch flatc +WORKDIR /code/tests +RUN node --version +RUN ../flatc -b -I include_test monster_test.fbs unicode_test.json +RUN node JavaScriptTest ./monster_test_generated diff --git a/tests/docker/languages/Dockerfile.testing.python.cpython_2_7_15 b/tests/docker/languages/Dockerfile.testing.python.cpython_2_7_15 new file mode 100644 index 00000000..cb3b3c29 --- /dev/null +++ b/tests/docker/languages/Dockerfile.testing.python.cpython_2_7_15 @@ -0,0 +1,7 @@ +FROM python:2.7.15-slim-stretch as base +WORKDIR /code +ADD . . +RUN cp flatc_debian_stretch flatc +WORKDIR /code/tests +RUN python --version +RUN ./PythonTest.sh diff --git a/tests/docker/languages/Dockerfile.testing.python.cpython_3_7_1 b/tests/docker/languages/Dockerfile.testing.python.cpython_3_7_1 new file mode 100644 index 00000000..a3873d9a --- /dev/null +++ b/tests/docker/languages/Dockerfile.testing.python.cpython_3_7_1 @@ -0,0 +1,7 @@ +FROM python:3.7.1-slim-stretch as base +WORKDIR /code +ADD . . +RUN cp flatc_debian_stretch flatc +WORKDIR /code/tests +RUN python --version +RUN ./PythonTest.sh diff --git a/tests/docker/languages/Dockerfile.testing.rust.1_30_1 b/tests/docker/languages/Dockerfile.testing.rust.1_30_1 new file mode 100644 index 00000000..4d1755c6 --- /dev/null +++ b/tests/docker/languages/Dockerfile.testing.rust.1_30_1 @@ -0,0 +1,7 @@ +FROM rust:1.30.1-slim-stretch as base +WORKDIR /code +ADD . . +RUN cp flatc_debian_stretch flatc +WORKDIR /code/tests +RUN rustc --version +RUN ./RustTest.sh diff --git a/tests/rust_usage_test/tests/integration_test.rs b/tests/rust_usage_test/tests/integration_test.rs index 3fd21770..b9e44d85 100644 --- a/tests/rust_usage_test/tests/integration_test.rs +++ b/tests/rust_usage_test/tests/integration_test.rs @@ -246,7 +246,7 @@ mod lifetime_correctness { #[test] fn table_get_field_from_static_buffer_1() { - let buf = load_file("../monsterdata_test.mon"); + let buf = load_file("../monsterdata_test.mon").expect("missing monsterdata_test.mon"); // create 'static slice let slice: &[u8] = &buf; let slice: &'static [u8] = unsafe { mem::transmute(slice) }; @@ -268,7 +268,7 @@ mod lifetime_correctness { #[test] fn table_object_self_lifetime_in_closure() { // This test is designed to ensure that lifetimes for temporary intermediate tables aren't inflated beyond where the need to be. - let buf = load_file("../monsterdata_test.mon"); + let buf = load_file("../monsterdata_test.mon").expect("missing monsterdata_test.mon"); let monster = my_game::example::get_root_as_monster(&buf); let enemy: Option<my_game::example::Monster> = monster.enemy(); // This line won't compile if "self" is required to live for the lifetime of buf above as the borrow disappears at the end of the closure. @@ -1414,17 +1414,27 @@ mod read_examples_from_other_language_ports { #[test] fn gold_cpp_example_data_is_accessible_and_correct() { - let buf = load_file("../monsterdata_test.mon"); + let buf = load_file("../monsterdata_test.mon").expect("missing monsterdata_test.mon"); serialized_example_is_accessible_and_correct(&buf[..], true, false).unwrap(); } #[test] fn java_wire_example_data_is_accessible_and_correct() { let buf = load_file("../monsterdata_java_wire.mon"); + if buf.is_err() { + println!("skipping java wire test because it is not present"); + return; + } + let buf = buf.unwrap(); serialized_example_is_accessible_and_correct(&buf[..], true, false).unwrap(); } #[test] fn java_wire_size_prefixed_example_data_is_accessible_and_correct() { let buf = load_file("../monsterdata_java_wire_sp.mon"); + if buf.is_err() { + println!("skipping java wire test because it is not present"); + return; + } + let buf = buf.unwrap(); serialized_example_is_accessible_and_correct(&buf[..], true, true).unwrap(); } } @@ -2676,10 +2686,10 @@ fn write_example_wire_data_to_file() { f.write_all(b.finished_data()).unwrap(); } -fn load_file(filename: &str) -> Vec<u8> { +fn load_file(filename: &str) -> Result<Vec<u8>, std::io::Error> { use std::io::Read; - let mut f = std::fs::File::open(filename).expect("file does not exist"); + let mut f = std::fs::File::open(filename)?; let mut buf = Vec::new(); - f.read_to_end(&mut buf).expect("file reading failed"); - buf + f.read_to_end(&mut buf)?; + Ok(buf) } |