You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shenyu.apache.org by de...@apache.org on 2021/08/01 15:17:49 UTC
[incubator-shenyu] branch master updated: [ISSUE #1824] Improve
test coverage of org.apache.shenyu.admin.service.* (#1846)
This is an automated email from the ASF dual-hosted git repository.
dengliming pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new a4471c9 [ISSUE #1824] Improve test coverage of org.apache.shenyu.admin.service.* (#1846)
a4471c9 is described below
commit a4471c907bce49a08c2f25d3e36612ed6993d660
Author: Kunshuai Zhu <jo...@gmail.com>
AuthorDate: Sun Aug 1 23:17:43 2021 +0800
[ISSUE #1824] Improve test coverage of org.apache.shenyu.admin.service.* (#1846)
* Improve the coverage of SelectorServiceTest
* Improve the coverage
* Delete an extra stubbing
* Improve the coverage of PermissionServiceImpl
* Fix the UnnecessaryStubbingException
* Improve the coverage using mockStatic
* Refactor UpstreamCheckServiceTest to remove all unnecessary stubbings
---
.../admin/service/DashboardUserServiceTest.java | 42 ++++--
.../shenyu/admin/service/MetaDataServiceTest.java | 20 +++
.../admin/service/PermissionServiceTest.java | 49 ++++---
.../shenyu/admin/service/RuleServiceTest.java | 25 +++-
.../shenyu/admin/service/SelectorServiceTest.java | 58 ++++++--
.../admin/service/UpstreamCheckServiceTest.java | 149 +++++++++++++++++++--
6 files changed, 286 insertions(+), 57 deletions(-)
diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DashboardUserServiceTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DashboardUserServiceTest.java
index 51e73d8..20edc1b 100644
--- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DashboardUserServiceTest.java
+++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/DashboardUserServiceTest.java
@@ -18,23 +18,29 @@
package org.apache.shenyu.admin.service;
import org.apache.shenyu.admin.config.properties.JwtProperties;
+import org.apache.shenyu.admin.config.properties.LdapProperties;
import org.apache.shenyu.admin.config.properties.SecretProperties;
import org.apache.shenyu.admin.mapper.DashboardUserMapper;
import org.apache.shenyu.admin.mapper.DataPermissionMapper;
import org.apache.shenyu.admin.mapper.RoleMapper;
import org.apache.shenyu.admin.mapper.UserRoleMapper;
import org.apache.shenyu.admin.model.dto.DashboardUserDTO;
+import org.apache.shenyu.admin.model.dto.RoleDTO;
import org.apache.shenyu.admin.model.entity.DashboardUserDO;
+import org.apache.shenyu.admin.model.entity.RoleDO;
import org.apache.shenyu.admin.model.page.CommonPager;
import org.apache.shenyu.admin.model.page.PageParameter;
import org.apache.shenyu.admin.model.query.DashboardUserQuery;
import org.apache.shenyu.admin.model.vo.DashboardUserVO;
+import org.apache.shenyu.admin.model.vo.LoginDashboardUserVO;
import org.apache.shenyu.admin.service.impl.DashboardUserServiceImpl;
+import org.apache.shenyu.admin.utils.AesUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
+import org.springframework.ldap.core.LdapTemplate;
import org.springframework.test.util.ReflectionTestUtils;
import java.sql.Timestamp;
@@ -47,7 +53,6 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.BDDMockito.given;
-import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -57,6 +62,7 @@ import static org.mockito.Mockito.when;
*/
@RunWith(MockitoJUnitRunner.class)
public final class DashboardUserServiceTest {
+
public static final String TEST_ID = "testId";
public static final String TEST_USER_NAME = "userName";
@@ -84,6 +90,9 @@ public final class DashboardUserServiceTest {
@Mock
private JwtProperties jwtProperties;
+ @Mock
+ private LdapTemplate ldapTemplate;
+
@Test
public void testCreateOrUpdate() {
DashboardUserDTO dashboardUserDTO = DashboardUserDTO.builder()
@@ -168,15 +177,28 @@ public final class DashboardUserServiceTest {
String iv = "6075877187097700";
when(secretProperties.getKey()).thenReturn(key, key);
when(secretProperties.getIv()).thenReturn(iv, iv);
- when(dashboardUserMapper.findByQuery(eq(TEST_USER_NAME), anyString())).thenReturn(null, dashboardUserDO, dashboardUserDO);
+ when(dashboardUserMapper.findByQuery(eq(TEST_USER_NAME), anyString())).thenReturn(dashboardUserDO);
given(dashboardUserMapper.updateSelective(any(DashboardUserDO.class))).willReturn(1);
-
+ given(ldapTemplate.authenticate(anyString(), anyString(), anyString())).willReturn(true);
+ given(roleMapper.findByRoleName("default")).willReturn(RoleDO.buildRoleDO(new RoleDTO("1", "test", null, null)));
+
+ // test loginByLdap
+ LdapProperties ldapProperties = new LdapProperties();
+ ldapProperties.setBaseDn("test");
+ ReflectionTestUtils.setField(dashboardUserService, "ldapProperties", ldapProperties);
+ ReflectionTestUtils.setField(dashboardUserService, "ldapTemplate", ldapTemplate);
+ LoginDashboardUserVO loginDashboardUserVO = dashboardUserService.login(TEST_USER_NAME, TEST_PASSWORD);
+ assertEquals(TEST_USER_NAME, loginDashboardUserVO.getUserName());
+ assertEquals(AesUtils.aesEncryption(TEST_PASSWORD, secretProperties.getKey(), secretProperties.getIv()), loginDashboardUserVO.getPassword());
+
+ // test loginByDatabase
+ ReflectionTestUtils.setField(dashboardUserService, "ldapTemplate", null);
assertLoginSuccessful(dashboardUserDO, dashboardUserService.login(TEST_USER_NAME, TEST_PASSWORD));
- verify(dashboardUserMapper, times(2)).findByQuery(eq(TEST_USER_NAME), anyString());
- verify(dashboardUserMapper, never()).updateSelective(any(DashboardUserDO.class));
- assertLoginSuccessful(dashboardUserDO, dashboardUserService.login(TEST_USER_NAME, TEST_PASSWORD));
- verify(dashboardUserMapper, times(3)).findByQuery(eq(TEST_USER_NAME), anyString());
+ verify(dashboardUserMapper).findByQuery(eq(TEST_USER_NAME), anyString());
verify(dashboardUserMapper).updateSelective(any(DashboardUserDO.class));
+ assertLoginSuccessful(dashboardUserDO, dashboardUserService.login(TEST_USER_NAME, TEST_PASSWORD));
+ verify(dashboardUserMapper, times(2)).findByQuery(eq(TEST_USER_NAME), anyString());
+ verify(dashboardUserMapper, times(2)).updateSelective(any(DashboardUserDO.class));
}
private DashboardUserDO createDashboardUserDO() {
@@ -188,8 +210,8 @@ public final class DashboardUserServiceTest {
}
private void assertLoginSuccessful(final DashboardUserDO dashboardUserDO, final DashboardUserVO dashboardUserVO) {
- assertEquals(dashboardUserVO.getId(), dashboardUserDO.getId());
- assertEquals(dashboardUserVO.getUserName(), dashboardUserDO.getUserName());
- assertEquals(dashboardUserVO.getPassword(), dashboardUserDO.getPassword());
+ assertEquals(dashboardUserDO.getId(), dashboardUserVO.getId());
+ assertEquals(dashboardUserDO.getUserName(), dashboardUserVO.getUserName());
+ assertEquals(dashboardUserDO.getPassword(), dashboardUserVO.getPassword());
}
}
diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
index c84b02a..c5166dc 100644
--- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
+++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
@@ -29,6 +29,7 @@ import org.apache.shenyu.admin.service.impl.MetaDataServiceImpl;
import org.apache.shenyu.admin.model.vo.MetaDataVO;
import org.apache.shenyu.common.constant.AdminConstants;
import org.apache.shenyu.common.dto.MetaData;
+import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -71,6 +72,15 @@ public final class MetaDataServiceTest {
private MetaDataQuery metaDataQuery;
/**
+ * Test case for saveOrUpdateMetaData().
+ */
+ @Test
+ public void testSaveOrUpdateMetaData() {
+ testSaveOrUpdateMetaDataForInsert();
+ testSaveOrUpdateMetaDataForUpdate();
+ }
+
+ /**
* Test case for createOrUpdate.<br>
* Note that the following methods have dependencies before and after.
*/
@@ -193,6 +203,16 @@ public final class MetaDataServiceTest {
metaDataDOList.size() - 1, all.size());
}
+ private void testSaveOrUpdateMetaDataForInsert() {
+ metaDataService.saveOrUpdateMetaData(null, new MetaDataRegisterDTO());
+ verify(metaDataMapper).insert(any(MetaDataDO.class));
+ }
+
+ private void testSaveOrUpdateMetaDataForUpdate() {
+ metaDataService.saveOrUpdateMetaData(MetaDataDO.builder().id("1").build(), new MetaDataRegisterDTO());
+ verify(metaDataMapper).update(any(MetaDataDO.class));
+ }
+
/**
* Cases where the params error.
*/
diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PermissionServiceTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PermissionServiceTest.java
index 185fc35..6b4b700 100644
--- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PermissionServiceTest.java
+++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/PermissionServiceTest.java
@@ -21,6 +21,7 @@ import org.apache.shenyu.admin.mapper.DashboardUserMapper;
import org.apache.shenyu.admin.mapper.PermissionMapper;
import org.apache.shenyu.admin.mapper.ResourceMapper;
import org.apache.shenyu.admin.mapper.UserRoleMapper;
+import org.apache.shenyu.admin.model.custom.UserInfo;
import org.apache.shenyu.admin.model.entity.DashboardUserDO;
import org.apache.shenyu.admin.model.entity.PermissionDO;
import org.apache.shenyu.admin.model.entity.ResourceDO;
@@ -29,17 +30,21 @@ import org.apache.shenyu.admin.model.vo.PermissionMenuVO;
import org.apache.shenyu.admin.service.impl.PermissionServiceImpl;
import org.apache.shenyu.admin.service.impl.ResourceServiceImpl;
import org.apache.shenyu.admin.spring.SpringBeanUtils;
+import org.apache.shenyu.admin.utils.JwtUtils;
import org.apache.shiro.SecurityUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
+import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.stubbing.Answer;
import org.springframework.context.ConfigurableApplicationContext;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -47,12 +52,13 @@ import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.mockStatic;
/**
* add test case for {@link PermissionServiceImpl}.
*/
@RunWith(MockitoJUnitRunner.class)
-public class PermissionServiceTest {
+public final class PermissionServiceTest {
@Mock
private DashboardUserMapper mockDashboardUserMapper;
@@ -66,8 +72,6 @@ public class PermissionServiceTest {
@Mock
private ResourceMapper mockResourceMapper;
- private ResourceService resourceService;
-
private PermissionServiceImpl permissionServiceImplUnderTest;
@Mock
@@ -107,32 +111,37 @@ public class PermissionServiceTest {
.dateUpdated(new Timestamp(1610940313000L))
.id("1347053375029653504").build();
when(mockDashboardUserMapper.selectByUserName("admin")).thenReturn(dashboardUserDO);
- when(mockUserRoleMapper.findByUserId("1")).thenReturn(Arrays.asList(userRoleDO));
+ when(mockUserRoleMapper.findByUserId("1")).thenReturn(Collections.singletonList(userRoleDO));
when(mockPermissionMapper.findByObjectId("1346358560427216896")).thenReturn(permissionDOS);
when(mockResourceMapper.selectById("1346775491550474240")).thenReturn(resourceDO1);
when(mockResourceMapper.selectById("1346776175553376256")).thenReturn(resourceDO2);
when(mockResourceMapper.selectById("1346777157943259136")).thenReturn(resourceDO3);
when(mockResourceMapper.selectById("1347053375029653504")).thenReturn(resourceDO4);
- resourceService = new ResourceServiceImpl(mockResourceMapper, mockPermissionMapper);
+ when(mockResourceMapper.selectAll()).thenReturn(Arrays.asList(resourceDO1, resourceDO2, resourceDO3, resourceDO4));
+ ResourceService resourceService = new ResourceServiceImpl(mockResourceMapper, mockPermissionMapper);
permissionServiceImplUnderTest = new PermissionServiceImpl(mockDashboardUserMapper, mockUserRoleMapper, mockPermissionMapper, mockResourceMapper, resourceService);
}
- @Test(expected = NullPointerException.class)
+ @Test
public void testGetPermissionMenu() {
- final PermissionMenuVO expectedResult = new PermissionMenuVO(Arrays.asList(
- new PermissionMenuVO.MenuInfo("1346776175553376256", "system", "/system", "system",
- new PermissionMenuVO.Meta("setting", "SHENYU.MENU.SYSTEM.MANAGMENT"), Arrays.asList(
- new PermissionMenuVO.MenuInfo("1346777157943259136", "manage", "/system/manage", "manage",
- new PermissionMenuVO.Meta("", "SHENYU.MENU.SYSTEM.MANAGMENT.USER"), Arrays.asList(), 1)
- ), 1),
- new PermissionMenuVO.MenuInfo("1346775491550474240", "plug", "/plug", "PluginList",
- new PermissionMenuVO.Meta("dashboard", "SHENYU.MENU.PLUGIN.LIST"), Arrays.asList(), 0)
- ),
- Arrays.asList(new PermissionMenuVO.AuthPerm("plugin:sign:modify", "SHENYU.BUTTON.PLUGIN.SYNCHRONIZE", null)),
- Arrays.asList(new PermissionMenuVO.AuthPerm("plugin:sign:modify", "SHENYU.BUTTON.PLUGIN.SYNCHRONIZE", null)));
- String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYxMTc5MjEzOX0.eFORUk5kZawKLTsfRYojy-uaaDySo9kWtcfgxISS_3g";
- final PermissionMenuVO result = permissionServiceImplUnderTest.getPermissionMenu(token);
- assertThat(result, is(expectedResult));
+ try (MockedStatic<JwtUtils> mocked = mockStatic(JwtUtils.class)) {
+ mocked.when(JwtUtils::getUserInfo)
+ .thenAnswer((Answer<UserInfo>) invocation -> UserInfo.builder().userId("1").userName("admin").build());
+ final PermissionMenuVO expectedResult = new PermissionMenuVO(Arrays.asList(
+ new PermissionMenuVO.MenuInfo("1346776175553376256", "system", "/system", "system",
+ new PermissionMenuVO.Meta("setting", "SHENYU.MENU.SYSTEM.MANAGMENT"), Collections.singletonList(
+ new PermissionMenuVO.MenuInfo("1346777157943259136", "manage", "/system/manage", "manage",
+ new PermissionMenuVO.Meta("", "SHENYU.MENU.SYSTEM.MANAGMENT.USER"), Collections.emptyList(), 1)
+ ), 1),
+ new PermissionMenuVO.MenuInfo("1346775491550474240", "plug", "/plug", "PluginList",
+ new PermissionMenuVO.Meta("dashboard", "SHENYU.MENU.PLUGIN.LIST"), Collections.emptyList(), 0)
+ ),
+ Collections.singletonList(new PermissionMenuVO.AuthPerm("plugin:sign:modify", "SHENYU.BUTTON.PLUGIN.SYNCHRONIZE", null)),
+ Collections.singletonList(new PermissionMenuVO.AuthPerm("plugin:sign:modify", "SHENYU.BUTTON.PLUGIN.SYNCHRONIZE", null)));
+ String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYxMTc5MjEzOX0.eFORUk5kZawKLTsfRYojy-uaaDySo9kWtcfgxISS_3g";
+ final PermissionMenuVO result = permissionServiceImplUnderTest.getPermissionMenu(token);
+ assertThat(result, is(expectedResult));
+ }
}
@Test
diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/RuleServiceTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/RuleServiceTest.java
index c5722fa..e8c11f9 100644
--- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/RuleServiceTest.java
+++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/RuleServiceTest.java
@@ -23,8 +23,11 @@ import org.apache.shenyu.admin.mapper.PluginMapper;
import org.apache.shenyu.admin.mapper.RuleConditionMapper;
import org.apache.shenyu.admin.mapper.RuleMapper;
import org.apache.shenyu.admin.mapper.SelectorMapper;
+import org.apache.shenyu.admin.model.custom.UserInfo;
+import org.apache.shenyu.admin.model.dto.DataPermissionDTO;
import org.apache.shenyu.admin.model.dto.RuleConditionDTO;
import org.apache.shenyu.admin.model.dto.RuleDTO;
+import org.apache.shenyu.admin.model.entity.DataPermissionDO;
import org.apache.shenyu.admin.model.entity.PluginDO;
import org.apache.shenyu.admin.model.entity.RuleConditionDO;
import org.apache.shenyu.admin.model.entity.RuleDO;
@@ -35,14 +38,16 @@ import org.apache.shenyu.admin.model.query.RuleConditionQuery;
import org.apache.shenyu.admin.model.query.RuleQuery;
import org.apache.shenyu.admin.model.vo.RuleVO;
import org.apache.shenyu.admin.service.impl.RuleServiceImpl;
+import org.apache.shenyu.admin.utils.JwtUtils;
import org.apache.shenyu.common.dto.RuleData;
-import org.apache.shiro.SecurityUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
+import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.stubbing.Answer;
import org.springframework.context.ApplicationEventPublisher;
import java.sql.Timestamp;
@@ -58,6 +63,8 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.when;
/**
* Test cases for RuleService.
@@ -91,7 +98,7 @@ public final class RuleServiceTest {
@Before
public void setUp() {
- SecurityUtils.setSecurityManager(securityManager);
+ when(dataPermissionMapper.listByUserId("1")).thenReturn(Collections.singletonList(DataPermissionDO.buildPermissionDO(new DataPermissionDTO())));
ruleService = new RuleServiceImpl(ruleMapper, ruleConditionMapper, selectorMapper, pluginMapper, dataPermissionMapper, eventPublisher);
}
@@ -102,11 +109,11 @@ public final class RuleServiceTest {
testRegisterUpdate();
}
- @Test(expected = NullPointerException.class)
+ @Test
public void testCreateOrUpdate() {
publishEvent();
- testCreate();
testUpdate();
+ testCreate();
}
@Test
@@ -226,9 +233,13 @@ public final class RuleServiceTest {
}
private void testCreate() {
- RuleDTO ruleDTO = buildRuleDTO("");
- given(this.ruleMapper.insertSelective(any())).willReturn(1);
- assertThat(this.ruleService.createOrUpdate(ruleDTO), greaterThan(0));
+ try (MockedStatic<JwtUtils> mocked = mockStatic(JwtUtils.class)) {
+ mocked.when(JwtUtils::getUserInfo)
+ .thenAnswer((Answer<UserInfo>) invocation -> UserInfo.builder().userId("1").userName("admin").build());
+ RuleDTO ruleDTO = buildRuleDTO("");
+ given(this.ruleMapper.insertSelective(any())).willReturn(1);
+ assertThat(this.ruleService.createOrUpdate(ruleDTO), greaterThan(0));
+ }
}
private void testUpdate() {
diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SelectorServiceTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SelectorServiceTest.java
index e7f733b..f7d902a 100644
--- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SelectorServiceTest.java
+++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/SelectorServiceTest.java
@@ -19,8 +19,11 @@ package org.apache.shenyu.admin.service;
import org.apache.commons.lang3.StringUtils;
import org.apache.shenyu.admin.mapper.DataPermissionMapper;
+import org.apache.shenyu.admin.model.custom.UserInfo;
+import org.apache.shenyu.admin.model.dto.DataPermissionDTO;
import org.apache.shenyu.admin.model.dto.SelectorConditionDTO;
import org.apache.shenyu.admin.model.dto.SelectorDTO;
+import org.apache.shenyu.admin.model.entity.DataPermissionDO;
import org.apache.shenyu.admin.model.entity.PluginDO;
import org.apache.shenyu.admin.model.entity.RuleDO;
import org.apache.shenyu.admin.model.entity.SelectorDO;
@@ -38,16 +41,19 @@ import org.apache.shenyu.admin.service.impl.SelectorServiceImpl;
import org.apache.shenyu.admin.service.impl.UpstreamCheckService;
import org.apache.shenyu.admin.model.vo.SelectorConditionVO;
import org.apache.shenyu.admin.model.vo.SelectorVO;
+import org.apache.shenyu.admin.utils.JwtUtils;
import org.apache.shenyu.common.dto.SelectorData;
import org.apache.shenyu.common.enums.PluginEnum;
import org.apache.shenyu.common.enums.SelectorTypeEnum;
-import org.apache.shiro.SecurityUtils;
+import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
+import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.stubbing.Answer;
import org.springframework.context.ApplicationEventPublisher;
import java.sql.Timestamp;
@@ -60,6 +66,7 @@ import java.util.Random;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertNotNull;
@@ -69,6 +76,7 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
/**
* Test cases for SelectorService.
@@ -103,12 +111,9 @@ public final class SelectorServiceTest {
@Mock
private UpstreamCheckService upstreamCheckService;
- @Mock
- private org.apache.shiro.mgt.SecurityManager securityManager;
-
@Before
public void setUp() {
- SecurityUtils.setSecurityManager(securityManager);
+ when(dataPermissionMapper.listByUserId("1")).thenReturn(Collections.singletonList(DataPermissionDO.buildPermissionDO(new DataPermissionDTO())));
selectorService = new SelectorServiceImpl(selectorMapper, selectorConditionMapper, pluginMapper,
ruleMapper, ruleConditionMapper, eventPublisher, dataPermissionMapper, upstreamCheckService);
}
@@ -120,11 +125,12 @@ public final class SelectorServiceTest {
testRegisterUpdate();
}
- @Test(expected = NullPointerException.class)
+ @Test
public void testCreateOrUpdate() {
+ given(pluginMapper.selectByName("divide")).willReturn(buildPluginDO());
publishEvent();
- testCreate();
testUpdate();
+ testCreate();
}
@Test
@@ -210,16 +216,35 @@ public final class SelectorServiceTest {
assertEquals(selectorDOs.size(), dataList.size());
}
+ @Test
+ public void testHandlerSelectorNeedUpstreamCheck() {
+ publishEvent();
+
+ // Test the situation where the selector cannot be found based on the contextPath.
+ given(pluginMapper.selectByName("test")).willReturn(buildPluginDO());
+ assertNotNull(selectorService.handlerSelectorNeedUpstreamCheck(buildMetaDataRegisterDTO(), "test"));
+
+ // Test the situation where the selector can be found based on the contextPath.
+ given(selectorMapper.selectByName("/test")).willReturn(buildSelectorDO());
+ assertThat(selectorService.handlerSelectorNeedUpstreamCheck(buildMetaDataRegisterDTO(), "test"), is("456"));
+ }
+
private void testUpdate() {
SelectorDTO selectorDTO = buildSelectorDTO("456");
+ selectorDTO.setPluginId("789");
given(this.selectorMapper.updateSelective(any())).willReturn(1);
assertThat(this.selectorService.createOrUpdate(selectorDTO), greaterThan(0));
}
private void testCreate() {
- SelectorDTO selectorDTO = buildSelectorDTO("");
- given(this.selectorMapper.insertSelective(any())).willReturn(1);
- assertThat(this.selectorService.createOrUpdate(selectorDTO), greaterThan(0));
+ try (MockedStatic<JwtUtils> mocked = mockStatic(JwtUtils.class)) {
+ mocked.when(JwtUtils::getUserInfo)
+ .thenAnswer((Answer<UserInfo>) invocation -> UserInfo.builder().userId("1").userName("admin").build());
+ SelectorDTO selectorDTO = buildSelectorDTO("");
+ given(this.selectorMapper.insertSelective(any())).willReturn(1);
+ // Because of the lack of shiro configuration, there would be a NullPointerException here.
+ assertThat(this.selectorService.createOrUpdate(selectorDTO), greaterThan(0));
+ }
}
private void testRegisterCreate() {
@@ -255,6 +280,7 @@ public final class SelectorServiceTest {
selectorDTO.setPluginId("789");
selectorDTO.setName("kuan");
selectorDTO.setType(SelectorTypeEnum.FULL_FLOW.getCode());
+ selectorDTO.setHandle("[{\"upstreamHost\": \"127.0.0.1\", \"protocol\": \"http://\", \"upstreamUrl\": \"anotherUrl\"}]");
SelectorConditionDTO selectorConditionDTO1 = new SelectorConditionDTO();
selectorConditionDTO1.setId("111");
selectorConditionDTO1.setSelectorId("456");
@@ -276,8 +302,8 @@ public final class SelectorServiceTest {
}
selectorDTO.setName("test-name-" + new Random().nextInt());
selectorDTO.setEnabled(true);
- selectorDTO.setHandle("test-handle");
- selectorDTO.setPluginId("test-pluginId");
+ selectorDTO.setHandle("[{\"upstreamHost\": \"127.0.0.1\", \"protocol\": \"http://\", \"upstreamUrl\": \"anotherUrl\"}]");
+ selectorDTO.setPluginId("789");
selectorDTO.setType(SelectorTypeEnum.FULL_FLOW.getCode());
selectorDTO.setLoged(true);
selectorDTO.setMatchMode(1);
@@ -304,4 +330,12 @@ public final class SelectorServiceTest {
selectorQuery.setPageParameter(new PageParameter());
return selectorQuery;
}
+
+ private MetaDataRegisterDTO buildMetaDataRegisterDTO() {
+ MetaDataRegisterDTO metaDataRegisterDTO = new MetaDataRegisterDTO();
+ metaDataRegisterDTO.setPath("/test");
+ metaDataRegisterDTO.setHost("127.0.0.1");
+ metaDataRegisterDTO.setPort(13307);
+ return metaDataRegisterDTO;
+ }
}
diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/UpstreamCheckServiceTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/UpstreamCheckServiceTest.java
index 8faa9fd..2da412f 100644
--- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/UpstreamCheckServiceTest.java
+++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/UpstreamCheckServiceTest.java
@@ -17,17 +17,25 @@
package org.apache.shenyu.admin.service;
+import com.google.common.collect.Lists;
+import org.apache.shenyu.admin.model.entity.PluginDO;
+import org.apache.shenyu.admin.model.entity.SelectorDO;
import org.apache.shenyu.admin.mapper.PluginMapper;
import org.apache.shenyu.admin.mapper.SelectorConditionMapper;
import org.apache.shenyu.admin.mapper.SelectorMapper;
import org.apache.shenyu.admin.service.impl.UpstreamCheckService;
+import org.apache.shenyu.common.constant.Constants;
import org.apache.shenyu.common.dto.convert.DivideUpstream;
+import org.apache.shenyu.common.dto.convert.ZombieUpstream;
+import org.apache.shenyu.common.enums.PluginEnum;
+import org.apache.shenyu.common.utils.UpstreamCheckUtils;
import org.apache.shenyu.register.common.config.ShenyuRegisterCenterConfig;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
+import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.test.util.ReflectionTestUtils;
@@ -35,6 +43,16 @@ import org.springframework.test.util.ReflectionTestUtils;
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.when;
/**
* Test cases for UpstreamCheckService.
@@ -48,6 +66,8 @@ public final class UpstreamCheckServiceTest {
private static final String MOCK_SELECTOR_NAME_OTHER = "mockSelectorNameOther";
+ private static final String MOCK_PLUGIN_ID = "mockPluginId";
+
private UpstreamCheckService upstreamCheckService;
@Mock
@@ -66,31 +86,89 @@ public final class UpstreamCheckServiceTest {
private Map<String, List<DivideUpstream>> upstreamMap;
+ private Set<ZombieUpstream> zombieSet;
+
@Before
public void setUp() {
shenyuRegisterCenterConfig.setRegisterType("http");
+ Properties properties = new Properties();
+ properties.setProperty(Constants.IS_CHECKED, "true");
+ shenyuRegisterCenterConfig.setProps(properties);
- //get static variable reference by reflection
+ // get static variable reference by reflection
upstreamMap = (Map<String, List<DivideUpstream>>) ReflectionTestUtils.getField(UpstreamCheckService.class, "UPSTREAM_MAP");
+ zombieSet = (Set<ZombieUpstream>) ReflectionTestUtils.getField(UpstreamCheckService.class, "ZOMBIE_SET");
+
upstreamCheckService = new UpstreamCheckService(selectorMapper, eventPublisher, pluginMapper, selectorConditionMapper, shenyuRegisterCenterConfig);
- //spring bean creation lifecycle phase:post construct.
- upstreamCheckService.setup();
+ }
+
+ @Test
+ public void testScheduled() {
+ PluginDO pluginDO = PluginDO.builder()
+ .name(PluginEnum.DIVIDE.getName())
+ .id(MOCK_PLUGIN_ID)
+ .build();
+ SelectorDO selectorDOWithUrlError = SelectorDO.builder()
+ .pluginId(MOCK_PLUGIN_ID)
+ .name("UrlError")
+ .handle("[{\"upstreamHost\":\"localhost\",\"protocol\":\"http://\",\"upstreamUrl\":\"divide-upstream-50\",\"weight\":50}]")
+ .build();
+ SelectorDO selectorDOWithUrlReachable = SelectorDO.builder()
+ .pluginId(MOCK_PLUGIN_ID)
+ .name("UrlReachable")
+ .handle("[{\"upstreamHost\":\"localhost\",\"protocol\":\"http://\",\"localhost\":\"divide-upstream-60\",\"weight\":60}]")
+ .build();
+
+ when(pluginMapper.selectById(anyString())).thenReturn(pluginDO);
+ when(selectorMapper.selectByName(anyString())).then(invocationOnMock -> {
+ Object[] args = invocationOnMock.getArguments();
+ if ("UrlError".equals(args[0])) {
+ return selectorDOWithUrlError;
+ } else if ("UrlReachable".equals(args[0])) {
+ return selectorDOWithUrlReachable;
+ }
+ return null;
+ });
+ try (MockedStatic<UpstreamCheckUtils> mocked = mockStatic(UpstreamCheckUtils.class)) {
+ mocked.when(() -> UpstreamCheckUtils.checkUrl("ReachableUrl"))
+ .thenReturn(true);
+ mocked.when(() -> UpstreamCheckUtils.checkUrl("ErrorUrl"))
+ .thenReturn(false);
+
+ zombieSet.clear();
+ setupZombieSet();
+ upstreamMap.clear();
+ setupUpstreamMap();
+ ReflectionTestUtils.invokeMethod(upstreamCheckService, "scheduled");
+ }
+ assertThat(zombieSet.size(), is(2));
+ assertThat(upstreamMap.size(), is(2));
+ assertTrue(upstreamMap.containsKey("UrlReachable"));
+ assertTrue(upstreamMap.containsKey("UrlReachableAnother"));
}
@Test
public void testRemoveByKey() {
+ upstreamMap.put(MOCK_SELECTOR_NAME, Collections.emptyList());
UpstreamCheckService.removeByKey(MOCK_SELECTOR_NAME);
Assert.assertFalse(upstreamMap.containsKey(MOCK_SELECTOR_NAME));
}
@Test
- public void testSubmitWhenSelectorNameNotExists() {
+ public void testSubmit() {
+ // Test submit when selector name not exists
+ testSubmitOnce();
+ // Test submit when selector name exists
+ testSubmitOnce();
+ }
+
+ private void testSubmitOnce() {
final DivideUpstream divideUpstream = DivideUpstream.builder()
.upstreamUrl("divide-upstream-60")
.weight(60)
.build();
upstreamCheckService.submit(MOCK_SELECTOR_NAME_OTHER, divideUpstream);
- Assert.assertTrue(upstreamMap.containsKey(MOCK_SELECTOR_NAME_OTHER));
+ assertTrue(upstreamMap.containsKey(MOCK_SELECTOR_NAME_OTHER));
}
@Test
@@ -108,8 +186,63 @@ public final class UpstreamCheckServiceTest {
}
@Test
- public void testScheduled() {
- ReflectionTestUtils.invokeMethod(upstreamCheckService, "scheduled");
- Assert.assertFalse(upstreamMap.containsKey(MOCK_SELECTOR_NAME));
+ public void testFetchUpstreamData() {
+ PluginDO pluginDO = PluginDO.builder()
+ .name(PluginEnum.DIVIDE.getName())
+ .id(MOCK_PLUGIN_ID)
+ .build();
+ SelectorDO selectorDOWithUrlError = SelectorDO.builder()
+ .pluginId(MOCK_PLUGIN_ID)
+ .name(MOCK_SELECTOR_NAME)
+ .handle("[{\"upstreamHost\":\"localhost\",\"protocol\":\"http://\",\"upstreamUrl\":\"divide-upstream-50\",\"weight\":50}]")
+ .build();
+ SelectorDO selectorDOWithUrlReachable = SelectorDO.builder()
+ .pluginId(MOCK_PLUGIN_ID)
+ .name(MOCK_SELECTOR_NAME_OTHER)
+ .handle("[{\"upstreamHost\":\"localhost\",\"protocol\":\"http://\",\"localhost\":\"divide-upstream-60\",\"weight\":60}]")
+ .build();
+ when(pluginMapper.selectByNames(anyList())).thenReturn(Lists.newArrayList(pluginDO));
+ when(selectorMapper.findByPluginId(anyString())).thenReturn(Lists.newArrayList(selectorDOWithUrlError, selectorDOWithUrlReachable));
+ upstreamCheckService.fetchUpstreamData();
+ assertTrue(upstreamMap.containsKey(MOCK_SELECTOR_NAME));
+ assertTrue(upstreamMap.containsKey(MOCK_SELECTOR_NAME_OTHER));
+ }
+
+ private void setupZombieSet() {
+ final DivideUpstream divideUpstream1 = DivideUpstream.builder()
+ .upstreamHost("127.0.0.1")
+ .upstreamUrl("ReachableUrl")
+ .status(false)
+ .build();
+ final DivideUpstream divideUpstream2 = DivideUpstream.builder()
+ .upstreamHost("ErrorUrl")
+ .build();
+ ZombieUpstream zombieUpstream1 = ZombieUpstream.builder()
+ .divideUpstream(divideUpstream1)
+ .zombieCheckTimes(5)
+ .selectorName("UrlReachable")
+ .build();
+ ZombieUpstream zombieUpstream2 = ZombieUpstream.builder()
+ .divideUpstream(divideUpstream2)
+ .zombieCheckTimes(5)
+ .selectorName("UrlError")
+ .build();
+
+ zombieSet.add(zombieUpstream1);
+ zombieSet.add(zombieUpstream2);
+ }
+
+ private void setupUpstreamMap() {
+ final DivideUpstream divideUpstream1 = DivideUpstream.builder()
+ .upstreamHost("127.0.0.1")
+ .upstreamUrl("ReachableUrl")
+ .status(false)
+ .build();
+ final DivideUpstream divideUpstream2 = DivideUpstream.builder()
+ .upstreamHost("ErrorUrl")
+ .build();
+
+ upstreamMap.put("UrlReachableAnother", Collections.singletonList(divideUpstream1));
+ upstreamMap.put("UrlErrorAnother", Collections.singletonList(divideUpstream2));
}
}