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

     1  //go:build integration
     2  // +build integration
     3  
     4  package storage
     5  
     6  import (
     7  	"context"
     8  	"encoding/json"
     9  	"os"
    10  	"path/filepath"
    11  	"strings"
    12  	"testing"
    13  	"time"
    14  
    15  	clientV1 "github.com/qiniu/go-sdk/v7/client"
    16  	"github.com/qiniu/go-sdk/v7/storagev2/uplog"
    17  )
    18  
    19  func TestUploadManagerUplogForm(t *testing.T) {
    20  	tmpDir, err := os.MkdirTemp("", "test-uplog-*")
    21  	if err != nil {
    22  		t.Fatal(err)
    23  	}
    24  	defer os.RemoveAll(tmpDir)
    25  
    26  	uplog.SetUplogFileBufferDirPath(tmpDir)
    27  	defer uplog.SetUplogFileBufferDirPath("")
    28  
    29  	if err = uplog.FlushBuffer(); err != nil {
    30  		t.Fatal(err)
    31  	}
    32  
    33  	writeFileBufferInterval := uplog.GetWriteFileBufferInterval()
    34  	uplog.SetFlushFileBufferInterval(1 * time.Hour)
    35  	defer uplog.SetFlushFileBufferInterval(writeFileBufferInterval)
    36  
    37  	clientV1.DebugMode = true
    38  	defer func() {
    39  		clientV1.DebugMode = false
    40  	}()
    41  
    42  	data := []byte("hello, 七牛!!!")
    43  	dataLen := int64(len(data))
    44  
    45  	tempFile, err := os.CreateTemp("", "TestUploadManagerFormPut-*")
    46  	if err != nil {
    47  		t.Fatalf("create temp file error:%v", err)
    48  	}
    49  	defer os.Remove(tempFile.Name())
    50  	defer tempFile.Close()
    51  
    52  	tempFile.Write(data)
    53  
    54  	uploadManager := getUploadManagerV2([]string{"mock03.qiniu.com", "mock04.qiniu.com"})
    55  	var ret Ret
    56  
    57  	// 上传 file
    58  	source, err := NewUploadSourceFile(tempFile.Name())
    59  	if err != nil {
    60  		t.Fatalf("upload source file error:%v", err)
    61  	}
    62  	err = uploadManager.Put(context.Background(), &ret, getUploadToken(), nil, source, &UploadExtra{
    63  		TryTimes: 1,
    64  	})
    65  	if err != nil {
    66  		t.Fatalf("form upload file error:%v", err)
    67  	}
    68  	if len(ret.Key) == 0 || len(ret.Hash) == 0 {
    69  		t.Fatal("form upload file error, key or hash is empty")
    70  	}
    71  
    72  	time.Sleep(1 * time.Second)
    73  
    74  	uplogFile, err := os.Open(filepath.Join(tmpDir, "uplog_v4_01.buffer"))
    75  	if err != nil {
    76  		t.Fatalf("uplog file error:%v", err)
    77  	}
    78  	defer uplogFile.Close()
    79  
    80  	uplogFileJsonDecoder := json.NewDecoder(uplogFile)
    81  	uplogs := make([]map[string]interface{}, 0, 4)
    82  	for {
    83  		var uplog map[string]interface{}
    84  		if err := uplogFileJsonDecoder.Decode(&uplog); err != nil {
    85  			break
    86  		}
    87  		uplogs = append(uplogs, uplog)
    88  	}
    89  	if len(uplogs) != 4 {
    90  		t.Fatalf("unexpected uplog count:%v", len(uplogs))
    91  	}
    92  	if uplogs[0]["log_type"] != "request" {
    93  		t.Fatalf("unexpected uplog log_type:%v", uplogs[0]["log_type"])
    94  	}
    95  	if uplogs[0]["api_type"] != "kodo" {
    96  		t.Fatalf("unexpected uplog api_type:%v", uplogs[0]["api_type"])
    97  	}
    98  	if uplogs[0]["api_name"] != "postObject" {
    99  		t.Fatalf("unexpected uplog api_name:%v", uplogs[0]["api_name"])
   100  	}
   101  	if uplogs[0]["error_type"] != "unknown_host" {
   102  		t.Fatalf("unexpected uplog error_type:%v", uplogs[0]["error_type"])
   103  	}
   104  	if uplogs[0]["host"] != "mock03.qiniu.com" {
   105  		t.Fatalf("unexpected uplog host:%v", uplogs[0]["host"])
   106  	}
   107  	if uplogs[0]["path"] != "/" {
   108  		t.Fatalf("unexpected uplog path:%v", uplogs[0]["path"])
   109  	}
   110  	if uplogs[0]["method"] != "POST" {
   111  		t.Fatalf("unexpected uplog method:%v", uplogs[0]["method"])
   112  	}
   113  	if uplogs[0]["target_bucket"] != testBucket {
   114  		t.Fatalf("unexpected uplog target_bucket:%v", uplogs[0]["target_bucket"])
   115  	}
   116  	if uplogs[1]["log_type"] != "request" {
   117  		t.Fatalf("unexpected uplog log_type:%v", uplogs[1]["log_type"])
   118  	}
   119  	if uplogs[1]["api_type"] != "kodo" {
   120  		t.Fatalf("unexpected uplog api_type:%v", uplogs[1]["api_type"])
   121  	}
   122  	if uplogs[1]["api_name"] != "postObject" {
   123  		t.Fatalf("unexpected uplog api_name:%v", uplogs[1]["api_name"])
   124  	}
   125  	if uplogs[1]["error_type"] != "unknown_host" {
   126  		t.Fatalf("unexpected uplog error_type:%v", uplogs[1]["error_type"])
   127  	}
   128  	if uplogs[1]["host"] != "mock04.qiniu.com" {
   129  		t.Fatalf("unexpected uplog host:%v", uplogs[1]["host"])
   130  	}
   131  	if uplogs[1]["target_bucket"] != testBucket {
   132  		t.Fatalf("unexpected uplog target_bucket:%v", uplogs[1]["target_bucket"])
   133  	}
   134  	if uplogs[1]["path"] != "/" {
   135  		t.Fatalf("unexpected uplog path:%v", uplogs[1]["path"])
   136  	}
   137  	if uplogs[1]["method"] != "POST" {
   138  		t.Fatalf("unexpected uplog method:%v", uplogs[1]["method"])
   139  	}
   140  	if uplogs[2]["log_type"] != "request" {
   141  		t.Fatalf("unexpected uplog log_type:%v", uplogs[2]["log_type"])
   142  	}
   143  	if uplogs[2]["api_type"] != "kodo" {
   144  		t.Fatalf("unexpected uplog api_type:%v", uplogs[2]["api_type"])
   145  	}
   146  	if uplogs[2]["api_name"] != "postObject" {
   147  		t.Fatalf("unexpected uplog api_name:%v", uplogs[2]["api_name"])
   148  	}
   149  	if uplogs[2]["error_type"] != nil {
   150  		t.Fatalf("unexpected uplog error_type:%v", uplogs[2]["error_type"])
   151  	}
   152  	if uplogs[2]["port"] != float64(443) {
   153  		t.Fatalf("unexpected uplog port:%v", uplogs[2]["port"])
   154  	}
   155  	if uplogs[2]["remote_ip"] == nil {
   156  		t.Fatalf("unexpected uplog remote_ip:%v", uplogs[2]["remote_ip"])
   157  	}
   158  	if uplogs[2]["target_bucket"] != testBucket {
   159  		t.Fatalf("unexpected uplog target_bucket:%v", uplogs[2]["target_bucket"])
   160  	}
   161  	if uplogs[2]["path"] != "/" {
   162  		t.Fatalf("unexpected uplog path:%v", uplogs[2]["path"])
   163  	}
   164  	if uplogs[2]["method"] != "POST" {
   165  		t.Fatalf("unexpected uplog method:%v", uplogs[2]["method"])
   166  	}
   167  	if uplogs[2]["status_code"] != float64(200) {
   168  		t.Fatalf("unexpected uplog status_code:%v", uplogs[2]["status_code"])
   169  	}
   170  	if uplogs[3]["log_type"] != "quality" {
   171  		t.Fatalf("unexpected uplog log_type:%v", uplogs[3]["log_type"])
   172  	}
   173  	if uplogs[3]["result"] != "ok" {
   174  		t.Fatalf("unexpected uplog result:%v", uplogs[3]["result"])
   175  	}
   176  	if uplogs[3]["up_type"] != "form" {
   177  		t.Fatalf("unexpected uplog up_type:%v", uplogs[3]["up_type"])
   178  	}
   179  	if uplogs[3]["regions_count"] != float64(2) {
   180  		t.Fatalf("unexpected uplog regions_count:%v", uplogs[3]["regions_count"])
   181  	}
   182  	if uplogs[3]["api_type"] != "kodo" {
   183  		t.Fatalf("unexpected uplog api_type:%v", uplogs[3]["api_type"])
   184  	}
   185  	if uplogs[3]["file_size"] != float64(dataLen) {
   186  		t.Fatalf("unexpected uplog file_size:%v", uplogs[3]["file_size"])
   187  	}
   188  	if uplogs[3]["target_bucket"] != testBucket {
   189  		t.Fatalf("unexpected uplog target_bucket:%v", uplogs[3]["target_bucket"])
   190  	}
   191  }
   192  
   193  func TestUploadManagerUplogResumableV1(t *testing.T) {
   194  	tmpDir, err := os.MkdirTemp("", "test-uplog-*")
   195  	if err != nil {
   196  		t.Fatal(err)
   197  	}
   198  	defer os.RemoveAll(tmpDir)
   199  
   200  	uplog.SetUplogFileBufferDirPath(tmpDir)
   201  	defer uplog.SetUplogFileBufferDirPath("")
   202  
   203  	if err = uplog.FlushBuffer(); err != nil {
   204  		t.Fatal(err)
   205  	}
   206  
   207  	writeFileBufferInterval := uplog.GetWriteFileBufferInterval()
   208  	uplog.SetFlushFileBufferInterval(1 * time.Hour)
   209  	defer uplog.SetFlushFileBufferInterval(writeFileBufferInterval)
   210  
   211  	clientV1.DebugMode = true
   212  	defer func() {
   213  		clientV1.DebugMode = false
   214  	}()
   215  
   216  	length := 1024 * 1024 * 4
   217  	data := make([]byte, length, length)
   218  	data[0] = 8
   219  	data[length-1] = 8
   220  	tempFile, err := os.CreateTemp("", "TestUploadManagerResumeV1Upload-*")
   221  	if err != nil {
   222  		t.Fatalf("create temp file error:%v", err)
   223  	}
   224  	defer func() {
   225  		tempFile.Close()
   226  		os.Remove(tempFile.Name())
   227  	}()
   228  	tempFile.Write(data)
   229  
   230  	uploadManager := getUploadManagerV2([]string{"mock05.qiniu.com", "mock06.qiniu.com"})
   231  	var ret Ret
   232  
   233  	// 上传 file
   234  	source, err := NewUploadSourceFile(tempFile.Name())
   235  	if err != nil {
   236  		t.Fatalf("upload source file error:%v", err)
   237  	}
   238  	err = uploadManager.Put(context.Background(), &ret, getUploadToken(), nil, source, &UploadExtra{
   239  		TryTimes:            1,
   240  		UploadResumeVersion: UploadResumeV1,
   241  		UploadThreshold:     1024 * 1024 * 2,
   242  		PartSize:            1024 * 1024,
   243  	})
   244  	if err != nil {
   245  		t.Fatalf("form upload file error:%v", err)
   246  	}
   247  	if len(ret.Key) == 0 || len(ret.Hash) == 0 {
   248  		t.Fatal("form upload file error, key or hash is empty")
   249  	}
   250  
   251  	time.Sleep(1 * time.Second)
   252  
   253  	uplogFile, err := os.Open(filepath.Join(tmpDir, "uplog_v4_01.buffer"))
   254  	if err != nil {
   255  		t.Fatalf("uplog file error:%v", err)
   256  	}
   257  	defer uplogFile.Close()
   258  
   259  	uplogFileJsonDecoder := json.NewDecoder(uplogFile)
   260  	uplogs := make([]map[string]interface{}, 0, 12)
   261  	for {
   262  		var uplog map[string]interface{}
   263  		if err := uplogFileJsonDecoder.Decode(&uplog); err != nil {
   264  			break
   265  		}
   266  		uplogs = append(uplogs, uplog)
   267  	}
   268  	if len(uplogs) != 10 {
   269  		t.Fatalf("unexpected uplog count:%v", len(uplogs))
   270  	}
   271  	if uplogs[0]["log_type"] != "request" {
   272  		t.Fatalf("unexpected uplog log_type:%v", uplogs[0]["log_type"])
   273  	}
   274  	if uplogs[0]["api_type"] != "kodo" {
   275  		t.Fatalf("unexpected uplog api_type:%v", uplogs[0]["api_type"])
   276  	}
   277  	if uplogs[0]["api_name"] != "resumableUploadV1MakeBlock" {
   278  		t.Fatalf("unexpected uplog api_name:%v", uplogs[0]["api_name"])
   279  	}
   280  	if uplogs[0]["error_type"] != "unknown_host" {
   281  		t.Fatalf("unexpected uplog error_type:%v", uplogs[0]["error_type"])
   282  	}
   283  	if uplogs[0]["host"] != "mock05.qiniu.com" {
   284  		t.Fatalf("unexpected uplog host:%v", uplogs[0]["host"])
   285  	}
   286  	if uplogs[0]["path"] != "/mkblk/4194304" {
   287  		t.Fatalf("unexpected uplog path:%v", uplogs[0]["path"])
   288  	}
   289  	if uplogs[0]["method"] != "POST" {
   290  		t.Fatalf("unexpected uplog method:%v", uplogs[0]["method"])
   291  	}
   292  	if uplogs[0]["target_bucket"] != testBucket {
   293  		t.Fatalf("unexpected uplog target_bucket:%v", uplogs[0]["target_bucket"])
   294  	}
   295  	if uplogs[1]["log_type"] != "request" {
   296  		t.Fatalf("unexpected uplog log_type:%v", uplogs[1]["log_type"])
   297  	}
   298  	if uplogs[1]["api_type"] != "kodo" {
   299  		t.Fatalf("unexpected uplog api_type:%v", uplogs[1]["api_type"])
   300  	}
   301  	if uplogs[1]["api_name"] != "resumableUploadV1MakeBlock" {
   302  		t.Fatalf("unexpected uplog api_name:%v", uplogs[1]["api_name"])
   303  	}
   304  	if uplogs[1]["error_type"] != "unknown_host" {
   305  		t.Fatalf("unexpected uplog error_type:%v", uplogs[1]["error_type"])
   306  	}
   307  	if uplogs[1]["host"] != "mock06.qiniu.com" {
   308  		t.Fatalf("unexpected uplog host:%v", uplogs[1]["host"])
   309  	}
   310  	if uplogs[1]["path"] != "/mkblk/4194304" {
   311  		t.Fatalf("unexpected uplog path:%v", uplogs[1]["path"])
   312  	}
   313  	if uplogs[1]["method"] != "POST" {
   314  		t.Fatalf("unexpected uplog method:%v", uplogs[1]["method"])
   315  	}
   316  	if uplogs[1]["target_bucket"] != testBucket {
   317  		t.Fatalf("unexpected uplog target_bucket:%v", uplogs[1]["target_bucket"])
   318  	}
   319  	if uplogs[2]["log_type"] != "block" {
   320  		t.Fatalf("unexpected uplog log_type:%v", uplogs[2]["log_type"])
   321  	}
   322  	if uplogs[2]["up_api_version"] != float64(1) {
   323  		t.Fatalf("unexpected uplog up_api_version:%v", uplogs[2]["up_api_version"])
   324  	}
   325  	if uplogs[2]["requests_count"] != float64(2) {
   326  		t.Fatalf("unexpected uplog requests_count:%v", uplogs[2]["requests_count"])
   327  	}
   328  	if uplogs[2]["error_type"] != "unknown_host" {
   329  		t.Fatalf("unexpected uplog error_type:%v", uplogs[2]["error_type"])
   330  	}
   331  	if uplogs[2]["api_type"] != "kodo" {
   332  		t.Fatalf("unexpected uplog api_type:%v", uplogs[2]["api_type"])
   333  	}
   334  	if uplogs[2]["file_size"] != float64(length) {
   335  		t.Fatalf("unexpected uplog file_size:%v", uplogs[2]["file_size"])
   336  	}
   337  	if uplogs[2]["target_bucket"] != testBucket {
   338  		t.Fatalf("unexpected uplog target_bucket:%v", uplogs[2]["target_bucket"])
   339  	}
   340  	if uplogs[3]["log_type"] != "request" {
   341  		t.Fatalf("unexpected uplog log_type:%v", uplogs[3]["log_type"])
   342  	}
   343  	if uplogs[3]["api_type"] != "kodo" {
   344  		t.Fatalf("unexpected uplog api_type:%v", uplogs[3]["api_type"])
   345  	}
   346  	if uplogs[3]["api_name"] != "resumableUploadV1MakeBlock" {
   347  		t.Fatalf("unexpected uplog api_name:%v", uplogs[3]["api_name"])
   348  	}
   349  	if uplogs[3]["error_type"] != nil {
   350  		t.Fatalf("unexpected uplog error_type:%v", uplogs[3]["error_type"])
   351  	}
   352  	if uplogs[3]["port"] != float64(443) {
   353  		t.Fatalf("unexpected uplog port:%v", uplogs[3]["port"])
   354  	}
   355  	if uplogs[3]["remote_ip"] == nil {
   356  		t.Fatalf("unexpected uplog remote_ip:%v", uplogs[3]["remote_ip"])
   357  	}
   358  	if uplogs[3]["target_bucket"] != testBucket {
   359  		t.Fatalf("unexpected uplog target_bucket:%v", uplogs[3]["target_bucket"])
   360  	}
   361  	if uplogs[3]["path"] != "/mkblk/4194304" {
   362  		t.Fatalf("unexpected uplog path:%v", uplogs[3]["path"])
   363  	}
   364  	if uplogs[3]["method"] != "POST" {
   365  		t.Fatalf("unexpected uplog method:%v", uplogs[3]["method"])
   366  	}
   367  	if uplogs[3]["status_code"] != float64(200) {
   368  		t.Fatalf("unexpected uplog status_code:%v", uplogs[3]["status_code"])
   369  	}
   370  	if uplogs[3]["bytes_sent"] != float64(1024*1024) {
   371  		t.Fatalf("unexpected uplog bytes_sent:%v", uplogs[3]["bytes_sent"])
   372  	}
   373  	for i := 4; i < 7; i++ {
   374  		if uplogs[i]["log_type"] != "request" {
   375  			t.Fatalf("unexpected uplog log_type:%v", uplogs[i]["log_type"])
   376  		}
   377  		if uplogs[i]["api_type"] != "kodo" {
   378  			t.Fatalf("unexpected uplog api_type:%v", uplogs[i]["api_type"])
   379  		}
   380  		if uplogs[i]["api_name"] != "resumableUploadV1Bput" {
   381  			t.Fatalf("unexpected uplog api_name:%v", uplogs[i]["api_name"])
   382  		}
   383  		if uplogs[i]["error_type"] != nil {
   384  			t.Fatalf("unexpected uplog error_type:%v", uplogs[i]["error_type"])
   385  		}
   386  		if uplogs[i]["port"] != float64(443) {
   387  			t.Fatalf("unexpected uplog port:%v", uplogs[i]["port"])
   388  		}
   389  		if uplogs[i]["remote_ip"] == nil {
   390  			t.Fatalf("unexpected uplog remote_ip:%v", uplogs[i]["remote_ip"])
   391  		}
   392  		if uplogs[i]["target_bucket"] != testBucket {
   393  			t.Fatalf("unexpected uplog target_bucket:%v", uplogs[i]["target_bucket"])
   394  		}
   395  		if !strings.HasPrefix(uplogs[i]["path"].(string), "/bput/") {
   396  			t.Fatalf("unexpected uplog path:%v", uplogs[i]["path"])
   397  		}
   398  		if uplogs[i]["method"] != "POST" {
   399  			t.Fatalf("unexpected uplog method:%v", uplogs[i]["method"])
   400  		}
   401  		if uplogs[i]["status_code"] != float64(200) {
   402  			t.Fatalf("unexpected uplog status_code:%v", uplogs[i]["status_code"])
   403  		}
   404  		if uplogs[i]["bytes_sent"] != float64(1024*1024) {
   405  			t.Fatalf("unexpected uplog bytes_sent:%v", uplogs[i]["bytes_sent"])
   406  		}
   407  	}
   408  	if uplogs[7]["api_type"] != "kodo" {
   409  		t.Fatalf("unexpected uplog api_type:%v", uplogs[7]["api_type"])
   410  	}
   411  	if uplogs[7]["api_name"] != "resumableUploadV1MakeFile" {
   412  		t.Fatalf("unexpected uplog api_name:%v", uplogs[7]["api_name"])
   413  	}
   414  	if uplogs[7]["error_type"] != nil {
   415  		t.Fatalf("unexpected uplog error_type:%v", uplogs[7]["error_type"])
   416  	}
   417  	if uplogs[7]["port"] != float64(443) {
   418  		t.Fatalf("unexpected uplog port:%v", uplogs[7]["port"])
   419  	}
   420  	if uplogs[7]["remote_ip"] == nil {
   421  		t.Fatalf("unexpected uplog remote_ip:%v", uplogs[7]["remote_ip"])
   422  	}
   423  	if uplogs[7]["target_bucket"] != testBucket {
   424  		t.Fatalf("unexpected uplog target_bucket:%v", uplogs[7]["target_bucket"])
   425  	}
   426  	if uplogs[7]["path"] != "/mkfile/4194304" {
   427  		t.Fatalf("unexpected uplog path:%v", uplogs[7]["path"])
   428  	}
   429  	if uplogs[7]["method"] != "POST" {
   430  		t.Fatalf("unexpected uplog method:%v", uplogs[7]["method"])
   431  	}
   432  	if uplogs[7]["status_code"] != float64(200) {
   433  		t.Fatalf("unexpected uplog status_code:%v", uplogs[7]["status_code"])
   434  	}
   435  	if uplogs[8]["log_type"] != "block" {
   436  		t.Fatalf("unexpected uplog log_type:%v", uplogs[8]["log_type"])
   437  	}
   438  	if uplogs[8]["up_api_version"] != float64(1) {
   439  		t.Fatalf("unexpected uplog up_api_version:%v", uplogs[8]["up_api_version"])
   440  	}
   441  	if uplogs[8]["requests_count"] != float64(5) {
   442  		t.Fatalf("unexpected uplog requests_count:%v", uplogs[8]["requests_count"])
   443  	}
   444  	if uplogs[8]["error_type"] != nil {
   445  		t.Fatalf("unexpected uplog error_type:%v", uplogs[8]["error_type"])
   446  	}
   447  	if uplogs[8]["api_type"] != "kodo" {
   448  		t.Fatalf("unexpected uplog api_type:%v", uplogs[8]["api_type"])
   449  	}
   450  	if uplogs[8]["file_size"] != float64(length) {
   451  		t.Fatalf("unexpected uplog file_size:%v", uplogs[8]["file_size"])
   452  	}
   453  	if uplogs[8]["target_bucket"] != testBucket {
   454  		t.Fatalf("unexpected uplog target_bucket:%v", uplogs[8]["target_bucket"])
   455  	}
   456  	if uplogs[9]["log_type"] != "quality" {
   457  		t.Fatalf("unexpected uplog log_type:%v", uplogs[9]["log_type"])
   458  	}
   459  	if uplogs[9]["requests_count"] != float64(7) {
   460  		t.Fatalf("unexpected uplog requests_count:%v", uplogs[9]["requests_count"])
   461  	}
   462  	if uplogs[9]["result"] != "ok" {
   463  		t.Fatalf("unexpected uplog result:%v", uplogs[9]["result"])
   464  	}
   465  	if uplogs[9]["up_type"] != "resumable_v1" {
   466  		t.Fatalf("unexpected uplog up_type:%v", uplogs[9]["up_type"])
   467  	}
   468  	if uplogs[9]["regions_count"] != float64(2) {
   469  		t.Fatalf("unexpected uplog regions_count:%v", uplogs[9]["regions_count"])
   470  	}
   471  	if uplogs[9]["api_type"] != "kodo" {
   472  		t.Fatalf("unexpected uplog api_type:%v", uplogs[9]["api_type"])
   473  	}
   474  	if uplogs[9]["file_size"] != float64(length) {
   475  		t.Fatalf("unexpected uplog file_size:%v", uplogs[9]["file_size"])
   476  	}
   477  	if uplogs[9]["target_bucket"] != testBucket {
   478  		t.Fatalf("unexpected uplog target_bucket:%v", uplogs[9]["target_bucket"])
   479  	}
   480  }