add test boilerplate for sharding client

Former-commit-id: 7cbd81db9421e1517ad92829a2dbbdfcf5f38699 [formerly 76607161435699e18a970c82f9838d20e94f04d7]
Former-commit-id: f6db97246aa70eda35e59a2a05fa55316289bd76
This commit is contained in:
Preston Van Loon 2018-01-14 21:59:51 -05:00
parent 9b6f224f83
commit 50e92a018e
3 changed files with 87 additions and 6 deletions

View File

@ -1,7 +1,6 @@
package main
import (
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/sharding"
"github.com/ethereum/go-ethereum/cmd/utils"
@ -20,7 +19,6 @@ var (
)
func shardingClient(ctx *cli.Context) error {
log.Info("hello world!")
c := sharding.MakeShardingClient(ctx)
if err := c.Start(); err != nil {
return err

View File

@ -1,29 +1,58 @@
package sharding
import (
"github.com/ethereum/go-ethereum/cmd/utils"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/node"
"github.com/ethereum/go-ethereum/rpc"
cli "gopkg.in/urfave/cli.v1"
)
const (
// TODO: Can this be referenced from main.clientIdentifier?
clientIdentifier = "geth" // Client identifier to advertise over the network
)
type Client struct {
endpoint string
client *rpc.Client
}
func MakeShardingClient(ctx *cli.Context) *Client {
// TODO: Setup client
return &Client{}
endpoint := ""
if ctx.GlobalIsSet(utils.DataDirFlag.Name) {
endpoint = ctx.GlobalString(utils.DataDirFlag.Name)
}
return &Client{
endpoint: endpoint,
}
}
func (c *Client) Start() error {
log.Info("Starting sharding client")
// TODO: Dial to RPC
// TODO: Verify VMC
rpcClient, err := dialRPC(c.endpoint)
if err != nil {
return err
}
c.client = rpcClient
defer c.client.Close()
if err := c.verifyVMC(); err != nil {
return err
}
// TODO: Wait to be selected?
return nil
}
func (c *Client) Wait() {
// TODO: Blocking lock
}
func dialRPC(endpoint string) (*rpc.Client, error) {
if endpoint == "" {
endpoint = node.DefaultIPCEndpoint(clientIdentifier)
}
return rpc.Dial(endpoint)
}

54
sharding/client_test.go Normal file
View File

@ -0,0 +1,54 @@
package sharding
import (
"flag"
"fmt"
"math/rand"
"os"
"testing"
"github.com/ethereum/go-ethereum/cmd/utils"
"github.com/ethereum/go-ethereum/rpc"
cli "gopkg.in/urfave/cli.v1"
)
func randomEndpoint() string {
return fmt.Sprintf("/tmp/go-ethereum-test-ipc-%d-%d", os.Getpid(), rand.Int63())
}
func newTestServer(endpoint string) (*rpc.Server, error) {
server := rpc.NewServer()
l, err := rpc.CreateIPCListener(endpoint)
if err != nil {
return nil, err
}
go server.ServeListener(l)
return server, nil
}
func createContext() *cli.Context {
set := flag.NewFlagSet("test", 0)
set.String(utils.DataDirFlag.Name, "", "")
return cli.NewContext(nil, set, nil)
}
func TestStart(t *testing.T) {
endpoint := randomEndpoint()
server, err := newTestServer(endpoint)
if err != nil {
t.Fatalf("Failed to create a test server: %v", err)
}
defer server.Stop()
ctx := createContext()
if err := ctx.GlobalSet(utils.DataDirFlag.Name, endpoint); err != nil {
t.Fatalf("Failed to set global variable for flag %s. Error: %v", utils.DataDirFlag.Name, err)
}
c := MakeShardingClient(ctx)
if err := c.Start(); err != nil {
t.Errorf("Failed to start server: %v", err)
}
}