func actorMakeFile(d *Directory) error { d, err := randomWalk(d, rand.Intn(7)) if err != nil { return err } name := randomName() f, err := NewFile(name, dag.NodeWithData(ft.FilePBData(nil, 0)), d, d.dserv) if err != nil { return err } wfd, err := f.Open(OpenWriteOnly, true) if err != nil { return err } rread := rand.New(rand.NewSource(time.Now().UnixNano())) r := io.LimitReader(rread, int64(77*rand.Intn(123))) _, err = io.Copy(wfd, r) if err != nil { return err } err = wfd.Close() if err != nil { return err } return nil }
func actorMakeFile(d *Directory) error { d, err := randomWalk(d, rand.Intn(7)) if err != nil { return err } name := randomName() f, err := NewFile(name, &dag.Node{Data: ft.FilePBData(nil, 0)}, d, d.dserv) if err != nil { return err } wfd, err := f.Open(OpenWriteOnly, true) if err != nil { return err } r := io.LimitReader(randbo.New(), int64(77*rand.Intn(123))) _, err = io.Copy(wfd, r) if err != nil { return err } err = wfd.Close() if err != nil { return err } return nil }
func getFileHandle(r *mfs.Root, path string, create bool) (*mfs.File, error) { target, err := mfs.Lookup(r, path) switch err { case nil: fi, ok := target.(*mfs.File) if !ok { return nil, fmt.Errorf("%s was not a file", path) } return fi, nil case os.ErrNotExist: if !create { return nil, err } // if create is specified and the file doesnt exist, we create the file dirname, fname := gopath.Split(path) pdiri, err := mfs.Lookup(r, dirname) if err != nil { log.Error("lookupfail ", dirname) return nil, err } pdir, ok := pdiri.(*mfs.Directory) if !ok { return nil, fmt.Errorf("%s was not a directory", dirname) } nd := dag.NodeWithData(ft.FilePBData(nil, 0)) err = pdir.AddChild(fname, nd) if err != nil { return nil, err } fsn, err := pdir.Child(fname) if err != nil { return nil, err } fi, ok := fsn.(*mfs.File) if !ok { return nil, errors.New("Expected *mfs.File, didnt get it. This is likely a race condition.") } return fi, nil default: return nil, err } }
func TestAppendSingleBytesToEmpty(t *testing.T) { ds := mdtest.Mock() data := []byte("AB") nd := new(merkledag.Node) nd.Data = ft.FilePBData(nil, 0) dbp := &h.DagBuilderParams{ Dagserv: ds, Maxlinks: 4, } spl := chunk.SizeSplitterGen(500) blks, errs := chunk.Chan(spl(bytes.NewReader(data[:1]))) ctx := context.Background() nnode, err := TrickleAppend(ctx, nd, dbp.New(blks, errs)) if err != nil { t.Fatal(err) } blks, errs = chunk.Chan(spl(bytes.NewReader(data[1:]))) nnode, err = TrickleAppend(ctx, nnode, dbp.New(blks, errs)) if err != nil { t.Fatal(err) } fread, err := uio.NewDagReader(ctx, nnode, ds) if err != nil { t.Fatal(err) } out, err := ioutil.ReadAll(fread) if err != nil { t.Fatal(err) } fmt.Println(out, data) err = arrComp(out, data) if err != nil { t.Fatal(err) } }
func TestAppendSingleBytesToEmpty(t *testing.T) { ds := mdtest.Mock(t) data := []byte("AB") nd := new(merkledag.Node) nd.Data = ft.FilePBData(nil, 0) dbp := &h.DagBuilderParams{ Dagserv: ds, Maxlinks: 4, } spl := &chunk.SizeSplitter{500} blks := spl.Split(bytes.NewReader(data[:1])) nnode, err := TrickleAppend(nd, dbp.New(blks)) if err != nil { t.Fatal(err) } blks = spl.Split(bytes.NewReader(data[1:])) nnode, err = TrickleAppend(nnode, dbp.New(blks)) if err != nil { t.Fatal(err) } fread, err := uio.NewDagReader(context.TODO(), nnode, ds) if err != nil { t.Fatal(err) } out, err := ioutil.ReadAll(fread) if err != nil { t.Fatal(err) } fmt.Println(out, data) err = arrComp(out, data) if err != nil { t.Fatal(err) } }
func (dir *Directory) Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) { // New 'empty' file nd := &dag.Node{Data: ft.FilePBData(nil, 0)} err := dir.dir.AddChild(req.Name, nd) if err != nil { return nil, nil, err } child, err := dir.dir.Child(req.Name) if err != nil { return nil, nil, err } fi, ok := child.(*mfs.File) if !ok { return nil, nil, errors.New("child creation failed") } nodechild := &File{fi: fi} return nodechild, nodechild, nil }
func (dir *Directory) Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) { // New 'empty' file nd := &dag.Node{Data: ft.FilePBData(nil, 0)} err := dir.dir.AddChild(req.Name, nd) if err != nil { return nil, nil, err } child, err := dir.dir.Child(req.Name) if err != nil { return nil, nil, err } fi, ok := child.(*mfs.File) if !ok { return nil, nil, errors.New("child creation failed") } nodechild := &FileNode{fi: fi} var openflag int switch { case req.Flags.IsReadOnly(): openflag = mfs.OpenReadOnly case req.Flags.IsWriteOnly(): openflag = mfs.OpenWriteOnly case req.Flags.IsReadWrite(): openflag = mfs.OpenReadWrite default: return nil, nil, errors.New("unsupported open mode") } fd, err := fi.Open(openflag, true) if err != nil { return nil, nil, err } return nodechild, &File{fi: fd}, nil }
func TestFileDescriptors(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() ds, rt := setupRoot(ctx, t) dir := rt.GetValue().(*Directory) nd := &dag.Node{Data: ft.FilePBData(nil, 0)} fi, err := NewFile("test", nd, dir, ds) if err != nil { t.Fatal(err) } // test read only rfd1, err := fi.Open(OpenReadOnly, false) if err != nil { t.Fatal(err) } err = rfd1.Truncate(0) if err == nil { t.Fatal("shouldnt be able to truncate readonly fd") } _, err = rfd1.Write([]byte{}) if err == nil { t.Fatal("shouldnt be able to write to readonly fd") } _, err = rfd1.Read([]byte{}) if err != nil { t.Fatalf("expected to be able to read from file: %s", err) } done := make(chan struct{}) go func() { defer close(done) // can open second readonly file descriptor rfd2, err := fi.Open(OpenReadOnly, false) if err != nil { t.Error(err) return } rfd2.Close() }() select { case <-time.After(time.Second): t.Fatal("open second file descriptor failed") case <-done: } if t.Failed() { return } // test not being able to open for write until reader are closed done = make(chan struct{}) go func() { defer close(done) wfd1, err := fi.Open(OpenWriteOnly, true) if err != nil { t.Error(err) } wfd1.Close() }() select { case <-time.After(time.Millisecond * 200): case <-done: if t.Failed() { return } t.Fatal("shouldnt have been able to open file for writing") } err = rfd1.Close() if err != nil { t.Fatal(err) } select { case <-time.After(time.Second): t.Fatal("should have been able to open write fd after closing read fd") case <-done: } wfd, err := fi.Open(OpenWriteOnly, true) if err != nil { t.Fatal(err) } _, err = wfd.Read([]byte{}) if err == nil { t.Fatal("shouldnt have been able to read from write only filedescriptor") } _, err = wfd.Write([]byte{}) if err != nil { t.Fatal(err) } }
func TestFlushing(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() _, rt := setupRoot(ctx, t) dir := rt.GetValue().(*Directory) c := mkdirP(t, dir, "a/b/c") d := mkdirP(t, dir, "a/b/d") e := mkdirP(t, dir, "a/b/e") data := []byte("this is a test\n") nd1 := &dag.Node{Data: ft.FilePBData(data, uint64(len(data)))} if err := c.AddChild("TEST", nd1); err != nil { t.Fatal(err) } if err := d.AddChild("TEST", nd1); err != nil { t.Fatal(err) } if err := e.AddChild("TEST", nd1); err != nil { t.Fatal(err) } if err := dir.AddChild("FILE", nd1); err != nil { t.Fatal(err) } if err := FlushPath(rt, "/a/b/c/TEST"); err != nil { t.Fatal(err) } if err := FlushPath(rt, "/a/b/d/TEST"); err != nil { t.Fatal(err) } if err := FlushPath(rt, "/a/b/e/TEST"); err != nil { t.Fatal(err) } if err := FlushPath(rt, "/FILE"); err != nil { t.Fatal(err) } rnd, err := dir.GetNode() if err != nil { t.Fatal(err) } fsnode, err := ft.FSNodeFromBytes(rnd.Data) if err != nil { t.Fatal(err) } if fsnode.Type != ft.TDirectory { t.Fatal("root wasnt a directory") } rnk, err := rnd.Key() if err != nil { t.Fatal(err) } exp := "QmWMVyhTuyxUrXX3ynz171jq76yY3PktfY9Bxiph7b9ikr" if rnk.B58String() != exp { t.Fatalf("dag looks wrong, expected %s, but got %s", exp, rnk.B58String()) } }