lib9p

Go 9P library.
Log | Files | Refs

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:
Mclient_test.go | 90++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
Mreq.go | 16+++++++++++++++-
Mserver_test.go | 2+-
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", },