blob: 4b89cdec9c7efd788233e13f55e8774e5e51221a [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 metadata
import (
"reflect"
"testing"
)
import (
gxset "github.com/dubbogo/gost/container/set"
"github.com/dubbogo/gost/gof/observer"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)
import (
"dubbo.apache.org/dubbo-go/v3/common"
"dubbo.apache.org/dubbo-go/v3/common/constant"
"dubbo.apache.org/dubbo-go/v3/common/extension"
"dubbo.apache.org/dubbo-go/v3/metadata/info"
"dubbo.apache.org/dubbo-go/v3/metadata/mapping"
"dubbo.apache.org/dubbo-go/v3/metadata/report"
"dubbo.apache.org/dubbo-go/v3/metrics"
metricsMetadata "dubbo.apache.org/dubbo-go/v3/metrics/metadata"
)
func TestDelegateMetadataReportGetAppMetadata(t *testing.T) {
mockReport := new(mockMetadataReport)
defer mockReport.AssertExpectations(t)
delegate := &DelegateMetadataReport{instance: mockReport}
metadataInfo := info.NewAppMetadataInfo("dubbo")
var ch = make(chan metrics.MetricsEvent, 10)
metrics.Subscribe(constant.MetricsMetadata, ch)
defer close(ch)
t.Run("normal", func(t *testing.T) {
mockReport.On("GetAppMetadata").Return(metadataInfo, nil).Once()
got, err := delegate.GetAppMetadata("dubbo", "1")
assert.Nil(t, err)
if !reflect.DeepEqual(got, metadataInfo) {
t.Errorf("GetAppMetadata() got = %v, want %v", got, metadataInfo)
}
assert.True(t, len(ch) == 1)
metricEvent := <-ch
assert.Equal(t, metricEvent.Type(), constant.MetricsMetadata)
event, ok := metricEvent.(*metricsMetadata.MetadataMetricEvent)
assert.True(t, ok)
assert.NotNil(t, event.Name, metricsMetadata.MetadataSub)
assert.NotNil(t, event.Start)
assert.NotNil(t, event.End)
assert.True(t, event.Succ)
})
t.Run("error", func(t *testing.T) {
mockReport.On("GetAppMetadata").Return(info.NewAppMetadataInfo("dubbo"), errors.New("mock error")).Once()
_, err := delegate.GetAppMetadata("dubbo", "1111")
assert.NotNil(t, err)
assert.True(t, len(ch) == 1)
metricEvent := <-ch
assert.Equal(t, metricEvent.Type(), constant.MetricsMetadata)
event, ok := metricEvent.(*metricsMetadata.MetadataMetricEvent)
assert.True(t, ok)
assert.NotNil(t, event.Name, metricsMetadata.MetadataSub)
assert.NotNil(t, event.Start)
assert.NotNil(t, event.End)
assert.True(t, !event.Succ)
})
}
func TestDelegateMetadataReportPublishAppMetadata(t *testing.T) {
mockReport := new(mockMetadataReport)
defer mockReport.AssertExpectations(t)
delegate := &DelegateMetadataReport{instance: mockReport}
metadataInfo := info.NewAppMetadataInfo("dubbo")
var ch = make(chan metrics.MetricsEvent, 10)
metrics.Subscribe(constant.MetricsMetadata, ch)
defer close(ch)
t.Run("normal", func(t *testing.T) {
mockReport.On("PublishAppMetadata").Return(nil).Once()
err := delegate.PublishAppMetadata("application", "revision", metadataInfo)
assert.Nil(t, err)
assert.True(t, len(ch) == 1)
metricEvent := <-ch
assert.Equal(t, metricEvent.Type(), constant.MetricsMetadata)
event, ok := metricEvent.(*metricsMetadata.MetadataMetricEvent)
assert.True(t, ok)
assert.NotNil(t, event.Name, metricsMetadata.MetadataPush)
assert.NotNil(t, event.Start)
assert.NotNil(t, event.End)
assert.True(t, event.Succ)
})
t.Run("error", func(t *testing.T) {
mockReport.On("PublishAppMetadata").Return(errors.New("mock error")).Once()
err := delegate.PublishAppMetadata("application", "revision", metadataInfo)
assert.NotNil(t, err)
assert.True(t, len(ch) == 1)
metricEvent := <-ch
assert.Equal(t, metricEvent.Type(), constant.MetricsMetadata)
event, ok := metricEvent.(*metricsMetadata.MetadataMetricEvent)
assert.True(t, ok)
assert.NotNil(t, event.Name, metricsMetadata.MetadataPush)
assert.NotNil(t, event.Start)
assert.NotNil(t, event.End)
assert.True(t, !event.Succ)
})
}
func TestDelegateMetadataReportGetServiceAppMapping(t *testing.T) {
mockReport := new(mockMetadataReport)
defer mockReport.AssertExpectations(t)
delegate := &DelegateMetadataReport{instance: mockReport}
t.Run("normal", func(t *testing.T) {
mockReport.On("GetServiceAppMapping").Return(gxset.NewSet(), nil).Once()
got, err := delegate.GetServiceAppMapping("dubbo", "dev", &listener{})
assert.Nil(t, err)
assert.True(t, got.Empty())
})
t.Run("error", func(t *testing.T) {
mockReport.On("GetServiceAppMapping").Return(gxset.NewSet(), errors.New("mock error")).Once()
_, err := delegate.GetServiceAppMapping("dubbo", "dev", &listener{})
assert.NotNil(t, err)
})
}
func TestDelegateMetadataReportRegisterServiceAppMapping(t *testing.T) {
mockReport := new(mockMetadataReport)
defer mockReport.AssertExpectations(t)
delegate := &DelegateMetadataReport{instance: mockReport}
t.Run("normal", func(t *testing.T) {
mockReport.On("RegisterServiceAppMapping").Return(nil).Once()
err := delegate.RegisterServiceAppMapping("interfaceName", "group", "application")
assert.Nil(t, err)
})
t.Run("error", func(t *testing.T) {
mockReport.On("RegisterServiceAppMapping").Return(errors.New("mock error")).Once()
err := delegate.RegisterServiceAppMapping("interfaceName", "group", "application")
assert.NotNil(t, err)
})
}
func TestDelegateMetadataReportRemoveServiceAppMappingListener(t *testing.T) {
mockReport := new(mockMetadataReport)
defer mockReport.AssertExpectations(t)
delegate := &DelegateMetadataReport{instance: mockReport}
t.Run("normal", func(t *testing.T) {
mockReport.On("RemoveServiceAppMappingListener").Return(nil).Once()
err := delegate.RemoveServiceAppMappingListener("interfaceName", "group")
assert.Nil(t, err)
})
t.Run("error", func(t *testing.T) {
mockReport.On("RemoveServiceAppMappingListener").Return(errors.New("mock error")).Once()
err := delegate.RemoveServiceAppMappingListener("interfaceName", "group")
assert.NotNil(t, err)
})
}
func TestGetMetadataReport(t *testing.T) {
instances = make(map[string]report.MetadataReport)
assert.Nil(t, GetMetadataReport())
instances["default"] = new(mockMetadataReport)
assert.NotNil(t, GetMetadataReport())
}
func TestGetMetadataReportByRegistry(t *testing.T) {
instances = make(map[string]report.MetadataReport)
assert.Nil(t, GetMetadataReportByRegistry("reg"))
instances["default"] = new(mockMetadataReport)
assert.NotNil(t, GetMetadataReportByRegistry("default"))
assert.NotNil(t, GetMetadataReportByRegistry("reg"))
assert.NotNil(t, GetMetadataReportByRegistry(""))
}
func TestGetMetadataReports(t *testing.T) {
instances = make(map[string]report.MetadataReport)
assert.True(t, len(GetMetadataReports()) == 0)
instances["default"] = new(mockMetadataReport)
assert.True(t, len(GetMetadataReports()) == 1)
}
func TestGetMetadataType(t *testing.T) {
assert.Equal(t, GetMetadataType(), constant.DefaultMetadataStorageType)
metadataOptions = &Options{}
assert.Equal(t, GetMetadataType(), constant.DefaultMetadataStorageType)
metadataOptions = &Options{
metadataType: constant.RemoteMetadataStorageType,
}
assert.Equal(t, GetMetadataType(), constant.RemoteMetadataStorageType)
}
func TestAddMetadataReport(t *testing.T) {
url := common.NewURLWithOptions(
common.WithProtocol("registryId"),
)
err := addMetadataReport("registryId", url)
assert.Nil(t, err)
assert.True(t, instances["registryId"] == nil)
mockReport := new(mockMetadataReport)
extension.SetMetadataReportFactory("registryId", func() report.MetadataReportFactory {
return mockReport
})
err = addMetadataReport("registryId", url)
assert.Nil(t, err)
assert.True(t, instances["registryId"] != nil)
}
type mockMetadataReport struct {
mock.Mock
}
func (m *mockMetadataReport) CreateMetadataReport(*common.URL) report.MetadataReport {
return m
}
func (m *mockMetadataReport) GetAppMetadata(string, string) (*info.MetadataInfo, error) {
args := m.Called()
return args.Get(0).(*info.MetadataInfo), args.Error(1)
}
func (m *mockMetadataReport) PublishAppMetadata(string, string, *info.MetadataInfo) error {
args := m.Called()
return args.Error(0)
}
func (m *mockMetadataReport) RegisterServiceAppMapping(string, string, string) error {
args := m.Called()
return args.Error(0)
}
func (m *mockMetadataReport) GetServiceAppMapping(string, string, mapping.MappingListener) (*gxset.HashSet, error) {
args := m.Called()
return args.Get(0).(*gxset.HashSet), args.Error(1)
}
func (m *mockMetadataReport) RemoveServiceAppMappingListener(string, string) error {
args := m.Called()
return args.Error(0)
}
type listener struct {
}
func (l *listener) OnEvent(e observer.Event) error {
return nil
}
func (l *listener) Stop() {
}