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: ®istry2.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 }