diff --git a/tests/lib.rs b/tests/lib.rs index eb81377..fca9708 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -2,6 +2,7 @@ extern crate sqlite; extern crate temporary; use std::path::PathBuf; +use std::thread; use temporary::Directory; macro_rules! ok( @@ -55,6 +56,35 @@ fn workflow() { } } +#[test] +fn stress() { + use sqlite::Binding::*; + use sqlite::State; + + let (path, _directory) = setup(); + + let database = ok!(sqlite::open(&path)); + let sql = r#"CREATE TABLE `users` (id INTEGER, name VARCHAR(255), age REAL);"#; + ok!(database.execute(sql)); + + let guards = (0..100).map(|_| { + let path = PathBuf::from(&path); + thread::spawn(move || { + let mut database = ok!(sqlite::open(&path)); + ok!(database.set_busy_handler(|_| true)); + let sql = r#"INSERT INTO `users` (id, name, age) VALUES (?, ?, ?);"#; + let mut statement = ok!(database.prepare(sql)); + ok!(statement.bind(&[Integer(1, 1), Text(2, "Alice"), Float(3, 20.99)])); + assert!(ok!(statement.step()) == State::Done); + true + }) + }).collect::>(); + + for guard in guards { + assert!(guard.join().unwrap()); + } +} + fn setup() -> (PathBuf, Directory) { let directory = ok!(Directory::new("sqlite")); (directory.path().join("database.sqlite3"), directory)