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  }