From b5bcb4f4a961e293fd7f673a48c8bfd116af6d31 Mon Sep 17 00:00:00 2001 From: Joe Richey Date: Thu, 28 May 2020 02:01:12 -0700 Subject: [PATCH 1/2] wasm: Move JS-based Custom RNGs back into the main crate They will be gated behind the "js" feature, as we can now do detect, at compile-time, which implementation (wasm-bindgen vs stdweb) we should use. The "js" implementation takes precedence over the "custom" implementation. This prevents issues that arise from the buggy way Cargo handles features across multiple targets. Signed-off-by: Joe Richey --- Cargo.toml | 15 ++++++++------ custom/stdweb/Cargo.toml | 17 ---------------- custom/stdweb/tests/test.rs | 7 ------- custom/wasm-bindgen/Cargo.toml | 20 ------------------- custom/wasm-bindgen/tests/node.rs | 7 ------- custom/wasm-bindgen/tests/web.rs | 9 --------- src/lib.rs | 5 +++++ custom/stdweb/src/lib.rs => src/stdweb.rs | 12 +++-------- .../src/lib.rs => src/wasm-bindgen.rs | 10 +++------- 9 files changed, 20 insertions(+), 82 deletions(-) delete mode 100644 custom/stdweb/Cargo.toml delete mode 100644 custom/stdweb/tests/test.rs delete mode 100644 custom/wasm-bindgen/Cargo.toml delete mode 100644 custom/wasm-bindgen/tests/node.rs delete mode 100644 custom/wasm-bindgen/tests/web.rs rename custom/stdweb/src/lib.rs => src/stdweb.rs (87%) rename custom/wasm-bindgen/src/lib.rs => src/wasm-bindgen.rs (91%) diff --git a/Cargo.toml b/Cargo.toml index 5ace34320..ef488a075 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,12 +14,6 @@ exclude = ["utils/*", ".*", "appveyor.yml"] travis-ci = { repository = "rust-random/getrandom" } appveyor = { repository = "rust-random/getrandom" } -[workspace] -members = [ - "custom/stdweb", - "custom/wasm-bindgen", -] - [dependencies] cfg-if = "0.1.2" @@ -33,10 +27,19 @@ libc = { version = "0.2.64", default-features = false } [target.'cfg(target_os = "wasi")'.dependencies] wasi = "0.9" +[target.'cfg(all(target_arch = "wasm32", target_os = "unknown", cargo_web))'.dependencies] +stdweb = { version = "0.4.18", default-features = false, optional = true } +[target.'cfg(all(target_arch = "wasm32", target_os = "unknown", not(cargo_web)))'.dependencies] +wasm-bindgen = { version = "0.2.62", default-features = false, optional = true } +[target.'cfg(all(target_arch = "wasm32", target_os = "unknown", not(cargo_web)))'.dev-dependencies] +wasm-bindgen-test = "0.3.12" + [features] std = [] # Feature to enable fallback RDRAND-based implementation rdrand = [] +# Feature to enable JavaScript bindings on wasm32-unknown-unknown +js = ["stdweb", "wasm-bindgen"] # Feature to enable custom RNG implementations custom = [] # Unstable feature to support being a libstd dependency diff --git a/custom/stdweb/Cargo.toml b/custom/stdweb/Cargo.toml deleted file mode 100644 index 67e44b994..000000000 --- a/custom/stdweb/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "stdweb-getrandom" -version = "0.1.0" -edition = "2018" -authors = ["The Rand Project Developers"] -license = "MIT OR Apache-2.0" -description = "Custom shim for using getrandom with stdweb" -documentation = "https://docs.rs/stdweb-getrandom" -repository = "https://github.com/rust-random/getrandom" -categories = ["wasm"] - -[dependencies] -getrandom = { path = "../..", version = "0.2", features = ["custom"] } -stdweb = "0.4.18" - -[package.metadata.docs.rs] -default-target = "wasm32-unknown-unknown" diff --git a/custom/stdweb/tests/test.rs b/custom/stdweb/tests/test.rs deleted file mode 100644 index 744da522d..000000000 --- a/custom/stdweb/tests/test.rs +++ /dev/null @@ -1,7 +0,0 @@ -// Explicitly use the Custom RNG crate to link it in. -use stdweb_getrandom as _; - -use getrandom::getrandom; -use test; -#[path = "../../../src/test_common.rs"] -mod test_common; diff --git a/custom/wasm-bindgen/Cargo.toml b/custom/wasm-bindgen/Cargo.toml deleted file mode 100644 index 2a6659283..000000000 --- a/custom/wasm-bindgen/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "wasm-bindgen-getrandom" -version = "0.1.0" -edition = "2018" -authors = ["The Rand Project Developers"] -license = "MIT OR Apache-2.0" -description = "Custom shim for using getrandom with wasm-bindgen" -documentation = "https://docs.rs/wasm-bindgen-getrandom" -repository = "https://github.com/rust-random/getrandom" -categories = ["wasm"] - -[dependencies] -getrandom = { path = "../..", version = "0.2", features = ["custom"] } -wasm-bindgen = "0.2.46" - -[dev-dependencies] -wasm-bindgen-test = "0.2.46" - -[package.metadata.docs.rs] -default-target = "wasm32-unknown-unknown" diff --git a/custom/wasm-bindgen/tests/node.rs b/custom/wasm-bindgen/tests/node.rs deleted file mode 100644 index 0861401c4..000000000 --- a/custom/wasm-bindgen/tests/node.rs +++ /dev/null @@ -1,7 +0,0 @@ -// Explicitly use the Custom RNG crate to link it in. -use wasm_bindgen_getrandom as _; - -use getrandom::getrandom; -use wasm_bindgen_test::wasm_bindgen_test as test; -#[path = "../../../src/test_common.rs"] -mod test_common; diff --git a/custom/wasm-bindgen/tests/web.rs b/custom/wasm-bindgen/tests/web.rs deleted file mode 100644 index f09ddca2b..000000000 --- a/custom/wasm-bindgen/tests/web.rs +++ /dev/null @@ -1,9 +0,0 @@ -// Explicitly use the Custom RNG crate to link it in. -use wasm_bindgen_getrandom as _; - -wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser); - -use getrandom::getrandom; -use wasm_bindgen_test::wasm_bindgen_test as test; -#[path = "../../../src/test_common.rs"] -mod test_common; diff --git a/src/lib.rs b/src/lib.rs index b988445cc..2cfc20d88 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -186,6 +186,11 @@ cfg_if! { } else if #[cfg(all(feature = "rdrand", any(target_arch = "x86_64", target_arch = "x86")))] { #[path = "rdrand.rs"] mod imp; + } else if #[cfg(all(feature = "js", + target_arch = "wasm32", target_os = "unknown"))] { + #[cfg_attr(cargo_web, path = "stdweb.rs")] + #[cfg_attr(not(cargo_web), path = "wasm-bindgen.rs")] + mod imp; } else if #[cfg(feature = "custom")] { use custom as imp; } else { diff --git a/custom/stdweb/src/lib.rs b/src/stdweb.rs similarity index 87% rename from custom/stdweb/src/lib.rs rename to src/stdweb.rs index a2b8eef42..5a50b68dd 100644 --- a/custom/stdweb/src/lib.rs +++ b/src/stdweb.rs @@ -5,17 +5,13 @@ // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. +use crate::Error; -#![recursion_limit = "128"] -#[cfg(not(all(target_arch = "wasm32", target_os = "unknown")))] -compile_error!("This crate is only for the `wasm32-unknown-unknown` target"); - +extern crate std; use std::thread_local; use stdweb::js; -use getrandom::{register_custom_getrandom, Error}; - #[derive(Clone, Copy, PartialEq)] enum RngSource { Browser, @@ -26,9 +22,7 @@ thread_local!( static RNG_SOURCE: Result = getrandom_init(); ); -register_custom_getrandom!(getrandom_inner); - -fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> { +pub(crate) fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> { RNG_SOURCE.with(|&source| getrandom_fill(source?, dest)) } diff --git a/custom/wasm-bindgen/src/lib.rs b/src/wasm-bindgen.rs similarity index 91% rename from custom/wasm-bindgen/src/lib.rs rename to src/wasm-bindgen.rs index 28cac6bab..3ec62f908 100644 --- a/custom/wasm-bindgen/src/lib.rs +++ b/src/wasm-bindgen.rs @@ -5,15 +5,13 @@ // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. +use crate::Error; -#[cfg(not(all(target_arch = "wasm32", target_os = "unknown")))] -compile_error!("This crate is only for the `wasm32-unknown-unknown` target"); - +extern crate std; use std::thread_local; use wasm_bindgen::prelude::*; -use getrandom::{register_custom_getrandom, Error}; enum RngSource { Node(NodeCrypto), @@ -26,9 +24,7 @@ thread_local!( static RNG_SOURCE: Result = getrandom_init(); ); -register_custom_getrandom!(getrandom_inner); - -fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> { +pub(crate) fn getrandom_inner(dest: &mut [u8]) -> Result<(), Error> { RNG_SOURCE.with(|result| { let source = result.as_ref().map_err(|&e| e)?; From 2edbed0350b43449d0c303abc7f1e2c1554175eb Mon Sep 17 00:00:00 2001 From: Joe Richey Date: Thu, 28 May 2020 02:03:15 -0700 Subject: [PATCH 2/2] wasm: Update testing framework Add back the "test-in-browser" feature. This makes it easier to manage a single file containing all of the test code. Signed-off-by: Joe Richey --- .travis.yml | 13 +++++-------- Cargo.toml | 3 +++ src/test_common.rs | 10 +++++++--- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3d3e443c7..79cef4015 100644 --- a/.travis.yml +++ b/.travis.yml @@ -67,17 +67,14 @@ jobs: script: - cargo test --target wasm32-wasi # stdweb (wasm32-unknown-unknown) tests (Node, Chrome) - - cargo web test --package stdweb-getrandom - - cargo web test --package stdweb-getrandom --nodejs + - cargo web test --features js --nodejs + - cargo web test --features js # wasm-bindgen (wasm32-unknown-unknown) tests (Node, Firefox, Chrome) - - cargo test --package wasm-bindgen-getrandom - --target wasm32-unknown-unknown --test node + - cargo test --target wasm32-unknown-unknown --features js - GECKODRIVER=$HOME/geckodriver - cargo test --package wasm-bindgen-getrandom - --target wasm32-unknown-unknown --test web + cargo test --target wasm32-unknown-unknown --features js,test-in-browser - CHROMEDRIVER=$HOME/chromedriver - cargo test --package wasm-bindgen-getrandom - --target wasm32-unknown-unknown --test web + cargo test --target wasm32-unknown-unknown --features js,test-in-browser - name: "WASM via Emscripten" rust: stable diff --git a/Cargo.toml b/Cargo.toml index ef488a075..83df2da95 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,5 +45,8 @@ custom = [] # Unstable feature to support being a libstd dependency rustc-dep-of-std = ["compiler_builtins", "core"] +# Test/wasm-bindgen only feature to run tests in a browser +test-in-browser = [] + [package.metadata.docs.rs] features = ["std", "custom"] diff --git a/src/test_common.rs b/src/test_common.rs index bbcf0e091..7d124bb09 100644 --- a/src/test_common.rs +++ b/src/test_common.rs @@ -1,7 +1,11 @@ -// Both getrandom and test can be renamed by the parent module. +// Allow getrandom to be renamed by the parent module. use super::getrandom; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] -use super::test; + +#[cfg(all(target_arch = "wasm32", target_os = "unknown", not(cargo_web)))] +use wasm_bindgen_test::wasm_bindgen_test as test; + +#[cfg(feature = "test-in-browser")] +wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser); #[test] fn test_zero() {