github.com/qiniu/go-sdk/v7@v7.27.0/storage/form_upload_test.go (about)

     1  //go:build integration
     2  // +build integration
     3  
     4  package storage
     5  
     6  import (
     7  	"bytes"
     8  	"context"
     9  	"fmt"
    10  	"io"
    11  	"math/rand"
    12  	"os"
    13  	"strings"
    14  	"testing"
    15  	"time"
    16  )
    17  
    18  func TestFormUploadPutFileWithoutExtra(t *testing.T) {
    19  	var putRet PutRet
    20  	ctx := context.TODO()
    21  	putPolicy := PutPolicy{
    22  		Scope:           testBucket,
    23  		DeleteAfterDays: 7,
    24  	}
    25  
    26  	// prepare file for test uploading
    27  	testLocalFile, err := os.CreateTemp("", "TestFormUploadPutFile")
    28  	if err != nil {
    29  		t.Fatalf("os.CreateTemp file failed, err: %v", err)
    30  	}
    31  	defer os.Remove(testLocalFile.Name())
    32  
    33  	r := rand.New(rand.NewSource(time.Now().UnixNano()))
    34  	_, err = io.CopyN(testLocalFile, r, 10*1024*1024)
    35  	if err != nil {
    36  		t.Fatalf("os.CreateTemp file write failed, err: %v", err)
    37  	}
    38  	_, err = testLocalFile.Seek(0, io.SeekCurrent)
    39  	if err != nil {
    40  		t.Fatalf("os.CreateTemp file seek failed, err: %v", err)
    41  	}
    42  
    43  	upToken := putPolicy.UploadToken(mac)
    44  	testKey := fmt.Sprintf("testPutFileWithoutExtra_%d", r.Int())
    45  
    46  	err = formUploader.PutFile(ctx, &putRet, upToken, testKey, testLocalFile.Name(), nil)
    47  	if err != nil {
    48  		t.Fatalf("FormUploader#PutFile() error, %s", err)
    49  	}
    50  	t.Logf("Key: %s, Hash:%s", putRet.Key, putRet.Hash)
    51  }
    52  
    53  func TestFormUploaderWithInvalidUpHost(t *testing.T) {
    54  	var putRet PutRet
    55  	ctx := context.TODO()
    56  	putPolicy := PutPolicy{
    57  		Scope:           testBucket,
    58  		DeleteAfterDays: 7,
    59  	}
    60  
    61  	// prepare file for test uploading
    62  	testLocalFile, err := os.CreateTemp("", "TestFormUploadPutFile")
    63  	if err != nil {
    64  		t.Fatalf("os.CreateTemp file failed, err: %v", err)
    65  	}
    66  	defer os.Remove(testLocalFile.Name())
    67  
    68  	r := rand.New(rand.NewSource(time.Now().UnixNano()))
    69  	_, err = io.CopyN(testLocalFile, r, 1024)
    70  	if err != nil {
    71  		t.Fatalf("os.CreateTemp file write failed, err: %v", err)
    72  	}
    73  	_, err = testLocalFile.Seek(0, io.SeekCurrent)
    74  	if err != nil {
    75  		t.Fatalf("os.CreateTemp file seek failed, err: %v", err)
    76  	}
    77  
    78  	upToken := putPolicy.UploadToken(mac)
    79  	testKey := fmt.Sprintf("testPutFileWithoutExtra_%d", r.Int())
    80  
    81  	err = formUploader.PutFile(ctx, &putRet, upToken, testKey, testLocalFile.Name(), &PutExtra{
    82  		UpHost: "mock.upload.io",
    83  	})
    84  	if err == nil {
    85  		t.Fatalf("TestFormUploaderWithInvalidUpHost should error, %s", err)
    86  	}
    87  	if !strings.Contains(err.Error(), "lookup mock.upload.io: no such host") {
    88  		t.Fatalf("TestFormUploaderWithInvalidUpHost should use mock host, %s", err)
    89  	}
    90  }
    91  
    92  func TestFormUploadPutFile(t *testing.T) {
    93  	var putRet PutRet
    94  	ctx := context.TODO()
    95  
    96  	// prepare file for test uploading
    97  	testLocalFile, err := os.CreateTemp("", "TestFormUploadPutFile")
    98  	if err != nil {
    99  		t.Fatalf("os.CreateTemp file failed, err: %v", err)
   100  	}
   101  	defer os.Remove(testLocalFile.Name())
   102  
   103  	r := rand.New(rand.NewSource(time.Now().UnixNano()))
   104  	_, err = io.CopyN(testLocalFile, r, 10*1024*1024)
   105  	if err != nil {
   106  		t.Fatalf("os.CreateTemp file write failed, err: %v", err)
   107  	}
   108  	_, err = testLocalFile.Seek(0, io.SeekCurrent)
   109  	if err != nil {
   110  		t.Fatalf("os.CreateTemp file seek failed, err: %v", err)
   111  	}
   112  
   113  	putPolicy := PutPolicy{
   114  		Scope:           testBucket,
   115  		DeleteAfterDays: 7,
   116  	}
   117  	upToken := putPolicy.UploadToken(mac)
   118  	upHosts := []string{testUpHost, "https://" + testUpHost, ""}
   119  	for _, upHost := range upHosts {
   120  		testKey := fmt.Sprintf("testPutFileKey_%d", r.Int())
   121  
   122  		err = formUploader.PutFile(ctx, &putRet, upToken, testKey, testLocalFile.Name(), &PutExtra{
   123  			UpHost: upHost,
   124  		})
   125  		if err != nil {
   126  			t.Fatalf("FormUploader#PutFile() error, %s", err)
   127  		}
   128  		t.Logf("Key: %s, Hash:%s", putRet.Key, putRet.Hash)
   129  	}
   130  }
   131  
   132  func TestFormUploadTrafficLimit(t *testing.T) {
   133  	var putRet PutRet
   134  	ctx := context.TODO()
   135  
   136  	testLocalFile, err := os.CreateTemp("", "TestFormUploadPutFile")
   137  	if err != nil {
   138  		t.Fatalf("os.CreateTemp file failed, err: %v", err)
   139  	}
   140  	defer os.Remove(testLocalFile.Name())
   141  
   142  	putPolicy := PutPolicy{
   143  		Scope:           testBucket,
   144  		DeleteAfterDays: 7,
   145  		TrafficLimit:    100 * 1024 * 8, // 限速 100KB/s,范围:100KB/s - 100MB/s
   146  	}
   147  	upToken := putPolicy.UploadToken(mac)
   148  	r := rand.New(rand.NewSource(time.Now().UnixNano()))
   149  	testKey := fmt.Sprintf("testPutFileKey_%d", r.Int())
   150  
   151  	st := time.Now().UnixMilli()
   152  
   153  	data := make([]byte, 1024*500)
   154  	err = formUploader.Put(ctx, &putRet, upToken, testKey, bytes.NewReader(data), int64(len(data)), &PutExtra{})
   155  	if err != nil {
   156  		t.Fatalf("FormUploader#PutFile() error, %s", err)
   157  	}
   158  	t.Logf("Key: %s, Hash:%s", putRet.Key, putRet.Hash)
   159  
   160  	et := time.Now().UnixMilli()
   161  
   162  	duration := et - st
   163  	// 限速后,至少需要 4s
   164  	if duration < 5000 {
   165  		// t.Fatal("TestFormUploadTrafficLimit() error, TrafficLimit invalid")
   166  	}
   167  }
   168  
   169  func TestFormUploadPutFileWithBackup(t *testing.T) {
   170  	var putRet PutRet
   171  	ctx := context.TODO()
   172  	putPolicy := PutPolicy{
   173  		Scope:           testBucket,
   174  		DeleteAfterDays: 7,
   175  	}
   176  
   177  	// prepare file for test uploading
   178  	testLocalFile, err := os.CreateTemp("", "TestFormUploadPutFileWithBackup")
   179  	if err != nil {
   180  		t.Fatalf("os.CreateTemp file failed, err: %v", err)
   181  	}
   182  	defer os.Remove(testLocalFile.Name())
   183  
   184  	region, err := GetRegion(mac.AccessKey, testBucket)
   185  	if err != nil {
   186  		t.Fatal("get region error:", err)
   187  	}
   188  
   189  	// mock host
   190  	customizedHost := []string{"mock.qiniu.com"}
   191  	customizedHost = append(customizedHost, region.SrcUpHosts...)
   192  	region.SrcUpHosts = customizedHost
   193  	cfg := Config{}
   194  	cfg.UseCdnDomains = false
   195  	cfg.Region = region
   196  	uploader := NewFormUploader(&cfg)
   197  	r := rand.New(rand.NewSource(time.Now().UnixNano()))
   198  	testKey := fmt.Sprintf("testPutFileKey_%d", r.Int())
   199  
   200  	upToken := putPolicy.UploadToken(mac)
   201  	err = uploader.PutFile(ctx, &putRet, upToken, testKey, testLocalFile.Name(), &PutExtra{})
   202  	if err != nil {
   203  		t.Fatalf("FormUploader#PutFile() error, %s", err)
   204  	}
   205  	t.Logf("Key: %s, Hash:%s", putRet.Key, putRet.Hash)
   206  
   207  	// cancel
   208  	customizedHost = []string{}
   209  	customizedHost = append(customizedHost, region.SrcUpHosts...)
   210  	region.SrcUpHosts = customizedHost
   211  	cfg = Config{}
   212  	cfg.UseCdnDomains = false
   213  	cfg.Region = region
   214  	uploader = NewFormUploader(&cfg)
   215  	r = rand.New(rand.NewSource(time.Now().UnixNano()))
   216  	testKey = fmt.Sprintf("testPutFileKey_%d", r.Int())
   217  
   218  	ctx, cancel := context.WithCancel(context.TODO())
   219  	go func() {
   220  		time.Sleep(time.Millisecond * 100)
   221  		cancel()
   222  	}()
   223  	upToken = putPolicy.UploadToken(mac)
   224  	err = uploader.PutFile(ctx, &putRet, upToken, testKey, testLocalFile.Name(), &PutExtra{})
   225  	if err == nil || !strings.Contains(err.Error(), "canceled") {
   226  		t.Fatal("FormUploader#PutFile() cancel error:", err)
   227  	}
   228  }