summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorParsa Ghadimi <me@qti3e.com>2018-05-30 17:03:55 +0430
committerRyan Dahl <ry@tinyclouds.org>2018-05-30 08:33:55 -0400
commit2242c6c7921fcb681d3be7683fba862b4954b04a (patch)
tree12a1b50c1e180caafb35a7f37df64aed98e8399d
parent1156467c937f5b9af532a25fa80a706eea8f959d (diff)
Use wildcard to check stack trace outputs (#3)
-rw-r--r--Makefile4
-rw-r--r--TODO.txt4
-rw-r--r--integration_test.go32
-rw-r--r--testdata/006_url_imports.ts.out1
-rw-r--r--testdata/async_error.ts (renamed from testdata/013_async_throw.ts)0
-rw-r--r--testdata/async_error.ts.out10
-rw-r--r--testdata/error.ts (renamed from testdata/007_stack_trace.ts)0
-rw-r--r--testdata/error.ts.out10
-rw-r--r--util.go45
-rw-r--r--util_test.go62
10 files changed, 141 insertions, 27 deletions
diff --git a/Makefile b/Makefile
index 437e8882f..9bcc37f3c 100644
--- a/Makefile
+++ b/Makefile
@@ -30,7 +30,9 @@ GO_FILES = \
os.go \
os_test.go \
timers.go \
- util.go
+ util.go \
+ util_test.go \
+ integration_test.go
deno: msg.pb.go $(GO_FILES)
diff --git a/TODO.txt b/TODO.txt
index fc87dd09c..362897fd2 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -1,9 +1,5 @@
- Fix v8_source_maps.ts so that we don't get random segfaults.
-- Add wildcard support to testdata/*.out tests so that we can check
- the stack trace output in testdata/007_stack_trace.ts and
- testdata/013_async_throw.ts.
-
- Remove text-encoding.d.ts because TS2.8 includes the declarations.
https://github.com/DefinitelyTyped/DefinitelyTyped/issues/24695
diff --git a/integration_test.go b/integration_test.go
index d98856f37..9f780f0fd 100644
--- a/integration_test.go
+++ b/integration_test.go
@@ -47,7 +47,7 @@ func listTestFiles() []string {
return out
}
-func checkOutput(t *testing.T, outFile string) {
+func checkOutput(t *testing.T, outFile string, shouldSucceed bool) {
outFile = path.Join("testdata", outFile)
jsFile := strings.TrimSuffix(outFile, ".out")
@@ -57,10 +57,12 @@ func checkOutput(t *testing.T, outFile string) {
}
actual, _, err := deno(jsFile)
- if err != nil {
- t.Fatal(err.Error())
+ if shouldSucceed && err != nil {
+ t.Fatalf("Expected success %s", err.Error())
+ } else if !shouldSucceed && err == nil {
+ t.Fatalf("Expected failure but got success")
}
- if bytes.Compare(actual, expected) != 0 {
+ if !patternMatch(string(expected), string(actual)) {
t.Fatalf(`Actual output does not match expected.
-----Actual-------------------
%s-----Expected-----------------
@@ -77,10 +79,9 @@ func deno(inputFn string) (actual []byte, cachedir string, err error) {
cmd := exec.Command(denoFn, "--cachedir="+cachedir, inputFn)
var out bytes.Buffer
cmd.Stdout = &out
+ cmd.Stderr = &out
err = cmd.Run()
- if err == nil {
- actual = out.Bytes()
- }
+ actual = out.Bytes()
return
}
@@ -100,7 +101,8 @@ func TestIntegrationFiles(t *testing.T) {
outFiles := listTestFiles()
for _, outFile := range outFiles {
t.Run(outFile, func(t *testing.T) {
- checkOutput(t, outFile)
+ shouldSucceed := strings.Index(outFile, "error") < 0
+ checkOutput(t, outFile, shouldSucceed)
})
}
}
@@ -133,20 +135,6 @@ func TestIntegrationUrlArgs(t *testing.T) {
}
}
-func TestErrors(t *testing.T) {
- integrationTestSetup()
-
- _, _, err := deno("testdata/013_async_throw.ts")
- if err == nil {
- t.Fatalf("Expected error.")
- }
-
- _, _, err = deno("testdata/007_stack_trace.ts")
- if err == nil {
- t.Fatalf("Expected error.")
- }
-}
-
func TestTestsTs(t *testing.T) {
integrationTestSetup()
// TODO Need unit test for each of the permissions.
diff --git a/testdata/006_url_imports.ts.out b/testdata/006_url_imports.ts.out
index 989ce33e9..f745fe3cf 100644
--- a/testdata/006_url_imports.ts.out
+++ b/testdata/006_url_imports.ts.out
@@ -1,2 +1,3 @@
+Downloading http://localhost:4545/testdata/subdir/print_hello.ts
Hello
success
diff --git a/testdata/013_async_throw.ts b/testdata/async_error.ts
index 12dee11eb..12dee11eb 100644
--- a/testdata/013_async_throw.ts
+++ b/testdata/async_error.ts
diff --git a/testdata/async_error.ts.out b/testdata/async_error.ts.out
new file mode 100644
index 000000000..7b7dc9d19
--- /dev/null
+++ b/testdata/async_error.ts.out
@@ -0,0 +1,10 @@
+hello
+before error
+error Error: error
+ at foo ([WILDCARD]testdata/async_error.ts:4:11)
+ at eval ([WILDCARD]testdata/async_error.ts:6:1)
+ at Object.eval [as globalEval] (<anonymous>)
+ at execute (/main.js:[WILDCARD])
+ at FileModule.compileAndRun (/main.js:[WILDCARD])
+ at /main.js:[WILDCARD]
+ at /main.js:[WILDCARD]
diff --git a/testdata/007_stack_trace.ts b/testdata/error.ts
index 624bc55da..624bc55da 100644
--- a/testdata/007_stack_trace.ts
+++ b/testdata/error.ts
diff --git a/testdata/error.ts.out b/testdata/error.ts.out
new file mode 100644
index 000000000..952758df9
--- /dev/null
+++ b/testdata/error.ts.out
@@ -0,0 +1,10 @@
+/main.js:[WILDCARD]
+ throw _iteratorError;
+ ^
+Error: bad
+ at foo ([WILDCARD]testdata/error.ts:2:9)
+ at bar ([WILDCARD]testdata/error.ts:6:3)
+ at eval ([WILDCARD]testdata/error.ts:9:1)
+ at Object.eval [as globalEval] (<anonymous>)
+ at execute (../runtime.ts:[WILDCARD])
+ at FileModule.compileAndRun (../runtime.ts:[WILDCARD]
diff --git a/util.go b/util.go
index 2662a256b..d5b83c393 100644
--- a/util.go
+++ b/util.go
@@ -6,6 +6,7 @@ import (
"fmt"
"net/url"
"os"
+ "strings"
)
func logDebug(format string, v ...interface{}) {
@@ -59,3 +60,47 @@ func async(cb func()) {
wg.Done()
}()
}
+
+const wildcard = "[WILDCARD]"
+
+// Matches the pattern string against the text string. The pattern can
+// contain "[WILDCARD]" substrings which will match one or more characters.
+// Returns true if matched.
+func patternMatch(pattern string, text string) bool {
+ // Empty pattern only match empty text.
+ if len(pattern) == 0 {
+ return len(text) == 0
+ }
+
+ if pattern == wildcard {
+ return true
+ }
+
+ parts := strings.Split(pattern, wildcard)
+
+ if len(parts) == 1 {
+ return pattern == text
+ }
+
+ if strings.HasPrefix(text, parts[0]) {
+ text = text[len(parts[0]):]
+ } else {
+ return false
+ }
+
+ for i := 1; i < len(parts); i++ {
+ // If the last part is empty, we match.
+ if i == len(parts)-1 {
+ if parts[i] == "" || parts[i] == "\n" {
+ return true
+ }
+ }
+ index := strings.Index(text, parts[i])
+ if index < 0 {
+ return false
+ }
+ text = text[index+len(parts[i]):]
+ }
+
+ return len(text) == 0
+}
diff --git a/util_test.go b/util_test.go
new file mode 100644
index 000000000..9f44454df
--- /dev/null
+++ b/util_test.go
@@ -0,0 +1,62 @@
+package deno
+
+import (
+ "testing"
+)
+
+const exStackTrace = `hello
+before error
+error Error: error
+ at foo (/Users/rld/go/src/github.com/ry/deno/testdata/013_async_throw.ts:4:11)
+ at eval (/Users/rld/go/src/github.com/ry/deno/testdata/013_async_throw.ts:6:1)
+ at Object.eval [as globalEval] (<anonymous>)
+ at execute (/main.js:144781:15)
+ at FileModule.compileAndRun (/main.js:144678:13)
+ at /main.js:145161:13
+ at /main.js:15733:13`
+const exStackTracePattern = `hello
+before error
+error Error: error
+ at foo ([WILDCARD]testdata/013_async_throw.ts:4:11)
+ at eval ([WILDCARD]testdata/013_async_throw.ts:6:1)
+ at Object.eval [as globalEval] (<anonymous>)
+ at execute (/main.js:[WILDCARD]`
+
+func TestPatternMatch(t *testing.T) {
+ if patternMatch("aa", "a") != false {
+ t.Fatalf("Wrong resullt (1).")
+ }
+ if patternMatch("aaa[WILDCARD]b", "aaaxsdfdb") != true {
+ t.Fatalf("Wrong resullt (2).")
+ }
+ if patternMatch("aab[WILDCARD]", "xsd") != false {
+ t.Fatalf("Wrong resullt (3).")
+ }
+ if patternMatch("a[WILDCARD]b[WILDCARD]c", "abc") != true {
+ t.Fatalf("Wrong resullt (4).")
+ }
+ if patternMatch("a[WILDCARD]b[WILDCARD]c", "axbc") != true {
+ t.Fatalf("Wrong resullt (5).")
+ }
+ if patternMatch("a[WILDCARD]b[WILDCARD]c", "abxc") != true {
+ t.Fatalf("Wrong resullt (6).")
+ }
+ if patternMatch("a[WILDCARD]b[WILDCARD]c", "axbxc") != true {
+ t.Fatalf("Wrong resullt (7).")
+ }
+ if patternMatch("a[WILDCARD]b[WILDCARD]c", "abcx") != false {
+ t.Fatalf("Wrong resullt (8).")
+ }
+ if patternMatch("a[WILDCARD][WILDCARD]c", "abc") != true {
+ t.Fatalf("Wrong resullt (9).")
+ }
+ if patternMatch("a[WILDCARD][WILDCARD]c", "ac") != true {
+ t.Fatalf("Wrong resullt (10).")
+ }
+}
+
+func TestPatternMatchStackTrace(t *testing.T) {
+ if patternMatch(exStackTracePattern, exStackTrace) != true {
+ t.Fatalf("Wrong resullt (11).")
+ }
+}