diff --git a/client/client.go b/client/client.go index 5c123026..80fbc396 100644 --- a/client/client.go +++ b/client/client.go @@ -217,6 +217,11 @@ func (cli *TMSPClient) QueryAsync(query []byte) *ReqRes { //---------------------------------------- +func (cli *TMSPClient) FlushSync() error { + cli.queueRequest(types.RequestFlush()).Wait() + return cli.err +} + func (cli *TMSPClient) InfoSync() (info string, err error) { reqres := cli.queueRequest(types.RequestInfo()) cli.FlushSync() @@ -226,9 +231,13 @@ func (cli *TMSPClient) InfoSync() (info string, err error) { return string(reqres.Response.Data), nil } -func (cli *TMSPClient) FlushSync() error { - cli.queueRequest(types.RequestFlush()).Wait() - return cli.err +func (cli *TMSPClient) SetOptionSync(key string, value string) (log string, err error) { + reqres := cli.queueRequest(types.RequestSetOption(key, value)) + cli.FlushSync() + if cli.err != nil { + return "", cli.err + } + return reqres.Response.Log, nil } func (cli *TMSPClient) AppendTxSync(tx []byte) (code types.CodeType, result []byte, log string, err error) { diff --git a/cmd/counter/main.go b/cmd/counter/main.go index 503908b4..37e73568 100644 --- a/cmd/counter/main.go +++ b/cmd/counter/main.go @@ -4,7 +4,7 @@ import ( "flag" . "github.com/tendermint/go-common" - "github.com/tendermint/tmsp/example/golang" + "github.com/tendermint/tmsp/example/counter" "github.com/tendermint/tmsp/server" ) @@ -13,7 +13,7 @@ func main() { addrPtr := flag.String("addr", "tcp://0.0.0.0:46658", "Listen address") serialPtr := flag.Bool("serial", false, "Enforce incrementing (serial) txs") flag.Parse() - app := example.NewCounterApplication(*serialPtr) + app := counter.NewCounterApplication(*serialPtr) // Start the listener _, err := server.StartListener(*addrPtr, app) diff --git a/cmd/dummy/main.go b/cmd/dummy/main.go index d1766e65..b4e542c6 100644 --- a/cmd/dummy/main.go +++ b/cmd/dummy/main.go @@ -4,7 +4,7 @@ import ( "flag" . "github.com/tendermint/go-common" - "github.com/tendermint/tmsp/example/golang" + "github.com/tendermint/tmsp/example/dummy" "github.com/tendermint/tmsp/server" ) @@ -14,7 +14,7 @@ func main() { flag.Parse() // Start the listener - _, err := server.StartListener(*addrPtr, example.NewDummyApplication()) + _, err := server.StartListener(*addrPtr, dummy.NewDummyApplication()) if err != nil { Exit(err.Error()) } diff --git a/example/golang/counter.go b/example/counter/counter.go similarity index 99% rename from example/golang/counter.go rename to example/counter/counter.go index b4da31bf..f97786f8 100644 --- a/example/golang/counter.go +++ b/example/counter/counter.go @@ -1,4 +1,4 @@ -package example +package counter import ( "encoding/binary" diff --git a/example/golang/dummy.go b/example/dummy/dummy.go similarity index 98% rename from example/golang/dummy.go rename to example/dummy/dummy.go index 818cd363..dc4441d9 100644 --- a/example/golang/dummy.go +++ b/example/dummy/dummy.go @@ -1,4 +1,4 @@ -package example +package dummy import ( "strings" diff --git a/example/golang/dummy_test.go b/example/dummy/dummy_test.go similarity index 99% rename from example/golang/dummy_test.go rename to example/dummy/dummy_test.go index 3e27e5e8..266cf635 100644 --- a/example/golang/dummy_test.go +++ b/example/dummy/dummy_test.go @@ -1,4 +1,4 @@ -package example +package dummy import ( "testing" diff --git a/example/python/app.py b/example/python/app.py index 8eda9020..b8cfcca8 100644 --- a/example/python/app.py +++ b/example/python/app.py @@ -47,7 +47,7 @@ class CounterApplication(): return 6 return 0 - def get_hash(self): + def commit(self): self.hashCount += 1 if self.txCount == 0: return "", 0 diff --git a/example/python/tmsp/msg.py b/example/python/tmsp/msg.py index 17e71471..a03c0a07 100644 --- a/example/python/tmsp/msg.py +++ b/example/python/tmsp/msg.py @@ -8,7 +8,7 @@ message_types = { 0x04: "set_option", 0x21: "append_tx", 0x22: "check_tx", - 0x23: "get_hash", + 0x23: "commit", 0x24: "add_listener", 0x25: "rm_listener", } @@ -38,7 +38,7 @@ class RequestDecoder(): def check_tx(self): return decode_string(self.reader) - def get_hash(self): + def commit(self): return def add_listener(self): diff --git a/example/python3/app.py b/example/python3/app.py index 01f3de0b..c3d11490 100644 --- a/example/python3/app.py +++ b/example/python3/app.py @@ -47,7 +47,7 @@ class CounterApplication(): return 6 return 0 - def get_hash(self): + def commit(self): self.hashCount += 1 if self.txCount == 0: return "", 0 diff --git a/example/python3/tmsp/msg.py b/example/python3/tmsp/msg.py index 2f35d8be..ae30f88d 100644 --- a/example/python3/tmsp/msg.py +++ b/example/python3/tmsp/msg.py @@ -8,7 +8,7 @@ message_types = { 0x04: "set_option", 0x21: "append_tx", 0x22: "check_tx", - 0x23: "get_hash", + 0x23: "commit", 0x24: "add_listener", 0x25: "rm_listener", } @@ -38,7 +38,7 @@ class RequestDecoder(): def check_tx(self): return decode_string(self.reader) - def get_hash(self): + def commit(self): return def add_listener(self): diff --git a/tests/test.sh b/tests/test.sh index c99f92dc..d375eafa 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -2,17 +2,8 @@ ROOT=$GOPATH/src/github.com/tendermint/tmsp cd $ROOT -# test golang dummy -bash tests/test_dummy.sh - # test golang counter -bash tests/test_counter.sh - -# test js counter -cd example/js -COUNTER_APP="node app.js" bash $ROOT/tests/test_counter.sh - -# test python counter -cd ../python -COUNTER_APP="python app.py" bash $ROOT/tests/test_counter.sh +COUNTER_APP="counter" go run $ROOT/tests/test_counter.go +# test nodejs counter +COUNTER_APP="node ../js-tmsp/example/app.js" go run $ROOT/tests/test_counter.go diff --git a/tests/test_counter.go b/tests/test_counter.go new file mode 100644 index 00000000..ff04ec32 --- /dev/null +++ b/tests/test_counter.go @@ -0,0 +1,126 @@ +package main + +import ( + "bytes" + "fmt" + "os" + "time" + + . "github.com/tendermint/go-common" + "github.com/tendermint/go-process" + "github.com/tendermint/tmsp/client" + "github.com/tendermint/tmsp/types" +) + +func main() { + + // Run tests + testBasic() + + fmt.Println("Success!") +} + +func testBasic() { + fmt.Println("Running basic tests") + appProc := startApp() + defer appProc.StopProcess(true) + client := startClient() + defer client.Stop() + + setOption(client, "serial", "on") + commit(client, nil) + appendTx(client, []byte("abc"), types.CodeType_BadNonce, nil) + commit(client, nil) + appendTx(client, []byte{0x00}, types.CodeType_OK, nil) + commit(client, []byte{0, 0, 0, 0, 0, 0, 0, 1}) + appendTx(client, []byte{0x00}, types.CodeType_BadNonce, nil) + appendTx(client, []byte{0x01}, types.CodeType_OK, nil) + appendTx(client, []byte{0x00, 0x02}, types.CodeType_OK, nil) + appendTx(client, []byte{0x00, 0x03}, types.CodeType_OK, nil) + appendTx(client, []byte{0x00, 0x00, 0x04}, types.CodeType_OK, nil) + appendTx(client, []byte{0x00, 0x00, 0x06}, types.CodeType_BadNonce, nil) + commit(client, []byte{0, 0, 0, 0, 0, 0, 0, 5}) +} + +//---------------------------------------- + +func startApp() *process.Process { + counterApp := os.Getenv("COUNTER_APP") + if counterApp == "" { + panic("No COUNTER_APP specified") + } + + // Start the app + //outBuf := NewBufferCloser(nil) + proc, err := process.StartProcess("counter_app", + "bash", + []string{"-c", counterApp}, + nil, + os.Stdout, + ) + if err != nil { + panic("running counter_app: " + err.Error()) + } + + // TODO a better way to handle this? + time.Sleep(time.Second) + + return proc +} + +func startClient() *tmspcli.TMSPClient { + // Start client + client, err := tmspcli.NewTMSPClient("tcp://127.0.0.1:46658") + if err != nil { + panic("connecting to counter_app: " + err.Error()) + } + return client +} + +func setOption(client *tmspcli.TMSPClient, key, value string) { + log, err := client.SetOptionSync(key, value) + if err != nil { + panic(Fmt("setting %v=%v: %v\nlog: %v", key, value, err, log)) + } +} + +func commit(client *tmspcli.TMSPClient, hashExp []byte) { + hash, log, err := client.CommitSync() + if err != nil { + panic(Fmt("committing %v\nlog: %v", err, log)) + } + if !bytes.Equal(hash, hashExp) { + panic(Fmt("Commit hash was unexpected. Got %X expected %X", + hash, hashExp)) + } +} + +func appendTx(client *tmspcli.TMSPClient, txBytes []byte, codeExp types.CodeType, dataExp []byte) { + code, data, log, err := client.AppendTxSync(txBytes) + if err != nil { + panic(Fmt("appending tx %X: %v\nlog: %v", txBytes, err, log)) + } + if code != codeExp { + panic(Fmt("AppendTx response code was unexpected. Got %v expected %v. Log: %v", + code, codeExp, log)) + } + if !bytes.Equal(data, dataExp) { + panic(Fmt("AppendTx response data was unexpected. Got %X expected %X", + data, dataExp)) + } +} + +func checkTx(client *tmspcli.TMSPClient, txBytes []byte, codeExp types.CodeType, dataExp []byte) { + code, data, log, err := client.CheckTxSync(txBytes) + if err != nil { + panic(Fmt("checking tx %X: %v\nlog: %v", txBytes, err, log)) + } + if code != codeExp { + panic(Fmt("CheckTx response code was unexpected. Got %v expected %v. Log: %v", + code, codeExp, log)) + } + if !bytes.Equal(data, dataExp) { + panic(Fmt("CheckTx response data was unexpected. Got %X expected %X", + data, dataExp)) + } +} diff --git a/tests/test_counter.sh b/tests/test_counter.sh deleted file mode 100755 index 53edab3b..00000000 --- a/tests/test_counter.sh +++ /dev/null @@ -1,78 +0,0 @@ -#! /bin/bash -function finish { - echo "Cleaning up..." - ps -p $PID > /dev/null - if [[ "$?" == "0" ]]; then - kill -9 $PID - fi -} -trap finish EXIT - -# so we can test other languages -if [[ "$COUNTER_APP" == "" ]]; then - COUNTER_APP="counter" -fi - -echo "Testing counter app for: $COUNTER_APP" - -# run the counter app -$COUNTER_APP &> /dev/null & -PID=`echo $!` - -if [[ "$?" != 0 ]]; then - echo "Error running tmsp app" - echo $OUTPUT - exit 1 -fi - -sleep 1 -OUTPUT=`(tmsp-cli batch) < /dev/null - if [[ "$?" == "0" ]]; then - kill -9 $PID - fi -} -trap finish EXIT - -# Make sure the tmsp cli can connect to the dummy -echo "Dummy test ..." -dummy &> /dev/null & -PID=`echo $!` -sleep 1 -RESULT_HASH=`tmsp-cli get_hash` -if [[ "$RESULT_HASH" != "" ]]; then - echo "Expected nothing but got: $RESULT_HASH" - exit 1 -fi -echo "... Pass!" -echo "" - -# Add a tx, get hash, get hash -# hashes should be non-empty and identical -echo "Dummy batch test ..." -OUTPUT=`(tmsp-cli batch) <