github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/internal/jsre/jsre_test.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:38</date> 10 //</624450092916543488> 11 12 13 package jsre 14 15 import ( 16 "io/ioutil" 17 "os" 18 "path" 19 "testing" 20 "time" 21 22 "github.com/robertkrimen/otto" 23 ) 24 25 type testNativeObjectBinding struct{} 26 27 type msg struct { 28 Msg string 29 } 30 31 func (no *testNativeObjectBinding) TestMethod(call otto.FunctionCall) otto.Value { 32 m, err := call.Argument(0).ToString() 33 if err != nil { 34 return otto.UndefinedValue() 35 } 36 v, _ := call.Otto.ToValue(&msg{m}) 37 return v 38 } 39 40 func newWithTestJS(t *testing.T, testjs string) (*JSRE, string) { 41 dir, err := ioutil.TempDir("", "jsre-test") 42 if err != nil { 43 t.Fatal("cannot create temporary directory:", err) 44 } 45 if testjs != "" { 46 if err := ioutil.WriteFile(path.Join(dir, "test.js"), []byte(testjs), os.ModePerm); err != nil { 47 t.Fatal("cannot create test.js:", err) 48 } 49 } 50 return New(dir, os.Stdout), dir 51 } 52 53 func TestExec(t *testing.T) { 54 jsre, dir := newWithTestJS(t, `msg = "testMsg"`) 55 defer os.RemoveAll(dir) 56 57 err := jsre.Exec("test.js") 58 if err != nil { 59 t.Errorf("expected no error, got %v", err) 60 } 61 val, err := jsre.Run("msg") 62 if err != nil { 63 t.Errorf("expected no error, got %v", err) 64 } 65 if !val.IsString() { 66 t.Errorf("expected string value, got %v", val) 67 } 68 exp := "testMsg" 69 got, _ := val.ToString() 70 if exp != got { 71 t.Errorf("expected '%v', got '%v'", exp, got) 72 } 73 jsre.Stop(false) 74 } 75 76 func TestNatto(t *testing.T) { 77 jsre, dir := newWithTestJS(t, `setTimeout(function(){msg = "testMsg"}, 1);`) 78 defer os.RemoveAll(dir) 79 80 err := jsre.Exec("test.js") 81 if err != nil { 82 t.Errorf("expected no error, got %v", err) 83 } 84 time.Sleep(100 * time.Millisecond) 85 val, err := jsre.Run("msg") 86 if err != nil { 87 t.Errorf("expected no error, got %v", err) 88 } 89 if !val.IsString() { 90 t.Errorf("expected string value, got %v", val) 91 } 92 exp := "testMsg" 93 got, _ := val.ToString() 94 if exp != got { 95 t.Errorf("expected '%v', got '%v'", exp, got) 96 } 97 jsre.Stop(false) 98 } 99 100 func TestBind(t *testing.T) { 101 jsre := New("", os.Stdout) 102 defer jsre.Stop(false) 103 104 jsre.Bind("no", &testNativeObjectBinding{}) 105 106 _, err := jsre.Run(`no.TestMethod("testMsg")`) 107 if err != nil { 108 t.Errorf("expected no error, got %v", err) 109 } 110 } 111 112 func TestLoadScript(t *testing.T) { 113 jsre, dir := newWithTestJS(t, `msg = "testMsg"`) 114 defer os.RemoveAll(dir) 115 116 _, err := jsre.Run(`loadScript("test.js")`) 117 if err != nil { 118 t.Errorf("expected no error, got %v", err) 119 } 120 val, err := jsre.Run("msg") 121 if err != nil { 122 t.Errorf("expected no error, got %v", err) 123 } 124 if !val.IsString() { 125 t.Errorf("expected string value, got %v", val) 126 } 127 exp := "testMsg" 128 got, _ := val.ToString() 129 if exp != got { 130 t.Errorf("expected '%v', got '%v'", exp, got) 131 } 132 jsre.Stop(false) 133 } 134