Skip to content

Commit f0fc2a9

Browse files
committed
fix(pact_ffi): update mock server status functions to use the server manager Tokio runtime #511
1 parent a6bdccd commit f0fc2a9

4 files changed

Lines changed: 41 additions & 88 deletions

File tree

rust/Cargo.lock

Lines changed: 17 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/pact_ffi/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ onig = { version = "6.5.1", default-features = false }
3131
# FFI Inmemory sink uses the global static `LOG_BUFFER` in the pact_matching crate. This is required to be the same
3232
# version as the mock server crate
3333
pact_matching = { version = "~2.0.2", path = "../pact_matching" }
34-
pact_mock_server = "~2.2.0"
34+
pact_mock_server = "~2.2.1"
3535
pact_models = { version = "~1.3.7" }
3636
pact-plugin-driver = { version = "~0.7.5" }
3737
pact_verifier = { version = "~1.3.2", path = "../pact_verifier" }

rust/pact_ffi/src/mock_server/mod.rs

Lines changed: 20 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -224,20 +224,8 @@ ffi_fn! {
224224
fn pactffi_mock_server_matched(mock_server_port: i32) -> bool {
225225
let mut guard = MANAGER.lock().unwrap();
226226
let manager = guard.get_or_insert_with(ServerManager::new);
227-
manager.find_mock_server_by_port(mock_server_port as u16, &|_, _, mock_server| {
228-
match mock_server {
229-
Either::Left(mock_server) => mock_server.mismatches().is_empty(),
230-
Either::Right(plugin_mock_server) => {
231-
match futures::executor::block_on(get_mock_server_results(&plugin_mock_server.mock_server_details)) {
232-
Ok(results) => results.is_empty(),
233-
Err(err) => {
234-
error!("Request to plugin to get matching results failed - {}", err);
235-
false
236-
}
237-
}
238-
}
239-
}
240-
}).unwrap_or(false)
227+
manager.mock_server_matched_by_port(mock_server_port as u16)
228+
.unwrap_or(false)
241229
}
242230
{
243231
false
@@ -262,69 +250,31 @@ ffi_fn! {
262250
fn pactffi_mock_server_mismatches(mock_server_port: i32) -> *mut c_char {
263251
let mut guard = MANAGER.lock().unwrap();
264252
let manager = guard.get_or_insert_with(ServerManager::new);
265-
let mismatches = manager.find_mock_server_by_port(mock_server_port as u16, &|_, _, mock_server| {
266-
match mock_server {
267-
Either::Left(mock_server) => {
268-
serde_json::Value::Array(
269-
mock_server.mismatches()
270-
.iter()
271-
.map(|mismatch| mismatch.to_json())
272-
.collect()
273-
).to_string()
274-
}
275-
Either::Right(plugin_mock_server) => {
276-
match futures::executor::block_on(get_mock_server_results(
277-
&plugin_mock_server.mock_server_details,
278-
)) {
279-
Ok(results) => json!(results
280-
.iter()
281-
.map(|item| {
282-
json!({
283-
"path": item.path,
284-
"error": item.error,
285-
"mismatches": item.mismatches.iter().map(|mismatch| {
286-
json!({
287-
"expected": mismatch.expected,
288-
"actual": mismatch.actual,
289-
"mismatch": mismatch.mismatch,
290-
"path": mismatch.path,
291-
"diff": mismatch.diff.clone().unwrap_or_default()
292-
})
293-
}).collect::<Vec<_>>()
294-
})
295-
})
296-
.collect::<Vec<_>>())
297-
.to_string(),
298-
Err(err) => {
299-
error!("Request to plugin to get matching results failed - {}", err);
300-
json!({
301-
"error": format!("Request to plugin to get matching results failed - {}", err)
302-
})
303-
.to_string()
304-
}
305-
}
306-
}
307-
}
308-
});
253+
let mismatches = manager.mock_server_mismatches_by_port(mock_server_port as u16);
309254

310255
match mismatches {
311-
Some(str) => {
256+
Ok(Some(results)) => {
257+
let str = Value::Array(results).to_string();
312258
match CString::new(str) {
313-
Ok(s) => {
314-
let p = s.as_ptr() as *mut _;
315-
manager.store_mock_server_resource(mock_server_port as u16, s);
316-
p
317-
}
318-
Err(err) => {
319-
error!("Failed to copy mismatches result - {}", err);
320-
ptr::null_mut()
321-
}
259+
Ok(s) => {
260+
let p = s.as_ptr() as *mut _;
261+
manager.store_mock_server_resource(mock_server_port as u16, s);
262+
p
263+
}
264+
Err(err) => {
265+
error!("Failed to copy mismatches result - {}", err);
266+
ptr::null_mut()
267+
}
322268
}
323269
}
324-
None => ptr::null_mut()
270+
Ok(None) => ptr::null_mut(),
271+
Err(err) => {
272+
error!("Request to plugin to get matching results failed - {}", err);
273+
ptr::null_mut()
274+
}
325275
}
326276
} {
327-
std::ptr::null_mut()
277+
ptr::null_mut()
328278
}
329279
}
330280

rust/pact_ffi/tests/tests.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ use pact_ffi::mock_server::handles::{
7171
PactHandle,
7272
};
7373
use pact_ffi::mock_server::handles::pactffi_with_matching_rules;
74+
use pact_ffi::mock_server::pactffi_mock_server_matched;
7475
use pact_ffi::verifier::{
7576
OptionsFlags,
7677
pactffi_verifier_add_directory_source,
@@ -485,13 +486,15 @@ fn http_consumer_feature_test() {
485486
};
486487

487488
thread::sleep(Duration::from_millis(100)); // Give mock server some time to update events
489+
let status = pactffi_mock_server_matched(port);
488490
let mismatches = unsafe {
489491
CStr::from_ptr(pactffi_mock_server_mismatches(port)).to_string_lossy().into_owned()
490492
};
491493

492494
pactffi_write_pact_file(port, file_path.as_ptr(), true);
493495
pactffi_cleanup_mock_server(port);
494496

497+
expect!(status).to(be_true());
495498
expect!(mismatches).to(be_equal_to("[]"));
496499
}
497500

0 commit comments

Comments
 (0)