blob: 1d1da5c471bfec4ff2024f0278cadc344f965c94 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 traffic
import (
"fmt"
"reflect"
"testing"
"github.com/apache/dubbo-kubernetes/pkg/admin/config"
"github.com/apache/dubbo-kubernetes/pkg/admin/config/mock_config"
"github.com/apache/dubbo-kubernetes/pkg/admin/model"
jsonpatch "github.com/evanphx/json-patch/v5"
"github.com/golang/mock/gomock"
"sigs.k8s.io/yaml"
)
func TestCreateTimeout(t *testing.T) {
var capturedRule string
ctrl := gomock.NewController(t)
mockGovernanceConfig := mock_config.NewMockGovernanceConfig(ctrl)
mockGovernanceConfig.EXPECT().SetConfig(gomock.Any(), gomock.Any()).Do(func(key, rule string) {
capturedRule = rule
})
mockGovernanceConfig.EXPECT().GetConfig(gomock.Any()).Return("", nil)
config.Governance = mockGovernanceConfig
tests := []struct {
name string
args *model.Timeout
want string
wantErr bool
}{
{
name: "create_timeout",
args: &model.Timeout{
Service: "DemoService",
Group: "",
Version: "",
Timeout: 5000,
},
want: "configVersion: v3.0\nscope: service\nenabled: true\nkey: DemoService\nconfigs:\n - side: consumer\n enabled: true\n parameters:\n timeout: 5000",
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
timeoutSvc := &TimeoutService{}
if err := timeoutSvc.CreateOrUpdate(tt.args); err != nil && !tt.wantErr {
t.Errorf("TimeoutService.CreateOrUpdate() error = %v, wantErr %v", err, tt.wantErr)
}
actualJson, _ := yaml.YAMLToJSON([]byte(capturedRule))
wantedJson, _ := yaml.YAMLToJSON([]byte(tt.want))
if !jsonpatch.Equal(actualJson, wantedJson) {
t.Errorf("TimeoutService.CreateOrUpdate() error \n, expected:\n %v \n, got:\n %v \n", tt.want, capturedRule)
}
})
}
}
func TestUpdateTimeout(t *testing.T) {
var capturedRule string
tests := []struct {
name string
args *model.Timeout
want string
existingRule string
wantErr bool
}{
{
name: "update_timeout_multi_configs",
args: &model.Timeout{
Service: "DemoService",
Group: "",
Version: "",
Timeout: 6000,
},
existingRule: "configVersion: v3.0\nscope: service\nenabled: true\nkey: DemoService\nconfigs:\n - side: consumer\n enabled: true\n parameters:\n timeout: 5000\n test: \"value\"\n - side: provider\n enabled: true\n parameters:\n accesslog: true",
want: "configVersion: v3.0\nscope: service\nenabled: true\nkey: DemoService\nconfigs:\n - side: consumer\n enabled: true\n parameters:\n timeout: 6000\n test: \"value\"\n - side: provider\n enabled: true\n parameters:\n accesslog: true",
wantErr: false,
},
{
name: "update_timeout_single_config_single_item",
args: &model.Timeout{
Service: "DemoService",
Group: "",
Version: "",
Timeout: 6000,
},
existingRule: "configVersion: v3.0\nscope: service\nenabled: true\nkey: DemoService\nconfigs:\n - side: consumer\n enabled: true\n parameters:\n timeout: 5000",
want: "configVersion: v3.0\nscope: service\nenabled: true\nkey: DemoService\nconfigs:\n - side: consumer\n enabled: true\n parameters:\n timeout: 6000",
wantErr: false,
},
{
name: "update_timeout_single_config_multi_items",
args: &model.Timeout{
Service: "DemoService",
Group: "",
Version: "",
Timeout: 6000,
},
existingRule: "configVersion: v3.0\nscope: service\nenabled: true\nkey: DemoService\nconfigs:\n - side: consumer\n enabled: true\n parameters:\n timeout: 5000\n test: \"value\"",
want: "configVersion: v3.0\nscope: service\nenabled: true\nkey: DemoService\nconfigs:\n - side: consumer\n enabled: true\n parameters:\n timeout: 6000\n test: \"value\"",
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
timeoutSvc := &TimeoutService{}
ctrl := gomock.NewController(t)
mockGovernanceConfig := mock_config.NewMockGovernanceConfig(ctrl)
mockGovernanceConfig.EXPECT().SetConfig(gomock.Any(), gomock.Any()).Do(func(key, rule string) {
capturedRule = rule
})
mockGovernanceConfig.EXPECT().GetConfig(gomock.Any()).Return(tt.existingRule, nil)
config.Governance = mockGovernanceConfig
if err := timeoutSvc.CreateOrUpdate(tt.args); err != nil && !tt.wantErr {
t.Errorf("TimeoutService.CreateOrUpdate() error = %v, wantErr %v", err, tt.wantErr)
}
actualJson, _ := yaml.YAMLToJSON([]byte(capturedRule))
wantedJson, _ := yaml.YAMLToJSON([]byte(tt.want))
if !jsonpatch.Equal(actualJson, wantedJson) {
t.Errorf("TimeoutService.CreateOrUpdate() error \n, expected:\n %v \n, got:\n %v \n", tt.want, capturedRule)
}
})
}
}
func TestDeleteTimeout(t *testing.T) {
var capturedRule string
tests := []struct {
name string
args *model.Timeout
want string
existingRule string
wantDelete bool
wantErr bool
}{
{
name: "delete_timeout_multi_configs",
args: &model.Timeout{
Service: "DemoService",
Group: "",
Version: "",
Timeout: 5000,
},
existingRule: "configVersion: v3.0\nscope: service\nenabled: true\nkey: DemoService\nconfigs:\n - side: consumer\n enabled: true\n parameters:\n timeout: 5000\n test: \"value\"\n - side: provider\n enabled: true\n parameters:\n accesslog: true",
want: "configVersion: v3.0\nscope: service\nenabled: true\nkey: DemoService\nconfigs:\n - side: consumer\n enabled: true\n parameters:\n test: \"value\"\n - side: provider\n enabled: true\n parameters:\n accesslog: true",
wantErr: false,
},
{
name: "delete_timeout_single_config_single_item",
args: &model.Timeout{
Service: "DemoService",
Group: "",
Version: "",
Timeout: 6000,
},
existingRule: "configVersion: v3.0\nscope: service\nenabled: true\nkey: DemoService\nconfigs:\n - side: consumer\n enabled: true\n parameters:\n timeout: 5000",
want: "",
wantDelete: true,
wantErr: false,
},
{
name: "delete_timeout_single_config_multi_items",
args: &model.Timeout{
Service: "DemoService",
Group: "",
Version: "",
Timeout: 6000,
},
existingRule: "configVersion: v3.0\nscope: service\nenabled: true\nkey: DemoService\nconfigs:\n - side: consumer\n enabled: true\n parameters:\n timeout: 5000\n test: \"value\"",
want: "configVersion: v3.0\nscope: service\nenabled: true\nkey: DemoService\nconfigs:\n - side: consumer\n enabled: true\n parameters:\n test: \"value\"",
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
timeoutSvc := &TimeoutService{}
ctrl := gomock.NewController(t)
mockGovernanceConfig := mock_config.NewMockGovernanceConfig(ctrl)
if tt.wantDelete {
mockGovernanceConfig.EXPECT().DeleteConfig(gomock.Any()).Times(1)
} else {
mockGovernanceConfig.EXPECT().SetConfig(gomock.Any(), gomock.Any()).Do(func(key, rule string) {
capturedRule = rule
})
}
mockGovernanceConfig.EXPECT().GetConfig(gomock.Any()).Return(tt.existingRule, nil)
config.Governance = mockGovernanceConfig
if err := timeoutSvc.Delete(tt.args); err != nil && !tt.wantErr {
t.Errorf("TimeoutService.Delete() error = %v, wantErr %v", err, tt.wantErr)
}
if !tt.wantDelete {
actualJson, _ := yaml.YAMLToJSON([]byte(capturedRule))
wantedJson, _ := yaml.YAMLToJSON([]byte(tt.want))
if !jsonpatch.Equal(actualJson, wantedJson) {
t.Errorf("TimeoutService.CreateOrUpdate() error \n, expected:\n %v \n, got:\n %v \n", tt.want, capturedRule)
}
}
})
}
}
func TestSearchTimeout(t *testing.T) {
tests := []struct {
name string
args *model.Timeout
want []*model.Timeout
existingRule string
wantErr bool
}{
{
name: "search_timeout_multi_configs",
args: &model.Timeout{
Service: "DemoService",
Group: "",
Version: "",
Timeout: 5000,
},
existingRule: "configVersion: v3.0\nscope: service\nenabled: true\nkey: DemoService\nconfigs:\n - side: consumer\n enabled: true\n parameters:\n timeout: 5000\n test: \"value\"\n - side: provider\n enabled: true\n parameters:\n accesslog: true",
want: []*model.Timeout{{
Service: "DemoService",
Timeout: 5000,
}},
wantErr: false,
},
{
name: "search_timeout_single_config_single_item",
args: &model.Timeout{
Service: "DemoService",
Group: "",
Version: "",
Timeout: 6000,
},
existingRule: "configVersion: v3.0\nscope: service\nenabled: true\nkey: DemoService\nconfigs:\n - side: consumer\n enabled: true\n parameters:\n timeout: 5000",
want: []*model.Timeout{{
Service: "DemoService",
Timeout: 5000,
}},
wantErr: false,
},
{
name: "search_timeout_single_config_multi_items",
args: &model.Timeout{
Service: "DemoService",
Group: "",
Version: "",
Timeout: 6000,
},
existingRule: "configVersion: v3.0\nscope: service\nenabled: true\nkey: DemoService\nconfigs:\n - side: consumer\n enabled: true\n parameters:\n timeout: 5000\n test: \"value\"",
want: []*model.Timeout{{
Service: "DemoService",
Timeout: 5000,
}},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
timeoutSvc := &TimeoutService{}
var capturedRule string
ctrl := gomock.NewController(t)
mockGovernanceConfig := mock_config.NewMockGovernanceConfig(ctrl)
mockGovernanceConfig.EXPECT().GetConfig(gomock.Any()).DoAndReturn(func(key string) (string, error) {
capturedRule = tt.existingRule
return tt.existingRule, nil
})
fmt.Print(capturedRule)
config.Governance = mockGovernanceConfig
if timeouts, err := timeoutSvc.Search(tt.args); err != nil && !tt.wantErr {
t.Errorf("TimeoutService.Search() error = %v, wantErr %v", err, tt.wantErr)
} else {
if !reflect.DeepEqual(timeouts, tt.want) {
t.Errorf("TimeoutService.Search() got = %v, want %v", timeouts, tt.want)
}
}
})
}
}