diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2021-07-11 18:12:26 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-11 18:12:26 -0700 |
commit | 511c48a03adee54aaadbefdeb2d2d521f6a45843 (patch) | |
tree | 817acc25f4c598fdc985f306f29fb3c318f87c55 /test_plugin/tests | |
parent | eea6000ef6e30e6684995619e630d3beb7d7484b (diff) |
Revert "Remove unstable native plugins (#10908)"
This reverts commit 7dd4090c2a3dc0222fd6ff611eeb2bd69cd28224.
Diffstat (limited to 'test_plugin/tests')
-rw-r--r-- | test_plugin/tests/integration_tests.rs | 58 | ||||
-rw-r--r-- | test_plugin/tests/test.js | 135 |
2 files changed, 193 insertions, 0 deletions
diff --git a/test_plugin/tests/integration_tests.rs b/test_plugin/tests/integration_tests.rs new file mode 100644 index 000000000..e408f59db --- /dev/null +++ b/test_plugin/tests/integration_tests.rs @@ -0,0 +1,58 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. + +use std::process::Command; +use test_util::deno_cmd; + +#[cfg(debug_assertions)] +const BUILD_VARIANT: &str = "debug"; + +#[cfg(not(debug_assertions))] +const BUILD_VARIANT: &str = "release"; + +#[test] +fn basic() { + let mut build_plugin_base = Command::new("cargo"); + let mut build_plugin = + build_plugin_base.arg("build").arg("-p").arg("test_plugin"); + if BUILD_VARIANT == "release" { + build_plugin = build_plugin.arg("--release"); + } + let build_plugin_output = build_plugin.output().unwrap(); + assert!(build_plugin_output.status.success()); + let output = deno_cmd() + .arg("run") + .arg("--allow-plugin") + .arg("--unstable") + .arg("tests/test.js") + .arg(BUILD_VARIANT) + .output() + .unwrap(); + let stdout = std::str::from_utf8(&output.stdout).unwrap(); + let stderr = std::str::from_utf8(&output.stderr).unwrap(); + if !output.status.success() { + println!("stdout {}", stdout); + println!("stderr {}", stderr); + } + println!("{:?}", output.status); + assert!(output.status.success()); + let expected = "\ + Plugin rid: 3\n\ + Hello from sync plugin op.\n\ + args: TestArgs { val: \"1\" }\n\ + zero_copy: test\n\ + op_test_sync returned: test\n\ + Hello from async plugin op.\n\ + args: TestArgs { val: \"1\" }\n\ + zero_copy: 123\n\ + op_test_async returned: test\n\ + Hello from resource_table.add plugin op.\n\ + TestResource rid: 4\n\ + Hello from resource_table.get plugin op.\n\ + TestResource get value: hello plugin!\n\ + Hello from sync plugin op.\n\ + args: TestArgs { val: \"1\" }\n\ + Ops completed count is correct!\n\ + Ops dispatched count is correct!\n"; + assert_eq!(stdout, expected); + assert_eq!(stderr, ""); +} diff --git a/test_plugin/tests/test.js b/test_plugin/tests/test.js new file mode 100644 index 000000000..2a2fa66b3 --- /dev/null +++ b/test_plugin/tests/test.js @@ -0,0 +1,135 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +// deno-lint-ignore-file + +const filenameBase = "test_plugin"; + +let filenameSuffix = ".so"; +let filenamePrefix = "lib"; + +if (Deno.build.os === "windows") { + filenameSuffix = ".dll"; + filenamePrefix = ""; +} else if (Deno.build.os === "darwin") { + filenameSuffix = ".dylib"; +} + +const filename = `../target/${ + Deno.args[0] +}/${filenamePrefix}${filenameBase}${filenameSuffix}`; + +const resourcesPre = Deno.resources(); + +const pluginRid = Deno.openPlugin(filename); +console.log(`Plugin rid: ${pluginRid}`); + +const { + op_test_sync, + op_test_async, + op_test_resource_table_add, + op_test_resource_table_get, +} = Deno.core.ops(); + +if ( + op_test_sync === null || + op_test_async === null || + op_test_resource_table_add === null || + op_test_resource_table_get === null +) { + throw new Error("Not all expected ops were registered"); +} + +function runTestSync() { + const result = Deno.core.opSync( + "op_test_sync", + { val: "1" }, + new Uint8Array([116, 101, 115, 116]), + ); + + console.log(`op_test_sync returned: ${result}`); + + if (result !== "test") { + throw new Error("op_test_sync returned an unexpected value!"); + } +} + +async function runTestAsync() { + const promise = Deno.core.opAsync( + "op_test_async", + { val: "1" }, + new Uint8Array([49, 50, 51]), + ); + + if (!(promise instanceof Promise)) { + throw new Error("Expected promise!"); + } + + const result = await promise; + console.log(`op_test_async returned: ${result}`); + + if (result !== "test") { + throw new Error("op_test_async promise resolved to an unexpected value!"); + } +} + +function runTestResourceTable() { + const expect = "hello plugin!"; + + const testRid = Deno.core.opSync("op_test_resource_table_add", expect); + console.log(`TestResource rid: ${testRid}`); + + if (testRid === null || Deno.resources()[testRid] !== "TestResource") { + throw new Error("TestResource was not found!"); + } + + const testValue = Deno.core.opSync("op_test_resource_table_get", testRid); + console.log(`TestResource get value: ${testValue}`); + + if (testValue !== expect) { + throw new Error("Did not get correct resource value!"); + } + + Deno.close(testRid); +} + +function runTestOpCount() { + const start = Deno.metrics(); + + Deno.core.opSync("op_test_sync", { val: "1" }); + + const end = Deno.metrics(); + + if (end.opsCompleted - start.opsCompleted !== 1) { + throw new Error("The opsCompleted metric is not correct!"); + } + console.log("Ops completed count is correct!"); + + if (end.opsDispatched - start.opsDispatched !== 1) { + throw new Error("The opsDispatched metric is not correct!"); + } + console.log("Ops dispatched count is correct!"); +} + +function runTestPluginClose() { + // Closing does not yet work + Deno.close(pluginRid); + + const resourcesPost = Deno.resources(); + + const preStr = JSON.stringify(resourcesPre, null, 2); + const postStr = JSON.stringify(resourcesPost, null, 2); + if (preStr !== postStr) { + throw new Error( + `Difference in open resources before openPlugin and after Plugin.close(): +Before: ${preStr} +After: ${postStr}`, + ); + } + console.log("Correct number of resources"); +} + +runTestSync(); +await runTestAsync(); +runTestResourceTable(); + +runTestOpCount(); +// runTestPluginClose(); |