summaryrefslogtreecommitdiff
path: root/installer/test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'installer/test.ts')
-rw-r--r--installer/test.ts299
1 files changed, 262 insertions, 37 deletions
diff --git a/installer/test.ts b/installer/test.ts
index 536e74c4f..c1baa0be1 100644
--- a/installer/test.ts
+++ b/installer/test.ts
@@ -1,13 +1,13 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
-const { run, stat, makeTempDir, remove, env } = Deno;
+const { run, stat, makeTempDir, remove, env, readAll } = Deno;
import { test, runIfMain, TestFunction } from "../testing/mod.ts";
-import { assert, assertEquals, assertThrowsAsync } from "../testing/asserts.ts";
+import { assert, assertEquals } from "../testing/asserts.ts";
import { BufReader, EOF } from "../io/bufio.ts";
import { TextProtoReader } from "../textproto/mod.ts";
-import { install, uninstall } from "./mod.ts";
import * as path from "../fs/path.ts";
import * as fs from "../fs/mod.ts";
+import { install, isRemoteUrl } from "./mod.ts";
let fileServer: Deno.Process;
const isWindows = Deno.platform.os === "win";
@@ -37,13 +37,15 @@ function killFileServer(): void {
fileServer.stdout!.close();
}
-function installerTest(t: TestFunction): void {
+function installerTest(t: TestFunction, useOriginHomeDir = false): void {
const fn = async (): Promise<void> => {
await startFileServer();
const tempDir = await makeTempDir();
const envVars = env();
const originalHomeDir = envVars["HOME"];
- envVars["HOME"] = tempDir;
+ if (!useOriginHomeDir) {
+ envVars["HOME"] = tempDir;
+ }
try {
await t();
@@ -58,10 +60,14 @@ function installerTest(t: TestFunction): void {
}
installerTest(async function installBasic(): Promise<void> {
- await install("file_srv", "http://localhost:4500/http/file_server.ts", []);
+ await install(
+ "echo_test",
+ "http://localhost:4500/installer/testdata/echo.ts",
+ []
+ );
const { HOME } = env();
- const filePath = path.resolve(HOME, ".deno/bin/file_srv");
+ const filePath = path.resolve(HOME, ".deno/bin/echo_test");
const fileInfo = await stat(filePath);
assert(fileInfo.isFile());
@@ -71,11 +77,11 @@ installerTest(async function installBasic(): Promise<void> {
/* eslint-disable max-len */
`% This executable is generated by Deno. Please don't modify it unless you know what it means. %
@IF EXIST "%~dp0\deno.exe" (
- "%~dp0\deno.exe" "run" "http://localhost:4500/http/file_server.ts" %*
+ "%~dp0\deno.exe" "run" "http://localhost:4500/installer/testdata/echo.ts" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.TS;=;%
- "deno" "run" "http://localhost:4500/http/file_server.ts" %*
+ "deno" "run" "http://localhost:4500/installer/testdata/echo.ts" %*
)
`
/* eslint-enable max-len */
@@ -85,7 +91,7 @@ installerTest(async function installBasic(): Promise<void> {
assertEquals(
await fs.readFileStr(filePath),
/* eslint-disable max-len */
- `#/bin/sh
+ `#!/bin/sh
# This executable is generated by Deno. Please don't modify it unless you know what it means.
basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')")
@@ -94,10 +100,10 @@ case \`uname\` in
esac
if [ -x "$basedir/deno" ]; then
- "$basedir/deno" "run" "http://localhost:4500/http/file_server.ts" "$@"
+ "$basedir/deno" "run" "http://localhost:4500/installer/testdata/echo.ts" "$@"
ret=$?
else
- "deno" "run" "http://localhost:4500/http/file_server.ts" "$@"
+ "deno" "run" "http://localhost:4500/installer/testdata/echo.ts" "$@"
ret=$?
fi
exit $ret
@@ -106,15 +112,73 @@ exit $ret
);
});
-installerTest(async function installWithFlags(): Promise<void> {
- await install("file_server", "http://localhost:4500/http/file_server.ts", [
- "--allow-net",
- "--allow-read",
- "--foobar"
- ]);
+installerTest(async function installCustomDir(): Promise<void> {
+ const tempDir = await makeTempDir();
+
+ await install(
+ "echo_test",
+ "http://localhost:4500/installer/testdata/echo.ts",
+ [],
+ tempDir
+ );
+
+ const filePath = path.resolve(tempDir, "echo_test");
+ const fileInfo = await stat(filePath);
+ assert(fileInfo.isFile());
+
+ if (isWindows) {
+ assertEquals(
+ await fs.readFileStr(filePath + ".cmd"),
+ /* eslint-disable max-len */
+ `% This executable is generated by Deno. Please don't modify it unless you know what it means. %
+@IF EXIST "%~dp0\deno.exe" (
+ "%~dp0\deno.exe" "run" "http://localhost:4500/installer/testdata/echo.ts" %*
+) ELSE (
+ @SETLOCAL
+ @SET PATHEXT=%PATHEXT:;.TS;=;%
+ "deno" "run" "http://localhost:4500/installer/testdata/echo.ts" %*
+)
+`
+ /* eslint-enable max-len */
+ );
+ }
+
+ assertEquals(
+ await fs.readFileStr(filePath),
+ /* eslint-disable max-len */
+ `#!/bin/sh
+# This executable is generated by Deno. Please don't modify it unless you know what it means.
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')")
+
+case \`uname\` in
+ *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;;
+esac
+
+if [ -x "$basedir/deno" ]; then
+ "$basedir/deno" "run" "http://localhost:4500/installer/testdata/echo.ts" "$@"
+ ret=$?
+else
+ "deno" "run" "http://localhost:4500/installer/testdata/echo.ts" "$@"
+ ret=$?
+fi
+exit $ret
+`
+ /* eslint-enable max-len */
+ );
+});
+
+installerTest(async function installLocalModule(): Promise<void> {
+ let localModule = path.join(Deno.cwd(), "installer", "testdata", "echo.ts");
+ await install("echo_test", localModule, []);
const { HOME } = env();
- const filePath = path.resolve(HOME, ".deno/bin/file_server");
+ const filePath = path.resolve(HOME, ".deno/bin/echo_test");
+ const fileInfo = await stat(filePath);
+ assert(fileInfo.isFile());
+
+ if (isWindows) {
+ localModule = localModule.replace(/\\/g, "\\\\");
+ }
if (isWindows) {
assertEquals(
@@ -122,11 +186,11 @@ installerTest(async function installWithFlags(): Promise<void> {
/* eslint-disable max-len */
`% This executable is generated by Deno. Please don't modify it unless you know what it means. %
@IF EXIST "%~dp0\deno.exe" (
- "%~dp0\deno.exe" "run" "--allow-net" "--allow-read" "http://localhost:4500/http/file_server.ts" "--foobar" %*
+ "%~dp0\deno.exe" "run" "${localModule}" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.TS;=;%
- "deno" "run" "--allow-net" "--allow-read" "http://localhost:4500/http/file_server.ts" "--foobar" %*
+ "deno" "run" "${localModule}" %*
)
`
/* eslint-enable max-len */
@@ -136,7 +200,7 @@ installerTest(async function installWithFlags(): Promise<void> {
assertEquals(
await fs.readFileStr(filePath),
/* eslint-disable max-len */
- `#/bin/sh
+ `#!/bin/sh
# This executable is generated by Deno. Please don't modify it unless you know what it means.
basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')")
@@ -145,10 +209,10 @@ case \`uname\` in
esac
if [ -x "$basedir/deno" ]; then
- "$basedir/deno" "run" "--allow-net" "--allow-read" "http://localhost:4500/http/file_server.ts" "--foobar" "$@"
+ "$basedir/deno" "run" "${localModule}" "$@"
ret=$?
else
- "deno" "run" "--allow-net" "--allow-read" "http://localhost:4500/http/file_server.ts" "--foobar" "$@"
+ "deno" "run" "${localModule}" "$@"
ret=$?
fi
exit $ret
@@ -157,26 +221,187 @@ exit $ret
);
});
-installerTest(async function uninstallBasic(): Promise<void> {
- await install("file_server", "http://localhost:4500/http/file_server.ts", []);
+installerTest(async function installWithFlags(): Promise<void> {
+ await install(
+ "echo_test",
+ "http://localhost:4500/installer/testdata/echo.ts",
+ ["--allow-net", "--allow-read", "--foobar"]
+ );
const { HOME } = env();
- const filePath = path.resolve(HOME, ".deno/bin/file_server");
+ const filePath = path.resolve(HOME, ".deno/bin/echo_test");
- await uninstall("file_server");
+ if (isWindows) {
+ assertEquals(
+ await fs.readFileStr(filePath + ".cmd"),
+ /* eslint-disable max-len */
+ `% This executable is generated by Deno. Please don't modify it unless you know what it means. %
+@IF EXIST "%~dp0\deno.exe" (
+ "%~dp0\deno.exe" "run" "--allow-net" "--allow-read" "http://localhost:4500/installer/testdata/echo.ts" "--foobar" %*
+) ELSE (
+ @SETLOCAL
+ @SET PATHEXT=%PATHEXT:;.TS;=;%
+ "deno" "run" "--allow-net" "--allow-read" "http://localhost:4500/installer/testdata/echo.ts" "--foobar" %*
+)
+`
+ /* eslint-enable max-len */
+ );
+ }
- assert(!(await fs.exists(filePath)));
- assert(!(await fs.exists(filePath + ".cmd")));
+ assertEquals(
+ await fs.readFileStr(filePath),
+ /* eslint-disable max-len */
+ `#!/bin/sh
+# This executable is generated by Deno. Please don't modify it unless you know what it means.
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')")
+
+case \`uname\` in
+ *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;;
+esac
+
+if [ -x "$basedir/deno" ]; then
+ "$basedir/deno" "run" "--allow-net" "--allow-read" "http://localhost:4500/installer/testdata/echo.ts" "--foobar" "$@"
+ ret=$?
+else
+ "deno" "run" "--allow-net" "--allow-read" "http://localhost:4500/installer/testdata/echo.ts" "--foobar" "$@"
+ ret=$?
+fi
+exit $ret
+`
+ /* eslint-enable max-len */
+ );
});
-installerTest(async function uninstallNonExistentModule(): Promise<void> {
- await assertThrowsAsync(
- async (): Promise<void> => {
- await uninstall("file_server");
- },
- Error,
- "file_server not found"
+installerTest(async function installLocalModuleAndRun(): Promise<void> {
+ const localModule = path.join(Deno.cwd(), "installer", "testdata", "echo.ts");
+ await install("echo_test", localModule, ["hello"]);
+
+ const { HOME } = env();
+ const filePath = path.resolve(HOME, ".deno/bin/echo_test");
+ const fileInfo = await stat(filePath);
+ assert(fileInfo.isFile());
+
+ const ps = run({
+ args: ["echo_test" + (isWindows ? ".cmd" : ""), "foo"],
+ stdout: "piped"
+ });
+
+ if (!ps.stdout) {
+ assert(!!ps.stdout, "There should have stdout.");
+ return;
+ }
+
+ let thrown = false;
+
+ try {
+ const b = await readAll(ps.stdout);
+
+ const s = new TextDecoder("utf-8").decode(b);
+
+ assertEquals(s, "hello, foo");
+ } catch (err) {
+ console.error(err);
+ thrown = true;
+ } finally {
+ await remove(filePath);
+ ps.close();
+ }
+
+ assert(!thrown, "It should not throw an error");
+}, true); // set true to install module in your real $HOME dir.
+
+installerTest(async function installAndMakesureItCanRun(): Promise<void> {
+ await install(
+ "echo_test",
+ "http://localhost:4500/installer/testdata/echo.ts",
+ ["hello"]
);
+
+ const { HOME } = env();
+ const filePath = path.resolve(HOME, ".deno/bin/echo_test");
+ const fileInfo = await stat(filePath);
+ assert(fileInfo.isFile());
+
+ const ps = run({
+ args: ["echo_test" + (isWindows ? ".cmd" : ""), "foo"],
+ stdout: "piped"
+ });
+
+ if (!ps.stdout) {
+ assert(!!ps.stdout, "There should have stdout.");
+ return;
+ }
+
+ let thrown = false;
+
+ try {
+ const b = await readAll(ps.stdout);
+
+ const s = new TextDecoder("utf-8").decode(b);
+
+ assertEquals(s, "hello, foo");
+ } catch (err) {
+ console.error(err);
+ thrown = true;
+ } finally {
+ await remove(filePath);
+ ps.close();
+ }
+
+ assert(!thrown, "It should not throw an error");
+}, true); // set true to install module in your real $HOME dir.
+
+installerTest(async function installAndMakesureArgsRight(): Promise<void> {
+ await install(
+ "args_test",
+ "http://localhost:4500/installer/testdata/args.ts",
+ ["arg1", "--flag1"]
+ );
+
+ const { HOME } = env();
+ const filePath = path.resolve(HOME, ".deno/bin/args_test");
+ const fileInfo = await stat(filePath);
+ assert(fileInfo.isFile());
+
+ const ps = run({
+ args: ["args_test" + (isWindows ? ".cmd" : ""), "arg2", "--flag2"],
+ stdout: "piped"
+ });
+
+ if (!ps.stdout) {
+ assert(!!ps.stdout, "There should have stdout.");
+ return;
+ }
+
+ let thrown = false;
+
+ try {
+ const b = await readAll(ps.stdout);
+
+ const s = new TextDecoder("utf-8").decode(b);
+
+ const obj = JSON.parse(s);
+
+ assertEquals(obj[0], "arg1");
+ assertEquals(obj[1], "--flag1");
+ assertEquals(obj[2], "arg2");
+ assertEquals(obj[3], "--flag2");
+ } catch (err) {
+ console.error(err);
+ thrown = true;
+ } finally {
+ await remove(filePath);
+ ps.close();
+ }
+
+ assert(!thrown, "It should not throw an error");
+}, true); // set true to install module in your real $HOME dir.
+
+test(function testIsRemoteUrl(): void {
+ assert(isRemoteUrl("https://deno.land/std/http/file_server.ts"));
+ assert(isRemoteUrl("http://deno.land/std/http/file_server.ts"));
+ assert(!isRemoteUrl("file:///dev/deno_std/http/file_server.ts"));
+ assert(!isRemoteUrl("./dev/deno_std/http/file_server.ts"));
});
runIfMain(import.meta);