func makeFile(name string, t *testing.T) (*torus.Server, *torus.File) { srv := torus.NewMemoryServer() vol := &models.Volume{ Name: name, Id: 3, Type: "test", } globals, err := srv.MDS.GlobalMetadata() if err != nil { t.Fatal(err) } bs, err := blockset.CreateBlocksetFromSpec(globals.DefaultBlockSpec, srv.Blocks) if err != nil { t.Fatal(err) } inode := models.NewEmptyINode() inode.INode = 1 inode.Volume = vol.Id inode.Blocks, err = torus.MarshalBlocksetToProto(bs) f, err := srv.CreateFile(vol, inode, bs) if err != nil { t.Fatal(err) } return srv, f }
// testAoEServer sets up a Torus AoE server and returns: // - an io.Reader which contains the server's response to a request // - an io.Writer which can be used to issue a request to the server // - a closure which can be used to run the server for a single // request/response cycle // - a closure which can be used to tear down all server resources func testAoEServer(t *testing.T) (response io.Reader, request io.Writer, run func() error, done func()) { ts := torus.NewMemoryServer() mds, err := temp.NewTemp(ts.Cfg) if err != nil { t.Fatalf("failed to configure metadata service: %v", err) } ts.MDS = mds const volName = "test" if err := block.CreateBlockVolume(mds, volName, 1024); err != nil { t.Fatalf("failed to create block volume: %v", err) } vol, err := block.OpenBlockVolume(ts, volName) if err != nil { t.Fatalf("error opening block volume: %v", err) } as, err := NewServer(vol, nil) if err != nil { t.Fatalf("error opening AoE server: %v", err) } serverWrite := bytes.NewBuffer(nil) serverRead := bytes.NewBuffer(nil) bp := &bufPacketConn{ rb: serverWrite, wb: serverRead, } iface := &Interface{ Interface: &net.Interface{ Name: "lo", MTU: testMTU, }, PacketConn: bp, } run = func() error { if err := as.Serve(iface); err != nil { return fmt.Errorf("failed to serve AoE: %v", err) } bp.mu.Lock() defer bp.mu.Unlock() if !bp.gotBroadcast { return errors.New("broadcast advertise was never received") } return nil } done = func() { _ = as.Close() _ = iface.PacketConn.Close() _ = ts.Close() } return serverRead, serverWrite, run, done }