blob: c329dbfa203a9ff43d5f2dbac91a8b424fed80dc [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 (
"testing"
)
import (
"github.com/apache/dubbo-go-pixiu/pkg/config/labels"
"github.com/apache/dubbo-go-pixiu/pkg/config/protocol"
)
var (
endpoint1 = IstioEndpoint{
Address: "192.168.1.1",
EndpointPort: 10001,
}
service1 = &Service{
Hostname: "one.service.com",
DefaultAddress: "192.168.3.1", // VIP
Ports: PortList{
&Port{Name: "http", Port: 81, Protocol: protocol.HTTP},
&Port{Name: "http-alt", Port: 8081, Protocol: protocol.HTTP},
},
}
)
func TestServiceInstanceValidate(t *testing.T) {
endpointWithLabels := func(lbls labels.Instance) *IstioEndpoint {
cpy := endpoint1
cpy.Labels = lbls
return &cpy
}
cases := []struct {
name string
instance *ServiceInstance
valid bool
}{
{
name: "nil service",
instance: &ServiceInstance{
Endpoint: endpointWithLabels(labels.Instance{}),
},
},
{
name: "bad label",
instance: &ServiceInstance{
Service: service1,
Endpoint: endpointWithLabels(labels.Instance{"*": "-"}),
},
},
{
name: "invalid service",
instance: &ServiceInstance{
Service: &Service{},
Endpoint: &IstioEndpoint{},
},
},
{
name: "invalid endpoint port and service port",
instance: &ServiceInstance{
Service: service1,
Endpoint: &IstioEndpoint{
Address: "192.168.1.2",
EndpointPort: 1000000,
},
},
},
{
name: "endpoint missing service port",
instance: &ServiceInstance{
Service: service1,
ServicePort: &Port{
Name: service1.Ports[1].Name + "-extra",
Port: service1.Ports[1].Port,
Protocol: service1.Ports[1].Protocol,
},
Endpoint: &IstioEndpoint{
Address: "192.168.1.2",
EndpointPort: uint32(service1.Ports[1].Port),
},
},
},
{
name: "endpoint port and protocol mismatch",
instance: &ServiceInstance{
Service: service1,
ServicePort: &Port{
Name: "http",
Port: service1.Ports[1].Port + 1,
Protocol: protocol.GRPC,
},
Endpoint: &IstioEndpoint{
Address: "192.168.1.2",
EndpointPort: uint32(service1.Ports[1].Port),
},
},
},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
if got := c.instance.Validate(); (got == nil) != c.valid {
t.Fatalf("%s failed: got valid=%v but wanted valid=%v: %v", c.name, got == nil, c.valid, got)
}
})
}
}
func TestServiceValidate(t *testing.T) {
ports := PortList{
{Name: "http", Port: 80, Protocol: protocol.HTTP},
{Name: "http-alt", Port: 8080, Protocol: protocol.HTTP},
}
badPorts := PortList{
{Port: 80, Protocol: protocol.HTTP},
{Name: "http-alt^", Port: 8080, Protocol: protocol.HTTP},
{Name: "http", Port: -80, Protocol: protocol.HTTP},
}
address := "192.168.1.1"
cases := []struct {
name string
service *Service
valid bool
}{
{
name: "empty hostname",
service: &Service{
Hostname: "",
DefaultAddress: address,
Ports: ports,
},
},
{
name: "invalid hostname",
service: &Service{
Hostname: "hostname.^.com",
DefaultAddress: address,
Ports: ports,
},
},
{
name: "empty ports",
service: &Service{
Hostname: "hostname",
DefaultAddress: address,
},
},
{
name: "bad ports",
service: &Service{
Hostname: "hostname",
DefaultAddress: address,
Ports: badPorts,
},
},
}
for _, c := range cases {
if got := c.service.Validate(); (got == nil) != c.valid {
t.Errorf("%s failed: got valid=%v but wanted valid=%v: %v", c.name, got == nil, c.valid, got)
}
}
}