github.com/qiniu/go-sdk/v7@v7.27.0/storagev2/uploader/source/source_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package source_test 5 6 import ( 7 "bytes" 8 "io" 9 "math/rand" 10 "os" 11 "sync" 12 "testing" 13 "time" 14 15 internal_io "github.com/qiniu/go-sdk/v7/internal/io" 16 uploader "github.com/qiniu/go-sdk/v7/storagev2/uploader/source" 17 ) 18 19 func TestSeekableSource(t *testing.T) { 20 tmpFile, err := os.CreateTemp("", "test-seekable-source-*") 21 if err != nil { 22 t.Fatal(err) 23 } 24 defer os.Remove(tmpFile.Name()) 25 defer tmpFile.Close() 26 27 if _, err = io.CopyN(tmpFile, rand.New(rand.NewSource(time.Now().UnixNano())), 4096); err != nil { 28 t.Fatal(err) 29 } 30 if _, err = tmpFile.Seek(0, io.SeekStart); err != nil { 31 t.Fatal(err) 32 } 33 34 source := uploader.NewReadSeekCloserSource(tmpFile, tmpFile.Name()) 35 testSource(t, source, tmpFile) 36 source = uploader.NewReadAtSeekCloserSource(tmpFile, tmpFile.Name()) 37 testSource(t, source, tmpFile) 38 } 39 40 func testSource(t *testing.T, source uploader.Source, originalFile *os.File) { 41 if ts, err := source.(uploader.SizedSource).TotalSize(); err != nil { 42 t.Fatal(err) 43 } else if ts != 4096 { 44 t.Fatalf("Unexpected file size: %d", ts) 45 } 46 47 if sk, err := source.SourceID(); err != nil { 48 t.Fatal(err) 49 } else if sk != originalFile.Name() { 50 t.Fatalf("Unexpected source key: %#v", sk) 51 } 52 53 parts := make([]uploader.Part, 0, 16) 54 for i := 0; i < 16; i++ { 55 part, err := source.Slice(256) 56 if err != nil { 57 t.Fatal(err) 58 } 59 parts = append(parts, part) 60 } 61 for i, part := range parts { 62 if part.PartNumber() != uint64(i+1) { 63 t.Fatalf("Unexpected part number: %d", part.PartNumber()) 64 } 65 } 66 var wg sync.WaitGroup 67 for i := 0; i < 16; i++ { 68 wg.Add(1) 69 go func(i int) { 70 defer wg.Done() 71 testPart(t, parts[i], int64(i*256), originalFile) 72 }(i) 73 } 74 wg.Wait() 75 } 76 77 func testPart(t *testing.T, part uploader.Part, offset int64, originalFile *os.File) { 78 partData, err := internal_io.ReadAll(part) 79 if err != nil { 80 t.Fatal(err) 81 } 82 assertReaderEqual(t, originalFile, offset, partData) 83 84 if _, err := part.Seek(0, io.SeekStart); err != nil { 85 t.Fatal(err) 86 } 87 88 partData, err = internal_io.ReadAll(part) 89 if err != nil { 90 t.Fatal(err) 91 } 92 assertReaderEqual(t, originalFile, offset, partData) 93 } 94 95 func assertReaderEqual(t *testing.T, file *os.File, offset int64, expectedData []byte) { 96 data := make([]byte, len(expectedData)) 97 n, err := file.ReadAt(data, offset) 98 if err != nil { 99 t.Fatal(err) 100 } else if n != len(expectedData) { 101 t.Fatalf("Unexpected read data size %d", n) 102 } 103 if !bytes.Equal(data, expectedData) { 104 t.Fatalf("Range (%d-%d) of file (%s) is inequal", offset, offset+int64(len(expectedData)), file.Name()) 105 } 106 }