blob: 9f0d4f6b37a59550cfd797480224d9f927569508 [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 org.apache.servicecomb.serviceregistry;
import java.net.InetAddress;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.configuration.AbstractConfiguration;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.message.BasicNameValuePair;
import org.apache.servicecomb.config.ConfigUtil;
import org.apache.servicecomb.foundation.common.net.NetUtils;
import org.apache.servicecomb.registry.RegistrationManager;
import org.apache.servicecomb.registry.api.registry.Microservice;
import org.apache.servicecomb.registry.api.registry.MicroserviceInstance;
import org.apache.servicecomb.registry.api.registry.MicroserviceInstances;
import org.apache.servicecomb.serviceregistry.registry.LocalServiceRegistryFactory;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.jupiter.api.Assertions;
import org.mockito.Mockito;
import com.netflix.config.ConcurrentCompositeConfiguration;
import com.netflix.config.ConcurrentMapConfiguration;
import com.netflix.config.ConfigurationManager;
import com.netflix.config.DynamicPropertyFactory;
import com.netflix.config.DynamicStringProperty;
import mockit.Deencapsulation;
import mockit.Expectations;
import mockit.Mocked;
public class TestRegistry {
private static final AbstractConfiguration inMemoryConfig = new ConcurrentMapConfiguration();
@BeforeClass
public static void initSetup() {
AbstractConfiguration dynamicConfig = ConfigUtil.createLocalConfig();
ConcurrentCompositeConfiguration configuration = new ConcurrentCompositeConfiguration();
configuration.addConfiguration(dynamicConfig);
configuration.addConfiguration(inMemoryConfig);
ConfigurationManager.install(configuration);
}
@AfterClass
public static void classTeardown() {
Deencapsulation.setField(ConfigurationManager.class, "instance", null);
Deencapsulation.setField(ConfigurationManager.class, "customConfigurationInstalled", false);
Deencapsulation.setField(DynamicPropertyFactory.class, "config", null);
RegistryUtils.setServiceRegistry(null);
}
@Before
public void setUp() throws Exception {
inMemoryConfig.clear();
}
@SuppressWarnings("deprecation")
@Test
public void testDelegate() {
ServiceRegistry serviceRegistry = LocalServiceRegistryFactory.createLocal();
serviceRegistry.init();
RegistryUtils.init();
serviceRegistry.run();
RegistryUtils.setServiceRegistry(serviceRegistry);
Assertions.assertEquals(serviceRegistry, RegistryUtils.getServiceRegistry());
Assertions.assertEquals(serviceRegistry.getServiceRegistryClient(), RegistryUtils.getServiceRegistryClient());
Microservice microservice = RegistryUtils.getMicroservice();
Assertions.assertEquals(serviceRegistry.getMicroservice(), microservice);
Assertions.assertEquals(serviceRegistry.getMicroserviceInstance(), RegistryUtils.getMicroserviceInstance());
List<MicroserviceInstance> instanceList = RegistryUtils.findServiceInstance("default", "default", "0.0.1");
Assertions.assertEquals(1, instanceList.size());
Assertions.assertEquals(RegistryUtils.getMicroservice().getServiceId(), instanceList.get(0).getServiceId());
instanceList = RegistryUtils.findServiceInstance("default", "notExists", "0.0.1");
Assertions.assertNull(instanceList);
MicroserviceInstances microserviceInstances =
RegistryUtils.findServiceInstances("default", "default", "0.0.1");
List<MicroserviceInstance> instanceLists = microserviceInstances.getInstancesResponse().getInstances();
Assertions.assertEquals(1, instanceLists.size());
Assertions.assertEquals(RegistryUtils.getMicroservice().getServiceId(), instanceLists.get(0).getServiceId());
Map<String, String> properties = new HashMap<>();
properties.put("k", "v");
RegistryUtils.updateInstanceProperties(properties);
Assertions.assertEquals(properties, RegistryUtils.getMicroserviceInstance().getProperties());
Assertions.assertEquals(microservice, RegistryUtils.getMicroservice(microservice.getServiceId()));
RegistryUtils.updateMicroserviceProperties(properties);
Assertions.assertEquals(properties, RegistryUtils.getMicroservice().getProperties());
Assertions.assertEquals("default", RegistryUtils.getAppId());
}
@Test
public void testRegistryUtilGetPublishAddress(@Mocked InetAddress ethAddress) {
new Expectations(NetUtils.class) {
{
NetUtils.getHostAddress();
result = "1.1.1.1";
}
};
String address = RegistrationManager.getPublishAddress();
Assertions.assertEquals("1.1.1.1", address);
new Expectations(DynamicPropertyFactory.getInstance()) {
{
DynamicPropertyFactory.getInstance().getStringProperty(RegistrationManager.PUBLISH_ADDRESS, "");
result = new DynamicStringProperty(RegistrationManager.PUBLISH_ADDRESS, "") {
public String get() {
return "127.0.0.1";
}
};
}
};
Assertions.assertEquals("127.0.0.1", RegistrationManager.getPublishAddress());
new Expectations(DynamicPropertyFactory.getInstance()) {
{
ethAddress.getHostAddress();
result = "1.1.1.1";
NetUtils.ensureGetInterfaceAddress("eth100");
result = ethAddress;
DynamicPropertyFactory.getInstance().getStringProperty(RegistrationManager.PUBLISH_ADDRESS, "");
result = new DynamicStringProperty(RegistrationManager.PUBLISH_ADDRESS, "") {
public String get() {
return "{eth100}";
}
};
}
};
Assertions.assertEquals("1.1.1.1", RegistrationManager.getPublishAddress());
}
@Test
public void testRegistryUtilGetHostName(@Mocked InetAddress ethAddress) {
new Expectations(NetUtils.class) {
{
NetUtils.getHostName();
result = "testHostName";
}
};
String host = RegistrationManager.getPublishHostName();
Assertions.assertEquals("testHostName", host);
inMemoryConfig.addProperty(RegistrationManager.PUBLISH_ADDRESS, "127.0.0.1");
Assertions.assertEquals("127.0.0.1", RegistrationManager.getPublishHostName());
new Expectations(DynamicPropertyFactory.getInstance()) {
{
ethAddress.getHostName();
result = "testHostName";
NetUtils.ensureGetInterfaceAddress("eth100");
result = ethAddress;
}
};
inMemoryConfig.addProperty(RegistrationManager.PUBLISH_ADDRESS, "{eth100}");
Assertions.assertEquals("testHostName", RegistrationManager.getPublishHostName());
}
@Test
public void testGetRealListenAddress() throws Exception {
new Expectations(NetUtils.class) {
{
NetUtils.getHostAddress();
result = "1.1.1.1";
}
};
Assertions.assertEquals("rest://172.0.0.0:8080", RegistrationManager.getPublishAddress("rest", "172.0.0.0:8080"));
Assertions.assertNull(RegistrationManager.getPublishAddress("rest", null));
URI uri = new URI(RegistrationManager.getPublishAddress("rest", "0.0.0.0:8080"));
Assertions.assertEquals("1.1.1.1:8080", uri.getAuthority());
new Expectations(DynamicPropertyFactory.getInstance()) {
{
DynamicPropertyFactory.getInstance().getStringProperty(RegistrationManager.PUBLISH_ADDRESS, "");
result = new DynamicStringProperty(RegistrationManager.PUBLISH_ADDRESS, "") {
public String get() {
return "1.1.1.1";
}
};
}
};
Assertions.assertEquals("rest://1.1.1.1:8080", RegistrationManager.getPublishAddress("rest", "172.0.0.0:8080"));
InetAddress ethAddress = Mockito.mock(InetAddress.class);
Mockito.when(ethAddress.getHostAddress()).thenReturn("1.1.1.1");
new Expectations(DynamicPropertyFactory.getInstance()) {
{
NetUtils.ensureGetInterfaceAddress("eth20");
result = ethAddress;
DynamicPropertyFactory.getInstance().getStringProperty(RegistrationManager.PUBLISH_ADDRESS, "");
result = new DynamicStringProperty(RegistrationManager.PUBLISH_ADDRESS, "") {
public String get() {
return "{eth20}";
}
};
}
};
String query = URLEncodedUtils.format(Collections.singletonList(new BasicNameValuePair("country", "中 国")),
StandardCharsets.UTF_8.name());
Assertions.assertEquals("rest://1.1.1.1:8080?" + query,
RegistrationManager.getPublishAddress("rest", "172.0.0.0:8080?" + query));
}
}