Skip to content
This repository was archived by the owner on Jun 19, 2023. It is now read-only.

Commit 80d0804

Browse files
committed
test: test ReadAt if implemented
(I plan on adding support to the http client, at least)
1 parent 114c623 commit 80d0804

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,5 @@ require (
1212
github.com/multiformats/go-multiaddr v0.0.4
1313
github.com/multiformats/go-multihash v0.0.7
1414
)
15+
16+
go 1.12

tests/unixfs.go

+89
Original file line numberDiff line numberDiff line change
@@ -996,3 +996,92 @@ func (tp *TestSuite) TestGetSeek(t *testing.T) {
996996
test(dataSize-50, io.SeekStart, 100, 50, true)
997997
test(-5, io.SeekEnd, 100, 5, true)
998998
}
999+
1000+
func (tp *TestSuite) TestGetReadAt(t *testing.T) {
1001+
ctx, cancel := context.WithCancel(context.Background())
1002+
defer cancel()
1003+
api, err := tp.makeAPI(ctx)
1004+
if err != nil {
1005+
t.Fatal(err)
1006+
}
1007+
1008+
dataSize := int64(100000)
1009+
tf := files.NewReaderFile(io.LimitReader(rand.New(rand.NewSource(1403768328)), dataSize))
1010+
1011+
p, err := api.Unixfs().Add(ctx, tf, options.Unixfs.Chunker("size-100"))
1012+
if err != nil {
1013+
t.Fatal(err)
1014+
}
1015+
1016+
r, err := api.Unixfs().Get(ctx, p)
1017+
if err != nil {
1018+
t.Fatal(err)
1019+
}
1020+
1021+
f, ok := r.(interface {
1022+
files.File
1023+
io.ReaderAt
1024+
})
1025+
if !ok {
1026+
t.Skip("ReaderAt not implemented")
1027+
}
1028+
1029+
orig := make([]byte, dataSize)
1030+
if _, err := io.ReadFull(f, orig); err != nil {
1031+
t.Fatal(err)
1032+
}
1033+
f.Close()
1034+
1035+
origR := bytes.NewReader(orig)
1036+
1037+
r, err = api.Unixfs().Get(ctx, p)
1038+
if err != nil {
1039+
t.Fatal(err)
1040+
}
1041+
1042+
test := func(offset int64, read int, expect int64, shouldEof bool) {
1043+
t.Run(fmt.Sprintf("readat%d-r%d-%d", offset, read, expect), func(t *testing.T) {
1044+
origBuf := make([]byte, read)
1045+
origRead, err := origR.ReadAt(origBuf, offset)
1046+
if err != nil {
1047+
t.Fatalf("orig: %s", err)
1048+
}
1049+
buf := make([]byte, read)
1050+
r, err := f.ReadAt(buf, offset)
1051+
switch {
1052+
case shouldEof && err != nil && err != io.EOF:
1053+
fallthrough
1054+
case !shouldEof && err != nil:
1055+
t.Fatalf("f: %s", err)
1056+
case shouldEof:
1057+
_, err := f.Read([]byte{0})
1058+
if err != io.EOF {
1059+
t.Fatal("expected EOF")
1060+
}
1061+
_, err = origR.Read([]byte{0})
1062+
if err != io.EOF {
1063+
t.Fatal("expected EOF (orig)")
1064+
}
1065+
}
1066+
1067+
if int64(r) != expect {
1068+
t.Fatal("read wrong amount of data")
1069+
}
1070+
if r != origRead {
1071+
t.Fatal("read different amount of data than bytes.Reader")
1072+
}
1073+
if !bytes.Equal(buf, origBuf) {
1074+
fmt.Fprintf(os.Stderr, "original:\n%s\n", hex.Dump(origBuf))
1075+
fmt.Fprintf(os.Stderr, "got:\n%s\n", hex.Dump(buf))
1076+
t.Fatal("data didn't match")
1077+
}
1078+
})
1079+
}
1080+
1081+
test(3, 10, 10, false)
1082+
test(13, 10, 10, false)
1083+
test(513, 10, 10, false)
1084+
test(350, 100, 100, false)
1085+
test(0, int(dataSize), dataSize, false)
1086+
test(dataSize-50, 100, 50, true)
1087+
}

0 commit comments

Comments
 (0)