blob: 4d157ff11001c03d0f309ede8be730bcbe2bb0ef [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.dubbo.config;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.config.api.DemoService;
import org.apache.dubbo.config.api.Greeting;
import org.apache.dubbo.config.mock.MockProtocol2;
import org.apache.dubbo.config.mock.MockRegistryFactory2;
import org.apache.dubbo.config.mock.TestProxyFactory;
import org.apache.dubbo.config.provider.impl.DemoServiceImpl;
import org.apache.dubbo.registry.Registry;
import org.apache.dubbo.rpc.Exporter;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Protocol;
import org.apache.dubbo.rpc.service.GenericService;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_SERIALIZATION_BEAN;
import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_SERIALIZATION_DEFAULT;
import static org.apache.dubbo.common.constants.CommonConstants.GENERIC_SERIALIZATION_NATIVE_JAVA;
import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER;
import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;
import static org.apache.dubbo.config.Constants.SHUTDOWN_TIMEOUT_KEY;
import static org.apache.dubbo.remoting.Constants.BIND_IP_KEY;
import static org.apache.dubbo.remoting.Constants.BIND_PORT_KEY;
import static org.apache.dubbo.rpc.Constants.GENERIC_KEY;
import static org.apache.dubbo.rpc.cluster.Constants.EXPORT_KEY;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasEntry;
import static org.hamcrest.Matchers.hasKey;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.withSettings;
public class ServiceConfigTest {
private Protocol protocolDelegate = Mockito.mock(Protocol.class);
private Registry registryDelegate = Mockito.mock(Registry.class);
private Exporter exporter = Mockito.mock(Exporter.class);
private ServiceConfig<DemoServiceImpl> service = new ServiceConfig<DemoServiceImpl>();
private ServiceConfig<DemoServiceImpl> service2 = new ServiceConfig<DemoServiceImpl>();
private ServiceConfig<DemoServiceImpl> delayService = new ServiceConfig<DemoServiceImpl>();
@BeforeEach
public void setUp() throws Exception {
MockProtocol2.delegate = protocolDelegate;
MockRegistryFactory2.registry = registryDelegate;
Mockito.when(protocolDelegate.export(Mockito.any(Invoker.class))).thenReturn(exporter);
ApplicationConfig app = new ApplicationConfig("app");
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName("mockprotocol2");
ProviderConfig provider = new ProviderConfig();
provider.setExport(true);
provider.setProtocol(protocolConfig);
RegistryConfig registry = new RegistryConfig();
registry.setProtocol("mockprotocol2");
registry.setAddress("N/A");
ArgumentConfig argument = new ArgumentConfig();
argument.setIndex(0);
argument.setCallback(false);
MethodConfig method = new MethodConfig();
method.setName("echo");
method.setArguments(Collections.singletonList(argument));
service.setProvider(provider);
service.setApplication(app);
service.setRegistry(registry);
service.setInterface(DemoService.class);
service.setRef(new DemoServiceImpl());
service.setMethods(Collections.singletonList(method));
service2.setProvider(provider);
service2.setApplication(app);
service2.setRegistry(registry);
service2.setInterface(DemoService.class);
service2.setRef(new DemoServiceImpl());
service2.setMethods(Collections.singletonList(method));
service2.setProxy("testproxyfactory");
delayService.setProvider(provider);
delayService.setApplication(app);
delayService.setRegistry(registry);
delayService.setInterface(DemoService.class);
delayService.setRef(new DemoServiceImpl());
delayService.setMethods(Collections.singletonList(method));
delayService.setDelay(100);
// ApplicationModel.getConfigManager().clear();
}
@AfterEach
public void tearDown() {
// ApplicationModel.getConfigManager().clear();
}
@Test
public void testExport() throws Exception {
service.export();
assertThat(service.getExportedUrls(), hasSize(1));
URL url = service.toUrl();
assertThat(url.getProtocol(), equalTo("mockprotocol2"));
assertThat(url.getPath(), equalTo(DemoService.class.getName()));
assertThat(url.getParameters(), hasEntry(ANYHOST_KEY, "true"));
assertThat(url.getParameters(), hasEntry(APPLICATION_KEY, "app"));
assertThat(url.getParameters(), hasKey(BIND_IP_KEY));
assertThat(url.getParameters(), hasKey(BIND_PORT_KEY));
assertThat(url.getParameters(), hasEntry(EXPORT_KEY, "true"));
assertThat(url.getParameters(), hasEntry("echo.0.callback", "false"));
assertThat(url.getParameters(), hasEntry(GENERIC_KEY, "false"));
assertThat(url.getParameters(), hasEntry(INTERFACE_KEY, DemoService.class.getName()));
assertThat(url.getParameters(), hasKey(METHODS_KEY));
assertThat(url.getParameters().get(METHODS_KEY), containsString("echo"));
assertThat(url.getParameters(), hasEntry(SIDE_KEY, PROVIDER));
Mockito.verify(protocolDelegate).export(Mockito.any(Invoker.class));
}
@Test
public void testProxy() throws Exception {
service2.export();
assertThat(service2.getExportedUrls(), hasSize(1));
assertEquals(2, TestProxyFactory.count); // local injvm and registry protocol, so expected is 2
}
@Test
public void testDelayExport() throws Exception {
delayService.export();
assertTrue(delayService.getExportedUrls().isEmpty());
//add 300ms to ensure that the delayService has been exported
TimeUnit.MILLISECONDS.sleep(delayService.getDelay() + 300);
assertThat(delayService.getExportedUrls(), hasSize(1));
}
@Test
@Disabled("cannot pass in travis")
public void testUnexport() throws Exception {
System.setProperty(SHUTDOWN_WAIT_KEY, "0");
try {
service.export();
service.unexport();
Thread.sleep(1000);
Mockito.verify(exporter, Mockito.atLeastOnce()).unexport();
} finally {
System.clearProperty(SHUTDOWN_TIMEOUT_KEY);
}
}
@Test
public void testInterfaceClass() throws Exception {
ServiceConfig<Greeting> service = new ServiceConfig<Greeting>();
service.setInterface(Greeting.class.getName());
service.setRef(Mockito.mock(Greeting.class));
assertThat(service.getInterfaceClass() == Greeting.class, is(true));
service = new ServiceConfig<Greeting>();
service.setRef(Mockito.mock(Greeting.class, withSettings().extraInterfaces(GenericService.class)));
assertThat(service.getInterfaceClass() == GenericService.class, is(true));
}
@Test
public void testInterface1() throws Exception {
Assertions.assertThrows(IllegalStateException.class, () -> {
ServiceConfig<DemoService> service = new ServiceConfig<DemoService>();
service.setInterface(DemoServiceImpl.class);
});
}
@Test
public void testInterface2() throws Exception {
ServiceConfig<DemoService> service = new ServiceConfig<DemoService>();
service.setInterface(DemoService.class);
assertThat(service.getInterface(), equalTo(DemoService.class.getName()));
}
@Test
public void testProvider() throws Exception {
ServiceConfig service = new ServiceConfig();
ProviderConfig provider = new ProviderConfig();
service.setProvider(provider);
assertThat(service.getProvider(), is(provider));
}
@Test
public void testGeneric1() throws Exception {
ServiceConfig service = new ServiceConfig();
service.setGeneric(GENERIC_SERIALIZATION_DEFAULT);
assertThat(service.getGeneric(), equalTo(GENERIC_SERIALIZATION_DEFAULT));
service.setGeneric(GENERIC_SERIALIZATION_NATIVE_JAVA);
assertThat(service.getGeneric(), equalTo(GENERIC_SERIALIZATION_NATIVE_JAVA));
service.setGeneric(GENERIC_SERIALIZATION_BEAN);
assertThat(service.getGeneric(), equalTo(GENERIC_SERIALIZATION_BEAN));
}
@Test
public void testGeneric2() throws Exception {
Assertions.assertThrows(IllegalArgumentException.class, () -> {
ServiceConfig service = new ServiceConfig();
service.setGeneric("illegal");
});
}
// @Test
// public void testMock() throws Exception {
// Assertions.assertThrows(IllegalArgumentException.class, () -> {
// ServiceConfig service = new ServiceConfig();
// service.setMock("true");
// });
// }
//
// @Test
// public void testMock2() throws Exception {
// Assertions.assertThrows(IllegalArgumentException.class, () -> {
// ServiceConfig service = new ServiceConfig();
// service.setMock(true);
// });
// }
@Test
public void testApplicationInUrl() {
service.export();
Assertions.assertNotNull(service.toUrl().getParameter(APPLICATION_KEY));
Assertions.assertEquals("app", service.toUrl().getParameter(APPLICATION_KEY));
}
}