You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DelegatingManagedServicesTest.java 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2023 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. package org.sonar.server.management;
  21. import java.util.Map;
  22. import java.util.Set;
  23. import org.junit.Test;
  24. import org.junit.runner.RunWith;
  25. import org.mockito.Mock;
  26. import org.mockito.junit.MockitoJUnitRunner;
  27. import org.sonar.db.DbSession;
  28. import static java.util.Collections.emptySet;
  29. import static org.assertj.core.api.Assertions.assertThat;
  30. import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
  31. import static org.assertj.core.api.Assertions.assertThatThrownBy;
  32. import static org.mockito.Mockito.doReturn;
  33. import static org.mockito.Mockito.mock;
  34. import static org.mockito.Mockito.when;
  35. import static org.mockito.Mockito.withSettings;
  36. @RunWith(MockitoJUnitRunner.class)
  37. public class DelegatingManagedServicesTest {
  38. private static final DelegatingManagedServices NO_MANAGED_SERVICES = new DelegatingManagedServices(emptySet());
  39. @Mock
  40. private DbSession dbSession;
  41. @Test
  42. public void getProviderName_whenNotManaged_shouldThrow() {
  43. DelegatingManagedServices managedInstanceService = NO_MANAGED_SERVICES;
  44. assertThatThrownBy(managedInstanceService::getProviderName)
  45. .isInstanceOf(IllegalStateException.class)
  46. .hasMessage("This instance is not managed.");
  47. }
  48. @Test
  49. public void getProviderName_whenManaged_shouldReturnName() {
  50. DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new AlwaysManagedInstanceService()));
  51. assertThat(managedInstanceService.getProviderName()).isEqualTo("Always");
  52. }
  53. @Test
  54. public void isInstanceExternallyManaged_whenNoManagedInstanceService_returnsFalse() {
  55. DelegatingManagedServices managedInstanceService = NO_MANAGED_SERVICES;
  56. assertThat(managedInstanceService.isInstanceExternallyManaged()).isFalse();
  57. }
  58. @Test
  59. public void isInstanceExternallyManaged_whenAllManagedInstanceServiceReturnsFalse_returnsFalse() {
  60. Set<ManagedInstanceService> delegates = Set.of(new NeverManagedInstanceService(), new NeverManagedInstanceService());
  61. DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(delegates);
  62. assertThat(managedInstanceService.isInstanceExternallyManaged()).isFalse();
  63. }
  64. @Test
  65. public void isInstanceExternallyManaged_whenOneManagedInstanceServiceReturnsTrue_returnsTrue() {
  66. Set<ManagedInstanceService> delegates = Set.of(new NeverManagedInstanceService(), new AlwaysManagedInstanceService());
  67. DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(delegates);
  68. assertThat(managedInstanceService.isInstanceExternallyManaged()).isTrue();
  69. }
  70. @Test
  71. public void getUserUuidToManaged_whenNoDelegates_setAllUsersAsNonManaged() {
  72. Set<String> userUuids = Set.of("a", "b");
  73. DelegatingManagedServices managedInstanceService = NO_MANAGED_SERVICES;
  74. Map<String, Boolean> userUuidToManaged = managedInstanceService.getUserUuidToManaged(dbSession, userUuids);
  75. assertThat(userUuidToManaged).containsExactlyInAnyOrderEntriesOf(Map.of("a", false, "b", false));
  76. }
  77. @Test
  78. public void getUserUuidToManaged_delegatesToRightService_andPropagateAnswer() {
  79. Set<String> userUuids = Set.of("a", "b");
  80. Map<String, Boolean> serviceResponse = Map.of("a", false, "b", true);
  81. ManagedInstanceService anotherManagedInstanceService = getManagedInstanceService(userUuids, serviceResponse);
  82. DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new NeverManagedInstanceService(), anotherManagedInstanceService));
  83. Map<String, Boolean> userUuidToManaged = managedInstanceService.getUserUuidToManaged(dbSession, userUuids);
  84. assertThat(userUuidToManaged).containsExactlyInAnyOrderEntriesOf(serviceResponse);
  85. }
  86. @Test
  87. public void getGroupUuidToManaged_whenNoDelegates_setAllUsersAsNonManaged() {
  88. Set<String> groupUuids = Set.of("a", "b");
  89. DelegatingManagedServices managedInstanceService = NO_MANAGED_SERVICES;
  90. Map<String, Boolean> groupUuidToManaged = managedInstanceService.getGroupUuidToManaged(dbSession, groupUuids);
  91. assertThat(groupUuidToManaged).containsExactlyInAnyOrderEntriesOf(Map.of("a", false, "b", false));
  92. }
  93. @Test
  94. public void isUserManaged_delegatesToRightService_andPropagateAnswer() {
  95. DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new NeverManagedInstanceService(), new AlwaysManagedInstanceService()));
  96. assertThat(managedInstanceService.isUserManaged(dbSession, "whatever")).isTrue();
  97. }
  98. @Test
  99. public void isUserManaged_whenNoDelegates_returnsFalse() {
  100. DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of());
  101. assertThat(managedInstanceService.isUserManaged(dbSession, "whatever")).isFalse();
  102. }
  103. @Test
  104. public void isGroupManaged_delegatesToRightService_andPropagateAnswer() {
  105. DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new NeverManagedInstanceService(), new AlwaysManagedInstanceService()));
  106. assertThat(managedInstanceService.isGroupManaged(dbSession, "whatever")).isTrue();
  107. }
  108. @Test
  109. public void isGroupManaged_whenNoDelegates_returnsFalse() {
  110. DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of());
  111. assertThat(managedInstanceService.isGroupManaged(dbSession, "whatever")).isFalse();
  112. }
  113. @Test
  114. public void getGroupUuidToManaged_delegatesToRightService_andPropagateAnswer() {
  115. Set<String> groupUuids = Set.of("a", "b");
  116. Map<String, Boolean> serviceResponse = Map.of("a", false, "b", true);
  117. ManagedInstanceService anotherManagedInstanceService = getManagedInstanceService(groupUuids, serviceResponse);
  118. DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new NeverManagedInstanceService(), anotherManagedInstanceService));
  119. Map<String, Boolean> groupUuidToManaged = managedInstanceService.getGroupUuidToManaged(dbSession, groupUuids);
  120. assertThat(groupUuidToManaged).containsExactlyInAnyOrderEntriesOf(serviceResponse);
  121. }
  122. @Test
  123. public void getGroupUuidToManaged_ifMoreThanOneDelegatesActivated_throws() {
  124. Set<ManagedInstanceService> managedInstanceServices = Set.of(new AlwaysManagedInstanceService(), new AlwaysManagedInstanceService());
  125. DelegatingManagedServices delegatingManagedServices = new DelegatingManagedServices(managedInstanceServices);
  126. assertThatIllegalStateException()
  127. .isThrownBy(() -> delegatingManagedServices.getGroupUuidToManaged(dbSession, Set.of("a")))
  128. .withMessage("The instance can't be managed by more than one identity provider and 2 were found.");
  129. }
  130. @Test
  131. public void getUserUuidToManaged_ifMoreThanOneDelegatesActivated_throws() {
  132. Set<ManagedInstanceService> managedInstanceServices = Set.of(new AlwaysManagedInstanceService(), new AlwaysManagedInstanceService());
  133. DelegatingManagedServices delegatingManagedServices = new DelegatingManagedServices(managedInstanceServices);
  134. assertThatIllegalStateException()
  135. .isThrownBy(() -> delegatingManagedServices.getUserUuidToManaged(dbSession, Set.of("a")))
  136. .withMessage("The instance can't be managed by more than one identity provider and 2 were found.");
  137. }
  138. @Test
  139. public void getManagedUsersSqlFilter_whenNoDelegates_throws() {
  140. Set<ManagedInstanceService> managedInstanceServices = emptySet();
  141. DelegatingManagedServices delegatingManagedServices = new DelegatingManagedServices(managedInstanceServices);
  142. assertThatIllegalStateException()
  143. .isThrownBy(() -> delegatingManagedServices.getManagedUsersSqlFilter(true))
  144. .withMessage("This instance is not managed.");
  145. }
  146. @Test
  147. public void getManagedUsersSqlFilter_delegatesToRightService_andPropagateAnswer() {
  148. AlwaysManagedInstanceService alwaysManagedInstanceService = new AlwaysManagedInstanceService();
  149. DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new NeverManagedInstanceService(), alwaysManagedInstanceService));
  150. assertThat(managedInstanceService.getManagedUsersSqlFilter(true)).isNotNull().isEqualTo(alwaysManagedInstanceService.getManagedUsersSqlFilter(
  151. true));
  152. }
  153. @Test
  154. public void getManagedGroupsSqlFilter_whenNoDelegates_throws() {
  155. Set<ManagedInstanceService> managedInstanceServices = emptySet();
  156. DelegatingManagedServices delegatingManagedServices = new DelegatingManagedServices(managedInstanceServices);
  157. assertThatIllegalStateException()
  158. .isThrownBy(() -> delegatingManagedServices.getManagedGroupsSqlFilter(true))
  159. .withMessage("This instance is not managed.");
  160. }
  161. @Test
  162. public void getManagedGroupsSqlFilter_delegatesToRightService_andPropagateAnswer() {
  163. AlwaysManagedInstanceService alwaysManagedInstanceService = new AlwaysManagedInstanceService();
  164. DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new NeverManagedInstanceService(), alwaysManagedInstanceService));
  165. assertThat(managedInstanceService.getManagedGroupsSqlFilter(true)).isNotNull().isEqualTo(alwaysManagedInstanceService.getManagedGroupsSqlFilter(
  166. true));
  167. }
  168. private ManagedInstanceService getManagedInstanceService(Set<String> userUuids, Map<String, Boolean> uuidToManaged) {
  169. ManagedInstanceService anotherManagedInstanceService = mock(ManagedInstanceService.class);
  170. when(anotherManagedInstanceService.isInstanceExternallyManaged()).thenReturn(true);
  171. when(anotherManagedInstanceService.getGroupUuidToManaged(dbSession, userUuids)).thenReturn(uuidToManaged);
  172. when(anotherManagedInstanceService.getUserUuidToManaged(dbSession, userUuids)).thenReturn(uuidToManaged);
  173. return anotherManagedInstanceService;
  174. }
  175. @Test
  176. public void getProjectUuidToManaged_whenNoDelegates_setAllProjectsAsNonManaged() {
  177. Set<String> projectUuids = Set.of("a", "b");
  178. DelegatingManagedServices managedInstanceService = NO_MANAGED_SERVICES;
  179. Map<String, Boolean> projectUuidToManaged = managedInstanceService.getProjectUuidToManaged(dbSession, projectUuids);
  180. assertThat(projectUuidToManaged).containsExactlyInAnyOrderEntriesOf(Map.of("a", false, "b", false));
  181. }
  182. @Test
  183. public void getProjectUuidToManaged_delegatesToRightService_andPropagateAnswer() {
  184. Set<String> projectUuids = Set.of("a", "b");
  185. Map<String, Boolean> serviceResponse = Map.of("a", false, "b", true);
  186. ManagedInstanceService anotherManagedProjectService = getManagedProjectService(projectUuids, serviceResponse);
  187. DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new NeverManagedInstanceService(), anotherManagedProjectService));
  188. Map<String, Boolean> projectUuidToManaged = managedInstanceService.getProjectUuidToManaged(dbSession, projectUuids);
  189. assertThat(projectUuidToManaged).containsExactlyInAnyOrderEntriesOf(serviceResponse);
  190. }
  191. private ManagedInstanceService getManagedProjectService(Set<String> projectUuids, Map<String, Boolean> uuidsToManaged) {
  192. ManagedInstanceService anotherManagedProjectService = mock(ManagedInstanceService.class, withSettings().extraInterfaces(ManagedProjectService.class));
  193. when(anotherManagedProjectService.isInstanceExternallyManaged()).thenReturn(true);
  194. doReturn(uuidsToManaged).when((ManagedProjectService) anotherManagedProjectService).getProjectUuidToManaged(dbSession, projectUuids);
  195. return anotherManagedProjectService;
  196. }
  197. @Test
  198. public void isProjectManaged_whenManagedInstanceServices_shouldDelegatesToRightService() {
  199. DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new NeverManagedInstanceService(), new AlwaysManagedInstanceService()));
  200. assertThat(managedInstanceService.isProjectManaged(dbSession, "whatever")).isTrue();
  201. }
  202. @Test
  203. public void isProjectManaged_whenManagedNoInstanceServices_returnsFalse() {
  204. DelegatingManagedServices managedInstanceService = NO_MANAGED_SERVICES;
  205. assertThat(managedInstanceService.isProjectManaged(dbSession, "whatever")).isFalse();
  206. }
  207. private static class NeverManagedInstanceService implements ManagedInstanceService, ManagedProjectService {
  208. @Override
  209. public boolean isInstanceExternallyManaged() {
  210. return false;
  211. }
  212. @Override
  213. public String getProviderName() {
  214. return "Never";
  215. }
  216. @Override
  217. public Map<String, Boolean> getUserUuidToManaged(DbSession dbSession, Set<String> userUuids) {
  218. return null;
  219. }
  220. @Override
  221. public Map<String, Boolean> getGroupUuidToManaged(DbSession dbSession, Set<String> groupUuids) {
  222. return null;
  223. }
  224. @Override
  225. public String getManagedUsersSqlFilter(boolean filterByManaged) {
  226. return null;
  227. }
  228. @Override
  229. public String getManagedGroupsSqlFilter(boolean filterByManaged) {
  230. return null;
  231. }
  232. @Override
  233. public boolean isUserManaged(DbSession dbSession, String userUuid) {
  234. return false;
  235. }
  236. @Override
  237. public boolean isGroupManaged(DbSession dbSession, String groupUuid) {
  238. return false;
  239. }
  240. @Override
  241. public Map<String, Boolean> getProjectUuidToManaged(DbSession dbSession, Set<String> projectUuids) {
  242. return null;
  243. }
  244. @Override
  245. public boolean isProjectManaged(DbSession dbSession, String projectUuid) {
  246. return false;
  247. }
  248. }
  249. private static class AlwaysManagedInstanceService implements ManagedInstanceService, ManagedProjectService {
  250. @Override
  251. public boolean isInstanceExternallyManaged() {
  252. return true;
  253. }
  254. @Override
  255. public String getProviderName() {
  256. return "Always";
  257. }
  258. @Override
  259. public Map<String, Boolean> getUserUuidToManaged(DbSession dbSession, Set<String> userUuids) {
  260. return null;
  261. }
  262. @Override
  263. public Map<String, Boolean> getGroupUuidToManaged(DbSession dbSession, Set<String> groupUuids) {
  264. return null;
  265. }
  266. @Override
  267. public String getManagedUsersSqlFilter(boolean filterByManaged) {
  268. return "any filter";
  269. }
  270. @Override
  271. public String getManagedGroupsSqlFilter(boolean filterByManaged) {
  272. return "any filter";
  273. }
  274. @Override
  275. public boolean isUserManaged(DbSession dbSession, String userUuid) {
  276. return true;
  277. }
  278. @Override
  279. public boolean isGroupManaged(DbSession dbSession, String groupUuid) {
  280. return true;
  281. }
  282. @Override
  283. public Map<String, Boolean> getProjectUuidToManaged(DbSession dbSession, Set<String> projectUuids) {
  284. return null;
  285. }
  286. @Override
  287. public boolean isProjectManaged(DbSession dbSession, String projectUuid) {
  288. return true;
  289. }
  290. }
  291. }