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