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: ®ion.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 }