commit f52fb3b604d476aa1237ff6928832315a53501e2
parent 34710a5171c50c7142098894d994242d4054904c
Author: Matsuda Kenji <info@mtkn.jp>
Date: Sat, 23 Dec 2023 11:30:18 +0900
use SetupConn in client test
Diffstat:
5 files changed, 37 insertions(+), 183 deletions(-)
diff --git a/auth_test.go b/auth_test.go
@@ -6,13 +6,12 @@ import (
"testing"
"git.mtkn.jp/lib9p"
- // "git.mtkn.jp/lib9p/client"
- // "git.mtkn.jp/lib9p/testfs"
+ "git.mtkn.jp/lib9p/testfs"
)
func TestAuth(t *testing.T) {
- conn := setupTestConn()
- defer conn.close()
+ conn := testfs.SetupConn()
+ defer conn.Close()
acr, asw := io.Pipe()
asr, acw := io.Pipe()
defer func() {
@@ -21,7 +20,7 @@ func TestAuth(t *testing.T) {
asr.Close()
asw.Close()
}()
- conn.s.Auth = func(ctx context.Context, respc chan<- *lib9p.Req) chan<- *lib9p.Req {
+ conn.S.Auth = func(ctx context.Context, respc chan<- *lib9p.Req) chan<- *lib9p.Req {
c := make(chan *lib9p.Req)
go func() {
for {
@@ -50,31 +49,31 @@ func TestAuth(t *testing.T) {
return c
}
ctx := context.Background()
- _, _, err := conn.c.Version(ctx, lib9p.NOTAG, 8*1024, "9P2000")
+ _, _, err := conn.C.Version(ctx, lib9p.NOTAG, 8*1024, "9P2000")
if err != nil {
t.Log(err)
}
- _, err = conn.c.Auth(ctx, 0, 0, "kenji", "")
+ _, err = conn.C.Auth(ctx, 0, 0, "kenji", "")
if err != nil {
t.Error(err)
}
- _, err = conn.c.Attach(ctx, 0, 1, 0, "kenji", "")
+ _, err = conn.C.Attach(ctx, 0, 1, 0, "kenji", "")
if err == nil {
t.Error("authentication skipped")
}
- _, _, err = conn.c.Open(ctx, 0, 0, lib9p.ORDWR)
+ _, _, err = conn.C.Open(ctx, 0, 0, lib9p.ORDWR)
if err != nil {
t.Error(err)
}
- _, err = conn.c.Write(ctx, 0, 0, 0, 5, []byte("kenji"))
+ _, err = conn.C.Write(ctx, 0, 0, 0, 5, []byte("kenji"))
if err != nil {
t.Error(err)
}
- _, err = conn.c.Write(ctx, 0, 0, 0, 8, []byte("password"))
+ _, err = conn.C.Write(ctx, 0, 0, 0, 8, []byte("password"))
if err != nil {
t.Error(err)
}
- _, err = conn.c.Attach(ctx, 0, 1, 0, "kenji", "")
+ _, err = conn.C.Attach(ctx, 0, 1, 0, "kenji", "")
if err != nil {
t.Error(err)
}
diff --git a/client/client_test.go b/client/client_test.go
@@ -1,12 +1,12 @@
-package client
+package client_test
import (
"context"
"io"
- "sync"
"testing"
"git.mtkn.jp/lib9p"
+ "git.mtkn.jp/lib9p/client"
"git.mtkn.jp/lib9p/testfs"
)
@@ -15,125 +15,25 @@ const (
uname = "kenji"
)
-func newClientForTest(msize uint32, uname string, tmsgc chan<- lib9p.Msg, rmsgc <-chan lib9p.Msg) *Client {
- ctx, cancel := context.WithCancel(context.Background())
- c := &Client{
- msize: mSize,
- mSizeLock: new(sync.Mutex),
- uname: uname,
- fPool: allocClientFidPool(),
- errc: make(chan error),
- cancel: cancel,
- wg: new(sync.WaitGroup),
- }
- c.txc = c.runMultiplexer(ctx, tmsgc, rmsgc)
- return c
-}
-
-func TestClientVersion(t *testing.T) {
- tests := []struct {
- name string
- mSize uint32
- version string
- rmsg lib9p.Msg
- wantmsize uint32
- wantversion string
- }{
- {"0", mSize, "9P2000",
- &lib9p.RVersion{Tag: lib9p.NOTAG, Msize: mSize, Version: "9P2000"},
- mSize, "9P2000"},
- {"1", mSize, "unko",
- &lib9p.RVersion{Tag: lib9p.NOTAG, Msize: mSize, Version: "unknown"},
- mSize, "unknown"},
- }
- for _, test := range tests {
- func() {
- tmsgc := make(chan lib9p.Msg)
- rmsgc := make(chan lib9p.Msg)
- c := newClientForTest(mSize, uname, tmsgc, rmsgc)
- tPool := newTagPool()
- defer c.Stop()
- bg := context.Background()
- var (
- gotmsize uint32
- gotversion string
- goterr error
- wg sync.WaitGroup
- )
- wg.Add(1)
- go func() {
- tag, err := tPool.add()
- if err != nil {
- t.Fatalf("add tag: %v", err)
- }
- gotmsize, gotversion, goterr = c.Version(bg, tag, test.mSize, test.version)
- tPool.delete(tag)
- wg.Done()
- }()
- gottmsg := <-tmsgc
- tag := gottmsg.GetTag()
- test.rmsg.SetTag(tag)
- rmsgc <- test.rmsg
- done := make(chan struct{})
- go func() { wg.Wait(); done <- struct{}{} }()
- select {
- case err := <-c.errc:
- t.Errorf("client error: %v", err)
- return
- case <-done:
- }
- if goterr != nil {
- t.Errorf("%s: goterr: %v", test.name, goterr)
- return
- }
- if test.wantmsize != gotmsize || test.wantversion != gotversion {
- t.Errorf("%s: (mSize, verion) want: %d, %s, got: %d, %s",
- test.name, test.wantmsize, test.wantversion,
- gotmsize, gotversion)
- }
- }()
- }
-}
-
// the following tests are test for both client and server.
// should be moved to propper file.
func TestTransaction(t *testing.T) {
- cr, sw := io.Pipe()
- sr, cw := io.Pipe()
- server := lib9p.NewServer(testfs.Fsys, mSize, sr, sw)
- //server.Chatty()
- client := NewClient(mSize, uname, cr, cw)
- tPool := newTagPool()
+ conn := testfs.SetupConn()
+ defer conn.Close()
bg := context.Background()
- go server.Serve(bg)
- tag, err := tPool.add()
- if err != nil {
- t.Fatalf("add tag: %v", err)
- }
- rmsize, rversion, err := client.Version(bg, tag, mSize, "9P2000")
- tPool.delete(tag)
+ rmsize, rversion, err := conn.C.Version(bg, 0, mSize, "9P2000")
if err != nil {
t.Log(err)
} else {
t.Log(&lib9p.RVersion{Msize: rmsize, Version: rversion})
}
- tag, err = tPool.add()
- if err != nil {
- t.Fatalf("add tag: %v", err)
- }
- rauth, err := client.Auth(bg, tag, 0, "kenji", "")
- tPool.delete(tag)
+ rauth, err := conn.C.Auth(bg, 0, 0, "kenji", "")
if err != nil {
t.Log(err)
} else {
t.Log(rauth)
}
- tag, err = tPool.add()
- if err != nil {
- t.Fatalf("add tag: %v", err)
- }
- rattach, err := client.Attach(bg, tag, 0, lib9p.NOFID, "kenji", "")
- tPool.delete(tag)
+ rattach, err := conn.C.Attach(bg, 0, 0, lib9p.NOFID, "kenji", "")
if err != nil {
t.Log(err)
} else {
@@ -144,24 +44,20 @@ func TestTransaction(t *testing.T) {
func TestClient2(t *testing.T) {
cr, sw := io.Pipe()
sr, cw := io.Pipe()
-
server := lib9p.NewServer(testfs.Fsys, mSize, sr, sw)
//server.Chatty()
go server.Serve(context.Background())
-
- fs, err := Mount(cr, cw, "kenji", "")
+ fs, err := client.Mount(cr, cw, "kenji", "")
if err != nil {
t.Errorf("mount: %v", err)
}
-
a0, err := fs.OpenFile("a", lib9p.OREAD)
if err != nil {
t.Errorf("open: %v", err)
}
t.Log(a0)
- a := a0.(*ClientFile)
-
- b := make([]byte, a.iounit)
+ a := a0.(*client.ClientFile)
+ b := make([]byte, 64)
n, err := a.Read(b)
if err != nil {
t.Errorf("read: %v", err)
diff --git a/file_test.go b/file_test.go
@@ -5,26 +5,27 @@ import (
"testing"
"git.mtkn.jp/lib9p"
+ "git.mtkn.jp/lib9p/testfs"
)
func BenchmarkRead(b *testing.B) {
- conn := setupTestConn()
- defer conn.close()
+ conn := testfs.SetupConn()
+ defer conn.Close()
ctx := context.Background()
- _, err := conn.c.Attach(ctx, ^uint16(0), 0, lib9p.NOFID, "kenji", "")
+ _, err := conn.C.Attach(ctx, ^uint16(0), 0, lib9p.NOFID, "kenji", "")
if err != nil {
b.Fatalf("attach: %v", err)
}
- wqid, err := conn.c.Walk(ctx, 0, 0, 1, []string{"dir", "file"})
+ wqid, err := conn.C.Walk(ctx, 0, 0, 1, []string{"dir", "file"})
if err != nil || len(wqid) != 2 {
b.Fatalf("walk: %v, %v", wqid, err)
}
- _, _, err = conn.c.Open(ctx, 0, 1, lib9p.OREAD)
+ _, _, err = conn.C.Open(ctx, 0, 1, lib9p.OREAD)
if err != nil {
b.Fatalf("open: %v", err)
}
for i := 0; i < b.N; i++ {
- _, err := conn.c.Read(ctx, 0, 1, 0, 8*1024)
+ _, err := conn.C.Read(ctx, 0, 1, 0, 8*1024)
if err != nil {
b.Fatalf("read: %v", err)
}
diff --git a/req_test.go b/req_test.go
@@ -16,28 +16,28 @@ func TestFlush(t *testing.T) {
)
testfs.Fsys.Slow = true
defer func() { testfs.Fsys.Slow = false }()
- conn := setupTestConn()
- defer conn.close()
+ conn := testfs.SetupConn()
+ defer conn.Close()
ctx := context.Background()
- conn.s.Chatty()
- _, _, err := conn.c.Version(ctx, lib9p.NOTAG, mSize, "9P2000")
+ conn.S.Chatty()
+ _, _, err := conn.C.Version(ctx, lib9p.NOTAG, mSize, "9P2000")
if err != nil {
t.Fatalf("version: %v", err)
}
- _, err = conn.c.Attach(ctx, 0, 0, lib9p.NOFID, uname, "")
- _, err = conn.c.Walk(ctx, 0, 0, 1, []string{"a"})
- _, _, err = conn.c.Open(ctx, 0, 1, lib9p.OREAD)
+ _, err = conn.C.Attach(ctx, 0, 0, lib9p.NOFID, uname, "")
+ _, err = conn.C.Walk(ctx, 0, 0, 1, []string{"a"})
+ _, _, err = conn.C.Open(ctx, 0, 1, lib9p.OREAD)
done := make(chan string)
ctx1, cancel1 := context.WithCancel(ctx)
var data []byte
go func() {
- data, err = conn.c.Read(ctx1, 0, 1, 0, mSize-lib9p.IOHDRSZ)
+ data, err = conn.C.Read(ctx1, 0, 1, 0, mSize-lib9p.IOHDRSZ)
close(done)
}()
// I want to send Tflush message after sending Tread and before recieving
// Rread. But I think this method is not relyable.
time.Sleep(1 * time.Millisecond)
- err = conn.c.Flush(ctx, 1, 0)
+ err = conn.C.Flush(ctx, 1, 0)
if err != nil {
t.Errorf("flush: %v", err)
}
diff --git a/server_test.go b/server_test.go
@@ -8,51 +8,9 @@ import (
"testing"
"git.mtkn.jp/lib9p"
- "git.mtkn.jp/lib9p/client"
"git.mtkn.jp/lib9p/testfs"
)
-type testConn struct {
- s *lib9p.Server
- c *client.Client
- cr, sr *io.PipeReader
- cw, sw *io.PipeWriter
- cancel context.CancelFunc
-}
-
-// SetupTestConn setups a connection between a server and a client and
-// returns those.
-func setupTestConn() *testConn {
- const (
- mSize = 8 * 1024
- uname = "kenji"
- )
- cr, sw := io.Pipe()
- sr, cw := io.Pipe()
- // TODO: fix the inconsistency of server and client api.
- s := lib9p.NewServer(testfs.Fsys, mSize, sr, sw)
- c := client.NewClient(mSize, uname, cr, cw)
- ctx, cancel := context.WithCancel(context.Background())
- go s.Serve(ctx)
- return &testConn{
- s: s,
- c: c,
- cr: cr,
- cw: cw,
- sr: sr,
- sw: sw,
- cancel: cancel,
- }
-}
-
-func (conn *testConn) close() {
- conn.cancel()
- conn.c.Stop()
- conn.cw.Close()
- conn.cr.Close()
- conn.sw.Close()
- conn.sr.Close()
-}
// This function does the actual work for TestWalk().
func testWalk(t *testing.T, fs *testfs.FS, pathname string, file *testfs.File) {