From 89b008ccff10ac20bb95d9bc8b14c6c4ffa47dfb Mon Sep 17 00:00:00 2001 From: Joe Richey Date: Thu, 19 Sep 2019 16:58:40 -0700 Subject: [PATCH 1/5] Simplify CI process for WASM Run WASI tests, and run both stdweb/wasm-bindgen on both node and in browsers These changes also remove the need for a separate tests/wasm_bindgen --- .cargo/config | 5 ++++ .travis.yml | 35 ++++++++++------------ Cargo.toml | 8 +++-- tests/{mod.rs => common.rs} | 9 +++++- tests/wasm_bindgen/Cargo.toml | 15 ---------- tests/wasm_bindgen/js/index.js | 5 ---- tests/wasm_bindgen/src/lib.rs | 55 ---------------------------------- utils/ci/install_cargo_web.sh | 15 ---------- 8 files changed, 34 insertions(+), 113 deletions(-) create mode 100644 .cargo/config rename tests/{mod.rs => common.rs} (80%) delete mode 100644 tests/wasm_bindgen/Cargo.toml delete mode 100644 tests/wasm_bindgen/js/index.js delete mode 100644 tests/wasm_bindgen/src/lib.rs delete mode 100755 utils/ci/install_cargo_web.sh diff --git a/.cargo/config b/.cargo/config new file mode 100644 index 00000000..291ce5e5 --- /dev/null +++ b/.cargo/config @@ -0,0 +1,5 @@ +[target.wasm32-unknown-unknown] +runner = 'wasm-bindgen-test-runner' + +[target.wasm32-wasi] +runner = 'wasmtime' diff --git a/.travis.yml b/.travis.yml index 19e566c1..946d10b0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,31 +32,28 @@ matrix: install: - rustup target add wasm32-unknown-unknown - rustup target add wasm32-unknown-emscripten + - rustup target add asmjs-unknown-emscripten - rustup target add wasm32-wasi - - nvm install 9 - - ./utils/ci/install_cargo_web.sh - - cargo web prepare-emscripten - - cargo web -V - - cargo list | grep install-update || cargo install -f cargo-update - - cargo install-update -i cargo-update wasm-bindgen-cli wasm-pack + - cargo install cargo-web wasmtime + - curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh addons: chrome: stable + firefox: latest + env: EMCC_CFLAGS="-s ERROR_ON_UNDEFINED_SYMBOLS=0" script: - # Testing wasm32-unknown-emscripten fails because of rust-lang/rust#49877 + # Running emscripten test binaries fails (see rust-lang/rust#63649). # However, we can still build and link all tests to make sure that works. # This is actually useful as it finds stuff such as rust-random/rand#669 - - EMCC_CFLAGS="-s ERROR_ON_UNDEFINED_SYMBOLS=0" cargo web test --target wasm32-unknown-emscripten --no-run - #- cargo web test --target wasm32-unknown-emscripten - #- cargo web test --nodejs --target wasm32-unknown-emscripten - #- cargo build --target wasm32-unknown-unknown # without any features - - cargo build --target wasm32-wasi - - cargo build --target wasm32-unknown-unknown - - cargo build --target wasm32-unknown-unknown --features=wasm-bindgen - - cargo web test --target wasm32-unknown-unknown --features=stdweb - - cargo build --manifest-path tests/wasm_bindgen/Cargo.toml --target wasm32-unknown-unknown - - wasm-bindgen --nodejs target/wasm32-unknown-unknown/debug/getrandom_wasm_bindgen_test.wasm --out-dir tests/wasm_bindgen/js - - node tests/wasm_bindgen/js/index.js - - wasm-pack test --node tests/wasm_bindgen + - cargo web test --target wasm32-unknown-emscripten --no-run + - cargo web test --target asmjs-unknown-emscripten --no-run + # wasi tests + - cargo test --target wasm32-wasi + # wasm-bindgen tests + - wasm-pack test --headless --chrome --firefox -- --features=test-in-browser + - wasm-pack test --node -- --features=wasm-bindgen + # wasm-stdweb tests + - cargo web test --target=wasm32-unknown-unknown --features=stdweb + - cargo web test --nodejs --target=wasm32-unknown-unknown --features=stdweb - name: "Linux, nightly, docs" rust: nightly diff --git a/Cargo.toml b/Cargo.toml index 7ac5850e..a354592d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,9 +14,6 @@ exclude = ["utils/*", ".*", "appveyor.yml"] travis-ci = { repository = "rust-random/getrandom" } appveyor = { repository = "rust-random/getrandom" } -[workspace] -members = ["tests/wasm_bindgen"] - [dependencies] log = { version = "0.4", optional = true } cfg-if = "0.1" @@ -35,9 +32,14 @@ wasi = "0.7" wasm-bindgen = { version = "0.2.29", optional = true } stdweb = { version = "0.4.18", optional = true } +[target.wasm32-unknown-unknown.dev-dependencies] +wasm-bindgen-test = "0.2" + [features] std = [] # Enables dummy implementation for unsupported targets dummy = [] # Unstable feature to support being a libstd dependency rustc-dep-of-std = ["compiler_builtins", "core"] +# Usstable feature for testing +test-in-browser = ["wasm-bindgen"] diff --git a/tests/mod.rs b/tests/common.rs similarity index 80% rename from tests/mod.rs rename to tests/common.rs index 66a36562..afefa031 100644 --- a/tests/mod.rs +++ b/tests/common.rs @@ -1,13 +1,19 @@ -extern crate getrandom; +#[cfg(feature = "wasm-bindgen")] +use wasm_bindgen_test::*; use getrandom::getrandom; +#[cfg(feature = "test-in-browser")] +wasm_bindgen_test_configure!(run_in_browser); + +#[cfg_attr(feature = "wasm-bindgen", wasm_bindgen_test)] #[test] fn test_zero() { // Test that APIs are happy with zero-length requests getrandom(&mut [0u8; 0]).unwrap(); } +#[cfg_attr(feature = "wasm-bindgen", wasm_bindgen_test)] #[test] fn test_diff() { let mut v1 = [0u8; 1000]; @@ -25,6 +31,7 @@ fn test_diff() { assert!(n_diff_bits >= v1.len() as u32); } +#[cfg_attr(feature = "wasm-bindgen", wasm_bindgen_test)] #[test] fn test_huge() { let mut huge = [0u8; 100_000]; diff --git a/tests/wasm_bindgen/Cargo.toml b/tests/wasm_bindgen/Cargo.toml deleted file mode 100644 index 4b735c85..00000000 --- a/tests/wasm_bindgen/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "getrandom_wasm_bindgen_test" -description = "Minimal test crate for getrandom using wasm-bindgen" -version = "0.1.0" -authors = ["The Rand Project Developers"] -publish = false -license = "MIT/Apache-2.0" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -getrandom = { path = "../..", features = ["wasm-bindgen"] } -wasm-bindgen = "0.2" -wasm-bindgen-test = "0.2" diff --git a/tests/wasm_bindgen/js/index.js b/tests/wasm_bindgen/js/index.js deleted file mode 100644 index d3390f69..00000000 --- a/tests/wasm_bindgen/js/index.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; - -const getrandom_wasm_bindgen_test = require('./getrandom_wasm_bindgen_test'); - -console.log(getrandom_wasm_bindgen_test.test_gen()); diff --git a/tests/wasm_bindgen/src/lib.rs b/tests/wasm_bindgen/src/lib.rs deleted file mode 100644 index 3629cbb8..00000000 --- a/tests/wasm_bindgen/src/lib.rs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2018 Developers of the Rand project. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// Crate to test WASM with the `wasm-bindgen` lib. - -#![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk.png")] - -extern crate getrandom; -extern crate wasm_bindgen; -extern crate wasm_bindgen_test; - -use std::slice; -use wasm_bindgen::prelude::*; -use wasm_bindgen_test::*; - -use getrandom::getrandom; - -#[wasm_bindgen] -pub fn test_gen() -> i32 { - let mut int: i32 = 0; - unsafe { - let ptr = &mut int as *mut i32 as *mut u8; - let slice = slice::from_raw_parts_mut(ptr, 4); - getrandom(slice).unwrap(); - } - int -} - -#[wasm_bindgen_test] -fn test_call() { - let mut buf = [0u8; 0]; - getrandom(&mut buf).unwrap(); -} - -#[wasm_bindgen_test] -fn test_diff() { - let mut v1 = [0u8; 1000]; - getrandom(&mut v1).unwrap(); - - let mut v2 = [0u8; 1000]; - getrandom(&mut v2).unwrap(); - - let mut n_diff_bits = 0; - for i in 0..v1.len() { - n_diff_bits += (v1[i] ^ v2[i]).count_ones(); - } - - // Check at least 1 bit per byte differs. p(failure) < 1e-1000 with random input. - assert!(n_diff_bits >= v1.len() as u32); -} diff --git a/utils/ci/install_cargo_web.sh b/utils/ci/install_cargo_web.sh deleted file mode 100755 index b35f0691..00000000 --- a/utils/ci/install_cargo_web.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -set -euo pipefail -IFS=$'\n\t' - -CARGO_WEB_RELEASE=$(curl -L -s -H 'Accept: application/json' https://github.com/koute/cargo-web/releases/latest) -CARGO_WEB_VERSION=$(echo $CARGO_WEB_RELEASE | sed -e 's/.*"tag_name":"\([^"]*\)".*/\1/') -CARGO_WEB_URL="https://github.com/koute/cargo-web/releases/download/$CARGO_WEB_VERSION/cargo-web-x86_64-unknown-linux-gnu.gz" - -echo "Downloading cargo-web from: $CARGO_WEB_URL" -curl -L $CARGO_WEB_URL | gzip -d > cargo-web -chmod +x cargo-web - -mkdir -p ~/.cargo/bin -mv cargo-web ~/.cargo/bin From 8680ed32a57b41723d1b2474b8f5cd6f74cfa06d Mon Sep 17 00:00:00 2001 From: Joe Richey Date: Thu, 19 Sep 2019 18:36:04 -0700 Subject: [PATCH 2/5] Use all pre-built binaries in the CI --- .travis.yml | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 946d10b0..9f069457 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,11 +34,19 @@ matrix: - rustup target add wasm32-unknown-emscripten - rustup target add asmjs-unknown-emscripten - rustup target add wasm32-wasi - - cargo install cargo-web wasmtime - - curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh + # Install pre-built binaries + - wget https://github.com/koute/cargo-web/releases/download/0.6.26/cargo-web-x86_64-unknown-linux-gnu.gz -O cargo-web.gz + - wget https://github.com/CraneStation/wasmtime/releases/download/v0.3.0/wasmtime-v0.3.0-x86_64-linux.tar.xz -O wasmtime.tar.xz + - wget https://github.com/rustwasm/wasm-pack/releases/download/v0.8.1/wasm-pack-v0.8.1-x86_64-unknown-linux-musl.tar.gz -O wasm-pack.tar.gz + - gunzip cargo-web.gz + - chmod +x cargo-web + - mkdir wasm-pack wasmtime + - tar -xzf wasm-pack.tar.gz --strip-components=1 -C wasm-pack + - tar -xf wasmtime.tar.xz --strip-components=1 -C wasmtime + - mv cargo-web wasmtime/wasmtime wasm-pack/wasm-pack /bin addons: - chrome: stable firefox: latest + chrome: stable env: EMCC_CFLAGS="-s ERROR_ON_UNDEFINED_SYMBOLS=0" script: # Running emscripten test binaries fails (see rust-lang/rust#63649). @@ -48,12 +56,13 @@ matrix: - cargo web test --target asmjs-unknown-emscripten --no-run # wasi tests - cargo test --target wasm32-wasi - # wasm-bindgen tests - - wasm-pack test --headless --chrome --firefox -- --features=test-in-browser - - wasm-pack test --node -- --features=wasm-bindgen # wasm-stdweb tests - - cargo web test --target=wasm32-unknown-unknown --features=stdweb - cargo web test --nodejs --target=wasm32-unknown-unknown --features=stdweb + - cargo web test --target=wasm32-unknown-unknown --features=stdweb + # wasm-bindgen tests + - wasm-pack test --node -- --features=wasm-bindgen + - wasm-pack test --headless --firefox -- --features=test-in-browser + - wasm-pack test --headless --chrome -- --features=test-in-browser - name: "Linux, nightly, docs" rust: nightly From c7909950b153feac7e0c9e80153407458de2ef6e Mon Sep 17 00:00:00 2001 From: Joseph Richey Date: Thu, 19 Sep 2019 18:37:40 -0700 Subject: [PATCH 3/5] Fix Cargo.toml typo Co-Authored-By: Artyom Pavlov --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index a354592d..a938c207 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,5 +41,5 @@ std = [] dummy = [] # Unstable feature to support being a libstd dependency rustc-dep-of-std = ["compiler_builtins", "core"] -# Usstable feature for testing +# Unstable feature for testing test-in-browser = ["wasm-bindgen"] From e2d883fd6254a873d37b272ac2595b1de631696a Mon Sep 17 00:00:00 2001 From: Joe Richey Date: Thu, 19 Sep 2019 18:51:30 -0700 Subject: [PATCH 4/5] Fix install location --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9f069457..58383776 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,6 +30,7 @@ matrix: - name: "WASM via emscripten, stdweb, wasm-bindgen and WASI" rust: nightly install: + - echo $PATH - rustup target add wasm32-unknown-unknown - rustup target add wasm32-unknown-emscripten - rustup target add asmjs-unknown-emscripten @@ -43,7 +44,7 @@ matrix: - mkdir wasm-pack wasmtime - tar -xzf wasm-pack.tar.gz --strip-components=1 -C wasm-pack - tar -xf wasmtime.tar.xz --strip-components=1 -C wasmtime - - mv cargo-web wasmtime/wasmtime wasm-pack/wasm-pack /bin + - mv cargo-web wasmtime/wasmtime wasm-pack/wasm-pack $HOME/.cargo/bin addons: firefox: latest chrome: stable From 1149861652f3fd9eff348470bee7f1bb0ed08c37 Mon Sep 17 00:00:00 2001 From: Joe Richey Date: Thu, 19 Sep 2019 20:08:49 -0700 Subject: [PATCH 5/5] Debug CI --- .travis.yml | 46 ++++++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/.travis.yml b/.travis.yml index 58383776..f96ab70a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,41 +29,51 @@ matrix: - name: "WASM via emscripten, stdweb, wasm-bindgen and WASI" rust: nightly + addons: + firefox: 69.0 + chrome: stable install: - - echo $PATH - rustup target add wasm32-unknown-unknown - rustup target add wasm32-unknown-emscripten - rustup target add asmjs-unknown-emscripten - rustup target add wasm32-wasi - # Install pre-built binaries - - wget https://github.com/koute/cargo-web/releases/download/0.6.26/cargo-web-x86_64-unknown-linux-gnu.gz -O cargo-web.gz - - wget https://github.com/CraneStation/wasmtime/releases/download/v0.3.0/wasmtime-v0.3.0-x86_64-linux.tar.xz -O wasmtime.tar.xz - - wget https://github.com/rustwasm/wasm-pack/releases/download/v0.8.1/wasm-pack-v0.8.1-x86_64-unknown-linux-musl.tar.gz -O wasm-pack.tar.gz + # Get geckodriver + - wget -O geckodriver.tar.gz https://github.com/mozilla/geckodriver/releases/download/v0.25.0/geckodriver-v0.25.0-linux64.tar.gz + - tar -xzf geckodriver.tar.gz + # Get chromedirver (we cannot pin chrome version, so don't pin chromedriver version) + - export VERSION=$(wget -q -O - https://chromedriver.storage.googleapis.com/LATEST_RELEASE) + - wget -O chromedriver.zip https://chromedriver.storage.googleapis.com/$VERSION/chromedriver_linux64.zip + - unzip chromedriver.zip + # Get cargo-web + - wget -O cargo-web.gz https://github.com/koute/cargo-web/releases/download/0.6.26/cargo-web-x86_64-unknown-linux-gnu.gz - gunzip cargo-web.gz - chmod +x cargo-web - - mkdir wasm-pack wasmtime - - tar -xzf wasm-pack.tar.gz --strip-components=1 -C wasm-pack - - tar -xf wasmtime.tar.xz --strip-components=1 -C wasmtime - - mv cargo-web wasmtime/wasmtime wasm-pack/wasm-pack $HOME/.cargo/bin - addons: - firefox: latest - chrome: stable + # Get wasmtime + - wget -O wasmtime.tar.xz https://github.com/CraneStation/wasmtime/releases/download/v0.3.0/wasmtime-v0.3.0-x86_64-linux.tar.xz + - tar -xf wasmtime.tar.xz --strip-components=1 + # Get wasm-bindgen-test-runner + - wget -O wasm-bindgen.tar.gz https://github.com/rustwasm/wasm-bindgen/releases/download/0.2.50/wasm-bindgen-0.2.50-x86_64-unknown-linux-musl.tar.gz + - tar -xzf wasm-bindgen.tar.gz --strip-components=1 + # Place the runner binaries in our PATH + - mv cargo-web wasmtime wasm-bindgen-test-runner $HOME/.cargo/bin + # Download and setup emscripten + - cargo web prepare-emscripten env: EMCC_CFLAGS="-s ERROR_ON_UNDEFINED_SYMBOLS=0" script: - # Running emscripten test binaries fails (see rust-lang/rust#63649). + # We cannot run emscripten test binaries (see rust-lang/rust#63649). # However, we can still build and link all tests to make sure that works. # This is actually useful as it finds stuff such as rust-random/rand#669 - cargo web test --target wasm32-unknown-emscripten --no-run - cargo web test --target asmjs-unknown-emscripten --no-run # wasi tests - cargo test --target wasm32-wasi - # wasm-stdweb tests + # stdweb tests (Node, Chrome) - cargo web test --nodejs --target=wasm32-unknown-unknown --features=stdweb - cargo web test --target=wasm32-unknown-unknown --features=stdweb - # wasm-bindgen tests - - wasm-pack test --node -- --features=wasm-bindgen - - wasm-pack test --headless --firefox -- --features=test-in-browser - - wasm-pack test --headless --chrome -- --features=test-in-browser + # wasm-bindgen tests (Node, Firefox, Chrome) + - cargo test --target wasm32-unknown-unknown --features=wasm-bindgen + - GECKODRIVER=$PWD/geckodriver cargo test --target wasm32-unknown-unknown --features=test-in-browser + - CHROMEDRIVER=$PWD/chromedriver cargo test --target wasm32-unknown-unknown --features=test-in-browser - name: "Linux, nightly, docs" rust: nightly