blob: 8d99395b9cc3dae86622f4e4735f3bfa9349e180 [file] [log] [blame]
// Copyright Istio Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package platform
import (
"net/http"
"net/http/httptest"
"net/url"
"reflect"
"testing"
)
import (
core "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
)
type handlerFunc func(http.ResponseWriter, *http.Request)
func TestAWSLocality(t *testing.T) {
cases := []struct {
name string
handlers map[string]handlerFunc
want *core.Locality
}{
{
"error",
map[string]handlerFunc{"/placement/region": errorHandler, "/placement/availability-zone": errorHandler},
&core.Locality{},
},
{
"locality",
map[string]handlerFunc{"/placement/region": regionHandler, "/placement/availability-zone": zoneHandler},
&core.Locality{Region: "us-west-2", Zone: "us-west-2b"},
},
}
for _, v := range cases {
t.Run(v.name, func(tt *testing.T) {
server, url := setupHTTPServer(v.handlers)
defer server.Close()
awsMetadataIPv4URL = url.String()
locality := NewAWS(false).Locality()
if !reflect.DeepEqual(locality, v.want) {
t.Errorf("unexpected locality. want :%v, got :%v", v.want, locality)
}
})
}
}
func TestIsAWS(t *testing.T) {
cases := []struct {
name string
handlers map[string]handlerFunc
want bool
}{
{"not aws", map[string]handlerFunc{"/iam/info": errorHandler}, false},
{"aws", map[string]handlerFunc{"/iam/info": iamInfoHandler}, true},
}
for _, v := range cases {
t.Run(v.name, func(tt *testing.T) {
server, url := setupHTTPServer(v.handlers)
defer server.Close()
awsMetadataIPv4URL = url.String()
aws := IsAWS(false)
if !reflect.DeepEqual(aws, v.want) {
t.Errorf("unexpected iam info. want :%v, got :%v", v.want, aws)
}
})
}
}
func errorHandler(writer http.ResponseWriter, _ *http.Request) {
writer.WriteHeader(http.StatusInternalServerError)
}
func regionHandler(writer http.ResponseWriter, _ *http.Request) {
writer.WriteHeader(http.StatusOK)
writer.Write([]byte("us-west-2"))
}
func zoneHandler(writer http.ResponseWriter, _ *http.Request) {
writer.WriteHeader(http.StatusOK)
writer.Write([]byte("us-west-2b"))
}
func iamInfoHandler(writer http.ResponseWriter, _ *http.Request) {
writer.WriteHeader(http.StatusOK)
// nolint: lll
writer.Write([]byte("{\n\"Code\" : \"Success\",\n\"LastUpdated\" : \"2022-03-18T05:04:31Z\",\n\"InstanceProfileArn\" : \"arn:aws:iam::614624372165:instance-profile/sam-processing0000120190916053337315200000004\",\n\"InstanceProfileId\" : \"AIPAY6GTXUXC3LLJY7OG7\"\n\t }"))
}
func setupHTTPServer(handlers map[string]handlerFunc) (*httptest.Server, *url.URL) {
handler := http.NewServeMux()
for path, handle := range handlers {
handler.HandleFunc(path, handle)
}
server := httptest.NewServer(handler)
url, _ := url.Parse(server.URL)
return server, url
}