func TestEndSeek(t *testing.T) { dserv := testu.GetDAGServ() n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } _, err = dagmod.Write(make([]byte, 100)) if err != nil { t.Fatal(err) } offset, err := dagmod.Seek(0, os.SEEK_CUR) if offset != 100 { t.Fatal("expected the relative seek 0 to return current location") } offset, err = dagmod.Seek(0, os.SEEK_SET) if offset != 0 { t.Fatal("expected the absolute seek to set offset at 0") } offset, err = dagmod.Seek(0, os.SEEK_END) if offset != 100 { t.Fatal("expected the end seek to set offset at end") } }
func TestRelativeSeek(t *testing.T) { dserv := testu.GetDAGServ() n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } for i := 0; i < 64; i++ { dagmod.Write([]byte{byte(i)}) if _, err := dagmod.Seek(1, os.SEEK_CUR); err != nil { t.Fatal(err) } } out, err := ioutil.ReadAll(dagmod) if err != nil { t.Fatal(err) } for i, v := range out { if v != 0 && i/2 != int(v) { t.Errorf("expected %d, at index %d, got %d", i/2, i, v) } } }
func TestDirBuilder(t *testing.T) { dserv := testu.GetDAGServ() ctx, closer := context.WithCancel(context.Background()) defer closer() inbuf, node := testu.GetRandomNode(t, dserv, 1024) key := node.Cid() b := NewDirectory(dserv) b.AddChild(ctx, "random", key) dir := b.GetNode() outn, err := dir.GetLinkedProtoNode(ctx, dserv, "random") if err != nil { t.Fatal(err) } reader, err := NewDagReader(ctx, outn, dserv) if err != nil { t.Fatal(err) } outbuf, err := ioutil.ReadAll(reader) if err != nil { t.Fatal(err) } err = testu.ArrComp(inbuf, outbuf) if err != nil { t.Fatal(err) } }
func TestSeekAndRead(t *testing.T) { dserv := testu.GetDAGServ() inbuf := make([]byte, 256) for i := 0; i <= 255; i++ { inbuf[i] = byte(i) } node := testu.GetNode(t, dserv, inbuf) ctx, closer := context.WithCancel(context.Background()) defer closer() reader, err := NewDagReader(ctx, node, dserv) if err != nil { t.Fatal(err) } for i := 255; i >= 0; i-- { reader.Seek(int64(i), os.SEEK_SET) if reader.Offset() != int64(i) { t.Fatal("expected offset to be increased by one after read") } out := readByte(t, reader) if int(out) != i { t.Fatalf("read %d at index %d, expected %d", out, i, i) } if reader.Offset() != int64(i+1) { t.Fatal("expected offset to be increased by one after read") } } }
func TestCtxRead(t *testing.T) { dserv := testu.GetDAGServ() n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } _, err = dagmod.Write([]byte{0, 1, 2, 3, 4, 5, 6, 7}) if err != nil { t.Fatal(err) } dagmod.Seek(0, os.SEEK_SET) readBuf := make([]byte, 4) _, err = dagmod.CtxReadFull(ctx, readBuf) if err != nil { t.Fatal(err) } err = testu.ArrComp(readBuf, []byte{0, 1, 2, 3}) if err != nil { t.Fatal(err) } // TODO(Kubuxu): context cancel case, I will do it after I figure out dagreader tests, // because this is exacelly the same. }
func BenchmarkDagmodWrite(b *testing.B) { b.StopTimer() dserv := testu.GetDAGServ() n := testu.GetEmptyNode(b, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() wrsize := 4096 dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { b.Fatal(err) } buf := make([]byte, b.N*wrsize) u.NewTimeSeededRand().Read(buf) b.StartTimer() b.SetBytes(int64(wrsize)) for i := 0; i < b.N; i++ { n, err := dagmod.Write(buf[i*wrsize : (i+1)*wrsize]) if err != nil { b.Fatal(err) } if n != wrsize { b.Fatal("Wrote bad size") } } }
func TestBadPBData(t *testing.T) { dserv := testu.GetDAGServ() ctx, closer := context.WithCancel(context.Background()) defer closer() node := mdag.NodeWithData([]byte{42}) _, err := NewDagReader(ctx, node, dserv) if err == nil { t.Fatal("excepted error, got nil") } }
func TestDagModifierBasic(t *testing.T) { dserv := testu.GetDAGServ() b, n := testu.GetRandomNode(t, dserv, 50000) ctx, cancel := context.WithCancel(context.Background()) defer cancel() dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } // Within zero block beg := uint64(15) length := uint64(60) t.Log("Testing mod within zero block") b = testModWrite(t, beg, length, b, dagmod) // Within bounds of existing file beg = 1000 length = 4000 t.Log("Testing mod within bounds of existing multiblock file.") b = testModWrite(t, beg, length, b, dagmod) // Extend bounds beg = 49500 length = 4000 t.Log("Testing mod that extends file.") b = testModWrite(t, beg, length, b, dagmod) // "Append" beg = uint64(len(b)) length = 3000 t.Log("Testing pure append") b = testModWrite(t, beg, length, b, dagmod) // Verify reported length node, err := dagmod.GetNode() if err != nil { t.Fatal(err) } size, err := ft.DataSize(node.Data()) if err != nil { t.Fatal(err) } expected := uint64(50000 + 3500 + 3000) if size != expected { t.Fatalf("Final reported size is incorrect [%d != %d]", size, expected) } }
func TestRelativeSeek(t *testing.T) { dserv := testu.GetDAGServ() ctx, closer := context.WithCancel(context.Background()) defer closer() inbuf := make([]byte, 1024) for i := 0; i < 256; i++ { inbuf[i*4] = byte(i) } inbuf[1023] = 1 // force the reader to be 1024 bytes node := testu.GetNode(t, dserv, inbuf) reader, err := NewDagReader(ctx, node, dserv) if err != nil { t.Fatal(err) } for i := 0; i < 256; i++ { if reader.Offset() != int64(i*4) { t.Fatalf("offset should be %d, was %d", i*4, reader.Offset()) } out := readByte(t, reader) if int(out) != i { t.Fatalf("expected to read: %d at %d, read %d", i, reader.Offset()-1, out) } if i != 255 { _, err := reader.Seek(3, os.SEEK_CUR) if err != nil { t.Fatal(err) } } } _, err = reader.Seek(4, os.SEEK_END) if err != nil { t.Fatal(err) } for i := 0; i < 256; i++ { if reader.Offset() != int64(1020-i*4) { t.Fatalf("offset should be %d, was %d", 1020-i*4, reader.Offset()) } out := readByte(t, reader) if int(out) != 255-i { t.Fatalf("expected to read: %d at %d, read %d", 255-i, reader.Offset()-1, out) } reader.Seek(-5, os.SEEK_CUR) // seek 4 bytes but we read one byte every time so 5 bytes } }
func TestMultiWrite(t *testing.T) { dserv := testu.GetDAGServ() n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } data := make([]byte, 4000) u.NewTimeSeededRand().Read(data) for i := 0; i < len(data); i++ { n, err := dagmod.WriteAt(data[i:i+1], int64(i)) if err != nil { t.Fatal(err) } if n != 1 { t.Fatal("Somehow wrote the wrong number of bytes! (n != 1)") } size, err := dagmod.Size() if err != nil { t.Fatal(err) } if size != int64(i+1) { t.Fatal("Size was reported incorrectly") } } nd, err := dagmod.GetNode() if err != nil { t.Fatal(err) } read, err := uio.NewDagReader(context.Background(), nd, dserv) if err != nil { t.Fatal(err) } rbuf, err := ioutil.ReadAll(read) if err != nil { t.Fatal(err) } err = testu.ArrComp(rbuf, data) if err != nil { t.Fatal(err) } }
func TestReaderSzie(t *testing.T) { dserv := testu.GetDAGServ() size := int64(1024) _, node := testu.GetRandomNode(t, dserv, size) ctx, closer := context.WithCancel(context.Background()) defer closer() reader, err := NewDagReader(ctx, node, dserv) if err != nil { t.Fatal(err) } if reader.Size() != uint64(size) { t.Fatal("wrong reader size") } }
func TestInvalidSeek(t *testing.T) { dserv := testu.GetDAGServ() n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } _, err = dagmod.Seek(10, -10) if err != ErrUnrecognizedWhence { t.Fatal(err) } }
func TestSeekPastEndWrite(t *testing.T) { dserv := testu.GetDAGServ() n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } buf := make([]byte, 5000) u.NewTimeSeededRand().Read(buf[2500:]) nseek, err := dagmod.Seek(2500, os.SEEK_SET) if err != nil { t.Fatal(err) } if nseek != 2500 { t.Fatal("failed to seek") } wrote, err := dagmod.Write(buf[2500:]) if err != nil { t.Fatal(err) } if wrote != 2500 { t.Fatal("incorrect write amount") } _, err = dagmod.Seek(0, os.SEEK_SET) if err != nil { t.Fatal(err) } out, err := ioutil.ReadAll(dagmod) if err != nil { t.Fatal(err) } if err = testu.ArrComp(out, buf); err != nil { t.Fatal(err) } }
func TestWriteNewFile(t *testing.T) { dserv := testu.GetDAGServ() n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } towrite := make([]byte, 2000) u.NewTimeSeededRand().Read(towrite) nw, err := dagmod.Write(towrite) if err != nil { t.Fatal(err) } if nw != len(towrite) { t.Fatal("Wrote wrong amount") } nd, err := dagmod.GetNode() if err != nil { t.Fatal(err) } read, err := uio.NewDagReader(ctx, nd, dserv) if err != nil { t.Fatal(err) } data, err := ioutil.ReadAll(read) if err != nil { t.Fatal(err) } if err := testu.ArrComp(data, towrite); err != nil { t.Fatal(err) } }
func TestWriteTo(t *testing.T) { dserv := testu.GetDAGServ() inbuf, node := testu.GetRandomNode(t, dserv, 1024) ctx, closer := context.WithCancel(context.Background()) defer closer() reader, err := NewDagReader(ctx, node, dserv) if err != nil { t.Fatal(err) } outbuf := new(bytes.Buffer) reader.WriteTo(outbuf) err = testu.ArrComp(inbuf, outbuf.Bytes()) if err != nil { t.Fatal(err) } }
func TestTypeFailures(t *testing.T) { dserv := testu.GetDAGServ() ctx, closer := context.WithCancel(context.Background()) defer closer() node := unixfs.EmptyDirNode() if _, err := NewDagReader(ctx, node, dserv); err != ErrIsDir { t.Fatalf("excepted to get %v, got %v", ErrIsDir, err) } data, err := unixfs.SymlinkData("/somelink") if err != nil { t.Fatal(err) } node = mdag.NodeWithData(data) if _, err := NewDagReader(ctx, node, dserv); err != ErrCantReadSymlinks { t.Fatalf("excepted to get %v, got %v", ErrCantReadSymlinks, err) } }
func TestBasicRead(t *testing.T) { dserv := testu.GetDAGServ() inbuf, node := testu.GetRandomNode(t, dserv, 1024) ctx, closer := context.WithCancel(context.Background()) defer closer() reader, err := NewDagReader(ctx, node, dserv) if err != nil { t.Fatal(err) } outbuf, err := ioutil.ReadAll(reader) if err != nil { t.Fatal(err) } err = testu.ArrComp(inbuf, outbuf) if err != nil { t.Fatal(err) } }
func TestMetadataNode(t *testing.T) { dserv := testu.GetDAGServ() rdata, rnode := testu.GetRandomNode(t, dserv, 512) _, err := dserv.Add(rnode) if err != nil { t.Fatal(err) } ctx, closer := context.WithCancel(context.Background()) defer closer() data, err := unixfs.BytesForMetadata(&unixfs.Metadata{"text", 125}) if err != nil { t.Fatal(err) } node := mdag.NodeWithData(data) _, err = NewDagReader(ctx, node, dserv) if err == nil { t.Fatal("expected an error") } if !strings.Contains(err.Error(), "incorrectly formatted") { t.Fatal("expected different error") } node.AddNodeLink("", rnode) reader, err := NewDagReader(ctx, node, dserv) if err != nil { t.Fatal(err) } readdata, err := ioutil.ReadAll(reader) if err != nil { t.Fatal(err) } if err := testu.ArrComp(rdata, readdata); err != nil { t.Fatal(err) } }
func TestLargeWriteChunks(t *testing.T) { dserv := testu.GetDAGServ() n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } wrsize := 1000 datasize := 10000000 data := make([]byte, datasize) u.NewTimeSeededRand().Read(data) for i := 0; i < datasize/wrsize; i++ { n, err := dagmod.WriteAt(data[i*wrsize:(i+1)*wrsize], int64(i*wrsize)) if err != nil { t.Fatal(err) } if n != wrsize { t.Fatal("failed to write buffer") } } out, err := ioutil.ReadAll(dagmod) if err != nil { t.Fatal(err) } if err = testu.ArrComp(out, data); err != nil { t.Fatal(err) } }
func TestDagTruncate(t *testing.T) { dserv := testu.GetDAGServ() b, n := testu.GetRandomNode(t, dserv, 50000) ctx, cancel := context.WithCancel(context.Background()) defer cancel() dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } err = dagmod.Truncate(12345) if err != nil { t.Fatal(err) } size, err := dagmod.Size() if err != nil { t.Fatal(err) } if size != 12345 { t.Fatal("size was incorrect!") } _, err = dagmod.Seek(0, os.SEEK_SET) if err != nil { t.Fatal(err) } out, err := ioutil.ReadAll(dagmod) if err != nil { t.Fatal(err) } if err = testu.ArrComp(out, b[:12345]); err != nil { t.Fatal(err) } err = dagmod.Truncate(10) if err != nil { t.Fatal(err) } size, err = dagmod.Size() if err != nil { t.Fatal(err) } if size != 10 { t.Fatal("size was incorrect!") } err = dagmod.Truncate(0) if err != nil { t.Fatal(err) } size, err = dagmod.Size() if err != nil { t.Fatal(err) } if size != 0 { t.Fatal("size was incorrect!") } }
func TestReadAndSeek(t *testing.T) { dserv := testu.GetDAGServ() n := testu.GetEmptyNode(t, dserv) ctx, cancel := context.WithCancel(context.Background()) defer cancel() dagmod, err := NewDagModifier(ctx, n, dserv, testu.SizeSplitterGen(512)) if err != nil { t.Fatal(err) } writeBuf := []byte{0, 1, 2, 3, 4, 5, 6, 7} dagmod.Write(writeBuf) if !dagmod.HasChanges() { t.Fatal("there are changes, this should be true") } readBuf := make([]byte, 4) offset, err := dagmod.Seek(0, os.SEEK_SET) if offset != 0 { t.Fatal("expected offset to be 0") } if err != nil { t.Fatal(err) } // read 0,1,2,3 c, err := dagmod.Read(readBuf) if err != nil { t.Fatal(err) } if c != 4 { t.Fatalf("expected length of 4 got %d", c) } for i := byte(0); i < 4; i++ { if readBuf[i] != i { t.Fatalf("wrong value %d [at index %d]", readBuf[i], i) } } // skip 4 _, err = dagmod.Seek(1, os.SEEK_CUR) if err != nil { t.Fatalf("error: %s, offset %d, reader offset %d", err, dagmod.curWrOff, dagmod.read.Offset()) } //read 5,6,7 readBuf = make([]byte, 3) c, err = dagmod.Read(readBuf) if err != nil { t.Fatal(err) } if c != 3 { t.Fatalf("expected length of 3 got %d", c) } for i := byte(0); i < 3; i++ { if readBuf[i] != i+5 { t.Fatalf("wrong value %d [at index %d]", readBuf[i], i) } } }