package stream import ( "bytes" "errors" "fmt" "io" "testing" "github.com/OpenListTeam/OpenList/v4/internal/model" "github.com/OpenListTeam/OpenList/v4/pkg/http_range" "github.com/OpenListTeam/OpenList/v4/pkg/utils" ) func TestFileStream_RangeRead(t *testing.T) { type args struct { httpRange http_range.Range } buf := []byte("github.com/OpenListTeam/OpenList") f := &FileStream{ Obj: &model.Object{ Size: int64(len(buf)), }, Reader: io.NopCloser(bytes.NewReader(buf)), } tests := []struct { name string f *FileStream args args want func(f *FileStream, got io.Reader, err error) error }{ { name: "range 11-12", f: f, args: args{ httpRange: http_range.Range{Start: 11, Length: 12}, }, want: func(f *FileStream, got io.Reader, err error) error { if f.GetFile() != nil { return errors.New("cached") } b, _ := io.ReadAll(got) if !bytes.Equal(buf[11:11+12], b) { return fmt.Errorf("=%s ,want =%s", b, buf[11:11+12]) } return nil }, }, { name: "range 11-21", f: f, args: args{ httpRange: http_range.Range{Start: 11, Length: 21}, }, want: func(f *FileStream, got io.Reader, err error) error { if f.GetFile() == nil { return errors.New("not cached") } b, _ := io.ReadAll(got) if !bytes.Equal(buf[11:11+21], b) { return fmt.Errorf("=%s ,want =%s", b, buf[11:11+21]) } return nil }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := tt.f.RangeRead(tt.args.httpRange) if err := tt.want(tt.f, got, err); err != nil { t.Errorf("FileStream.RangeRead() %v", err) } }) } if f.GetFile() == nil { t.Error("not cached") } buf2 := make([]byte, len(buf)) if _, err := io.ReadFull(f, buf2); err != nil { t.Errorf("FileStream.Read() error = %v", err) } if !bytes.Equal(buf, buf2) { t.Errorf("FileStream.Read() = %s, want %s", buf2, buf) } } func TestFileStream_With_PreHash(t *testing.T) { buf := []byte("github.com/OpenListTeam/OpenList") f := &FileStream{ Obj: &model.Object{ Size: int64(len(buf)), }, Reader: io.NopCloser(bytes.NewReader(buf)), } const hashSize int64 = 20 reader, _ := f.RangeRead(http_range.Range{Start: 0, Length: hashSize}) preHash, _ := utils.HashReader(utils.SHA1, reader) if preHash == "" { t.Error("preHash is empty") } tmpF, fullHash, _ := CacheFullAndHash(f, nil, utils.SHA1) fmt.Println(fullHash) fileFullHash, _ := utils.HashFile(utils.SHA1, tmpF) fmt.Println(fileFullHash) if fullHash != fileFullHash { t.Errorf("fullHash and fileFullHash should match: fullHash=%s fileFullHash=%s", fullHash, fileFullHash) } }