dubbo.apache.org/dubbo-go/v3@v3.1.1/config/reference_config_test.go (about)

     1  /*
     2   * Licensed to the Apache Software Foundation (ASF) under one or more
     3   * contributor license agreements.  See the NOTICE file distributed with
     4   * this work for additional information regarding copyright ownership.
     5   * The ASF licenses this file to You under the Apache License, Version 2.0
     6   * (the "License"); you may not use this file except in compliance with
     7   * the License.  You may obtain a copy of the License at
     8   *
     9   *     http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17  
    18  package config
    19  
    20  import (
    21  	"testing"
    22  )
    23  
    24  import (
    25  	"github.com/stretchr/testify/assert"
    26  )
    27  
    28  import (
    29  	"dubbo.apache.org/dubbo-go/v3/common/constant"
    30  	_ "dubbo.apache.org/dubbo-go/v3/proxy/proxy_factory"
    31  )
    32  
    33  // import (
    34  //
    35  //	"context"
    36  //	"dubbo.apache.org/dubbo-go/v3/config"
    37  //	"dubbo.apache.org/dubbo-go/v3/config/applicationConfig"
    38  //	"dubbo.apache.org/dubbo-go/v3/config/base"
    39  //	"dubbo.apache.org/dubbo-go/v3/config/consumer"
    40  //	"dubbo.apache.org/dubbo-go/v3/config/instance"
    41  //	"dubbo.apache.org/dubbo-go/v3/config/method"
    42  //	registry2 "dubbo.apache.org/dubbo-go/v3/config/registry"
    43  //	"sync"
    44  //	"testing"
    45  //
    46  // )
    47  //
    48  // import (
    49  //
    50  //	"github.com/stretchr/testify/assert"
    51  //
    52  // )
    53  //
    54  // import (
    55  //
    56  //	"dubbo.apache.org/dubbo-go/v3/cluster/cluster_impl"
    57  //	"dubbo.apache.org/dubbo-go/v3/common"
    58  //	"dubbo.apache.org/dubbo-go/v3/common/constant"
    59  //	"dubbo.apache.org/dubbo-go/v3/common/extension"
    60  //	"dubbo.apache.org/dubbo-go/v3/filter"
    61  //	"dubbo.apache.org/dubbo-go/v3/protocol"
    62  //	"dubbo.apache.org/dubbo-go/v3/registry"
    63  //
    64  // )
    65  //
    66  // var regProtocol protocol.Protocol
    67  //
    68  //	func doInitConsumer() {
    69  //		config.consumerConfig = &consumer.Config{
    70  //			BaseConfig: base.Config{
    71  //				applicationConfig.Config: &applicationConfig.Config{
    72  //					Organization: "dubbo_org",
    73  //					Name:         "dubbo",
    74  //					Module:       "module",
    75  //					Version:      "2.6.0",
    76  //					Owner:        "dubbo",
    77  //					Environment:  "test",
    78  //				},
    79  //			},
    80  //
    81  //			Registries: map[string]*registry2.RegistryConfig{
    82  //				"shanghai_reg1": {
    83  //					Protocol:   "mock",
    84  //					TimeoutStr: "2s",
    85  //					Group:      "shanghai_idc",
    86  //					Address:    "127.0.0.1:2181",
    87  //					Username:   "user1",
    88  //					Password:   "pwd1",
    89  //				},
    90  //				"shanghai_reg2": {
    91  //					Protocol:   "mock",
    92  //					TimeoutStr: "2s",
    93  //					Group:      "shanghai_idc",
    94  //					Address:    "127.0.0.2:2181",
    95  //					Username:   "user1",
    96  //					Password:   "pwd1",
    97  //				},
    98  //				"hangzhou_reg1": {
    99  //					Protocol:   "mock",
   100  //					TimeoutStr: "2s",
   101  //					Group:      "hangzhou_idc",
   102  //					Address:    "127.0.0.3:2181",
   103  //					Username:   "user1",
   104  //					Password:   "pwd1",
   105  //				},
   106  //				"hangzhou_reg2": {
   107  //					Protocol:   "mock",
   108  //					TimeoutStr: "2s",
   109  //					Group:      "hangzhou_idc",
   110  //					Address:    "127.0.0.4:2181",
   111  //					Username:   "user1",
   112  //					Password:   "pwd1",
   113  //				},
   114  //			},
   115  //
   116  //			References: map[string]*ReferenceConfig{
   117  //				"MockService": {
   118  //					id: "MockProvider",
   119  //					Params: map[string]string{
   120  //						"serviceid": "soa.mock",
   121  //						"forks":     "5",
   122  //					},
   123  //					Sticky:        false,
   124  //					Registry:      "shanghai_reg1,shanghai_reg2,hangzhou_reg1,hangzhou_reg2",
   125  //					InterfaceName: "com.MockService",
   126  //					Protocol:      "mock",
   127  //					Cluster:       "failover",
   128  //					Loadbalance:   "random",
   129  //					Retries:       "3",
   130  //					Group:         "huadong_idc",
   131  //					Version:       "1.0.0",
   132  //					Methods: []*method.MethodConfig{
   133  //						{
   134  //							Name:        "GetUser",
   135  //							Retries:     "2",
   136  //							LoadBalance: "random",
   137  //						},
   138  //						{
   139  //							Name:        "GetUser1",
   140  //							Retries:     "2",
   141  //							LoadBalance: "random",
   142  //							Sticky:      true,
   143  //						},
   144  //					},
   145  //				},
   146  //			},
   147  //		}
   148  //	}
   149  //
   150  // var mockProvider = new(MockProvider)
   151  //
   152  // type MockProvider struct{}
   153  //
   154  //	func (m *MockProvider) Reference() string {
   155  //		return "MockProvider"
   156  //	}
   157  //
   158  //	func (m *MockProvider) CallBack(res common.CallbackResponse) {
   159  //		// CallBack is a mock function. to implement the interface
   160  //	}
   161  //
   162  //	func doInitConsumerAsync() {
   163  //		doInitConsumer()
   164  //		instance.SetConsumerService(mockProvider)
   165  //		for _, v := range config.consumerConfig.References {
   166  //			v.Async = true
   167  //		}
   168  //	}
   169  //
   170  //	func doInitConsumerWithSingleRegistry() {
   171  //		config.consumerConfig = &consumer.Config{
   172  //			BaseConfig: base.Config{
   173  //				applicationConfig.Config: &applicationConfig.Config{
   174  //					Organization: "dubbo_org",
   175  //					Name:         "dubbo",
   176  //					Module:       "module",
   177  //					Version:      "2.6.0",
   178  //					Owner:        "dubbo",
   179  //					Environment:  "test",
   180  //				},
   181  //			},
   182  //
   183  //			Registry: &registry2.RegistryConfig{
   184  //				Address:  "mock://27.0.0.1:2181",
   185  //				Username: "user1",
   186  //				Password: "pwd1",
   187  //			},
   188  //			Registries: map[string]*registry2.RegistryConfig{},
   189  //
   190  //			References: map[string]*ReferenceConfig{
   191  //				"MockService": {
   192  //					Params: map[string]string{
   193  //						"serviceid": "soa.mock",
   194  //						"forks":     "5",
   195  //					},
   196  //					InterfaceName: "com.MockService",
   197  //					Protocol:      "mock",
   198  //					Cluster:       "failover",
   199  //					Loadbalance:   "random",
   200  //					Retries:       "3",
   201  //					Group:         "huadong_idc",
   202  //					Version:       "1.0.0",
   203  //					Methods: []*method.MethodConfig{
   204  //						{
   205  //							Name:        "GetUser",
   206  //							Retries:     "2",
   207  //							LoadBalance: "random",
   208  //						},
   209  //						{
   210  //							Name:        "GetUser1",
   211  //							Retries:     "2",
   212  //							LoadBalance: "random",
   213  //						},
   214  //					},
   215  //				},
   216  //			},
   217  //		}
   218  //	}
   219  //
   220  //	func TestReferMultiReg(t *testing.T) {
   221  //		doInitConsumer()
   222  //		extension.SetProtocol("registry", GetProtocol)
   223  //		extension.SetCluster(constant.ZONEAWARE_CLUSTER_NAME, cluster_impl.NewZoneAwareCluster)
   224  //		for _, reference := range config.consumerConfig.References {
   225  //			reference.Refer(nil)
   226  //			assert.NotNil(t, reference.invoker)
   227  //			assert.NotNil(t, reference.pxy)
   228  //		}
   229  //		config.consumerConfig = nil
   230  //	}
   231  //
   232  //	func TestRefer(t *testing.T) {
   233  //		doInitConsumer()
   234  //		extension.SetProtocol("registry", GetProtocol)
   235  //		extension.SetCluster(constant.ZONEAWARE_CLUSTER_NAME, cluster_impl.NewZoneAwareCluster)
   236  //
   237  //		for _, reference := range config.consumerConfig.References {
   238  //			reference.Refer(nil)
   239  //			assert.Equal(t, "soa.mock", reference.Params["serviceid"])
   240  //			assert.NotNil(t, reference.invoker)
   241  //			assert.NotNil(t, reference.pxy)
   242  //		}
   243  //		config.consumerConfig = nil
   244  //	}
   245  //
   246  //	func TestReferAsync(t *testing.T) {
   247  //		doInitConsumerAsync()
   248  //		extension.SetProtocol("registry", GetProtocol)
   249  //		extension.SetCluster(constant.ZONEAWARE_CLUSTER_NAME, cluster_impl.NewZoneAwareCluster)
   250  //
   251  //		for _, reference := range config.consumerConfig.References {
   252  //			reference.Refer(nil)
   253  //			assert.Equal(t, "soa.mock", reference.Params["serviceid"])
   254  //			assert.NotNil(t, reference.invoker)
   255  //			assert.NotNil(t, reference.pxy)
   256  //			assert.NotNil(t, reference.pxy.GetCallback())
   257  //		}
   258  //		config.consumerConfig = nil
   259  //	}
   260  //
   261  //	func TestReferP2P(t *testing.T) {
   262  //		doInitConsumer()
   263  //		extension.SetProtocol("dubbo", GetProtocol)
   264  //		mockFilter()
   265  //		m := config.consumerConfig.References["MockService"]
   266  //		m.URL = "dubbo://127.0.0.1:20000"
   267  //
   268  //		for _, reference := range config.consumerConfig.References {
   269  //			reference.Refer(nil)
   270  //			assert.NotNil(t, reference.invoker)
   271  //			assert.NotNil(t, reference.pxy)
   272  //		}
   273  //		config.consumerConfig = nil
   274  //	}
   275  //
   276  //	func TestReferMultiP2P(t *testing.T) {
   277  //		doInitConsumer()
   278  //		extension.SetProtocol("dubbo", GetProtocol)
   279  //		mockFilter()
   280  //		m := config.consumerConfig.References["MockService"]
   281  //		m.URL = "dubbo://127.0.0.1:20000;dubbo://127.0.0.2:20000"
   282  //
   283  //		for _, reference := range config.consumerConfig.References {
   284  //			reference.Refer(nil)
   285  //			assert.NotNil(t, reference.invoker)
   286  //			assert.NotNil(t, reference.pxy)
   287  //		}
   288  //		config.consumerConfig = nil
   289  //	}
   290  //
   291  //	func TestReferMultiP2PWithReg(t *testing.T) {
   292  //		doInitConsumer()
   293  //		extension.SetProtocol("dubbo", GetProtocol)
   294  //		extension.SetProtocol("registry", GetProtocol)
   295  //		mockFilter()
   296  //		m := config.consumerConfig.References["MockService"]
   297  //		m.URL = "dubbo://127.0.0.1:20000;registry://127.0.0.2:20000"
   298  //
   299  //		for _, reference := range config.consumerConfig.References {
   300  //			reference.Refer(nil)
   301  //			assert.NotNil(t, reference.invoker)
   302  //			assert.NotNil(t, reference.pxy)
   303  //		}
   304  //		config.consumerConfig = nil
   305  //	}
   306  //
   307  //	func TestImplement(t *testing.T) {
   308  //		doInitConsumer()
   309  //		extension.SetProtocol("registry", GetProtocol)
   310  //		extension.SetCluster(constant.ZONEAWARE_CLUSTER_NAME, cluster_impl.NewZoneAwareCluster)
   311  //		for _, reference := range config.consumerConfig.References {
   312  //			reference.Refer(nil)
   313  //			reference.Implement(&config.MockService{})
   314  //			assert.NotNil(t, reference.GetRPCService())
   315  //
   316  //		}
   317  //		config.consumerConfig = nil
   318  //	}
   319  //
   320  //	func TestForking(t *testing.T) {
   321  //		doInitConsumer()
   322  //		extension.SetProtocol("dubbo", GetProtocol)
   323  //		extension.SetProtocol("registry", GetProtocol)
   324  //		mockFilter()
   325  //		m := config.consumerConfig.References["MockService"]
   326  //		m.URL = "dubbo://127.0.0.1:20000;registry://127.0.0.2:20000"
   327  //
   328  //		for _, reference := range config.consumerConfig.References {
   329  //			reference.Refer(nil)
   330  //			forks := int(reference.invoker.GetURL().GetParamInt(constant.FORKS_KEY, constant.DEFAULT_FORKS))
   331  //			assert.Equal(t, 5, forks)
   332  //			assert.NotNil(t, reference.pxy)
   333  //			assert.NotNil(t, reference.Cluster)
   334  //		}
   335  //		config.consumerConfig = nil
   336  //	}
   337  //
   338  //	func TestSticky(t *testing.T) {
   339  //		doInitConsumer()
   340  //		extension.SetProtocol("dubbo", GetProtocol)
   341  //		extension.SetProtocol("registry", GetProtocol)
   342  //		mockFilter()
   343  //		m := config.consumerConfig.References["MockService"]
   344  //		m.URL = "dubbo://127.0.0.1:20000;registry://127.0.0.2:20000"
   345  //
   346  //		reference := config.consumerConfig.References["MockService"]
   347  //		reference.Refer(nil)
   348  //		referenceSticky := reference.invoker.GetURL().GetParam(constant.STICKY_KEY, "false")
   349  //		assert.Equal(t, "false", referenceSticky)
   350  //
   351  //		method0StickKey := reference.invoker.GetURL().GetMethodParam(reference.Methods[0].Name, constant.STICKY_KEY, "false")
   352  //		assert.Equal(t, "false", method0StickKey)
   353  //		method1StickKey := reference.invoker.GetURL().GetMethodParam(reference.Methods[1].Name, constant.STICKY_KEY, "false")
   354  //		assert.Equal(t, "true", method1StickKey)
   355  //	}
   356  //
   357  //	func GetProtocol() protocol.Protocol {
   358  //		if regProtocol != nil {
   359  //			return regProtocol
   360  //		}
   361  //		return newRegistryProtocol()
   362  //	}
   363  //
   364  //	func newRegistryProtocol() protocol.Protocol {
   365  //		return &mockRegistryProtocol{}
   366  //	}
   367  //
   368  // type mockRegistryProtocol struct {
   369  // }
   370  //
   371  //	func (*mockRegistryProtocol) Refer(url *common.URL) protocol.Invoker {
   372  //		return protocol.NewBaseInvoker(url)
   373  //	}
   374  //
   375  //	func (*mockRegistryProtocol) Export(invoker protocol.Invoker) protocol.Exporter {
   376  //		registryURL := getRegistryURL(invoker)
   377  //		if registryURL.Protocol == "service-discovery" {
   378  //			metaDataService, err := extension.GetLocalMetadataService("")
   379  //			if err != nil {
   380  //				panic(err)
   381  //			}
   382  //			ok, err := metaDataService.ExportURL(invoker.GetURL().SubURL.Clone())
   383  //			if err != nil {
   384  //				panic(err)
   385  //			}
   386  //			if !ok {
   387  //				panic("The URL has been registry!")
   388  //			}
   389  //		}
   390  //		return protocol.NewBaseExporter("test", invoker, &sync.Map{})
   391  //	}
   392  //
   393  //	func (*mockRegistryProtocol) Destroy() {
   394  //		// Destroy is a mock function
   395  //	}
   396  //
   397  //	func getRegistryURL(invoker protocol.Invoker) *common.URL {
   398  //		// here add * for return a new url
   399  //		url := invoker.GetURL()
   400  //		// if the protocol == registry ,set protocol the registry value in url.params
   401  //		if url.Protocol == constant.REGISTRY_PROTOCOL {
   402  //			protocol := url.GetParam(constant.REGISTRY_KEY, "")
   403  //			url.Protocol = protocol
   404  //		}
   405  //		return url
   406  //	}
   407  //
   408  //	func (p *mockRegistryProtocol) GetRegistries() []registry.Registry {
   409  //		return []registry.Registry{&config.mockServiceDiscoveryRegistry{}}
   410  //	}
   411  //
   412  //	func mockFilter() {
   413  //		consumerFiler := &mockShutdownFilter{}
   414  //		extension.SetFilter(constant.GracefulShutdownConsumerFilterKey, func() filter.Filter {
   415  //			return consumerFiler
   416  //		})
   417  //	}
   418  //
   419  // type mockShutdownFilter struct {
   420  // }
   421  //
   422  // // Invoke adds the requests count and block the new requests if applicationConfig is closing
   423  //
   424  //	func (gf *mockShutdownFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
   425  //		return invoker.Invoke(ctx, invocation)
   426  //	}
   427  //
   428  // // OnResponse reduces the number of active processes then return the process result
   429  //
   430  //	func (gf *mockShutdownFilter) OnResponse(ctx context.Context, result protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
   431  //		return result
   432  //	}
   433  func TestNewReferenceConfigBuilder(t *testing.T) {
   434  	registryConfig := NewRegistryConfigWithProtocolDefaultPort("nacos")
   435  	protocolConfig := NewProtocolConfigBuilder().
   436  		SetName("dubbo").
   437  		SetPort("20000").
   438  		Build()
   439  	config := NewReferenceConfigBuilder().
   440  		SetInterface("org.apache.dubbo.HelloService").
   441  		SetRegistryIDs("nacos").
   442  		SetGeneric(false).
   443  		SetCluster("cluster").
   444  		SetSerialization("serialization").
   445  		SetProtocol("dubbo").
   446  		Build()
   447  
   448  	config.rootConfig = NewRootConfigBuilder().
   449  		SetProtocols(map[string]*ProtocolConfig{"dubbo": protocolConfig}).
   450  		SetRegistries(map[string]*RegistryConfig{"nacos": registryConfig}).
   451  		Build()
   452  
   453  	assert.Equal(t, config.Prefix(), constant.ReferenceConfigPrefix+config.InterfaceName+".")
   454  	proxy := config.GetProxy()
   455  	assert.Nil(t, proxy)
   456  
   457  	values := config.getURLMap()
   458  	assert.Equal(t, values.Get(constant.GroupKey), "")
   459  
   460  	invoker := config.GetInvoker()
   461  	assert.Nil(t, invoker)
   462  }
   463  
   464  func TestReferenceConfigInitWithoutConsumerConfig(t *testing.T) {
   465  	testRootConfig := NewRootConfigBuilder().Build()
   466  	testRootConfig.Consumer = nil
   467  	err := NewReferenceConfigBuilder().Build().Init(testRootConfig)
   468  	assert.Nil(t, err)
   469  }