summaryrefslogtreecommitdiff
path: root/test_plugin/tests
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2021-07-11 18:12:26 -0700
committerGitHub <noreply@github.com>2021-07-11 18:12:26 -0700
commit511c48a03adee54aaadbefdeb2d2d521f6a45843 (patch)
tree817acc25f4c598fdc985f306f29fb3c318f87c55 /test_plugin/tests
parenteea6000ef6e30e6684995619e630d3beb7d7484b (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.rs58
-rw-r--r--test_plugin/tests/test.js135
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();