go-ethereum/p2p/simulations/session_controller_test.go
zelig 15b8c39f96 p2p: network testing framework and protocol abstraction
subpackages:

* adapters:
  * msgpipes for simulated test connections
  * rlpx the RLPx adapter for normal non-test use
  * simnet simulated in-process network adapter
* protocols: easy-to-setup protocols
* simulations:
  * simulated network using simnet adapter
  * (local cluster of nodes running their own p2p server)
  * (remote cluster of nodes managed via docker)
* testing: test resource drivers
  * exchange: trigger/expect style driver for single node and its peers
  * sessions:   for unit testing protocols and protocol modules
  * (network: for network testing, benchmarking, stats, correctness, fault tolerance)

see more in the README-s in each subpackage
2016-10-27 07:44:09 +01:00

121 lines
2.6 KiB
Go

package simulations
import (
"fmt"
"io/ioutil"
"net/http"
"testing"
"time"
"github.com/ethereum/go-ethereum/logger/glog"
"github.com/ethereum/go-ethereum/p2p/discover"
)
const (
domain = "http://localhost"
port = "8888"
)
var quitc chan bool
var controller *ResourceController
func init() {
glog.SetV(6)
glog.SetToStderr(true)
controller, quitc = NewSessionController()
StartRestApiServer(port, controller)
}
func url(port, path string) string {
return fmt.Sprintf("%v:%v/%v", domain, port, path)
}
func TestQuit(t *testing.T) {
req, err := http.NewRequest("DELETE", url(port, ""), nil)
// req, err := http.NewRequest("PUT", url(""), nil)
if err != nil {
t.Fatalf("unexpected error")
}
var resp *http.Response
go func() {
r, err := (&http.Client{}).Do(req)
if err != nil {
t.Fatalf("unexpected error")
}
resp = r
}()
timeout := time.NewTimer(1000 * time.Millisecond)
select {
case <-quitc:
case <-timeout.C:
t.Fatalf("timed out: controller did not quit, response: %v", resp)
}
}
func TestUpdate(t *testing.T) {
req, err := http.NewRequest("GET", url(port, "0"), nil)
if err != nil {
t.Fatalf("unexpected error")
}
keys := []string{
"aa7cca80aa7cca80aa7cca80aa7cca80aa7cca80aa7cca80aa7cca80aa7cca80aa7cca80aa7cca80aa7cca80aa7cca80aa7cca80aa7cca80aa7cca80aa7cca80",
"f5ae22c3f5ae22c3f5ae22c3f5ae22c3f5ae22c3f5ae22c3f5ae22c3f5ae22c3f5ae22c3f5ae22c3f5ae22c3f5ae22c3f5ae22c3f5ae22c3f5ae22c3f5ae22c3",
}
var ids []*discover.NodeID
for _, key := range keys {
id := discover.MustHexID(key)
ids = append(ids, &id)
}
network := NewNetwork(nil)
NewNetworkController(network, controller)
Update(network, ids)
r, err := (&http.Client{}).Do(req)
if err != nil {
t.Fatalf("unexpected error")
}
resp, err := ioutil.ReadAll(r.Body)
if err != nil {
t.Fatalf("error reading response body: %v", err)
}
exp := `{
"add": [
{
"data": {
"id": "aa7c",
"source": "",
"target": "",
"on": false
},
"classes": "",
"group": "nodes"
},
{
"data": {
"id": "f5ae",
"source": "",
"target": "",
"on": false
},
"classes": "",
"group": "nodes"
}
],
"remove": []
}`
if string(resp) != exp {
t.Fatalf("incorrect response body. got\n'%v', expected\n'%v'", string(resp), exp)
}
}
func Update(self *Network, ids []*discover.NodeID) {
self.lock.Lock()
defer self.lock.Unlock()
for _, id := range ids {
e := &Entry{
Action: "Add",
Type: "Node",
Object: &SimNode{ID: id, config: &NodeConfig{ID: id}},
}
self.Journal = append(self.Journal, e)
}
}