Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

ConfigFileBackedConfigProviderTest.java 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. /*
  2. * Copyright (c) 2006-2015 DMDirc Developers
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a copy
  5. * of this software and associated documentation files (the "Software"), to deal
  6. * in the Software without restriction, including without limitation the rights
  7. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. * copies of the Software, and to permit persons to whom the Software is
  9. * furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  20. * SOFTWARE.
  21. */
  22. package com.dmdirc.config;
  23. import com.dmdirc.config.provider.ConfigChangeListener;
  24. import com.dmdirc.config.provider.ConfigProvider;
  25. import com.dmdirc.tests.JimFsRule;
  26. import com.dmdirc.util.io.InvalidConfigFileException;
  27. import com.dmdirc.util.validators.NumericalValidator;
  28. import com.dmdirc.util.validators.PermissiveValidator;
  29. import com.google.common.collect.Lists;
  30. import java.io.IOException;
  31. import java.nio.file.Files;
  32. import java.nio.file.StandardCopyOption;
  33. import org.junit.Before;
  34. import org.junit.Rule;
  35. import org.junit.Test;
  36. import org.junit.runner.RunWith;
  37. import org.mockito.Mock;
  38. import org.mockito.runners.MockitoJUnitRunner;
  39. import static org.junit.Assert.assertEquals;
  40. import static org.junit.Assert.assertFalse;
  41. import static org.junit.Assert.assertNull;
  42. import static org.junit.Assert.assertTrue;
  43. import static org.mockito.ArgumentMatchers.anyString;
  44. import static org.mockito.Mockito.never;
  45. import static org.mockito.Mockito.verify;
  46. @RunWith(MockitoJUnitRunner.class)
  47. public class ConfigFileBackedConfigProviderTest {
  48. private static final String[] FILES = {
  49. "simple-ircd", "simple-server", "profile-new", "profile-old", "profile-old-no-alts",
  50. "no-name", "no-target", "invalid-config-file", "simple-ircd-extra"
  51. };
  52. public static final PermissiveValidator<String> PERMISSIVE_VALIDATOR =
  53. new PermissiveValidator<>();
  54. @Rule public final JimFsRule jimFsRule = new JimFsRule();
  55. @Mock private IdentityManager identityManager;
  56. @Mock private ConfigChangeListener changeListener;
  57. @Before
  58. public void setUp() throws Exception {
  59. for (String file: FILES) {
  60. Files.copy(getClass().getResourceAsStream(file), jimFsRule.getPath(file));
  61. }
  62. }
  63. @Test(expected = InvalidIdentityFileException.class)
  64. public void testNoName() throws Exception {
  65. new ConfigFileBackedConfigProvider(identityManager,
  66. jimFsRule.getPath("no-name"), false);
  67. }
  68. @Test(expected = InvalidIdentityFileException.class)
  69. public void testNoTarget() throws Exception {
  70. new ConfigFileBackedConfigProvider(identityManager,
  71. jimFsRule.getPath("no-target"), false);
  72. }
  73. @Test(expected = InvalidIdentityFileException.class)
  74. public void testInvalidConfigFile() throws Exception {
  75. new ConfigFileBackedConfigProvider(identityManager,
  76. jimFsRule.getPath("invalid-config-file"), false);
  77. }
  78. @Test
  79. public void testProfileSimple() throws Exception {
  80. final ConfigFileBackedConfigProvider provider = getProvider("profile-new");
  81. assertTrue(provider.isProfile());
  82. assertEquals("nick1\nnick2\nnick3", provider.getOption("profile", "nicknames"));
  83. assertEquals("ident", provider.getOption("profile", "ident"));
  84. assertEquals("Guy Incognito", provider.getOption("profile", "realname"));
  85. }
  86. @Test
  87. public void testProfileNonProfileConfig() throws Exception {
  88. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  89. assertFalse(provider.isProfile());
  90. }
  91. @Test
  92. public void testReadsIrcdTarget() throws Exception {
  93. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  94. assertEquals(ConfigTarget.TYPE.IRCD, provider.getTarget().getType());
  95. assertEquals("DMDircircd!", provider.getTarget().getData());
  96. }
  97. @Test
  98. public void testReadsServerTarget() throws Exception {
  99. final ConfigFileBackedConfigProvider provider = getProvider("simple-server");
  100. assertEquals(ConfigTarget.TYPE.SERVER, provider.getTarget().getType());
  101. assertEquals("test123", provider.getTarget().getData());
  102. }
  103. @Test
  104. public void testSetsOrder() throws Exception {
  105. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  106. assertEquals(5000, provider.getTarget().getOrder());
  107. }
  108. @Test
  109. public void testHasOptionPermissiveValidator() throws Exception {
  110. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  111. assertTrue(provider.hasOption("unit", "test", PERMISSIVE_VALIDATOR));
  112. assertFalse(provider.hasOption("unit", "untest", PERMISSIVE_VALIDATOR));
  113. assertFalse(provider.hasOption("foo", "test", PERMISSIVE_VALIDATOR));
  114. }
  115. @Test
  116. public void testHasOptionFailingValidator() throws Exception {
  117. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  118. assertFalse(provider.hasOption("unit", "test", new NumericalValidator(0, 100)));
  119. }
  120. @Test
  121. public void testGetOptionPermissioveValidator() throws Exception {
  122. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  123. assertEquals("true", provider.getOption("unit", "test", PERMISSIVE_VALIDATOR));
  124. }
  125. @Test
  126. public void testGetOptionFailingValidator() throws Exception {
  127. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  128. assertNull(provider.getOption("unit", "test", new NumericalValidator(0, 100)));
  129. }
  130. @Test
  131. public void testUnsetOption() throws Exception {
  132. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  133. provider.unsetOption("unit", "test");
  134. assertFalse(provider.hasOption("unit", "test", PERMISSIVE_VALIDATOR));
  135. }
  136. @Test
  137. public void testSetOptionBoolean() throws Exception {
  138. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  139. provider.setOption("new", "option", true);
  140. assertEquals("true", provider.getOption("new", "option", PERMISSIVE_VALIDATOR));
  141. }
  142. @Test
  143. public void testSetOptionInt() throws Exception {
  144. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  145. provider.setOption("new", "option", 1234);
  146. assertEquals("1234", provider.getOption("new", "option", PERMISSIVE_VALIDATOR));
  147. }
  148. @Test
  149. public void testSetOptionList() throws Exception {
  150. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  151. provider.setOption("new", "option", Lists.newArrayList("first", "second"));
  152. assertEquals("first\nsecond", provider.getOption("new", "option", PERMISSIVE_VALIDATOR));
  153. }
  154. @Test
  155. public void testSetOptionListWithSingleEntry() throws Exception {
  156. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  157. provider.setOption("new", "option", Lists.newArrayList("first"));
  158. assertEquals("first", provider.getOption("new", "option", PERMISSIVE_VALIDATOR));
  159. }
  160. @Test
  161. public void testSaveSimple() throws Exception {
  162. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  163. provider.setOption("newdomain", "test123", 47);
  164. provider.save();
  165. final ConfigFileBackedConfigProvider loaded = getProvider("simple-ircd");
  166. assertTrue(loaded.hasOptionInt("newdomain", "test123"));
  167. assertEquals(Integer.valueOf(47), loaded.getOptionInt("newdomain", "test123"));
  168. // Check old settings are preserved
  169. assertTrue(loaded.hasOptionString("unit", "test"));
  170. assertEquals(ConfigTarget.TYPE.IRCD, loaded.getTarget().getType());
  171. assertEquals("DMDircircd!", loaded.getTarget().getData());
  172. }
  173. @Test
  174. public void testFiresSettingChanged() throws Exception {
  175. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  176. provider.addListener(changeListener);
  177. provider.setOption("new", "option", "boo");
  178. verify(changeListener).configChanged("new", "option");
  179. }
  180. @Test
  181. public void testDoesNotFireSettingChangedIfValueIsSame() throws Exception {
  182. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  183. provider.setOption("new", "option", "boo");
  184. provider.addListener(changeListener);
  185. provider.setOption("new", "option", "boo");
  186. verify(changeListener, never()).configChanged(anyString(), anyString());
  187. }
  188. @Test
  189. public void testFiresSettingChangedWhenUnset() throws Exception {
  190. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  191. provider.setOption("new", "option", "boo");
  192. provider.addListener(changeListener);
  193. provider.unsetOption("new", "option");
  194. verify(changeListener).configChanged("new", "option");
  195. }
  196. @Test
  197. public void testDoesNotFireSettingChangedIfNonExistantOptionUnset() throws Exception {
  198. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  199. provider.addListener(changeListener);
  200. provider.unsetOption("new", "option");
  201. verify(changeListener, never()).configChanged(anyString(), anyString());
  202. }
  203. @Test
  204. public void testDoesNotFireSettingChangedIfRemoved() throws Exception {
  205. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  206. provider.addListener(changeListener);
  207. provider.removeListener(changeListener);
  208. provider.setOption("new", "option", "boo");
  209. verify(changeListener, never()).configChanged(anyString(), anyString());
  210. }
  211. @Test
  212. public void testReloadLoadsExtraSettings() throws Exception {
  213. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  214. copyFileAndReload(provider);
  215. assertTrue(provider.hasOption("more", "settings", PERMISSIVE_VALIDATOR));
  216. assertEquals("here", provider.getOption("more", "settings", PERMISSIVE_VALIDATOR));
  217. }
  218. @Test
  219. public void testReloadUnsetsMissingSettings() throws Exception {
  220. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  221. copyFileAndReload(provider);
  222. assertFalse(provider.hasOption("unit", "test", PERMISSIVE_VALIDATOR));
  223. }
  224. @Test
  225. public void testReloadFiresSettingChangedForChangedOptions() throws Exception {
  226. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  227. provider.addListener(changeListener);
  228. copyFileAndReload(provider);
  229. verify(changeListener).configChanged("meep", "moop");
  230. }
  231. @Test
  232. public void testReloadFiresSettingChangedForNewOptions() throws Exception {
  233. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  234. provider.addListener(changeListener);
  235. copyFileAndReload(provider);
  236. verify(changeListener).configChanged("more", "settings");
  237. verify(changeListener).configChanged("more", "because");
  238. verify(changeListener).configChanged("more", "are");
  239. verify(changeListener).configChanged("more", "fun");
  240. }
  241. @Test
  242. public void testReloadFiresSettingChangedForRemovedOptions() throws Exception {
  243. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  244. provider.addListener(changeListener);
  245. copyFileAndReload(provider);
  246. verify(changeListener).configChanged("unit", "test");
  247. }
  248. @Test
  249. public void testReloadDoesNotFireSettingChangedForUnchangedOptions() throws Exception {
  250. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  251. provider.addListener(changeListener);
  252. copyFileAndReload(provider);
  253. verify(changeListener, never()).configChanged("meep", "mop");
  254. }
  255. private void copyFileAndReload(final ConfigProvider provider)
  256. throws IOException, InvalidConfigFileException {
  257. Files.copy(jimFsRule.getPath("simple-ircd-extra"), jimFsRule.getPath("simple-ircd"),
  258. StandardCopyOption.REPLACE_EXISTING);
  259. provider.reload();
  260. }
  261. private ConfigFileBackedConfigProvider getProvider(final String file)
  262. throws IOException, InvalidIdentityFileException {
  263. return new ConfigFileBackedConfigProvider(identityManager, jimFsRule.getPath(file), false);
  264. }
  265. }