github.com/qiniu/go-sdk/v7@v7.27.0/storagev2/region/query_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  	"sync/atomic"
    14  	"testing"
    15  )
    16  
    17  func TestBucketRegionsQuery(t *testing.T) {
    18  	const accessKey = "fakeaccesskey"
    19  	const bucketName = "fakeBucketName"
    20  	var callCount uint64
    21  	mux := http.NewServeMux()
    22  	mux.HandleFunc("/v4/query", func(w http.ResponseWriter, r *http.Request) {
    23  		if gotAk := r.URL.Query().Get("ak"); gotAk != accessKey {
    24  			t.Fatalf("Unexpected ak: %s", gotAk)
    25  		}
    26  		if gotBucketName := r.URL.Query().Get("bucket"); gotBucketName != bucketName {
    27  			t.Fatalf("Unexpected bucket: %s", gotBucketName)
    28  		}
    29  		w.Header().Add("X-ReqId", "fakereqid")
    30  		if _, err := io.WriteString(w, mockUcQueryResponseBody()); 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  	query, err := NewBucketRegionsQuery(Endpoints{Preferred: []string{server.URL}}, &BucketRegionsQueryOptions{
    46  		PersistentFilePath: cacheFile.Name(),
    47  	})
    48  	if err != nil {
    49  		t.Fatal(err)
    50  	}
    51  	for i := 0; i < 2; i++ {
    52  		regions, err := query.Query(accessKey, bucketName).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 mockUcQueryResponseBody() string {
    84  	return `
    85  	{
    86  		"hosts": [
    87  			{
    88  				"region": "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  				"region": "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  }