From 1cbf5509c04eb4df83464d04110c9c60f1ade15b Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 18 Apr 2016 10:31:33 +0200 Subject: [PATCH 1/2] Run tests in separate processes. --- Cargo.toml | 9 ++++ src/lib.rs | 3 -- src/rust.rs | 73 ++++++++------------------ src/tests.rs | 93 --------------------------------- {examples => tests}/callback.rs | 47 +++++++---------- tests/evaluate.rs | 32 ++++++++++++ tests/stack_limit.rs | 39 ++++++++++++++ tests/vec_conversion.rs | 60 +++++++++++++++++++++ 8 files changed, 181 insertions(+), 175 deletions(-) delete mode 100644 src/tests.rs rename {examples => tests}/callback.rs (63%) create mode 100644 tests/evaluate.rs create mode 100644 tests/stack_limit.rs create mode 100644 tests/vec_conversion.rs diff --git a/Cargo.toml b/Cargo.toml index a327f2bf2..dcd82e057 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,15 @@ authors = ["The Servo Project Developers"] build = "build.rs" +[[test]] +name = "callback" +[[test]] +name = "evaluate" +[[test]] +name = "stack_limit" +[[test]] +name = "vec_conversion" + [features] debugmozjs = ['mozjs_sys/debugmozjs'] diff --git a/src/lib.rs b/src/lib.rs index d1fae5b2a..bc680fb0f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -63,9 +63,6 @@ pub mod glue; pub mod jsval; pub mod rust; -#[cfg(test)] -mod tests; - pub use consts::*; use heapsize::HeapSizeOf; diff --git a/src/rust.rs b/src/rust.rs index 17e530858..da89a42ef 100644 --- a/src/rust.rs +++ b/src/rust.rs @@ -16,6 +16,8 @@ use std::intrinsics::return_address; use std::ops::{Deref, DerefMut}; use std::cell::UnsafeCell; use std::marker::PhantomData; +use consts::{JSCLASS_RESERVED_SLOTS_MASK, JSCLASS_RESERVED_SLOTS_SHIFT}; +use consts::{JSCLASS_GLOBAL_SLOT_COUNT, JSCLASS_IS_GLOBAL}; use jsapi::{JS_NewContext, JS_DestroyContext, JS_NewRuntime, JS_DestroyRuntime}; use jsapi::{JSContext, JSRuntime, JSObject, JSFlatString, JSFunction, JSString, Symbol, JSScript, jsid, Value}; use jsapi::{RuntimeOptionsRef, ContextOptionsRef, ReadOnlyCompileOptions}; @@ -42,6 +44,8 @@ use jsapi::JSNativeWrapper; use jsapi::JSPropertySpec; use jsapi::PropertyDefinitionBehavior; use jsapi::JS_SetNativeStackQuota; +use jsapi::JSClass; +use jsapi::JS_GlobalObjectTraceHook; use jsval::UndefinedValue; use glue::{CreateAutoObjectVector, AppendToAutoObjectVector, DeleteAutoObjectVector}; use glue::{NewCompileOptions, DeleteCompileOptions}; @@ -948,54 +952,21 @@ pub unsafe fn define_properties(cx: *mut JSContext, obj: HandleObject, JS_DefineProperties(cx, obj, properties.as_ptr()).to_result() } -#[cfg(test)] -pub mod test { - use {JSCLASS_IS_GLOBAL, JSCLASS_GLOBAL_SLOT_COUNT}; - use {JSCLASS_RESERVED_SLOTS_MASK, JSCLASS_RESERVED_SLOTS_SHIFT}; - use super::Runtime; - use jsapi::JS_Init; - use jsapi::JSClass; - use jsapi::{JS_NewGlobalObject, JS_PropertyStub, JS_StrictPropertyStub}; - use jsapi::{RootedObject, CompartmentOptions, OnNewGlobalHookOption}; - use jsapi::JS_GlobalObjectTraceHook; - - use libc; - - use std::ptr; - - #[test] - pub fn dummy() { - static CLASS: JSClass = JSClass { - name: b"Global\0" as *const u8 as *const libc::c_char, - flags: JSCLASS_IS_GLOBAL | - ((JSCLASS_GLOBAL_SLOT_COUNT & JSCLASS_RESERVED_SLOTS_MASK) << - JSCLASS_RESERVED_SLOTS_SHIFT), - // JSCLASS_HAS_RESERVED_SLOTS(JSCLASS_GLOBAL_SLOT_COUNT), - addProperty: None, - delProperty: None, - getProperty: None, - setProperty: None, - enumerate: None, - resolve: None, - convert: None, - finalize: None, - call: None, - hasInstance: None, - construct: None, - trace: Some(JS_GlobalObjectTraceHook), - - reserved: [0 as *mut libc::c_void; 26] - }; - - unsafe { assert!(JS_Init()); } - let rt = Runtime::new(); - let global = RootedObject::new(rt.cx(), unsafe { - JS_NewGlobalObject(rt.cx(), &CLASS, ptr::null_mut(), - OnNewGlobalHookOption::FireOnNewGlobalHook, - &CompartmentOptions::default()) - }); - assert!(rt.evaluate_script(global.handle(), "1 + 1".to_owned(), - "test".to_owned(), 1).is_ok()); - } - -} +/// This is a simple `JSClass` for global objects, primarily intended for tests. +pub static SIMPLE_GLOBAL_CLASS: JSClass = JSClass { + name: b"Global\0" as *const u8 as *const _, + flags: JSCLASS_IS_GLOBAL | ((JSCLASS_GLOBAL_SLOT_COUNT & JSCLASS_RESERVED_SLOTS_MASK) << JSCLASS_RESERVED_SLOTS_SHIFT), + addProperty: None, + delProperty: None, + getProperty: None, + setProperty: None, + enumerate: None, + resolve: None, + convert: None, + finalize: None, + call: None, + hasInstance: None, + construct: None, + trace: Some(JS_GlobalObjectTraceHook), + reserved: [0 as *mut _; 26] +}; diff --git a/src/tests.rs b/src/tests.rs deleted file mode 100644 index 34c8992cb..000000000 --- a/src/tests.rs +++ /dev/null @@ -1,93 +0,0 @@ - -use consts::{JSCLASS_RESERVED_SLOTS_MASK,JSCLASS_RESERVED_SLOTS_SHIFT,JSCLASS_GLOBAL_SLOT_COUNT,JSCLASS_IS_GLOBAL}; -use jsapi::JS_GlobalObjectTraceHook; -use conversions::*; -use jsval::*; -use rust::*; -use jsapi::{CallArgs,CompartmentOptions,OnNewGlobalHookOption,Rooted,Value, JS_NewGlobalObject}; -use jsapi::{RootedValue, RootedObject, JSAutoRequest, JSAutoCompartment, JS_Init, JSClass}; -use std::ptr; - -static CLASS: &'static JSClass = &JSClass { - name: b"test\0" as *const u8 as *const _, - flags: JSCLASS_IS_GLOBAL | ((JSCLASS_GLOBAL_SLOT_COUNT & JSCLASS_RESERVED_SLOTS_MASK) << JSCLASS_RESERVED_SLOTS_SHIFT), - addProperty: None, - delProperty: None, - getProperty: None, - setProperty: None, - enumerate: None, - resolve: None, - convert: None, - finalize: None, - call: None, - hasInstance: None, - construct: None, - trace: Some(JS_GlobalObjectTraceHook), - reserved: [0 as *mut _; 26] -}; - - -#[test] -fn test_vec_conversion() { - unsafe{ - assert!(JS_Init()); - } - - let rt = Runtime::new(); - let cx = rt.cx(); - - let glob = RootedObject::new(cx, 0 as *mut _); - let _ar = JSAutoRequest::new(cx); - - let h_option = OnNewGlobalHookOption::FireOnNewGlobalHook; - let c_option = CompartmentOptions::default(); - let global = unsafe { - JS_NewGlobalObject(cx, CLASS, ptr::null_mut(), h_option, &c_option) - }; - let global_root = Rooted::new(cx, global); - let global = global_root.handle(); - - let _ac = JSAutoCompartment::new(cx, global.get()); - - let mut rval = RootedValue::new(cx, UndefinedValue()); - - let orig_vec: Vec = vec![1.0, 2.9, 3.0]; - let converted = unsafe { - orig_vec.to_jsval(cx, rval.handle_mut()); - Vec::::from_jsval(cx, rval.handle(), ()).unwrap() - }; - - assert_eq!(orig_vec, converted); - - let orig_vec: Vec = vec![1, 2, 3]; - let converted = unsafe { - orig_vec.to_jsval(cx, rval.handle_mut()); - Vec::::from_jsval(cx, rval.handle(), ConversionBehavior::Default).unwrap() - }; - - assert_eq!(orig_vec, converted); -} - -#[test] -fn stack_limit() { - unsafe { - assert!(JS_Init()); - } - - let rt = Runtime::new(); - let cx = rt.cx(); - - let h_option = OnNewGlobalHookOption::FireOnNewGlobalHook; - let c_option = CompartmentOptions::default(); - let global = unsafe { - JS_NewGlobalObject(cx, CLASS, ptr::null_mut(), h_option, &c_option) - }; - let global_root = Rooted::new(cx, global); - let global = global_root.handle(); - - assert!(rt.evaluate_script(global, - "function f() { f.apply() } f()".to_string(), - "test".to_string(), - 1).is_err()); -} - diff --git a/examples/callback.rs b/tests/callback.rs similarity index 63% rename from examples/callback.rs rename to tests/callback.rs index 3815ff7d0..ddcfb97cc 100644 --- a/examples/callback.rs +++ b/tests/callback.rs @@ -5,37 +5,28 @@ extern crate js; extern crate libc; +use js::jsapi::CallArgs; +use js::jsapi::CompartmentOptions; +use js::jsapi::JSAutoCompartment; +use js::jsapi::JSAutoRequest; +use js::jsapi::JSContext; +use js::jsapi::JS_DefineFunction; +use js::jsapi::JS_EncodeStringToUTF8; +use js::jsapi::JS_Init; +use js::jsapi::JS_NewGlobalObject; +use js::jsapi::JS_ReportError; +use js::jsapi::OnNewGlobalHookOption; +use js::jsapi::Rooted; +use js::jsapi::Value; +use js::jsval::UndefinedValue; +use js::rust::{Runtime, SIMPLE_GLOBAL_CLASS}; + use std::ffi::CStr; use std::ptr; use std::str; -use js::{JSCLASS_RESERVED_SLOTS_MASK,JSCLASS_RESERVED_SLOTS_SHIFT,JSCLASS_GLOBAL_SLOT_COUNT,JSCLASS_IS_GLOBAL}; -use js::jsapi::JS_GlobalObjectTraceHook; -use js::jsapi::{CallArgs,CompartmentOptions,OnNewGlobalHookOption,Rooted,Value}; -use js::jsapi::{JS_DefineFunction,JS_Init,JS_NewGlobalObject,JS_EncodeStringToUTF8,JS_ReportError}; -use js::jsapi::{JSAutoCompartment,JSAutoRequest,JSContext,JSClass}; -use js::jsval::UndefinedValue; -use js::rust::Runtime; - -static CLASS: &'static JSClass = &JSClass { - name: b"test\0" as *const u8 as *const libc::c_char, - flags: JSCLASS_IS_GLOBAL | ((JSCLASS_GLOBAL_SLOT_COUNT & JSCLASS_RESERVED_SLOTS_MASK) << JSCLASS_RESERVED_SLOTS_SHIFT), - addProperty: None, - delProperty: None, - getProperty: None, - setProperty: None, - enumerate: None, - resolve: None, - convert: None, - finalize: None, - call: None, - hasInstance: None, - construct: None, - trace: Some(JS_GlobalObjectTraceHook), - reserved: [0 as *mut _; 26] -}; - -fn main() { +#[test] +fn callback() { unsafe { JS_Init(); } @@ -46,7 +37,7 @@ fn main() { let h_option = OnNewGlobalHookOption::FireOnNewGlobalHook; let c_option = CompartmentOptions::default(); let _ar = JSAutoRequest::new(context); - let global = JS_NewGlobalObject(context, CLASS, ptr::null_mut(), h_option, &c_option); + let global = JS_NewGlobalObject(context, &SIMPLE_GLOBAL_CLASS, ptr::null_mut(), h_option, &c_option); let global_root = Rooted::new(context, global); let global = global_root.handle(); let _ac = JSAutoCompartment::new(context, global.get()); diff --git a/tests/evaluate.rs b/tests/evaluate.rs new file mode 100644 index 000000000..317cdde6c --- /dev/null +++ b/tests/evaluate.rs @@ -0,0 +1,32 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +extern crate js; +extern crate libc; + +use js::jsapi::CompartmentOptions; +use js::jsapi::JSAutoRequest; +use js::jsapi::JS_Init; +use js::jsapi::JS_NewGlobalObject; +use js::jsapi::OnNewGlobalHookOption; +use js::jsapi::RootedObject; +use js::rust::{Runtime, SIMPLE_GLOBAL_CLASS}; + +use std::ptr; + +#[test] +fn evaluate() { + unsafe { assert!(JS_Init()); } + let rt = Runtime::new(); + let cx = rt.cx(); + let _ar = JSAutoRequest::new(cx); + + let global = RootedObject::new(cx, unsafe { + JS_NewGlobalObject(cx, &SIMPLE_GLOBAL_CLASS, ptr::null_mut(), + OnNewGlobalHookOption::FireOnNewGlobalHook, + &CompartmentOptions::default()) + }); + assert!(rt.evaluate_script(global.handle(), "1 + 1".to_owned(), + "test".to_owned(), 1).is_ok()); +} diff --git a/tests/stack_limit.rs b/tests/stack_limit.rs new file mode 100644 index 000000000..4d19fe5c3 --- /dev/null +++ b/tests/stack_limit.rs @@ -0,0 +1,39 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +extern crate js; + +use js::jsapi::CompartmentOptions; +use js::jsapi::JSAutoRequest; +use js::jsapi::JS_Init; +use js::jsapi::JS_NewGlobalObject; +use js::jsapi::OnNewGlobalHookOption; +use js::jsapi::Rooted; +use js::rust::{Runtime, SIMPLE_GLOBAL_CLASS}; + +use std::ptr; + +#[test] +fn stack_limit() { + unsafe { + assert!(JS_Init()); + } + + let rt = Runtime::new(); + let cx = rt.cx(); + let _ar = JSAutoRequest::new(cx); + + let h_option = OnNewGlobalHookOption::FireOnNewGlobalHook; + let c_option = CompartmentOptions::default(); + let global = unsafe { + JS_NewGlobalObject(cx, &SIMPLE_GLOBAL_CLASS, ptr::null_mut(), h_option, &c_option) + }; + let global_root = Rooted::new(cx, global); + let global = global_root.handle(); + + assert!(rt.evaluate_script(global, + "function f() { f.apply() } f()".to_string(), + "test".to_string(), + 1).is_err()); +} diff --git a/tests/vec_conversion.rs b/tests/vec_conversion.rs new file mode 100644 index 000000000..ff8aba5c9 --- /dev/null +++ b/tests/vec_conversion.rs @@ -0,0 +1,60 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +extern crate js; + +use js::conversions::ConversionBehavior; +use js::conversions::FromJSValConvertible; +use js::conversions::ToJSValConvertible; +use js::jsapi::CompartmentOptions; +use js::jsapi::JSAutoCompartment; +use js::jsapi::JSAutoRequest; +use js::jsapi::JS_Init; +use js::jsapi::JS_NewGlobalObject; +use js::jsapi::OnNewGlobalHookOption; +use js::jsapi::Rooted; +use js::jsapi::RootedValue; +use js::jsval::UndefinedValue; +use js::rust::{Runtime, SIMPLE_GLOBAL_CLASS}; + +use std::ptr; + +#[test] +fn vec_conversion() { + unsafe { + assert!(JS_Init()); + } + + let rt = Runtime::new(); + let cx = rt.cx(); + let _ar = JSAutoRequest::new(cx); + + let h_option = OnNewGlobalHookOption::FireOnNewGlobalHook; + let c_option = CompartmentOptions::default(); + let global = unsafe { + JS_NewGlobalObject(cx, &SIMPLE_GLOBAL_CLASS, ptr::null_mut(), h_option, &c_option) + }; + let global_root = Rooted::new(cx, global); + let global = global_root.handle(); + + let _ac = JSAutoCompartment::new(cx, global.get()); + + let mut rval = RootedValue::new(cx, UndefinedValue()); + + let orig_vec: Vec = vec![1.0, 2.9, 3.0]; + let converted = unsafe { + orig_vec.to_jsval(cx, rval.handle_mut()); + Vec::::from_jsval(cx, rval.handle(), ()).unwrap() + }; + + assert_eq!(orig_vec, converted); + + let orig_vec: Vec = vec![1, 2, 3]; + let converted = unsafe { + orig_vec.to_jsval(cx, rval.handle_mut()); + Vec::::from_jsval(cx, rval.handle(), ConversionBehavior::Default).unwrap() + }; + + assert_eq!(orig_vec, converted); +} From 3b3a2733ea7a7c530748955150dbea93366826f1 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Tue, 8 Mar 2016 09:56:41 +0100 Subject: [PATCH 2/2] Enable debug testing. --- .travis.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.travis.yml b/.travis.yml index 645d0c93a..4ab7de750 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,14 @@ dist: trusty rust: - nightly +env: + - FEATURES="" + - FEATURES="debugmozjs" + +script: + - cargo build --verbose --features "$FEATURES" + - cargo test --verbose --features "$FEATURES" + branches: except: - master