github.com/qiniu/go-sdk/v7@v7.27.0/storage/upload_manager_test.go (about) 1 //go:build integration 2 // +build integration 3 4 package storage 5 6 import ( 7 "context" 8 "fmt" 9 "io" 10 "os" 11 "testing" 12 13 clientV1 "github.com/qiniu/go-sdk/v7/client" 14 ) 15 16 func getUploadManager() *UploadManager { 17 return getUploadManagerV2([]string{"mock01.qiniu.com", "mock02.qiniu.com"}) 18 } 19 20 func getUploadManagerV2(srcUpHosts []string) *UploadManager { 21 region01 := &Region{SrcUpHosts: srcUpHosts} 22 region02, err := GetRegion(testAK, testBucket) 23 if err != nil { 24 return nil 25 } 26 27 regionGroup := NewRegionGroup(region01, region02) 28 return NewUploadManager(&UploadConfig{ 29 UseHTTPS: true, 30 UseCdnDomains: false, 31 Regions: regionGroup, 32 }) 33 } 34 35 func getUploadToken() string { 36 putPolicy := PutPolicy{ 37 Scope: testBucket, 38 DeleteAfterDays: 7, 39 } 40 return putPolicy.UploadToken(mac) 41 } 42 43 type Ret struct { 44 UploadRet 45 46 Foo string `json:"x:foo"` 47 } 48 49 func TestUploadManagerFormUpload(t *testing.T) { 50 clientV1.DebugMode = true 51 defer func() { 52 clientV1.DebugMode = false 53 }() 54 55 data := []byte("hello, 七牛!!!") 56 tempFile, err := os.CreateTemp("", "TestUploadManagerFormPut") 57 if err != nil { 58 t.Fatalf("create temp file error:%v", err) 59 } 60 defer os.Remove(tempFile.Name()) 61 defer tempFile.Close() 62 63 tempFile.Write(data) 64 size := int64(len(data)) 65 66 params := make(map[string]string) 67 params["x:foo"] = "foo" 68 params["x-qn-meta-A"] = "meta-A" 69 70 uploadManager := getUploadManager() 71 var ret Ret 72 73 // 上传 file 74 source, err := NewUploadSourceFile(tempFile.Name()) 75 err = uploadManager.Put(context.Background(), &ret, getUploadToken(), nil, source, &UploadExtra{ 76 Params: params, 77 TryTimes: 1, 78 HostFreezeDuration: 0, 79 MimeType: "", 80 OnProgress: func(fileSize, uploaded int64) { 81 fmt.Printf("form upload file progress: %d-%d \n", uploaded, fileSize) 82 }, 83 UploadResumeVersion: 0, 84 UploadThreshold: 0, 85 Recorder: nil, 86 PartSize: 0, 87 }) 88 if err != nil { 89 t.Fatalf("form upload file error:%v", err) 90 } 91 if len(ret.Key) == 0 || len(ret.Hash) == 0 { 92 t.Fatal("form upload file error, key or hash is empty") 93 } 94 if len(ret.Foo) == 0 { 95 t.Fatal("form upload file error, foo is empty") 96 } 97 98 // 上传 reader no size 99 tempFile.Seek(0, io.SeekStart) 100 source, _ = NewUploadSourceReader(tempFile, size) 101 err = uploadManager.Put(context.Background(), &ret, getUploadToken(), nil, source, &UploadExtra{ 102 Params: params, 103 TryTimes: 1, 104 HostFreezeDuration: 0, 105 MimeType: "", 106 OnProgress: func(fileSize, uploaded int64) { 107 fmt.Printf("form upload reader progress: %d-%d \n", uploaded, fileSize) 108 }, 109 UploadResumeVersion: 0, 110 UploadThreshold: 0, 111 Recorder: nil, 112 PartSize: 0, 113 }) 114 if err == nil { 115 t.Fatal("form upload: reader source should not support region backup") 116 } 117 118 // 上传 readerAt 119 tempFile.Seek(0, io.SeekStart) 120 source, _ = NewUploadSourceReaderAt(tempFile, size) 121 err = uploadManager.Put(context.Background(), &ret, getUploadToken(), nil, source, &UploadExtra{ 122 Params: params, 123 TryTimes: 1, 124 HostFreezeDuration: 0, 125 MimeType: "", 126 OnProgress: func(fileSize, uploaded int64) { 127 fmt.Printf("form upload reader at progress: %d-%d \n", uploaded, fileSize) 128 }, 129 UploadResumeVersion: 0, 130 UploadThreshold: 0, 131 Recorder: nil, 132 PartSize: 0, 133 }) 134 if err != nil { 135 t.Fatalf("form upload reader at error:%v", err) 136 } 137 if len(ret.Key) == 0 || len(ret.Hash) == 0 { 138 t.Fatal("form upload reader at error, key or hash is empty") 139 } 140 if len(ret.Foo) == 0 { 141 t.Fatal("form upload reader at error, foo is empty") 142 } 143 } 144 145 func TestUploadManagerResumeV1Upload(t *testing.T) { 146 length := 1024 * 1024 * 4 147 data := make([]byte, length, length) 148 data[0] = 8 149 data[length-1] = 8 150 151 tempFile, err := os.CreateTemp("", "TestUploadManagerFormPut") 152 if err != nil { 153 t.Fatalf("create temp file error:%v", err) 154 } 155 defer os.Remove(tempFile.Name()) 156 defer tempFile.Close() 157 158 tempFile.Write(data) 159 size := int64(len(data)) 160 161 params := make(map[string]string) 162 params["x:foo"] = "foo" 163 params["x-qn-meta-A"] = "meta-A" 164 165 uploadManager := getUploadManager() 166 var ret Ret 167 168 // 上传 file 169 source, err := NewUploadSourceFile(tempFile.Name()) 170 err = uploadManager.Put(context.Background(), &ret, getUploadToken(), nil, source, &UploadExtra{ 171 Params: params, 172 TryTimes: 1, 173 HostFreezeDuration: 0, 174 MimeType: "", 175 OnProgress: func(fileSize, uploaded int64) { 176 fmt.Printf("resume v1: upload file progress: %d-%d \n", uploaded, fileSize) 177 }, 178 UploadResumeVersion: UploadResumeV1, 179 UploadThreshold: 1024 * 1024 * 2, 180 Recorder: nil, 181 PartSize: 1024 * 1024, 182 }) 183 if err != nil { 184 t.Fatalf("form upload file error:%v", err) 185 } 186 if len(ret.Key) == 0 || len(ret.Hash) == 0 { 187 t.Fatal("form upload file error, key or hash is empty") 188 } 189 if len(ret.Foo) == 0 { 190 t.Fatal("form upload file error, foo is empty") 191 } 192 193 // 上传 reader no size 194 tempFile.Seek(0, io.SeekStart) 195 source, _ = NewUploadSourceReader(tempFile, size) 196 err = uploadManager.Put(context.Background(), &ret, getUploadToken(), nil, source, &UploadExtra{ 197 Params: params, 198 TryTimes: 1, 199 HostFreezeDuration: 0, 200 MimeType: "", 201 OnProgress: func(fileSize, uploaded int64) { 202 fmt.Printf("resume v1: upload reader progress: %d-%d \n", uploaded, fileSize) 203 }, 204 UploadResumeVersion: UploadResumeV1, 205 UploadThreshold: 1024 * 1024 * 2, 206 Recorder: nil, 207 PartSize: 1024 * 1024, 208 }) 209 if err == nil { 210 t.Fatal("resume v1:: reader source should not support region backup") 211 } 212 213 // 上传 readerAt 214 tempFile.Seek(0, io.SeekStart) 215 source, _ = NewUploadSourceReaderAt(tempFile, size) 216 err = uploadManager.Put(context.Background(), &ret, getUploadToken(), nil, source, &UploadExtra{ 217 Params: params, 218 TryTimes: 1, 219 HostFreezeDuration: 0, 220 MimeType: "", 221 OnProgress: func(fileSize, uploaded int64) { 222 fmt.Printf("resume v1: upload reader at progress: %d-%d \n", uploaded, fileSize) 223 }, 224 UploadResumeVersion: UploadResumeV1, 225 UploadThreshold: 1024 * 1024 * 2, 226 Recorder: nil, 227 PartSize: 1024 * 1024, 228 }) 229 if err != nil { 230 t.Fatalf("resume v1: upload reader at error:%v", err) 231 } 232 if len(ret.Key) == 0 || len(ret.Hash) == 0 { 233 t.Fatal("resume v1: upload reader at error, key or hash is empty") 234 } 235 if len(ret.Foo) == 0 { 236 t.Fatal("resume v1: upload reader at error, foo is empty") 237 } 238 } 239 240 func TestUploadManagerResumeV1UploadRecord(t *testing.T) { 241 // 文件比较小,小并发方便取消 242 settings.Workers = 2 243 244 length := 1024 * 1024 * 9 245 data := make([]byte, length, length) 246 data[0] = 8 247 data[length-1] = 8 248 249 tempFile, err := os.CreateTemp("", "TestUploadManagerFormPut") 250 if err != nil { 251 t.Fatalf("create temp file error:%v", err) 252 } 253 defer os.Remove(tempFile.Name()) 254 defer tempFile.Close() 255 256 tempFile.Write(data) 257 258 params := make(map[string]string) 259 params["x:foo"] = "foo" 260 params["x-qn-meta-A"] = "meta-A" 261 262 uploadManager := getUploadManager() 263 var ret Ret 264 265 ctx, cancel := context.WithCancel(context.Background()) 266 267 recorder, err := NewFileRecorder(os.TempDir()) 268 if err != nil { 269 t.Fatalf("create recorder error:%v", err) 270 } 271 uploadedSizeWhileCancel := int64(1024 * 1024 * 2) 272 // 上传 file 273 source, err := NewUploadSourceFile(tempFile.Name()) 274 err = uploadManager.Put(ctx, &ret, getUploadToken(), nil, source, &UploadExtra{ 275 Params: params, 276 TryTimes: 1, 277 HostFreezeDuration: 0, 278 MimeType: "", 279 OnProgress: func(fileSize, uploaded int64) { 280 fmt.Printf("resume v1 record 01: upload file progress: %d-%d \n", uploaded, fileSize) 281 if uploaded >= uploadedSizeWhileCancel { 282 cancel() 283 } 284 }, 285 UploadResumeVersion: UploadResumeV1, 286 UploadThreshold: 1024 * 1024 * 2, 287 Recorder: recorder, 288 PartSize: 1024 * 1024, 289 }) 290 if !isCancelErr(err) { 291 t.Fatalf("resume upload file with record error:%v", err) 292 } 293 294 // 再次上传 file 295 err = uploadManager.Put(context.Background(), &ret, getUploadToken(), nil, source, &UploadExtra{ 296 Params: params, 297 TryTimes: 1, 298 HostFreezeDuration: 0, 299 MimeType: "", 300 OnProgress: func(fileSize, uploaded int64) { 301 fmt.Printf("resume v1 record 02: upload file progress: %d-%d \n", uploaded, fileSize) 302 if uploaded < uploadedSizeWhileCancel { 303 t.Fatalf("resume upload file with record error: uploaded size should bigger than %d", uploadedSizeWhileCancel) 304 } 305 }, 306 UploadResumeVersion: UploadResumeV1, 307 UploadThreshold: 1024 * 1024 * 2, 308 Recorder: recorder, 309 PartSize: 1024 * 1024, 310 }) 311 if err != nil { 312 t.Fatalf("resume v1 upload file with record error:%v", err) 313 } 314 if len(ret.Key) == 0 || len(ret.Hash) == 0 { 315 t.Fatal("resume v1 upload file with record error, key or hash is empty") 316 } 317 if len(ret.Foo) == 0 { 318 t.Fatal("resume v1 upload file with record error, foo is empty") 319 } 320 } 321 322 func TestUploadManagerResumeV2Upload(t *testing.T) { 323 length := 1024 * 1024 * 4 324 data := make([]byte, length, length) 325 data[0] = 8 326 data[length-1] = 8 327 328 tempFile, err := os.CreateTemp("", "TestUploadManagerFormPut") 329 if err != nil { 330 t.Fatalf("create temp file error:%v", err) 331 } 332 defer os.Remove(tempFile.Name()) 333 defer tempFile.Close() 334 335 tempFile.Write(data) 336 size := int64(len(data)) 337 338 params := make(map[string]string) 339 params["x:foo"] = "foo" 340 params["x-qn-meta-A"] = "meta-A" 341 342 uploadManager := getUploadManager() 343 var ret Ret 344 345 // 上传 file 346 source, err := NewUploadSourceFile(tempFile.Name()) 347 err = uploadManager.Put(context.Background(), &ret, getUploadToken(), nil, source, &UploadExtra{ 348 Params: params, 349 TryTimes: 1, 350 HostFreezeDuration: 0, 351 MimeType: "", 352 OnProgress: func(fileSize, uploaded int64) { 353 fmt.Printf("resume v2: upload file progress: %d-%d \n", uploaded, fileSize) 354 }, 355 UploadResumeVersion: UploadResumeV2, 356 UploadThreshold: 1024 * 1024 * 2, 357 Recorder: nil, 358 PartSize: 1024 * 1024, 359 }) 360 if err != nil { 361 t.Fatalf("form upload file error:%v", err) 362 } 363 if len(ret.Key) == 0 || len(ret.Hash) == 0 { 364 t.Fatal("form upload file error, key or hash is empty") 365 } 366 if len(ret.Foo) == 0 { 367 t.Fatal("form upload file error, foo is empty") 368 } 369 370 // 上传 reader no size 371 tempFile.Seek(0, io.SeekStart) 372 source, _ = NewUploadSourceReader(tempFile, size) 373 err = uploadManager.Put(context.Background(), &ret, getUploadToken(), nil, source, &UploadExtra{ 374 Params: params, 375 TryTimes: 1, 376 HostFreezeDuration: 0, 377 MimeType: "", 378 OnProgress: func(fileSize, uploaded int64) { 379 fmt.Printf("resume v2: upload reader progress: %d-%d \n", uploaded, fileSize) 380 }, 381 UploadResumeVersion: UploadResumeV2, 382 UploadThreshold: 1024 * 1024 * 2, 383 Recorder: nil, 384 PartSize: 1024 * 1024, 385 }) 386 if err == nil { 387 t.Fatal("resume v2:: reader source should not support region backup") 388 } 389 390 // 上传 readerAt 391 tempFile.Seek(0, io.SeekStart) 392 source, _ = NewUploadSourceReaderAt(tempFile, size) 393 err = uploadManager.Put(context.Background(), &ret, getUploadToken(), nil, source, &UploadExtra{ 394 Params: params, 395 TryTimes: 1, 396 HostFreezeDuration: 0, 397 MimeType: "", 398 OnProgress: func(fileSize, uploaded int64) { 399 fmt.Printf("resume v2: upload reader at progress: %d-%d \n", uploaded, fileSize) 400 }, 401 UploadResumeVersion: UploadResumeV2, 402 UploadThreshold: 1024 * 1024 * 2, 403 Recorder: nil, 404 PartSize: 1024 * 1024, 405 }) 406 if err != nil { 407 t.Fatalf("resume v2: upload reader at error:%v", err) 408 } 409 if len(ret.Key) == 0 || len(ret.Hash) == 0 { 410 t.Fatal("resume v2: upload reader at error, key or hash is empty") 411 } 412 if len(ret.Foo) == 0 { 413 t.Fatal("resume v2: upload reader at error, foo is empty") 414 } 415 } 416 417 func TestUploadManagerResumeV2UploadRecord(t *testing.T) { 418 // 文件比较小,小并发方便取消 419 settings.Workers = 2 420 421 length := 1024 * 1024 * 9 422 data := make([]byte, length, length) 423 data[0] = 8 424 data[length-1] = 8 425 426 tempFile, err := os.CreateTemp("", "TestUploadManagerFormPut") 427 if err != nil { 428 t.Fatalf("create temp file error:%v", err) 429 } 430 defer os.Remove(tempFile.Name()) 431 defer tempFile.Close() 432 433 tempFile.Write(data) 434 435 params := make(map[string]string) 436 params["x:foo"] = "foo" 437 params["x-qn-meta-A"] = "meta-A" 438 439 uploadManager := getUploadManager() 440 var ret Ret 441 442 ctx, cancel := context.WithCancel(context.Background()) 443 444 recorder, err := NewFileRecorder(os.TempDir()) 445 if err != nil { 446 t.Fatalf("create recorder error:%v", err) 447 } 448 uploadedSizeWhileCancel := int64(1024 * 1024 * 4) 449 // 上传 file 450 source, err := NewUploadSourceFile(tempFile.Name()) 451 uploadedSet := make(map[int64]struct{}) 452 err = uploadManager.Put(ctx, &ret, getUploadToken(), nil, source, &UploadExtra{ 453 Params: params, 454 TryTimes: 1, 455 HostFreezeDuration: 0, 456 MimeType: "", 457 OnProgress: func(fileSize, uploaded int64) { 458 if uploaded >= uploadedSizeWhileCancel { 459 cancel() 460 } else { 461 uploadedSet[uploaded] = struct{}{} 462 } 463 }, 464 UploadResumeVersion: UploadResumeV2, 465 UploadThreshold: 1024 * 1024 * 2, 466 Recorder: recorder, 467 PartSize: 1024 * 1024, 468 }) 469 if !isCancelErr(err) { 470 t.Fatalf("resume upload file with record error:%v", err) 471 } 472 473 // 再次上传 file 474 err = uploadManager.Put(context.Background(), &ret, getUploadToken(), nil, source, &UploadExtra{ 475 Params: params, 476 TryTimes: 1, 477 HostFreezeDuration: 0, 478 MimeType: "", 479 OnProgress: func(fileSize, uploaded int64) { 480 if _, ok := uploadedSet[uploaded]; ok { 481 t.Fatal("resume v2 upload file with record error: uploaded chunk should be resumed from record") 482 } 483 }, 484 UploadResumeVersion: UploadResumeV2, 485 UploadThreshold: 1024 * 1024 * 2, 486 Recorder: recorder, 487 PartSize: 1024 * 1024, 488 }) 489 if err != nil { 490 t.Fatalf("resume v2 upload file with record error:%v", err) 491 } 492 if len(ret.Key) == 0 || len(ret.Hash) == 0 { 493 t.Fatal("resume v2 upload file with record error, key or hash is empty") 494 } 495 if len(ret.Foo) == 0 { 496 t.Fatal("resume v2 upload file with record error, foo is empty") 497 } 498 }