commit cecd09a98851fbb053ae1f898129d2da2a8946c0
parent ceb8994075b99e53f5069ec216d1af75be40b90c
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sun, 8 Oct 2023 05:09:02 +0900
add test for client Version
Diffstat:
3 files changed, 99 insertions(+), 9 deletions(-)
diff --git a/client_test.go b/client_test.go
@@ -4,19 +4,95 @@ import (
"context"
"io"
"reflect"
+ "sync"
"testing"
)
+const (
+ mSize = 8192
+ uname = "kenji"
+)
+
+func newClientForTest() (*Client, chan<- Msg, chan<- error) {
+ tmsgc := make(chan Msg, 1)
+ rerrc := make(chan error, 1)
+ c := &Client{
+ msize: mSize,
+ mSizeLock: new(sync.Mutex),
+ uname: uname,
+ fPool: allocFidPool(),
+ rPool: newClientReqPool(),
+ tmsgc: tmsgc,
+ rerrc: rerrc,
+ }
+ return c, tmsgc, rerrc
+}
+
+func TestClientVersion(t *testing.T) {
+ tests := []struct{
+ name string
+ msg *TVersion
+ reply Msg
+ wantmsg *RVersion
+ wanterr error
+ }{
+ {
+ "valid",
+ &TVersion{0, mSize, "9P2000"},
+ &RVersion{NOTAG, mSize, "9P2000"},
+ &RVersion{NOTAG, mSize, "9P2000"},
+ nil,
+ },
+ {
+ "invalid",
+ &TVersion{0, mSize, "unko"},
+ &RVersion{NOTAG, mSize, "unknown"},
+ &RVersion{NOTAG, mSize, "unknown"},
+ nil,
+ },
+ }
+ for _, test := range tests {
+ c, _, _ := newClientForTest()
+ var (
+ gotmsg *RVersion
+ goterr error
+ wg sync.WaitGroup
+ )
+ wg.Add(1)
+ go func() {
+ gotmsg, goterr = c.Version(context.Background(), test.msg.mSize, test.msg.version)
+ wg.Done()
+ }()
+
+ var ok bool
+ var req *clientReq
+ for !ok {
+ req, ok = c.rPool.lookup(NOTAG)
+ }
+ req.rmsgc <- test.reply
+ close(req.errc)
+ close(req.rmsgc)
+
+ wg.Wait()
+ if !reflect.DeepEqual(gotmsg, test.wantmsg) || !reflect.DeepEqual(goterr, test.wanterr) {
+ t.Errorf("%s: got: (%v, %v), want: (%v, %v)\n", test.name, gotmsg, goterr,
+ test.wantmsg, test.wanterr)
+ }
+ }
+}
+
+// the following tests are test for both client and server.
+// should be moved to propper file.
func TestTransaction(t *testing.T) {
const (
mSize = 8192
- noTag = ^uint16(0)
+ noTag = NOTAG
)
cr, sw := io.Pipe()
sr, cw := io.Pipe()
server := NewServer(fsys, mSize, sr, sw)
- server.Chatty()
+ //server.Chatty()
client := NewClient(mSize, "kenji", cr, cw)
bg := context.Background()
go server.Serve()
@@ -41,10 +117,10 @@ func TestTransaction(t *testing.T) {
}
}
-func TestClientVersion(t *testing.T) {
+func TestVersion(t *testing.T) {
const (
mSize = 8192
- noTag = ^uint16(0)
+ noTag = NOTAG
)
tests := []struct {
name string
@@ -53,11 +129,11 @@ func TestClientVersion(t *testing.T) {
want Msg
}{
{"size", 4096, "9P2000",
- &RVersion{tag: noTag, mSize: 4096, version: "9P2000"}},
+ &RVersion{tag: NOTAG, mSize: 4096, version: "9P2000"}},
{"valid", mSize, "9P2000",
- &RVersion{tag: noTag, mSize: mSize, version: "9P2000"}},
+ &RVersion{tag: NOTAG, mSize: mSize, version: "9P2000"}},
{"invalid", mSize, "unko",
- &RVersion{tag: noTag, mSize: mSize, version: "unknown"}},
+ &RVersion{tag: NOTAG, mSize: mSize, version: "unknown"}},
}
for _, test := range tests {
diff --git a/req.go b/req.go
@@ -95,7 +95,7 @@ func (rp *clientReqPool) nextTag() (uint16, error) {
func (rp *clientReqPool) add(msg Msg) (*clientReq, error) {
var tag uint16
if _, ok := msg.(*TVersion); ok {
- tag = ^uint16(0)
+ tag = NOTAG
} else {
var err error
tag, err = rp.nextTag()
@@ -129,3 +129,16 @@ func (rp *clientReqPool) delete(tag uint16) {
defer rp.lock.Unlock()
delete(rp.m, tag)
}
+
+func (rp *clientReqPool) String() string {
+ s := "["
+ for tag := range rp.m {
+ s += fmt.Sprintf("%d ", tag)
+ }
+ if len(s) > 1 {
+ s = s[:len(s)-1] + "]"
+ } else {
+ s = "[]"
+ }
+ return s
+}
+\ No newline at end of file
diff --git a/server_test.go b/server_test.go
@@ -157,7 +157,7 @@ func TestServer(t *testing.T) {
cr, sw := io.Pipe()
msg := []Msg{
&TVersion{
- tag: ^uint16(0),
+ tag: NOTAG,
mSize: 1024,
version: "9P2000",
},