@@ -996,3 +996,92 @@ func (tp *TestSuite) TestGetSeek(t *testing.T) {
996
996
test (dataSize - 50 , io .SeekStart , 100 , 50 , true )
997
997
test (- 5 , io .SeekEnd , 100 , 5 , true )
998
998
}
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