|
1 | 1 | /*
|
2 |
| - * Copyright 2002-2021 the original author or authors. |
| 2 | + * Copyright 2002-2023 the original author or authors. |
3 | 3 | *
|
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | 5 | * you may not use this file except in compliance with the License.
|
|
23 | 23 | import static org.assertj.core.api.Assertions.assertThat;
|
24 | 24 | import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
25 | 25 | import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
|
| 26 | +import static org.assertj.core.api.Assertions.assertThatNoException; |
26 | 27 | import static org.mockito.BDDMockito.given;
|
27 | 28 | import static org.mockito.BDDMockito.mock;
|
28 | 29 |
|
|
35 | 36 | */
|
36 | 37 | class SimpleAliasRegistryTests {
|
37 | 38 |
|
| 39 | + private static final String REAL_NAME = "real_name"; |
| 40 | + private static final String NICKNAME = "nickname"; |
| 41 | + private static final String NAME1 = "name1"; |
| 42 | + private static final String NAME2 = "name2"; |
| 43 | + private static final String NAME3 = "name3"; |
| 44 | + private static final String NAME4 = "name4"; |
| 45 | + private static final String NAME5 = "name5"; |
| 46 | + private static final String ALIAS1 = "alias1"; |
| 47 | + private static final String ALIAS2 = "alias2"; |
| 48 | + private static final String ALIAS3 = "alias3"; |
| 49 | + // TODO Change ALIAS4 to "alias4". |
| 50 | + // When ALIAS4 is "testAlias4", resolveAliasesWithComplexPlaceholderReplacement() passes. |
| 51 | + // If you change ALIAS4 to "alias4", resolveAliasesWithComplexPlaceholderReplacement() fails. |
| 52 | + // Those assertions pass for values such as "x", "xx", "xxx", and "xxxx" but fail with values |
| 53 | + // such as "xxxxx", "testAli", ... |
| 54 | + private static final String ALIAS4 = "testAlias4"; |
| 55 | + private static final String ALIAS5 = "alias5"; |
| 56 | + |
| 57 | + |
38 | 58 | private final SimpleAliasRegistry registry = new SimpleAliasRegistry();
|
39 | 59 |
|
| 60 | + |
40 | 61 | @Test
|
41 | 62 | void aliasChaining() {
|
42 |
| - registry.registerAlias("test", "testAlias"); |
43 |
| - registry.registerAlias("testAlias", "testAlias2"); |
44 |
| - registry.registerAlias("testAlias2", "testAlias3"); |
45 |
| - |
46 |
| - assertThat(registry.hasAlias("test", "testAlias")).isTrue(); |
47 |
| - assertThat(registry.hasAlias("test", "testAlias2")).isTrue(); |
48 |
| - assertThat(registry.hasAlias("test", "testAlias3")).isTrue(); |
49 |
| - assertThat(registry.canonicalName("testAlias")).isEqualTo("test"); |
50 |
| - assertThat(registry.canonicalName("testAlias2")).isEqualTo("test"); |
51 |
| - assertThat(registry.canonicalName("testAlias3")).isEqualTo("test"); |
52 |
| - |
| 63 | + registerAlias(NAME1, ALIAS1); |
| 64 | + registerAlias(ALIAS1, ALIAS2); |
| 65 | + registerAlias(ALIAS2, ALIAS3); |
| 66 | + |
| 67 | + assertHasAlias(NAME1, ALIAS1); |
| 68 | + assertHasAlias(NAME1, ALIAS2); |
| 69 | + assertHasAlias(NAME1, ALIAS3); |
| 70 | + assertThat(registry.canonicalName(ALIAS1)).isEqualTo(NAME1); |
| 71 | + assertThat(registry.canonicalName(ALIAS2)).isEqualTo(NAME1); |
| 72 | + assertThat(registry.canonicalName(ALIAS3)).isEqualTo(NAME1); |
53 | 73 | }
|
54 | 74 |
|
55 | 75 | @Test // SPR-17191
|
56 | 76 | void aliasChainingWithMultipleAliases() {
|
57 |
| - registry.registerAlias("name", "alias_a"); |
58 |
| - registry.registerAlias("name", "alias_b"); |
59 |
| - assertThat(registry.hasAlias("name", "alias_a")).isTrue(); |
60 |
| - assertThat(registry.hasAlias("name", "alias_b")).isTrue(); |
61 |
| - |
62 |
| - registry.registerAlias("real_name", "name"); |
63 |
| - assertThat(registry.hasAlias("real_name", "name")).isTrue(); |
64 |
| - assertThat(registry.hasAlias("real_name", "alias_a")).isTrue(); |
65 |
| - assertThat(registry.hasAlias("real_name", "alias_b")).isTrue(); |
66 |
| - |
67 |
| - registry.registerAlias("name", "alias_c"); |
68 |
| - assertThat(registry.hasAlias("real_name", "name")).isTrue(); |
69 |
| - assertThat(registry.hasAlias("real_name", "alias_a")).isTrue(); |
70 |
| - assertThat(registry.hasAlias("real_name", "alias_b")).isTrue(); |
71 |
| - assertThat(registry.hasAlias("real_name", "alias_c")).isTrue(); |
| 77 | + registerAlias(NAME1, ALIAS1); |
| 78 | + registerAlias(NAME1, ALIAS2); |
| 79 | + assertHasAlias(NAME1, ALIAS1); |
| 80 | + assertHasAlias(NAME1, ALIAS2); |
| 81 | + |
| 82 | + registerAlias(REAL_NAME, NAME1); |
| 83 | + assertHasAlias(REAL_NAME, NAME1); |
| 84 | + assertHasAlias(REAL_NAME, ALIAS1); |
| 85 | + assertHasAlias(REAL_NAME, ALIAS2); |
| 86 | + |
| 87 | + registerAlias(NAME1, ALIAS3); |
| 88 | + assertHasAlias(REAL_NAME, NAME1); |
| 89 | + assertHasAlias(REAL_NAME, ALIAS1); |
| 90 | + assertHasAlias(REAL_NAME, ALIAS2); |
| 91 | + assertHasAlias(REAL_NAME, ALIAS3); |
72 | 92 | }
|
73 | 93 |
|
74 | 94 | @Test
|
75 | 95 | void removeAlias() {
|
76 |
| - registry.registerAlias("real_name", "nickname"); |
77 |
| - assertThat(registry.hasAlias("real_name", "nickname")).isTrue(); |
| 96 | + registerAlias(REAL_NAME, NICKNAME); |
| 97 | + assertHasAlias(REAL_NAME, NICKNAME); |
78 | 98 |
|
79 |
| - registry.removeAlias("nickname"); |
80 |
| - assertThat(registry.hasAlias("real_name", "nickname")).isFalse(); |
| 99 | + registry.removeAlias(NICKNAME); |
| 100 | + assertDoesNotHaveAlias(REAL_NAME, NICKNAME); |
81 | 101 | }
|
82 | 102 |
|
83 | 103 | @Test
|
84 | 104 | void isAlias() {
|
85 |
| - registry.registerAlias("real_name", "nickname"); |
86 |
| - assertThat(registry.isAlias("nickname")).isTrue(); |
87 |
| - assertThat(registry.isAlias("real_name")).isFalse(); |
88 |
| - assertThat(registry.isAlias("fake")).isFalse(); |
| 105 | + registerAlias(REAL_NAME, NICKNAME); |
| 106 | + assertThat(registry.isAlias(NICKNAME)).isTrue(); |
| 107 | + assertThat(registry.isAlias(REAL_NAME)).isFalse(); |
| 108 | + assertThat(registry.isAlias("bogus")).isFalse(); |
89 | 109 | }
|
90 | 110 |
|
91 | 111 | @Test
|
92 | 112 | void getAliases() {
|
93 |
| - registry.registerAlias("test", "testAlias1"); |
94 |
| - assertThat(registry.getAliases("test")).containsExactly("testAlias1"); |
| 113 | + assertThat(registry.getAliases(NAME1)).isEmpty(); |
95 | 114 |
|
96 |
| - registry.registerAlias("testAlias1", "testAlias2"); |
97 |
| - registry.registerAlias("testAlias2", "testAlias3"); |
98 |
| - assertThat(registry.getAliases("test")).containsExactlyInAnyOrder("testAlias1", "testAlias2", "testAlias3"); |
99 |
| - assertThat(registry.getAliases("testAlias1")).containsExactlyInAnyOrder("testAlias2", "testAlias3"); |
100 |
| - assertThat(registry.getAliases("testAlias2")).containsExactly("testAlias3"); |
| 115 | + registerAlias(NAME1, ALIAS1); |
| 116 | + assertThat(registry.getAliases(NAME1)).containsExactly(ALIAS1); |
101 | 117 |
|
102 |
| - assertThat(registry.getAliases("testAlias3")).isEmpty(); |
| 118 | + registerAlias(ALIAS1, ALIAS2); |
| 119 | + registerAlias(ALIAS2, ALIAS3); |
| 120 | + assertThat(registry.getAliases(NAME1)).containsExactlyInAnyOrder(ALIAS1, ALIAS2, ALIAS3); |
| 121 | + assertThat(registry.getAliases(ALIAS1)).containsExactlyInAnyOrder(ALIAS2, ALIAS3); |
| 122 | + assertThat(registry.getAliases(ALIAS2)).containsExactly(ALIAS3); |
| 123 | + assertThat(registry.getAliases(ALIAS3)).isEmpty(); |
103 | 124 | }
|
104 | 125 |
|
105 | 126 | @Test
|
106 |
| - void testCheckForAliasCircle() { |
107 |
| - String name = "testName"; |
108 |
| - String alias = "testAlias"; |
109 |
| - registry.checkForAliasCircle(name, alias); |
110 |
| - registry.registerAlias(name, alias); |
| 127 | + void checkForAliasCircle() { |
| 128 | + // No aliases registered, so no cycles possible. |
| 129 | + assertThatNoException().isThrownBy(() -> registry.checkForAliasCircle(NAME1, ALIAS1)); |
| 130 | + |
| 131 | + // NAME1 -> ALIAS1 |
| 132 | + registerAlias(NAME1, ALIAS1); |
| 133 | + |
| 134 | + // No cycles possible. |
| 135 | + assertThatNoException().isThrownBy(() -> registry.checkForAliasCircle(NAME1, ALIAS1)); |
| 136 | + |
111 | 137 | assertThatIllegalStateException()
|
112 |
| - .isThrownBy(() -> registry.checkForAliasCircle(alias, name)); |
| 138 | + // NAME1 -> ALIAS1 -> NAME1 |
| 139 | + .isThrownBy(() -> registerAlias(ALIAS1, NAME1)) // internally invokes checkForAliasCircle() |
| 140 | + .withMessageContaining("'%s' is a direct or indirect alias for '%s'", ALIAS1, NAME1); |
| 141 | + |
| 142 | + // NAME1 -> ALIAS1 -> ALIAS2 |
| 143 | + registerAlias(ALIAS1, ALIAS2); |
| 144 | + assertThatIllegalStateException() |
| 145 | + // NAME1 -> ALIAS1 -> ALIAS2 -> NAME1 |
| 146 | + .isThrownBy(() -> registerAlias(ALIAS2, NAME1)) // internally invokes checkForAliasCircle() |
| 147 | + .withMessageContaining("'%s' is a direct or indirect alias for '%s'", ALIAS2, NAME1); |
| 148 | + } |
| 149 | + |
| 150 | + @Test |
| 151 | + void resolveAliasesPreconditions() { |
| 152 | + assertThatIllegalArgumentException().isThrownBy(() -> registry.resolveAliases(null)); |
113 | 153 | }
|
114 | 154 |
|
115 | 155 | @Test
|
116 |
| - void testResolveAliases() { |
117 |
| - assertThatIllegalArgumentException() |
118 |
| - .isThrownBy(() -> registry.resolveAliases(null)); |
| 156 | + void resolveAliasesWithoutPlaceholderReplacement() { |
| 157 | + // Resolver returns input unmodified. |
| 158 | + StringValueResolver valueResolver = str -> str; |
| 159 | + |
| 160 | + registerAlias(NAME1, ALIAS1); |
| 161 | + registerAlias(NAME1, ALIAS3); |
| 162 | + registerAlias(NAME2, ALIAS2); |
| 163 | + registerAlias(NAME2, ALIAS4); |
| 164 | + |
| 165 | + registry.resolveAliases(valueResolver); |
| 166 | + assertThat(registry.getAliases(NAME1)).containsExactlyInAnyOrder(ALIAS1, ALIAS3); |
| 167 | + assertThat(registry.getAliases(NAME2)).containsExactlyInAnyOrder(ALIAS2, ALIAS4); |
| 168 | + |
| 169 | + registry.removeAlias(ALIAS1); |
| 170 | + registry.resolveAliases(valueResolver); |
| 171 | + assertThat(registry.getAliases(NAME1)).containsExactly(ALIAS3); |
| 172 | + assertThat(registry.getAliases(NAME2)).containsExactlyInAnyOrder(ALIAS2, ALIAS4); |
| 173 | + } |
119 | 174 |
|
| 175 | + @Test |
| 176 | + void resolveAliasesWithPlaceholderReplacement() { |
120 | 177 | StringValueResolver mock = mock();
|
121 | 178 |
|
122 |
| - registry.registerAlias("testName1", "testAlias1"); |
123 |
| - registry.registerAlias("testName2", "testAlias2"); |
124 |
| - given(mock.resolveStringValue("testAlias2")).willReturn("anotherAlias2"); |
125 |
| - given(mock.resolveStringValue("testName2")).willReturn("anotherName2"); |
| 179 | + registerAlias(NAME1, ALIAS1); |
| 180 | + |
| 181 | + given(mock.resolveStringValue(NAME1)).willReturn(NAME2); |
| 182 | + given(mock.resolveStringValue(ALIAS1)).willReturn(ALIAS2); |
| 183 | + |
126 | 184 | registry.resolveAliases(mock);
|
127 |
| - assertThat(registry.getAliases("anotherName2")).containsExactly("anotherAlias2"); |
128 |
| - |
129 |
| - registry.registerAlias("testName3", "testAlias3"); |
130 |
| - registry.registerAlias("testName4", "testAlias4"); |
131 |
| - registry.registerAlias("testName5", "testAlias5"); |
132 |
| - given(mock.resolveStringValue("testName5")).willReturn("testName5"); |
133 |
| - given(mock.resolveStringValue("testAlias5")).willReturn("testAlias5"); |
134 |
| - given(mock.resolveStringValue("testName3")).willReturn("testName4"); |
135 |
| - given(mock.resolveStringValue("testAlias3")).willReturn("testAlias4"); |
136 |
| - given(mock.resolveStringValue("testName4")).willReturn("testName4"); |
137 |
| - given(mock.resolveStringValue("testAlias4")).willReturn("testAlias5"); |
138 |
| - assertThatIllegalStateException() |
139 |
| - .isThrownBy(() -> registry.resolveAliases(mock)); |
| 185 | + assertThat(registry.getAliases(NAME1)).isEmpty(); |
| 186 | + assertThat(registry.getAliases(NAME2)).containsExactly(ALIAS2); |
140 | 187 |
|
141 |
| - given(mock.resolveStringValue("testName4")).willReturn("testName5"); |
142 |
| - given(mock.resolveStringValue("testAlias4")).willReturn("testAlias4"); |
143 |
| - assertThatIllegalStateException() |
144 |
| - .isThrownBy(() -> registry.resolveAliases(mock)); |
| 188 | + registry.removeAlias(ALIAS2); |
| 189 | + assertThat(registry.getAliases(NAME2)).isEmpty(); |
| 190 | + } |
| 191 | + |
| 192 | + @Test |
| 193 | + void resolveAliasesWithComplexPlaceholderReplacement() { |
| 194 | + StringValueResolver mock = mock(); |
| 195 | + |
| 196 | + registerAlias(NAME3, ALIAS3); |
| 197 | + registerAlias(NAME4, ALIAS4); |
| 198 | + registerAlias(NAME5, ALIAS5); |
| 199 | + |
| 200 | + given(mock.resolveStringValue(NAME3)).willReturn(NAME4); |
| 201 | + given(mock.resolveStringValue(NAME4)).willReturn(NAME4); |
| 202 | + given(mock.resolveStringValue(NAME5)).willReturn(NAME5); |
| 203 | + given(mock.resolveStringValue(ALIAS3)).willReturn(ALIAS4); |
| 204 | + given(mock.resolveStringValue(ALIAS4)).willReturn(ALIAS5); |
| 205 | + given(mock.resolveStringValue(ALIAS5)).willReturn(ALIAS5); |
| 206 | + assertThatIllegalStateException().isThrownBy(() -> registry.resolveAliases(mock)); |
145 | 207 |
|
146 |
| - given(mock.resolveStringValue("testName4")).willReturn("testName4"); |
147 |
| - given(mock.resolveStringValue("testAlias4")).willReturn("testAlias5"); |
| 208 | + given(mock.resolveStringValue(NAME4)).willReturn(NAME5); |
| 209 | + given(mock.resolveStringValue(ALIAS4)).willReturn(ALIAS4); |
| 210 | + assertThatIllegalStateException().isThrownBy(() -> registry.resolveAliases(mock)); |
| 211 | + |
| 212 | + given(mock.resolveStringValue(NAME4)).willReturn(NAME4); |
| 213 | + given(mock.resolveStringValue(ALIAS4)).willReturn(ALIAS5); |
148 | 214 | registry.resolveAliases(mock);
|
149 |
| - assertThat(registry.getAliases("testName4")).containsExactly("testAlias4"); |
150 |
| - assertThat(registry.getAliases("testName5")).containsExactly("testAlias5"); |
| 215 | + assertThat(registry.getAliases(NAME4)).containsExactly(ALIAS4); |
| 216 | + assertThat(registry.getAliases(NAME5)).containsExactly(ALIAS5); |
| 217 | + } |
| 218 | + |
| 219 | + private void registerAlias(String name, String alias) { |
| 220 | + registry.registerAlias(name, alias); |
| 221 | + } |
| 222 | + |
| 223 | + private void assertHasAlias(String name, String alias) { |
| 224 | + assertThat(registry.hasAlias(name, alias)).isTrue(); |
| 225 | + } |
| 226 | + |
| 227 | + private void assertDoesNotHaveAlias(String name, String alias) { |
| 228 | + assertThat(registry.hasAlias(name, alias)).isFalse(); |
151 | 229 | }
|
152 | 230 |
|
153 | 231 | }
|
0 commit comments