github.com/qiniu/go-sdk/v7@v7.27.0/storagev2/region/all_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package region 5 6 import ( 7 "context" 8 "io" 9 "net/http" 10 "net/http/httptest" 11 "os" 12 "reflect" 13 "strings" 14 "sync/atomic" 15 "testing" 16 17 "github.com/qiniu/go-sdk/v7/storagev2/credentials" 18 ) 19 20 func TestAllRegionsProvider(t *testing.T) { 21 const accessKey = "fakeaccesskey" 22 const secretKey = "fakesecretkey" 23 var callCount uint64 24 mux := http.NewServeMux() 25 mux.HandleFunc("/regions", func(w http.ResponseWriter, r *http.Request) { 26 if !strings.HasPrefix(r.Header.Get("Authorization"), "Qiniu "+accessKey) { 27 t.Fatalf("unexpected authorization") 28 } 29 w.Header().Add("X-ReqId", "fakereqid") 30 if _, err := io.WriteString(w, mockUcRegionsResponseBody()); err != nil { 31 t.Fatal(err) 32 } 33 atomic.AddUint64(&callCount, 1) 34 }) 35 server := httptest.NewServer(mux) 36 defer server.Close() 37 38 cacheFile, err := os.CreateTemp("", "") 39 if err != nil { 40 t.Fatal(err) 41 } 42 defer os.Remove(cacheFile.Name()) 43 defer cacheFile.Close() 44 45 provider, err := NewAllRegionsProvider(credentials.NewCredentials(accessKey, secretKey), Endpoints{Preferred: []string{server.URL}}, &AllRegionsProviderOptions{ 46 PersistentFilePath: cacheFile.Name(), 47 }) 48 if err != nil { 49 t.Fatal(err) 50 } 51 for i := 0; i < 2; i++ { 52 regions, err := provider.GetRegions(context.Background()) 53 if err != nil { 54 t.Fatal(err) 55 } 56 if regionsCount := len(regions); regionsCount != 2 { 57 t.Fatalf("Unexpected regions count: %d", regionsCount) 58 } 59 if regionId := regions[0].RegionID; regionId != "z0" { 60 t.Fatalf("Unexpected regionId: %s", regionId) 61 } 62 if preferredUp := regions[0].Up.Preferred; !reflect.DeepEqual(preferredUp, []string{"upload.qiniup.com", "up.qiniup.com"}) { 63 t.Fatalf("Unexpected preferred up domains: %v", preferredUp) 64 } 65 if alternativeUp := regions[0].Up.Alternative; !reflect.DeepEqual(alternativeUp, []string{"upload.qbox.me", "up.qbox.me"}) { 66 t.Fatalf("Unexpected alternative up domains: %v", alternativeUp) 67 } 68 if regionId := regions[1].RegionID; regionId != "z1" { 69 t.Fatalf("Unexpected regionId: %s", regionId) 70 } 71 if preferredUp := regions[1].Up.Preferred; !reflect.DeepEqual(preferredUp, []string{"upload-z1.qiniup.com", "up-z1.qiniup.com"}) { 72 t.Fatalf("Unexpected preferred up domains: %v", preferredUp) 73 } 74 if alternativeUp := regions[1].Up.Alternative; !reflect.DeepEqual(alternativeUp, []string{"upload-z1.qbox.me", "up-z1.qbox.me"}) { 75 t.Fatalf("Unexpected alternative up domains: %v", alternativeUp) 76 } 77 } 78 if cc := atomic.LoadUint64(&callCount); cc != 1 { 79 t.Fatalf("Unexpected call count: %d", cc) 80 } 81 } 82 83 func mockUcRegionsResponseBody() string { 84 return ` 85 { 86 "regions": [ 87 { 88 "id": "z0", 89 "ttl": 86400, 90 "io": { 91 "domains": ["iovip.qbox.me"] 92 }, 93 "up": { 94 "domains": ["upload.qiniup.com", "up.qiniup.com"], 95 "old": ["upload.qbox.me", "up.qbox.me"] 96 }, 97 "uc": { 98 "domains": ["uc.qbox.me"] 99 }, 100 "rs": { 101 "domains": ["rs-z0.qbox.me"] 102 }, 103 "rsf": { 104 "domains": ["rsf-z0.qbox.me"] 105 }, 106 "api": { 107 "domains": ["api.qiniu.com"] 108 } 109 }, 110 { 111 "id": "z1", 112 "ttl": 86400, 113 "io": { 114 "domains": ["iovip-z1.qbox.me"] 115 }, 116 "up": { 117 "domains": ["upload-z1.qiniup.com", "up-z1.qiniup.com"], 118 "old": ["upload-z1.qbox.me", "up-z1.qbox.me"] 119 }, 120 "uc": { 121 "domains": ["uc.qbox.me"] 122 }, 123 "rs": { 124 "domains": ["rs-z1.qbox.me"] 125 }, 126 "rsf": { 127 "domains": ["rsf-z1.qbox.me"] 128 }, 129 "api": { 130 "domains": ["api-z1.qiniu.com"] 131 } 132 } 133 ] 134 } 135 ` 136 }