mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-05 19:43:47 +00:00
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
121 lines
2.6 KiB
Go
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)
|
|
}
|
|
}
|