lib9p

Go 9P library.
Log | Files | Refs | LICENSE

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:
Mauth_test.go | 23+++++++++++------------
Mclient/client_test.go | 124+++++++------------------------------------------------------------------------
Mfile_test.go | 13+++++++------
Mreq_test.go | 18+++++++++---------
Mserver_test.go | 42------------------------------------------
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) {