node_test.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. // Copyright 2015 The go-ethereum Authors
  2. // This file is part of the go-ethereum library.
  3. //
  4. // The go-ethereum library is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // The go-ethereum library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU Lesser General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Lesser General Public License
  15. // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
  16. package node
  17. import (
  18. "errors"
  19. "io/ioutil"
  20. "net/http"
  21. "os"
  22. "reflect"
  23. "testing"
  24. "time"
  25. "github.com/ethereum/go-ethereum/crypto"
  26. "github.com/ethereum/go-ethereum/p2p"
  27. "github.com/ethereum/go-ethereum/rpc"
  28. "github.com/stretchr/testify/assert"
  29. )
  30. var (
  31. testNodeKey, _ = crypto.GenerateKey()
  32. )
  33. func testNodeConfig() *Config {
  34. return &Config{
  35. Name: "test node",
  36. P2P: p2p.Config{PrivateKey: testNodeKey},
  37. }
  38. }
  39. // Tests that an empty protocol stack can be started, restarted and stopped.
  40. func TestNodeLifeCycle(t *testing.T) {
  41. stack, err := New(testNodeConfig())
  42. if err != nil {
  43. t.Fatalf("failed to create protocol stack: %v", err)
  44. }
  45. defer stack.Close()
  46. // Ensure that a stopped node can be stopped again
  47. for i := 0; i < 3; i++ {
  48. if err := stack.Stop(); err != ErrNodeStopped {
  49. t.Fatalf("iter %d: stop failure mismatch: have %v, want %v", i, err, ErrNodeStopped)
  50. }
  51. }
  52. // Ensure that a node can be successfully started, but only once
  53. if err := stack.Start(); err != nil {
  54. t.Fatalf("failed to start node: %v", err)
  55. }
  56. if err := stack.Start(); err != ErrNodeRunning {
  57. t.Fatalf("start failure mismatch: have %v, want %v ", err, ErrNodeRunning)
  58. }
  59. // Ensure that a node can be restarted arbitrarily many times
  60. for i := 0; i < 3; i++ {
  61. if err := stack.Restart(); err != nil {
  62. t.Fatalf("iter %d: failed to restart node: %v", i, err)
  63. }
  64. }
  65. // Ensure that a node can be stopped, but only once
  66. if err := stack.Stop(); err != nil {
  67. t.Fatalf("failed to stop node: %v", err)
  68. }
  69. if err := stack.Stop(); err != ErrNodeStopped {
  70. t.Fatalf("stop failure mismatch: have %v, want %v ", err, ErrNodeStopped)
  71. }
  72. }
  73. // Tests that if the data dir is already in use, an appropriate error is returned.
  74. func TestNodeUsedDataDir(t *testing.T) {
  75. // Create a temporary folder to use as the data directory
  76. dir, err := ioutil.TempDir("", "")
  77. if err != nil {
  78. t.Fatalf("failed to create temporary data directory: %v", err)
  79. }
  80. defer os.RemoveAll(dir)
  81. // Create a new node based on the data directory
  82. original, err := New(&Config{DataDir: dir})
  83. if err != nil {
  84. t.Fatalf("failed to create original protocol stack: %v", err)
  85. }
  86. defer original.Close()
  87. if err := original.Start(); err != nil {
  88. t.Fatalf("failed to start original protocol stack: %v", err)
  89. }
  90. defer original.Stop()
  91. // Create a second node based on the same data directory and ensure failure
  92. duplicate, err := New(&Config{DataDir: dir})
  93. if err != nil {
  94. t.Fatalf("failed to create duplicate protocol stack: %v", err)
  95. }
  96. defer duplicate.Close()
  97. if err := duplicate.Start(); err != ErrDatadirUsed {
  98. t.Fatalf("duplicate datadir failure mismatch: have %v, want %v", err, ErrDatadirUsed)
  99. }
  100. }
  101. // Tests whether services can be registered and duplicates caught.
  102. func TestServiceRegistry(t *testing.T) {
  103. stack, err := New(testNodeConfig())
  104. if err != nil {
  105. t.Fatalf("failed to create protocol stack: %v", err)
  106. }
  107. defer stack.Close()
  108. // Register a batch of unique services and ensure they start successfully
  109. services := []ServiceConstructor{NewNoopServiceA, NewNoopServiceB, NewNoopServiceC}
  110. for i, constructor := range services {
  111. if err := stack.Register(constructor); err != nil {
  112. t.Fatalf("service #%d: registration failed: %v", i, err)
  113. }
  114. }
  115. if err := stack.Start(); err != nil {
  116. t.Fatalf("failed to start original service stack: %v", err)
  117. }
  118. if err := stack.Stop(); err != nil {
  119. t.Fatalf("failed to stop original service stack: %v", err)
  120. }
  121. // Duplicate one of the services and retry starting the node
  122. if err := stack.Register(NewNoopServiceB); err != nil {
  123. t.Fatalf("duplicate registration failed: %v", err)
  124. }
  125. if err := stack.Start(); err == nil {
  126. t.Fatalf("duplicate service started")
  127. } else {
  128. if _, ok := err.(*DuplicateServiceError); !ok {
  129. t.Fatalf("duplicate error mismatch: have %v, want %v", err, DuplicateServiceError{})
  130. }
  131. }
  132. }
  133. // Tests that registered services get started and stopped correctly.
  134. func TestServiceLifeCycle(t *testing.T) {
  135. stack, err := New(testNodeConfig())
  136. if err != nil {
  137. t.Fatalf("failed to create protocol stack: %v", err)
  138. }
  139. defer stack.Close()
  140. // Register a batch of life-cycle instrumented services
  141. services := map[string]InstrumentingWrapper{
  142. "A": InstrumentedServiceMakerA,
  143. "B": InstrumentedServiceMakerB,
  144. "C": InstrumentedServiceMakerC,
  145. }
  146. started := make(map[string]bool)
  147. stopped := make(map[string]bool)
  148. for id, maker := range services {
  149. id := id // Closure for the constructor
  150. constructor := func(*ServiceContext) (Service, error) {
  151. return &InstrumentedService{
  152. startHook: func(*p2p.Server) { started[id] = true },
  153. stopHook: func() { stopped[id] = true },
  154. }, nil
  155. }
  156. if err := stack.Register(maker(constructor)); err != nil {
  157. t.Fatalf("service %s: registration failed: %v", id, err)
  158. }
  159. }
  160. // Start the node and check that all services are running
  161. if err := stack.Start(); err != nil {
  162. t.Fatalf("failed to start protocol stack: %v", err)
  163. }
  164. for id := range services {
  165. if !started[id] {
  166. t.Fatalf("service %s: freshly started service not running", id)
  167. }
  168. if stopped[id] {
  169. t.Fatalf("service %s: freshly started service already stopped", id)
  170. }
  171. }
  172. // Stop the node and check that all services have been stopped
  173. if err := stack.Stop(); err != nil {
  174. t.Fatalf("failed to stop protocol stack: %v", err)
  175. }
  176. for id := range services {
  177. if !stopped[id] {
  178. t.Fatalf("service %s: freshly terminated service still running", id)
  179. }
  180. }
  181. }
  182. // Tests that services are restarted cleanly as new instances.
  183. func TestServiceRestarts(t *testing.T) {
  184. stack, err := New(testNodeConfig())
  185. if err != nil {
  186. t.Fatalf("failed to create protocol stack: %v", err)
  187. }
  188. defer stack.Close()
  189. // Define a service that does not support restarts
  190. var (
  191. running bool
  192. started int
  193. )
  194. constructor := func(*ServiceContext) (Service, error) {
  195. running = false
  196. return &InstrumentedService{
  197. startHook: func(*p2p.Server) {
  198. if running {
  199. panic("already running")
  200. }
  201. running = true
  202. started++
  203. },
  204. }, nil
  205. }
  206. // Register the service and start the protocol stack
  207. if err := stack.Register(constructor); err != nil {
  208. t.Fatalf("failed to register the service: %v", err)
  209. }
  210. if err := stack.Start(); err != nil {
  211. t.Fatalf("failed to start protocol stack: %v", err)
  212. }
  213. defer stack.Stop()
  214. if !running || started != 1 {
  215. t.Fatalf("running/started mismatch: have %v/%d, want true/1", running, started)
  216. }
  217. // Restart the stack a few times and check successful service restarts
  218. for i := 0; i < 3; i++ {
  219. if err := stack.Restart(); err != nil {
  220. t.Fatalf("iter %d: failed to restart stack: %v", i, err)
  221. }
  222. }
  223. if !running || started != 4 {
  224. t.Fatalf("running/started mismatch: have %v/%d, want true/4", running, started)
  225. }
  226. }
  227. // Tests that if a service fails to initialize itself, none of the other services
  228. // will be allowed to even start.
  229. func TestServiceConstructionAbortion(t *testing.T) {
  230. stack, err := New(testNodeConfig())
  231. if err != nil {
  232. t.Fatalf("failed to create protocol stack: %v", err)
  233. }
  234. defer stack.Close()
  235. // Define a batch of good services
  236. services := map[string]InstrumentingWrapper{
  237. "A": InstrumentedServiceMakerA,
  238. "B": InstrumentedServiceMakerB,
  239. "C": InstrumentedServiceMakerC,
  240. }
  241. started := make(map[string]bool)
  242. for id, maker := range services {
  243. id := id // Closure for the constructor
  244. constructor := func(*ServiceContext) (Service, error) {
  245. return &InstrumentedService{
  246. startHook: func(*p2p.Server) { started[id] = true },
  247. }, nil
  248. }
  249. if err := stack.Register(maker(constructor)); err != nil {
  250. t.Fatalf("service %s: registration failed: %v", id, err)
  251. }
  252. }
  253. // Register a service that fails to construct itself
  254. failure := errors.New("fail")
  255. failer := func(*ServiceContext) (Service, error) {
  256. return nil, failure
  257. }
  258. if err := stack.Register(failer); err != nil {
  259. t.Fatalf("failer registration failed: %v", err)
  260. }
  261. // Start the protocol stack and ensure none of the services get started
  262. for i := 0; i < 100; i++ {
  263. if err := stack.Start(); err != failure {
  264. t.Fatalf("iter %d: stack startup failure mismatch: have %v, want %v", i, err, failure)
  265. }
  266. for id := range services {
  267. if started[id] {
  268. t.Fatalf("service %s: started should not have", id)
  269. }
  270. delete(started, id)
  271. }
  272. }
  273. }
  274. // Tests that if a service fails to start, all others started before it will be
  275. // shut down.
  276. func TestServiceStartupAbortion(t *testing.T) {
  277. stack, err := New(testNodeConfig())
  278. if err != nil {
  279. t.Fatalf("failed to create protocol stack: %v", err)
  280. }
  281. defer stack.Close()
  282. // Register a batch of good services
  283. services := map[string]InstrumentingWrapper{
  284. "A": InstrumentedServiceMakerA,
  285. "B": InstrumentedServiceMakerB,
  286. "C": InstrumentedServiceMakerC,
  287. }
  288. started := make(map[string]bool)
  289. stopped := make(map[string]bool)
  290. for id, maker := range services {
  291. id := id // Closure for the constructor
  292. constructor := func(*ServiceContext) (Service, error) {
  293. return &InstrumentedService{
  294. startHook: func(*p2p.Server) { started[id] = true },
  295. stopHook: func() { stopped[id] = true },
  296. }, nil
  297. }
  298. if err := stack.Register(maker(constructor)); err != nil {
  299. t.Fatalf("service %s: registration failed: %v", id, err)
  300. }
  301. }
  302. // Register a service that fails to start
  303. failure := errors.New("fail")
  304. failer := func(*ServiceContext) (Service, error) {
  305. return &InstrumentedService{
  306. start: failure,
  307. }, nil
  308. }
  309. if err := stack.Register(failer); err != nil {
  310. t.Fatalf("failer registration failed: %v", err)
  311. }
  312. // Start the protocol stack and ensure all started services stop
  313. for i := 0; i < 100; i++ {
  314. if err := stack.Start(); err != failure {
  315. t.Fatalf("iter %d: stack startup failure mismatch: have %v, want %v", i, err, failure)
  316. }
  317. for id := range services {
  318. if started[id] && !stopped[id] {
  319. t.Fatalf("service %s: started but not stopped", id)
  320. }
  321. delete(started, id)
  322. delete(stopped, id)
  323. }
  324. }
  325. }
  326. // Tests that even if a registered service fails to shut down cleanly, it does
  327. // not influece the rest of the shutdown invocations.
  328. func TestServiceTerminationGuarantee(t *testing.T) {
  329. stack, err := New(testNodeConfig())
  330. if err != nil {
  331. t.Fatalf("failed to create protocol stack: %v", err)
  332. }
  333. defer stack.Close()
  334. // Register a batch of good services
  335. services := map[string]InstrumentingWrapper{
  336. "A": InstrumentedServiceMakerA,
  337. "B": InstrumentedServiceMakerB,
  338. "C": InstrumentedServiceMakerC,
  339. }
  340. started := make(map[string]bool)
  341. stopped := make(map[string]bool)
  342. for id, maker := range services {
  343. id := id // Closure for the constructor
  344. constructor := func(*ServiceContext) (Service, error) {
  345. return &InstrumentedService{
  346. startHook: func(*p2p.Server) { started[id] = true },
  347. stopHook: func() { stopped[id] = true },
  348. }, nil
  349. }
  350. if err := stack.Register(maker(constructor)); err != nil {
  351. t.Fatalf("service %s: registration failed: %v", id, err)
  352. }
  353. }
  354. // Register a service that fails to shot down cleanly
  355. failure := errors.New("fail")
  356. failer := func(*ServiceContext) (Service, error) {
  357. return &InstrumentedService{
  358. stop: failure,
  359. }, nil
  360. }
  361. if err := stack.Register(failer); err != nil {
  362. t.Fatalf("failer registration failed: %v", err)
  363. }
  364. // Start the protocol stack, and ensure that a failing shut down terminates all
  365. for i := 0; i < 100; i++ {
  366. // Start the stack and make sure all is online
  367. if err := stack.Start(); err != nil {
  368. t.Fatalf("iter %d: failed to start protocol stack: %v", i, err)
  369. }
  370. for id := range services {
  371. if !started[id] {
  372. t.Fatalf("iter %d, service %s: service not running", i, id)
  373. }
  374. if stopped[id] {
  375. t.Fatalf("iter %d, service %s: service already stopped", i, id)
  376. }
  377. }
  378. // Stop the stack, verify failure and check all terminations
  379. err := stack.Stop()
  380. if err, ok := err.(*StopError); !ok {
  381. t.Fatalf("iter %d: termination failure mismatch: have %v, want StopError", i, err)
  382. } else {
  383. failer := reflect.TypeOf(&InstrumentedService{})
  384. if err.Services[failer] != failure {
  385. t.Fatalf("iter %d: failer termination failure mismatch: have %v, want %v", i, err.Services[failer], failure)
  386. }
  387. if len(err.Services) != 1 {
  388. t.Fatalf("iter %d: failure count mismatch: have %d, want %d", i, len(err.Services), 1)
  389. }
  390. }
  391. for id := range services {
  392. if !stopped[id] {
  393. t.Fatalf("iter %d, service %s: service not terminated", i, id)
  394. }
  395. delete(started, id)
  396. delete(stopped, id)
  397. }
  398. }
  399. }
  400. // TestServiceRetrieval tests that individual services can be retrieved.
  401. func TestServiceRetrieval(t *testing.T) {
  402. // Create a simple stack and register two service types
  403. stack, err := New(testNodeConfig())
  404. if err != nil {
  405. t.Fatalf("failed to create protocol stack: %v", err)
  406. }
  407. defer stack.Close()
  408. if err := stack.Register(NewNoopService); err != nil {
  409. t.Fatalf("noop service registration failed: %v", err)
  410. }
  411. if err := stack.Register(NewInstrumentedService); err != nil {
  412. t.Fatalf("instrumented service registration failed: %v", err)
  413. }
  414. // Make sure none of the services can be retrieved until started
  415. var noopServ *NoopService
  416. if err := stack.Service(&noopServ); err != ErrNodeStopped {
  417. t.Fatalf("noop service retrieval mismatch: have %v, want %v", err, ErrNodeStopped)
  418. }
  419. var instServ *InstrumentedService
  420. if err := stack.Service(&instServ); err != ErrNodeStopped {
  421. t.Fatalf("instrumented service retrieval mismatch: have %v, want %v", err, ErrNodeStopped)
  422. }
  423. // Start the stack and ensure everything is retrievable now
  424. if err := stack.Start(); err != nil {
  425. t.Fatalf("failed to start stack: %v", err)
  426. }
  427. defer stack.Stop()
  428. if err := stack.Service(&noopServ); err != nil {
  429. t.Fatalf("noop service retrieval mismatch: have %v, want %v", err, nil)
  430. }
  431. if err := stack.Service(&instServ); err != nil {
  432. t.Fatalf("instrumented service retrieval mismatch: have %v, want %v", err, nil)
  433. }
  434. }
  435. // Tests that all protocols defined by individual services get launched.
  436. func TestProtocolGather(t *testing.T) {
  437. stack, err := New(testNodeConfig())
  438. if err != nil {
  439. t.Fatalf("failed to create protocol stack: %v", err)
  440. }
  441. defer stack.Close()
  442. // Register a batch of services with some configured number of protocols
  443. services := map[string]struct {
  444. Count int
  445. Maker InstrumentingWrapper
  446. }{
  447. "zero": {0, InstrumentedServiceMakerA},
  448. "one": {1, InstrumentedServiceMakerB},
  449. "many": {10, InstrumentedServiceMakerC},
  450. }
  451. for id, config := range services {
  452. protocols := make([]p2p.Protocol, config.Count)
  453. for i := 0; i < len(protocols); i++ {
  454. protocols[i].Name = id
  455. protocols[i].Version = uint(i)
  456. }
  457. constructor := func(*ServiceContext) (Service, error) {
  458. return &InstrumentedService{
  459. protocols: protocols,
  460. }, nil
  461. }
  462. if err := stack.Register(config.Maker(constructor)); err != nil {
  463. t.Fatalf("service %s: registration failed: %v", id, err)
  464. }
  465. }
  466. // Start the services and ensure all protocols start successfully
  467. if err := stack.Start(); err != nil {
  468. t.Fatalf("failed to start protocol stack: %v", err)
  469. }
  470. defer stack.Stop()
  471. protocols := stack.Server().Protocols
  472. if len(protocols) != 11 {
  473. t.Fatalf("mismatching number of protocols launched: have %d, want %d", len(protocols), 26)
  474. }
  475. for id, config := range services {
  476. for ver := 0; ver < config.Count; ver++ {
  477. launched := false
  478. for i := 0; i < len(protocols); i++ {
  479. if protocols[i].Name == id && protocols[i].Version == uint(ver) {
  480. launched = true
  481. break
  482. }
  483. }
  484. if !launched {
  485. t.Errorf("configured protocol not launched: %s v%d", id, ver)
  486. }
  487. }
  488. }
  489. }
  490. // Tests that all APIs defined by individual services get exposed.
  491. func TestAPIGather(t *testing.T) {
  492. stack, err := New(testNodeConfig())
  493. if err != nil {
  494. t.Fatalf("failed to create protocol stack: %v", err)
  495. }
  496. defer stack.Close()
  497. // Register a batch of services with some configured APIs
  498. calls := make(chan string, 1)
  499. makeAPI := func(result string) *OneMethodAPI {
  500. return &OneMethodAPI{fun: func() { calls <- result }}
  501. }
  502. services := map[string]struct {
  503. APIs []rpc.API
  504. Maker InstrumentingWrapper
  505. }{
  506. "Zero APIs": {
  507. []rpc.API{}, InstrumentedServiceMakerA},
  508. "Single API": {
  509. []rpc.API{
  510. {Namespace: "single", Version: "1", Service: makeAPI("single.v1"), Public: true},
  511. }, InstrumentedServiceMakerB},
  512. "Many APIs": {
  513. []rpc.API{
  514. {Namespace: "multi", Version: "1", Service: makeAPI("multi.v1"), Public: true},
  515. {Namespace: "multi.v2", Version: "2", Service: makeAPI("multi.v2"), Public: true},
  516. {Namespace: "multi.v2.nested", Version: "2", Service: makeAPI("multi.v2.nested"), Public: true},
  517. }, InstrumentedServiceMakerC},
  518. }
  519. for id, config := range services {
  520. config := config
  521. constructor := func(*ServiceContext) (Service, error) {
  522. return &InstrumentedService{apis: config.APIs}, nil
  523. }
  524. if err := stack.Register(config.Maker(constructor)); err != nil {
  525. t.Fatalf("service %s: registration failed: %v", id, err)
  526. }
  527. }
  528. // Start the services and ensure all API start successfully
  529. if err := stack.Start(); err != nil {
  530. t.Fatalf("failed to start protocol stack: %v", err)
  531. }
  532. defer stack.Stop()
  533. // Connect to the RPC server and verify the various registered endpoints
  534. client, err := stack.Attach()
  535. if err != nil {
  536. t.Fatalf("failed to connect to the inproc API server: %v", err)
  537. }
  538. defer client.Close()
  539. tests := []struct {
  540. Method string
  541. Result string
  542. }{
  543. {"single_theOneMethod", "single.v1"},
  544. {"multi_theOneMethod", "multi.v1"},
  545. {"multi.v2_theOneMethod", "multi.v2"},
  546. {"multi.v2.nested_theOneMethod", "multi.v2.nested"},
  547. }
  548. for i, test := range tests {
  549. if err := client.Call(nil, test.Method); err != nil {
  550. t.Errorf("test %d: API request failed: %v", i, err)
  551. }
  552. select {
  553. case result := <-calls:
  554. if result != test.Result {
  555. t.Errorf("test %d: result mismatch: have %s, want %s", i, result, test.Result)
  556. }
  557. case <-time.After(time.Second):
  558. t.Fatalf("test %d: rpc execution timeout", i)
  559. }
  560. }
  561. }
  562. func TestWebsocketHTTPOnSamePort_WebsocketRequest(t *testing.T) {
  563. node := startHTTP(t)
  564. defer node.stopHTTP()
  565. wsReq, err := http.NewRequest(http.MethodGet, "http://127.0.0.1:7453", nil)
  566. if err != nil {
  567. t.Error("could not issue new http request ", err)
  568. }
  569. wsReq.Header.Set("Connection", "upgrade")
  570. wsReq.Header.Set("Upgrade", "websocket")
  571. wsReq.Header.Set("Sec-WebSocket-Version", "13")
  572. wsReq.Header.Set("Sec-Websocket-Key", "SGVsbG8sIHdvcmxkIQ==")
  573. resp := doHTTPRequest(t, wsReq)
  574. assert.Equal(t, "websocket", resp.Header.Get("Upgrade"))
  575. }
  576. func TestWebsocketHTTPOnSamePort_HTTPRequest(t *testing.T) {
  577. node := startHTTP(t)
  578. defer node.stopHTTP()
  579. httpReq, err := http.NewRequest(http.MethodGet, "http://127.0.0.1:7453", nil)
  580. if err != nil {
  581. t.Error("could not issue new http request ", err)
  582. }
  583. httpReq.Header.Set("Accept-Encoding", "gzip")
  584. resp := doHTTPRequest(t, httpReq)
  585. assert.Equal(t, "gzip", resp.Header.Get("Content-Encoding"))
  586. }
  587. func startHTTP(t *testing.T) *Node {
  588. conf := &Config{HTTPPort: 7453, WSPort: 7453}
  589. node, err := New(conf)
  590. if err != nil {
  591. t.Error("could not create a new node ", err)
  592. }
  593. err = node.startHTTP("127.0.0.1:7453", []rpc.API{}, []string{}, []string{}, []string{}, rpc.HTTPTimeouts{}, []string{})
  594. if err != nil {
  595. t.Error("could not start http service on node ", err)
  596. }
  597. return node
  598. }
  599. func doHTTPRequest(t *testing.T, req *http.Request) *http.Response {
  600. client := &http.Client{}
  601. resp, err := client.Do(req)
  602. if err != nil {
  603. t.Error("could not issue a GET request to the given endpoint", err)
  604. }
  605. return resp
  606. }