github.com/qiniu/go-sdk/v7@v7.27.0/storagev2/downloader/urls_provider_test.go (about)

     1  //go:build unit
     2  // +build unit
     3  
     4  package downloader_test
     5  
     6  import (
     7  	"context"
     8  	"encoding/json"
     9  	"io"
    10  	"net/http"
    11  	"net/http/httptest"
    12  	"os"
    13  	"sync/atomic"
    14  	"testing"
    15  
    16  	"github.com/qiniu/go-sdk/v7/storagev2/credentials"
    17  	"github.com/qiniu/go-sdk/v7/storagev2/downloader"
    18  	"github.com/qiniu/go-sdk/v7/storagev2/http_client"
    19  	"github.com/qiniu/go-sdk/v7/storagev2/region"
    20  )
    21  
    22  func TestStaticDomainBasedURLsProvider(t *testing.T) {
    23  	generator := downloader.NewStaticDomainBasedURLsProvider([]string{
    24  		"http://testa.com/",
    25  		"https://b.testb.com/",
    26  		"testc.com",
    27  	})
    28  
    29  	urls, err := downloader.GetURLStrings(context.Background(), generator, "/!@#$%^&*()?", &downloader.GenerateOptions{
    30  		Command: "test1|test2",
    31  	})
    32  	if err != nil {
    33  		t.Fatal(err)
    34  	}
    35  	if len(urls) != 3 {
    36  		t.Fatalf("unexpected urls count")
    37  	}
    38  	if urls[0] != "http://testa.com//%21@%23$%25%5E&%2A%28%29%3F?test1|test2" {
    39  		t.Fatalf("unexpected generated url")
    40  	}
    41  	if urls[1] != "https://b.testb.com//%21@%23$%25%5E&%2A%28%29%3F?test1|test2" {
    42  		t.Fatalf("unexpected generated url")
    43  	}
    44  	if urls[2] != "https://testc.com//%21@%23$%25%5E&%2A%28%29%3F?test1|test2" {
    45  		t.Fatalf("unexpected generated url")
    46  	}
    47  }
    48  
    49  func TestDefaultSrcURLsProvider(t *testing.T) {
    50  	const accessKey = "fakeaccesskey"
    51  	const secretKey = "fakesecretkey"
    52  	const bucketName = "fakeBucketName"
    53  	mux := http.NewServeMux()
    54  	mux.HandleFunc("/v4/query", func(w http.ResponseWriter, r *http.Request) {
    55  		if gotAk := r.URL.Query().Get("ak"); gotAk != accessKey {
    56  			t.Fatalf("Unexpected ak: %s", gotAk)
    57  		}
    58  		if gotBucketName := r.URL.Query().Get("bucket"); gotBucketName != bucketName {
    59  			t.Fatalf("Unexpected bucket: %s", gotBucketName)
    60  		}
    61  		w.Header().Add("x-reqid", "fakereqid")
    62  		if _, err := io.WriteString(w, `
    63  {
    64  	"hosts": [
    65  		{
    66  			"region": "z0",
    67  			"ttl": 86400,
    68  			"io_src": {
    69  				"domains": ["fakebucket.cn-east-1.qiniucs.com"]
    70  			}
    71  		}
    72  	]
    73  }
    74  		`); err != nil {
    75  			t.Fatal(err)
    76  		}
    77  	})
    78  	server := httptest.NewServer(mux)
    79  	defer server.Close()
    80  
    81  	cacheFile, err := os.CreateTemp("", "")
    82  	if err != nil {
    83  		t.Fatal(err)
    84  	}
    85  	defer os.Remove(cacheFile.Name())
    86  	defer cacheFile.Close()
    87  
    88  	urlsProvider := downloader.NewDefaultSrcURLsProvider(
    89  		accessKey,
    90  		&downloader.DefaultSrcURLsProviderOptions{
    91  			BucketRegionsQueryOptions: region.BucketRegionsQueryOptions{PersistentFilePath: cacheFile.Name()},
    92  			BucketHosts:               region.Endpoints{Preferred: []string{server.URL}},
    93  		},
    94  	)
    95  	urls, err := downloader.GetURLStrings(context.Background(), urlsProvider, "/!@#$%^&*()?", &downloader.GenerateOptions{
    96  		BucketName: bucketName,
    97  		Command:    "test1|test2",
    98  	})
    99  	if err != nil {
   100  		t.Fatal(err)
   101  	}
   102  	if len(urls) != 1 {
   103  		t.Fatalf("unexpected urls count")
   104  	}
   105  	if urls[0] != "https://fakebucket.cn-east-1.qiniucs.com//%21@%23$%25%5E&%2A%28%29%3F?test1|test2" {
   106  		t.Fatalf("unexpected generated url")
   107  	}
   108  }
   109  
   110  func TestDomainsQueryURLsProvider(t *testing.T) {
   111  	const accessKey = "fakeaccesskey"
   112  	const secretKey = "fakesecretkey"
   113  	const bucketName = "fakeBucketName"
   114  	var callCount uint64
   115  	mux := http.NewServeMux()
   116  	mux.HandleFunc("/v2/domains", func(w http.ResponseWriter, r *http.Request) {
   117  		atomic.AddUint64(&callCount, 1)
   118  		if r.URL.String() != "/v2/domains?tbl="+bucketName {
   119  			t.Fatalf("unexpected request url")
   120  		}
   121  		bytes, err := json.Marshal([]string{"domain1.com", "domain2.com"})
   122  		if err != nil {
   123  			t.Fatal(err)
   124  		}
   125  		w.Header().Add("x-reqid", "fakereqid")
   126  		w.Write(bytes)
   127  	})
   128  	server := httptest.NewServer(mux)
   129  	defer server.Close()
   130  
   131  	cacheFile, err := os.CreateTemp("", "")
   132  	if err != nil {
   133  		t.Fatal(err)
   134  	}
   135  	defer os.Remove(cacheFile.Name())
   136  	defer cacheFile.Close()
   137  
   138  	generator, err := downloader.NewDomainsQueryURLsProvider(&downloader.DomainsQueryURLsProviderOptions{
   139  		Options: http_client.Options{
   140  			Regions:     &region.Region{Bucket: region.Endpoints{Preferred: []string{server.URL}}},
   141  			Credentials: credentials.NewCredentials(accessKey, secretKey),
   142  		},
   143  		PersistentFilePath: cacheFile.Name(),
   144  	})
   145  	if err != nil {
   146  		t.Fatal(err)
   147  	}
   148  	for i := 0; i < 2; i++ {
   149  		urls, err := downloader.GetURLStrings(context.Background(), generator, "/!@#$%^&*()?", &downloader.GenerateOptions{
   150  			BucketName: bucketName,
   151  			Command:    "test1|test2",
   152  		})
   153  		if err != nil {
   154  			t.Fatal(err)
   155  		}
   156  		if len(urls) != 2 {
   157  			t.Fatalf("unexpected urls count")
   158  		}
   159  		if urls[0] != "https://domain1.com//%21@%23$%25%5E&%2A%28%29%3F?test1|test2" {
   160  			t.Fatalf("unexpected generated url")
   161  		}
   162  		if urls[1] != "https://domain2.com//%21@%23$%25%5E&%2A%28%29%3F?test1|test2" {
   163  			t.Fatalf("unexpected generated url")
   164  		}
   165  	}
   166  	if atomic.LoadUint64(&callCount) != 1 {
   167  		t.Fatalf("unexpected call count")
   168  	}
   169  }