blob: 7c5535d969ff1c0c1c5636186a6d961a5607cf30 [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 model
import (
"fmt"
"testing"
)
import (
networking "istio.io/api/networking/v1alpha3"
)
import (
"github.com/apache/dubbo-go-pixiu/pkg/config"
)
// nolint lll
func TestMergeGateways(t *testing.T) {
gwHTTPFoo := makeConfig("foo1", "not-default", "foo.bar.com", "name1", "http", 7, "ingressgateway", "", networking.ServerTLSSettings_SIMPLE)
gwHTTPbar := makeConfig("bar1", "not-default", "bar.foo.com", "bname1", "http", 7, "ingressgateway", "", networking.ServerTLSSettings_SIMPLE)
gwHTTPlocalbar := makeConfig("lcoalbar1", "not-default", "localbar.foo.com", "bname1", "http", 7, "ingressgateway", "127.0.0.1", networking.ServerTLSSettings_SIMPLE)
gwHTTP2Wildcard := makeConfig("foo5", "not-default", "*", "name5", "http2", 8, "ingressgateway", "", networking.ServerTLSSettings_SIMPLE)
gwHTTPWildcard := makeConfig("foo3", "not-default", "*", "name3", "http", 8, "ingressgateway", "", networking.ServerTLSSettings_SIMPLE)
gwTCPWildcard := makeConfig("foo4", "not-default-2", "*", "name4", "tcp", 8, "ingressgateway", "", networking.ServerTLSSettings_SIMPLE)
gwHTTPWildcardAlternate := makeConfig("foo2", "not-default", "*", "name2", "http", 7, "ingressgateway2", "", networking.ServerTLSSettings_SIMPLE)
gwSimple := makeConfig("foo-simple", "not-default-2", "*.example.com", "https", "HTTPS", 443, "ingressgateway", "", networking.ServerTLSSettings_SIMPLE)
gwPassthrough := makeConfig("foo-passthrough", "not-default-2", "foo.example.com", "tls-foo", "TLS", 443, "ingressgateway", "", networking.ServerTLSSettings_PASSTHROUGH)
// TODO(ramaraochavali): Add more test cases here.
tests := []struct {
name string
gwConfig []config.Config
mergedServersNum int
serverNum int
serversForRouteNum map[string]int
gatewaysNum int
}{
{
"single-server-config",
[]config.Config{gwHTTPFoo},
1,
1,
map[string]int{"http.7": 1},
1,
},
{
"two servers on the same port",
[]config.Config{gwHTTPFoo, gwHTTPbar},
1,
2,
map[string]int{"http.7": 2},
2,
},
{
"two servers on the same port with different bind",
[]config.Config{gwHTTPbar, gwHTTPlocalbar},
2,
2,
map[string]int{"http.7": 1, "http.7.127.0.0.1": 1},
2,
},
{
"same-server-config",
[]config.Config{gwHTTPFoo, gwHTTPWildcardAlternate},
1,
2,
map[string]int{"http.7": 2},
2,
},
{
"multi-server-config",
[]config.Config{gwHTTPFoo, gwHTTPWildcardAlternate, gwHTTPWildcard},
2,
3,
map[string]int{"http.7": 2, "http.8": 1},
3,
},
{
"http-tcp-wildcard-server-config",
[]config.Config{gwHTTPFoo, gwTCPWildcard},
2,
2,
map[string]int{"http.7": 1},
2,
},
{
"tcp-http-server-config",
[]config.Config{gwTCPWildcard, gwHTTPWildcard},
1,
1,
map[string]int{},
2,
},
{
"tcp-tcp-server-config",
[]config.Config{gwHTTPWildcard, gwTCPWildcard}, // order matters
1,
1,
map[string]int{"http.8": 1},
2,
},
{
"http-http2-server-config",
[]config.Config{gwHTTPWildcard, gwHTTP2Wildcard},
1,
1,
// http and http2 both present
map[string]int{"http.8": 1},
2,
},
{
"simple-passthrough",
[]config.Config{gwSimple, gwPassthrough},
2,
2,
map[string]int{"https.443.https.foo-simple.not-default-2": 1},
2,
},
}
for idx, tt := range tests {
t.Run(fmt.Sprintf("[%d] %s", idx, tt.name), func(t *testing.T) {
instances := []gatewayWithInstances{}
for _, c := range tt.gwConfig {
instances = append(instances, gatewayWithInstances{c, true, nil})
}
mgw := MergeGateways(instances, &Proxy{}, nil)
if len(mgw.MergedServers) != tt.mergedServersNum {
t.Errorf("Incorrect number of merged servers. Expected: %v Got: %d", tt.mergedServersNum, len(mgw.MergedServers))
}
if len(mgw.ServersByRouteName) != len(tt.serversForRouteNum) {
t.Errorf("Incorrect number of routes. Expected: %v Got: %d", len(tt.serversForRouteNum), len(mgw.ServersByRouteName))
}
for k, v := range mgw.ServersByRouteName {
if tt.serversForRouteNum[k] != len(v) {
t.Errorf("for route %v expected %v servers got %v", k, tt.serversForRouteNum[k], len(v))
}
}
ns := 0
for _, ms := range mgw.MergedServers {
ns += len(ms.Servers)
}
if ns != tt.serverNum {
t.Errorf("Incorrect number of total servers. Expected: %v Got: %d", tt.serverNum, ns)
}
if len(mgw.GatewayNameForServer) != tt.gatewaysNum {
t.Errorf("Incorrect number of gateways. Expected: %v Got: %d", tt.gatewaysNum, len(mgw.GatewayNameForServer))
}
})
}
}
func makeConfig(name, namespace, host, portName, portProtocol string, portNumber uint32, gw string, bind string,
mode networking.ServerTLSSettings_TLSmode) config.Config {
c := config.Config{
Meta: config.Meta{
Name: name,
Namespace: namespace,
},
Spec: &networking.Gateway{
Selector: map[string]string{"istio": gw},
Servers: []*networking.Server{
{
Hosts: []string{host},
Port: &networking.Port{Name: portName, Number: portNumber, Protocol: portProtocol},
Bind: bind,
Tls: &networking.ServerTLSSettings{Mode: mode},
},
},
},
}
return c
}
func TestParseGatewayRDSRouteName(t *testing.T) {
type args struct {
name string
}
tests := []struct {
name string
args args
wantPortNumber int
wantPortName string
wantGateway string
}{
{
name: "invalid rds name",
args: args{"https.scooby.dooby.doo"},
wantPortNumber: 0,
wantPortName: "",
wantGateway: "",
},
{
name: "gateway http rds name",
args: args{"http.80"},
wantPortNumber: 80,
wantPortName: "",
wantGateway: "",
},
{
name: "https rds name",
args: args{"https.443.app1.gw1.ns1"},
wantPortNumber: 443,
wantPortName: "app1",
wantGateway: "ns1/gw1",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gotPortNumber, gotPortName, gotGateway := ParseGatewayRDSRouteName(tt.args.name)
if gotPortNumber != tt.wantPortNumber {
t.Errorf("ParseGatewayRDSRouteName() gotPortNumber = %v, want %v", gotPortNumber, tt.wantPortNumber)
}
if gotPortName != tt.wantPortName {
t.Errorf("ParseGatewayRDSRouteName() gotPortName = %v, want %v", gotPortName, tt.wantPortName)
}
if gotGateway != tt.wantGateway {
t.Errorf("ParseGatewayRDSRouteName() gotGateway = %v, want %v", gotGateway, tt.wantGateway)
}
})
}
}