@cryptotaxi247 / kubo / commits / 5168b591d

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 +}