@@ -48,6 +48,7 @@ func (tp *TestSuite) TestUnixfs(t *testing.T) {
48
48
t .Run ("TestLsNonUnixfs" , tp .TestLsNonUnixfs )
49
49
t .Run ("TestAddCloses" , tp .TestAddCloses )
50
50
t .Run ("TestGetSeek" , tp .TestGetSeek )
51
+ t .Run ("TestGetReadAt" , tp .TestGetReadAt )
51
52
}
52
53
53
54
// `echo -n 'hello, world!' | ipfs add`
@@ -996,3 +997,84 @@ func (tp *TestSuite) TestGetSeek(t *testing.T) {
996
997
test (dataSize - 50 , io .SeekStart , 100 , 50 , true )
997
998
test (- 5 , io .SeekEnd , 100 , 5 , true )
998
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
+ }
0 commit comments