diff --git a/rust/logos-blockchain-circuits-poc-sys/src/native.rs b/rust/logos-blockchain-circuits-poc-sys/src/native.rs index 959926f..9933d7a 100644 --- a/rust/logos-blockchain-circuits-poc-sys/src/native.rs +++ b/rust/logos-blockchain-circuits-poc-sys/src/native.rs @@ -60,6 +60,29 @@ mod tests { static INPUTS: LazyLock = LazyLock::new(|| PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("sample.input.json")); + #[test] + fn test_generate_witness_invalid_json_returns_err() { + let input = PocWitnessInput::new("{".to_owned()).unwrap(); + assert!(generate_witness(&input).is_err()); + } + + #[test] + fn test_generate_witness_missing_inputs_returns_err() { + let input = PocWitnessInput::new("{}".to_owned()).unwrap(); + assert!(generate_witness(&input).is_err()); + } + + #[test] + fn test_generate_witness_constraint_violation_returns_err() { + let json = std::fs::read_to_string(&*INPUTS).unwrap(); + let bad_json = json.replace( + "\"voucher_root\": \"20810875415353676096192834577269613981524168537821543897016159330974871397924\"", + "\"voucher_root\": \"1\"", + ); + let input = PocWitnessInput::new(bad_json).unwrap(); + assert!(generate_witness(&input).is_err()); + } + #[test] fn test_generate_witness() { let dat = LIB_DIR.join("witness_generator"); diff --git a/rust/logos-blockchain-circuits-pol-sys/src/native.rs b/rust/logos-blockchain-circuits-pol-sys/src/native.rs index 62c3d43..ca465b9 100644 --- a/rust/logos-blockchain-circuits-pol-sys/src/native.rs +++ b/rust/logos-blockchain-circuits-pol-sys/src/native.rs @@ -60,6 +60,29 @@ mod tests { static INPUTS: LazyLock = LazyLock::new(|| PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("sample.input.json")); + #[test] + fn test_generate_witness_invalid_json_returns_err() { + let input = PolWitnessInput::new("{".to_owned()).unwrap(); + assert!(generate_witness(&input).is_err()); + } + + #[test] + fn test_generate_witness_missing_inputs_returns_err() { + let input = PolWitnessInput::new("{}".to_owned()).unwrap(); + assert!(generate_witness(&input).is_err()); + } + + #[test] + fn test_generate_witness_constraint_violation_returns_err() { + let json = std::fs::read_to_string(&*INPUTS).unwrap(); + let bad_json = json.replace( + "\"ledger_aged\": \"9907496234164738674719754286318998202143315407023653151112941050435603056651\"", + "\"ledger_aged\": \"1\"", + ); + let input = PolWitnessInput::new(bad_json).unwrap(); + assert!(generate_witness(&input).is_err()); + } + #[test] fn test_generate_witness() { let dat = LIB_DIR.join("witness_generator"); diff --git a/rust/logos-blockchain-circuits-poq-sys/src/native.rs b/rust/logos-blockchain-circuits-poq-sys/src/native.rs index 1570c7e..2e51eb2 100644 --- a/rust/logos-blockchain-circuits-poq-sys/src/native.rs +++ b/rust/logos-blockchain-circuits-poq-sys/src/native.rs @@ -60,6 +60,31 @@ mod tests { static INPUTS: LazyLock = LazyLock::new(|| PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("sample.input.json")); + #[test] + fn test_generate_witness_invalid_json_returns_err() { + let input = PoqWitnessInput::new("{".to_owned()).unwrap(); + assert!(generate_witness(&input).is_err()); + } + + #[test] + fn test_generate_witness_missing_inputs_returns_err() { + let input = PoqWitnessInput::new("{}".to_owned()).unwrap(); + assert!(generate_witness(&input).is_err()); + } + + #[test] + fn test_generate_witness_constraint_violation_returns_err() { + let json = std::fs::read_to_string(&*INPUTS).unwrap(); + // Swap core_root for a wrong value; the Merkle path no longer verifies, + // so is_registered.out = 0 and the constraint at circom line 108 fires. + let bad_json = json.replace( + "\"core_root\": \"20423847801203321296654759690878714805328777188198550442842378955293864405749\"", + "\"core_root\": \"1\"", + ); + let input = PoqWitnessInput::new(bad_json).unwrap(); + assert!(generate_witness(&input).is_err()); + } + #[test] fn test_generate_witness() { let dat = LIB_DIR.join("witness_generator"); diff --git a/rust/logos-blockchain-circuits-signature-sys/src/native.rs b/rust/logos-blockchain-circuits-signature-sys/src/native.rs index 62f710b..c2c847f 100644 --- a/rust/logos-blockchain-circuits-signature-sys/src/native.rs +++ b/rust/logos-blockchain-circuits-signature-sys/src/native.rs @@ -65,6 +65,18 @@ mod tests { static INPUTS: LazyLock = LazyLock::new(|| PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("sample.input.json")); + #[test] + fn test_generate_witness_invalid_json_returns_err() { + let input = SignatureWitnessInput::new("{".to_owned()).unwrap(); + assert!(generate_witness(&input).is_err()); + } + + #[test] + fn test_generate_witness_missing_inputs_returns_err() { + let input = SignatureWitnessInput::new("{}".to_owned()).unwrap(); + assert!(generate_witness(&input).is_err()); + } + #[test] fn test_generate_witness() { let dat = LIB_DIR.join("witness_generator"); diff --git a/rust/logos-blockchain-circuits-tests/tests/conflicts.rs b/rust/logos-blockchain-circuits-tests/tests/conflicts.rs index 5d58d5d..446718e 100644 --- a/rust/logos-blockchain-circuits-tests/tests/conflicts.rs +++ b/rust/logos-blockchain-circuits-tests/tests/conflicts.rs @@ -22,4 +22,23 @@ mod tests { let poq_result = lbc_poq_sys::generate_witness(&inputs_json); assert!(poq_result.is_ok()); } + + #[test] + fn test_concurrent_poq_calls() { + let inputs_json_raw = std::fs::read_to_string(inputs::POQ.as_path()).unwrap(); + + let handles: Vec<_> = (0..4) + .map(|_| { + let json = inputs_json_raw.clone(); + std::thread::spawn(move || { + let input = PoqWitnessInput::new(json).unwrap(); + lbc_poq_sys::generate_witness(&input) + }) + }) + .collect(); + + for h in handles { + assert!(h.join().unwrap().is_ok()); + } + } }