Skip to content

Commit da467f8

Browse files
committed
custom: WIP
Signed-off-by: Joe Richey <[email protected]>
1 parent 8365277 commit da467f8

File tree

12 files changed

+87
-107
lines changed

12 files changed

+87
-107
lines changed

.travis.yml

+31-54
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
language: rust
2-
sudo: false
2+
os: linux
33

4-
matrix:
4+
# Targets that we just build (rather than run and test)
5+
env:
6+
global:
7+
- STD_TARGETS="x86_64-sun-solaris x86_64-unknown-cloudabi x86_64-unknown-freebsd x86_64-fuchsia x86_64-unknown-netbsd x86_64-unknown-redox x86_64-fortanix-unknown-sgx"
8+
- NO_STD_TARGETS="x86_64-unknown-uefi x86_64-unknown-hermit x86_64-unknown-l4re-uclibc x86_64-uwp-windows-gnu x86_64-wrs-vxworks"
9+
10+
jobs:
511
include:
612
- name: "Linux, 1.32.0"
713
rust: 1.32.0
8-
os: linux
914

1015
- name: "OSX, 1.32.0"
1116
rust: 1.32.0
@@ -68,41 +73,40 @@ matrix:
6873
# This is actually useful as it finds stuff such as rust-random/rand#669
6974
- cargo web test --target wasm32-unknown-emscripten --no-run
7075
- cargo web test --target asmjs-unknown-emscripten --no-run
71-
# wasi tests
7276
- cargo test --target wasm32-wasi
73-
# stdweb tests (Node, Chrome)
74-
- cd custom/stdweb
75-
- cargo web test --nodejs --target=wasm32-unknown-unknown
76-
- cargo web test --target=wasm32-unknown-unknown
77-
# wasm-bindgen tests (Node, Firefox, Chrome)
78-
- cd ../wasm-bindgen
79-
- cargo test --target wasm32-unknown-unknown
80-
- GECKODRIVER=$HOME/geckodriver cargo test --target wasm32-unknown-unknown --features=test-in-browser
81-
- CHROMEDRIVER=$HOME/chromedriver cargo test --target wasm32-unknown-unknown --features=test-in-browser
77+
# stdweb (wasm32-unknown-unknown) tests (Node, Chrome)
78+
- cargo web test --package stdweb-getrandom
79+
- cargo web test --package stdweb-getrandom --nodejs
80+
# wasm-bindgen (wasm32-unknown-unknown) tests (Node, Firefox, Chrome)
81+
- cargo test --package wasm-bindgen-getrandom
82+
--target wasm32-unknown-unknown --test node
83+
- GECKODRIVER=$HOME/geckodriver
84+
cargo test --package wasm-bindgen-getrandom
85+
--target wasm32-unknown-unknown --test web
86+
- CHROMEDRIVER=$HOME/chromedriver
87+
cargo test --package wasm-bindgen-getrandom
88+
--target wasm32-unknown-unknown --test web
8289

8390
- &nightly_and_docs
8491
name: "Linux, nightly, docs"
8592
rust: nightly
86-
os: linux
8793
install:
8894
- rustup target add wasm32-unknown-unknown
8995
- cargo --list | egrep "^\s*deadlinks$" -q || cargo install cargo-deadlinks
9096
- cargo deadlinks -V
9197
script:
92-
# Check that our tests pass in the default configuration
93-
- cargo test
94-
- cargo test --benches
9598
# Check that setting various features does not break the build
9699
- cargo build --features=std
97100
- cargo build --features=custom
98101
# remove cached documentation, otherwise files from previous PRs can get included
99102
- rm -rf target/doc
100103
- cargo doc --no-deps --features=std,custom
101-
- cargo doc --no-deps --manifest-path=custom/wasm-bindgen/Cargo.toml --target=wasm32-unknown-unknown
104+
- cargo doc --no-deps --package wasm-bindgen-getrandom --target=wasm32-unknown-unknown
102105
- cargo deadlinks --dir target/doc
103-
# also test minimum dependency versions are usable
106+
# Check that our tests pass in the default/minimal configuration
107+
- cargo test --tests --benches
104108
- cargo generate-lockfile -Z minimal-versions
105-
- cargo test --features=std,custom
109+
- cargo test --tests --benches
106110

107111
- <<: *nightly_and_docs
108112
name: "OSX, nightly, docs"
@@ -111,49 +115,23 @@ matrix:
111115
- name: "cross-platform build only"
112116
rust: nightly
113117
install:
114-
- rustup target add x86_64-sun-solaris
115-
- rustup target add x86_64-unknown-cloudabi
116-
- rustup target add x86_64-unknown-freebsd
117-
- rustup target add x86_64-fuchsia
118-
- rustup target add x86_64-unknown-netbsd
119-
- rustup target add x86_64-unknown-redox
120-
- rustup target add x86_64-fortanix-unknown-sgx
118+
- echo $STD_TARGETS | xargs -n1 rustup target add
121119
# For no_std targets
122120
- rustup component add rust-src
123-
- cargo install cargo-xbuild || true
121+
- cargo --list | egrep "^\s*xbuild$" -q || cargo install cargo-xbuild
124122
script:
125-
- cargo build --target=x86_64-sun-solaris
126-
- cargo build --target=x86_64-unknown-cloudabi
127-
- cargo build --target=x86_64-unknown-freebsd
128-
- cargo build --target=x86_64-fuchsia
129-
- cargo build --target=x86_64-unknown-netbsd
130-
- cargo build --target=x86_64-unknown-redox
131-
- cargo build --target=x86_64-fortanix-unknown-sgx
132-
- cargo xbuild --target=x86_64-unknown-uefi
133-
- cargo xbuild --target=x86_64-unknown-hermit
134-
- cargo xbuild --target=x86_64-unknown-l4re-uclibc
135-
- cargo xbuild --target=x86_64-uwp-windows-gnu
136-
- cargo xbuild --target=x86_64-wrs-vxworks
123+
# We test that getrandom builds for all targets
124+
- echo $STD_TARGETS | xargs -n1 cargo build --target
125+
- echo $NO_STD_TARGETS | xargs -n1 cargo xbuild --target
137126
# also test minimum dependency versions are usable
138127
- cargo generate-lockfile -Z minimal-versions
139-
- cargo build --target=x86_64-sun-solaris
140-
- cargo build --target=x86_64-unknown-cloudabi
141-
- cargo build --target=x86_64-unknown-freebsd
142-
- cargo build --target=x86_64-fuchsia
143-
- cargo build --target=x86_64-unknown-netbsd
144-
- cargo build --target=x86_64-unknown-redox
145-
- cargo build --target=x86_64-fortanix-unknown-sgx
146-
- cargo xbuild --target=x86_64-unknown-uefi
147-
- cargo xbuild --target=x86_64-unknown-hermit
148-
- cargo xbuild --target=x86_64-unknown-l4re-uclibc
149-
- cargo xbuild --target=x86_64-uwp-windows-gnu
150-
- cargo xbuild --target=x86_64-wrs-vxworks
128+
- echo $STD_TARGETS | xargs -n1 cargo build --target
129+
- echo $NO_STD_TARGETS | xargs -n1 cargo xbuild --target
151130

152131
# Trust cross-built/emulated targets. We must repeat all non-default values.
153132
- name: "Linux (MIPS, big-endian)"
154133
env: TARGET=mips-unknown-linux-gnu
155134
rust: stable
156-
sudo: required
157135
dist: trusty
158136
services: docker
159137
install:
@@ -165,7 +143,6 @@ matrix:
165143
- name: "Android (ARMv7)"
166144
env: TARGET=armv7-linux-androideabi
167145
rust: stable
168-
sudo: required
169146
dist: trusty
170147
services: docker
171148
install:

Cargo.toml

+3
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ libc = { version = "0.2.64", default-features = false }
3434
wasi = "0.9"
3535

3636
[features]
37+
default = ["cpu"]
3738
std = []
39+
# Feature to enable fallback CPU-based implementation
40+
cpu = []
3841
# Feature to enable custom RNG implementations
3942
custom = []
4043
# Unstable feature to support being a libstd dependency

benches/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
#![feature(test)]
2-
extern crate getrandom;
32
extern crate test;
43

54
#[bench]

custom/stdweb/Cargo.toml

+1-10
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,5 @@ categories = ["wasm"]
1313
getrandom = { path = "../..", version = "0.2", features = ["custom"] }
1414
stdweb = "0.4.18"
1515

16-
# Test-only features allowing us to reuse most of the code in common.rs
17-
[features]
18-
default = ["test-stdweb"]
19-
test-stdweb = []
20-
21-
[[test]]
22-
name = "common"
23-
path = "../../tests/common.rs"
24-
2516
[package.metadata.docs.rs]
26-
default-target = "wasm32-unknown-unknown"
17+
default-target = "wasm32-unknown-unknown"

custom/stdweb/tests/test.rs

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Explicitly use the Custom RNG crate to link it in.
2+
use stdweb_getrandom as _;
3+
4+
use getrandom::getrandom;
5+
use test;
6+
#[path = "../../../src/test_common.rs"]
7+
mod test_common;

custom/wasm-bindgen/Cargo.toml

+3-13
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,10 @@ categories = ["wasm"]
1111

1212
[dependencies]
1313
getrandom = { path = "../..", version = "0.2", features = ["custom"] }
14-
wasm-bindgen = "0.2.29"
14+
wasm-bindgen = "0.2.46"
1515

1616
[dev-dependencies]
17-
wasm-bindgen-test = "0.2"
18-
19-
# Test-only features allowing us to reuse most of the code in common.rs
20-
[features]
21-
default = ["test-bindgen"]
22-
test-bindgen = []
23-
test-in-browser = ["test-bindgen"]
24-
25-
[[test]]
26-
name = "common"
27-
path = "../../tests/common.rs"
17+
wasm-bindgen-test = "0.2.46"
2818

2919
[package.metadata.docs.rs]
30-
default-target = "wasm32-unknown-unknown"
20+
default-target = "wasm32-unknown-unknown"

custom/wasm-bindgen/tests/node.rs

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Explicitly use the Custom RNG crate to link it in.
2+
use wasm_bindgen_getrandom as _;
3+
4+
use getrandom::getrandom;
5+
use wasm_bindgen_test::wasm_bindgen_test as test;
6+
#[path = "../../../src/test_common.rs"]
7+
mod test_common;

custom/wasm-bindgen/tests/web.rs

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Explicitly use the Custom RNG crate to link it in.
2+
use wasm_bindgen_getrandom as _;
3+
4+
wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser);
5+
6+
use getrandom::getrandom;
7+
use wasm_bindgen_test::wasm_bindgen_test as test;
8+
#[path = "../../../src/test_common.rs"]
9+
mod test_common;

src/custom.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ macro_rules! register_custom_getrandom {
2323
// We use an extern "C" function to get the guarantees of a stable ABI.
2424
#[no_mangle]
2525
extern "C" fn __getrandom_custom(dest: *mut u8, len: usize) -> u32 {
26-
let slice = unsafe { ::std::slice::from_raw_parts_mut(dest, len) };
26+
let slice = unsafe { ::core::slice::from_raw_parts_mut(dest, len) };
2727
match $path(slice) {
2828
Ok(()) => 0,
2929
Err(e) => e.code().get(),

src/lib.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@
2525
//! | Redox | [`rand:`][12]
2626
//! | CloudABI | [`cloudabi_sys_random_get`][13]
2727
//! | Haiku | `/dev/random` (identical to `/dev/urandom`)
28-
//! | L4RE, SGX, UEFI | [RDRAND][18]
29-
//! | Hermit | [RDRAND][18] as [`sys_rand`][22] is currently broken.
28+
//! | SGX | [RDRAND][18]
3029
//! | VxWorks | `randABytes` after checking entropy pool initialization with `randSecure`
3130
//! | Web browsers | [`Crypto.getRandomValues`][14] (see [Support for WebAssembly and asm.js][16])
3231
//! | Node.js | [`crypto.randomBytes`][15] (see [Support for WebAssembly and asm.js][16])
@@ -118,7 +117,6 @@
118117
//! [19]: https://www.unix.com/man-page/mojave/2/getentropy/
119118
//! [20]: https://www.unix.com/man-page/mojave/4/random/
120119
//! [21]: https://www.freebsd.org/cgi/man.cgi?query=getrandom&manpath=FreeBSD+12.0-stable
121-
//! [22]: https://github.com/hermitcore/libhermit-rs/blob/09c38b0371cee6f56a541400ba453e319e43db53/src/syscalls/random.rs#L21
122120
123121
#![doc(
124122
html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk.png",
@@ -183,15 +181,12 @@ cfg_if! {
183181
#[path = "windows_uwp.rs"] mod imp;
184182
} else if #[cfg(windows)] {
185183
#[path = "windows.rs"] mod imp;
186-
} else if #[cfg(all(target_arch = "x86_64", any(
187-
target_os = "hermit",
188-
target_os = "l4re",
189-
target_os = "uefi",
190-
target_env = "sgx",
191-
)))] {
184+
} else if #[cfg(all(target_arch = "x86_64", target_env = "sgx"))] {
192185
#[path = "rdrand.rs"] mod imp;
193186
} else if #[cfg(feature = "custom")] {
194187
use custom as imp;
188+
} else if #[cfg(all(feature = "cpu", target_arch = "x86_64"))] {
189+
#[path = "rdrand.rs"] mod imp;
195190
} else {
196191
compile_error!("\
197192
target is not supported, for more information see: \
@@ -219,3 +214,8 @@ pub fn getrandom(dest: &mut [u8]) -> Result<(), Error> {
219214
}
220215
imp::getrandom_inner(dest)
221216
}
217+
218+
#[cfg(test)]
219+
mod test_common;
220+
#[cfg(test)]
221+
mod test_cpu;

tests/common.rs src/test_common.rs

+8-19
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,14 @@
1-
// Explicitly use the Custom RNG crates to link them in.
2-
#[cfg(feature = "test-stdweb")]
3-
use stdweb_getrandom as _;
4-
#[cfg(feature = "test-bindgen")]
5-
use wasm_bindgen_getrandom as _;
1+
// Both getrandom and test can be renamed by the parent module.
2+
use super::getrandom;
3+
#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
4+
use super::test;
65

7-
#[cfg(feature = "test-bindgen")]
8-
use wasm_bindgen_test::*;
9-
10-
use getrandom::getrandom;
11-
12-
#[cfg(feature = "test-in-browser")]
13-
wasm_bindgen_test_configure!(run_in_browser);
14-
15-
#[cfg_attr(feature = "test-bindgen", wasm_bindgen_test)]
166
#[test]
177
fn test_zero() {
188
// Test that APIs are happy with zero-length requests
199
getrandom(&mut [0u8; 0]).unwrap();
2010
}
2111

22-
#[cfg_attr(feature = "test-bindgen", wasm_bindgen_test)]
2312
#[test]
2413
fn test_diff() {
2514
let mut v1 = [0u8; 1000];
@@ -37,18 +26,18 @@ fn test_diff() {
3726
assert!(n_diff_bits >= v1.len() as u32);
3827
}
3928

40-
#[cfg_attr(feature = "test-bindgen", wasm_bindgen_test)]
4129
#[test]
4230
fn test_huge() {
4331
let mut huge = [0u8; 100_000];
4432
getrandom(&mut huge).unwrap();
4533
}
4634

47-
#[cfg(any(unix, windows, target_os = "redox", target_os = "fuchsia"))]
35+
// On WASM, the thread API always fails/panics
36+
#[cfg(not(target_arch = "wasm32"))]
4837
#[test]
4938
fn test_multithreading() {
50-
use std::sync::mpsc::channel;
51-
use std::thread;
39+
extern crate std;
40+
use std::{sync::mpsc::channel, thread, vec};
5241

5342
let mut txs = vec![];
5443
for _ in 0..20 {

src/test_cpu.rs

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// We only test the CPU-based RNG source on supported architectures.
2+
#![cfg(target_arch = "x86_64")]
3+
4+
#[path = "rdrand.rs"]
5+
mod rdrand;
6+
use rdrand::getrandom_inner as getrandom;
7+
#[path = "test_common.rs"]
8+
mod test_common;

0 commit comments

Comments
 (0)