js_test.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "os"
  6. "path"
  7. "testing"
  8. "github.com/robertkrimen/otto"
  9. "github.com/ethereum/go-ethereum/accounts"
  10. "github.com/ethereum/go-ethereum/crypto"
  11. "github.com/ethereum/go-ethereum/eth"
  12. )
  13. var port = 30300
  14. func testJEthRE(t *testing.T) (repl *jsre, ethereum *eth.Ethereum, err error) {
  15. os.RemoveAll("/tmp/eth/")
  16. err = os.MkdirAll("/tmp/eth/keys/e273f01c99144c438695e10f24926dc1f9fbf62d/", os.ModePerm)
  17. if err != nil {
  18. t.Errorf("%v", err)
  19. return
  20. }
  21. err = os.MkdirAll("/tmp/eth/data", os.ModePerm)
  22. if err != nil {
  23. t.Errorf("%v", err)
  24. return
  25. }
  26. // FIXME: this does not work ATM
  27. ks := crypto.NewKeyStorePlain("/tmp/eth/keys")
  28. ioutil.WriteFile("/tmp/eth/keys/e273f01c99144c438695e10f24926dc1f9fbf62d/e273f01c99144c438695e10f24926dc1f9fbf62d",
  29. []byte(`{"Id":"RhRXD+fNRKS4jx+7ZfEsNA==","Address":"4nPwHJkUTEOGleEPJJJtwfn79i0=","PrivateKey":"h4ACVpe74uIvi5Cg/2tX/Yrm2xdr3J7QoMbMtNX2CNc="}`), os.ModePerm)
  30. port++
  31. ethereum, err = eth.New(&eth.Config{
  32. DataDir: "/tmp/eth",
  33. AccountManager: accounts.NewManager(ks),
  34. Port: fmt.Sprintf("%d", port),
  35. MaxPeers: 10,
  36. Name: "test",
  37. })
  38. if err != nil {
  39. t.Errorf("%v", err)
  40. return
  41. }
  42. assetPath := path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "cmd", "mist", "assets", "ext")
  43. repl = newJSRE(ethereum, assetPath, false)
  44. return
  45. }
  46. func TestNodeInfo(t *testing.T) {
  47. repl, ethereum, err := testJEthRE(t)
  48. if err != nil {
  49. t.Errorf("error creating jsre, got %v", err)
  50. return
  51. }
  52. err = ethereum.Start()
  53. if err != nil {
  54. t.Errorf("error starting ethereum: %v", err)
  55. return
  56. }
  57. defer ethereum.Stop()
  58. val, err := repl.re.Run("admin.nodeInfo()")
  59. if err != nil {
  60. t.Errorf("expected no error, got %v", err)
  61. }
  62. exp, err := val.Export()
  63. if err != nil {
  64. t.Errorf("expected no error, got %v", err)
  65. }
  66. nodeInfo, ok := exp.(*eth.NodeInfo)
  67. if !ok {
  68. t.Errorf("expected nodeInfo, got %v", err)
  69. }
  70. exp = "test"
  71. got := nodeInfo.Name
  72. if exp != got {
  73. t.Errorf("expected %v, got %v", exp, got)
  74. }
  75. exp = 30301
  76. port := nodeInfo.DiscPort
  77. if exp != port {
  78. t.Errorf("expected %v, got %v", exp, port)
  79. }
  80. exp = 30301
  81. port = nodeInfo.TCPPort
  82. if exp != port {
  83. t.Errorf("expected %v, got %v", exp, port)
  84. }
  85. }
  86. func TestAccounts(t *testing.T) {
  87. repl, ethereum, err := testJEthRE(t)
  88. if err != nil {
  89. t.Errorf("error creating jsre, got %v", err)
  90. return
  91. }
  92. err = ethereum.Start()
  93. if err != nil {
  94. t.Errorf("error starting ethereum: %v", err)
  95. return
  96. }
  97. defer ethereum.Stop()
  98. val, err := repl.re.Run("eth.coinbase")
  99. if err != nil {
  100. t.Errorf("expected no error, got %v", err)
  101. }
  102. pp, err := repl.re.PrettyPrint(val)
  103. if err != nil {
  104. t.Errorf("%v", err)
  105. }
  106. if !val.IsString() {
  107. t.Errorf("incorrect type, expected string, got %v: %v", val, pp)
  108. }
  109. strVal, _ := val.ToString()
  110. expected := "0xe273f01c99144c438695e10f24926dc1f9fbf62d"
  111. if strVal != expected {
  112. t.Errorf("incorrect result, expected %s, got %v", expected, strVal)
  113. }
  114. val, err = repl.re.Run(`admin.newAccount("password")`)
  115. if err != nil {
  116. t.Errorf("expected no error, got %v", err)
  117. }
  118. addr, err := val.ToString()
  119. if err != nil {
  120. t.Errorf("expected string, got %v", err)
  121. }
  122. val, err = repl.re.Run("eth.accounts")
  123. if err != nil {
  124. t.Errorf("expected no error, got %v", err)
  125. }
  126. exp, err := val.Export()
  127. if err != nil {
  128. t.Errorf("expected no error, got %v", err)
  129. }
  130. interfaceAddr, ok := exp.([]interface{})
  131. if !ok {
  132. t.Errorf("expected []string, got %T", exp)
  133. }
  134. addrs := make([]string, len(interfaceAddr))
  135. for i, addr := range interfaceAddr {
  136. var ok bool
  137. if addrs[i], ok = addr.(string); !ok {
  138. t.Errorf("expected addrs[%d] to be string. Got %T instead", i, addr)
  139. }
  140. }
  141. if len(addrs) != 2 || (addr != addrs[0][2:] && addr != addrs[1][2:]) {
  142. t.Errorf("expected addrs == [<default>, <new>], got %v (%v)", addrs, addr)
  143. }
  144. }
  145. func TestBlockChain(t *testing.T) {
  146. repl, ethereum, err := testJEthRE(t)
  147. if err != nil {
  148. t.Errorf("error creating jsre, got %v", err)
  149. return
  150. }
  151. err = ethereum.Start()
  152. if err != nil {
  153. t.Errorf("error starting ethereum: %v", err)
  154. return
  155. }
  156. defer ethereum.Stop()
  157. // should get current block
  158. val0, err := repl.re.Run("admin.dumpBlock()")
  159. if err != nil {
  160. t.Errorf("expected no error, got %v", err)
  161. }
  162. fn := "/tmp/eth/data/blockchain.0"
  163. _, err = repl.re.Run("admin.export(\"" + fn + "\")")
  164. if err != nil {
  165. t.Errorf("expected no error, got %v", err)
  166. }
  167. if _, err = os.Stat(fn); err != nil {
  168. t.Errorf("expected no error on file, got %v", err)
  169. }
  170. _, err = repl.re.Run("admin.import(\"" + fn + "\")")
  171. if err != nil {
  172. t.Errorf("expected no error, got %v", err)
  173. }
  174. var val1 otto.Value
  175. // should get current block
  176. val1, err = repl.re.Run("admin.dumpBlock()")
  177. if err != nil {
  178. t.Errorf("expected no error, got %v", err)
  179. }
  180. // FIXME: neither != , nor reflect.DeepEqual works, doing string comparison
  181. v0 := fmt.Sprintf("%v", val0)
  182. v1 := fmt.Sprintf("%v", val1)
  183. if v0 != v1 {
  184. t.Errorf("expected same head after export-import, got %v (!=%v)", v1, v0)
  185. }
  186. }
  187. func TestMining(t *testing.T) {
  188. repl, ethereum, err := testJEthRE(t)
  189. if err != nil {
  190. t.Errorf("error creating jsre, got %v", err)
  191. return
  192. }
  193. err = ethereum.Start()
  194. if err != nil {
  195. t.Errorf("error starting ethereum: %v", err)
  196. return
  197. }
  198. defer ethereum.Stop()
  199. val, err := repl.re.Run("eth.mining")
  200. if err != nil {
  201. t.Errorf("expected no error, got %v", err)
  202. }
  203. var mining bool
  204. mining, err = val.ToBoolean()
  205. if err != nil {
  206. t.Errorf("expected boolean, got %v", err)
  207. }
  208. if mining {
  209. t.Errorf("expected false (not mining), got true")
  210. }
  211. }
  212. func TestRPC(t *testing.T) {
  213. repl, ethereum, err := testJEthRE(t)
  214. if err != nil {
  215. t.Errorf("error creating jsre, got %v", err)
  216. return
  217. }
  218. err = ethereum.Start()
  219. if err != nil {
  220. t.Errorf("error starting ethereum: %v", err)
  221. return
  222. }
  223. defer ethereum.Stop()
  224. val, err := repl.re.Run(`admin.startRPC("127.0.0.1", 5004)`)
  225. if err != nil {
  226. t.Errorf("expected no error, got %v", err)
  227. }
  228. success, _ := val.ToBoolean()
  229. if !success {
  230. t.Errorf("expected true (started), got false")
  231. }
  232. }