test: test ReadAt if implemented
(I plan on adding support to the http client, at least) This commit was moved from ipfs/interface-go-ipfs-core@ae838686170af209e0a9b29aa1a59b64346b5de1 This commit was moved from ipfs/boxo@a8c5ec606246224d3f0dfadfc627a9f90d9b53df
Steven Allen committed
Sep 10, 2019 at 18:23 UTC
5168b591dc343f345b0074bcbee870888a7e001d
1 file changed
+82
core/coreiface/tests/unixfs.go
+82
@@ -48,6 +48,7 @@ func (tp *TestSuite) TestUnixfs(t *testing.T) {
48
t.Run("TestLsNonUnixfs", tp.TestLsNonUnixfs)
49
t.Run("TestAddCloses", tp.TestAddCloses)
50
t.Run("TestGetSeek", tp.TestGetSeek)
51
+ t.Run("TestGetReadAt", tp.TestGetReadAt)
52
}
53
54
// `echo -n 'hello, world!' | ipfs add`
@@ -996,3 +997,84 @@ func (tp *TestSuite) TestGetSeek(t *testing.T) {
997
test(dataSize-50, io.SeekStart, 100, 50, true)
998
test(-5, io.SeekEnd, 100, 5, true)
999
}
1000
+
1001
+func (tp *TestSuite) TestGetReadAt(t *testing.T) {
1002
+ ctx, cancel := context.WithCancel(context.Background())
1003
+ defer cancel()
1004
+ api, err := tp.makeAPI(ctx)
1005
+ if err != nil {
1006
+ t.Fatal(err)
1007
+ }
1008
+
1009
+ dataSize := int64(100000)
1010
+ tf := files.NewReaderFile(io.LimitReader(rand.New(rand.NewSource(1403768328)), dataSize))
1011
+
1012
+ p, err := api.Unixfs().Add(ctx, tf, options.Unixfs.Chunker("size-100"))
1013
+ if err != nil {
1014
+ t.Fatal(err)
1015
+ }
1016
+
1017
+ r, err := api.Unixfs().Get(ctx, p)
1018
+ if err != nil {
1019
+ t.Fatal(err)
1020
+ }
1021
+
1022
+ f, ok := r.(interface {
1023
+ files.File
1024
+ io.ReaderAt
1025
+ })
1026
+ if !ok {
1027
+ t.Skip("ReaderAt not implemented")
1028
+ }
1029
+
1030
+ orig := make([]byte, dataSize)
1031
+ if _, err := io.ReadFull(f, orig); err != nil {
1032
+ t.Fatal(err)
1033
+ }
1034
+ f.Close()
1035
+
1036
+ origR := bytes.NewReader(orig)
1037
+
1038
+ r, err = api.Unixfs().Get(ctx, p)
1039
+ if err != nil {
1040
+ t.Fatal(err)
1041
+ }
1042
+
1043
+ test := func(offset int64, read int, expect int64, shouldEof bool) {
1044
+ t.Run(fmt.Sprintf("readat%d-r%d-%d", offset, read, expect), func(t *testing.T) {
1045
+ origBuf := make([]byte, read)
1046
+ origRead, err := origR.ReadAt(origBuf, offset)
1047
+ if err != nil && err != io.EOF {
1048
+ t.Fatalf("orig: %s", err)
1049
+ }
1050
+ buf := make([]byte, read)
1051
+ r, err := f.ReadAt(buf, offset)
1052
+ if shouldEof {
1053
+ if err != io.EOF {
1054
+ t.Fatal("expected EOF, got: ", err)
1055
+ }
1056
+ } else if err != nil {
1057
+ t.Fatal("got: ", err)
1058
+ }
1059
+
1060
+ if int64(r) != expect {
1061
+ t.Fatal("read wrong amount of data")
1062
+ }
1063
+ if r != origRead {
1064
+ t.Fatal("read different amount of data than bytes.Reader")
1065
+ }
1066
+ if !bytes.Equal(buf, origBuf) {
1067
+ fmt.Fprintf(os.Stderr, "original:\n%s\n", hex.Dump(origBuf))
1068
+ fmt.Fprintf(os.Stderr, "got:\n%s\n", hex.Dump(buf))
1069
+ t.Fatal("data didn't match")
1070
+ }
1071
+ })
1072
+ }
1073
+
1074
+ test(3, 10, 10, false)
1075
+ test(13, 10, 10, false)
1076
+ test(513, 10, 10, false)
1077
+ test(350, 100, 100, false)
1078
+ test(0, int(dataSize), dataSize, false)
1079
+ test(dataSize-50, 100, 50, true)
1080
+}