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.

ConfigFileBackedConfigProviderTest.java 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  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.interfaces.config.ConfigChangeListener;
  24. import com.dmdirc.interfaces.config.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.Matchers.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 IOException, InvalidIdentityFileException {
  65. new ConfigFileBackedConfigProvider(identityManager,
  66. jimFsRule.getPath("no-name"), false);
  67. }
  68. @Test(expected = InvalidIdentityFileException.class)
  69. public void testNoTarget() throws IOException, InvalidIdentityFileException {
  70. new ConfigFileBackedConfigProvider(identityManager,
  71. jimFsRule.getPath("no-target"), false);
  72. }
  73. @Test(expected = InvalidIdentityFileException.class)
  74. public void testInvalidConfigFile() throws IOException, InvalidIdentityFileException {
  75. new ConfigFileBackedConfigProvider(identityManager,
  76. jimFsRule.getPath("invalid-config-file"), false);
  77. }
  78. @Test
  79. public void testProfileSimple() throws IOException, InvalidIdentityFileException {
  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 IOException, InvalidIdentityFileException {
  88. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  89. assertFalse(provider.isProfile());
  90. }
  91. @Test
  92. public void testReadsIrcdTarget() throws IOException, InvalidIdentityFileException {
  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 IOException, InvalidIdentityFileException {
  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 IOException, InvalidIdentityFileException {
  105. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  106. assertEquals(5000, provider.getTarget().getOrder());
  107. }
  108. @Test
  109. public void testHasOptionPermissiveValidator()
  110. throws IOException, InvalidIdentityFileException {
  111. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  112. assertTrue(provider.hasOption("unit", "test", PERMISSIVE_VALIDATOR));
  113. assertFalse(provider.hasOption("unit", "untest", PERMISSIVE_VALIDATOR));
  114. assertFalse(provider.hasOption("foo", "test", PERMISSIVE_VALIDATOR));
  115. }
  116. @Test
  117. public void testHasOptionFailingValidator() throws IOException, InvalidIdentityFileException {
  118. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  119. assertFalse(provider.hasOption("unit", "test", new NumericalValidator(0, 100)));
  120. }
  121. @Test
  122. public void testGetOptionPermissioveValidator()
  123. throws IOException, InvalidIdentityFileException {
  124. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  125. assertEquals("true", provider.getOption("unit", "test", PERMISSIVE_VALIDATOR));
  126. }
  127. @Test
  128. public void testGetOptionFailingValidator() throws IOException, InvalidIdentityFileException {
  129. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  130. assertNull(provider.getOption("unit", "test", new NumericalValidator(0, 100)));
  131. }
  132. @Test
  133. public void testUnsetOption() throws IOException, InvalidIdentityFileException {
  134. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  135. provider.unsetOption("unit", "test");
  136. assertFalse(provider.hasOption("unit", "test", PERMISSIVE_VALIDATOR));
  137. }
  138. @Test
  139. public void testSetOptionBoolean() throws IOException, InvalidIdentityFileException {
  140. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  141. provider.setOption("new", "option", true);
  142. assertEquals("true", provider.getOption("new", "option", PERMISSIVE_VALIDATOR));
  143. }
  144. @Test
  145. public void testSetOptionInt() throws IOException, InvalidIdentityFileException {
  146. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  147. provider.setOption("new", "option", 1234);
  148. assertEquals("1234", provider.getOption("new", "option", PERMISSIVE_VALIDATOR));
  149. }
  150. @Test
  151. public void testSetOptionList() throws IOException, InvalidIdentityFileException {
  152. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  153. provider.setOption("new", "option", Lists.newArrayList("first", "second"));
  154. assertEquals("first\nsecond", provider.getOption("new", "option", PERMISSIVE_VALIDATOR));
  155. }
  156. @Test
  157. public void testSetOptionListWithSingleEntry()
  158. throws IOException, InvalidIdentityFileException {
  159. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  160. provider.setOption("new", "option", Lists.newArrayList("first"));
  161. assertEquals("first", provider.getOption("new", "option", PERMISSIVE_VALIDATOR));
  162. }
  163. @Test
  164. public void testSaveSimple() throws IOException, InvalidIdentityFileException {
  165. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  166. provider.setOption("newdomain", "test123", 47);
  167. provider.save();
  168. final ConfigFileBackedConfigProvider loaded = getProvider("simple-ircd");
  169. assertTrue(loaded.hasOptionInt("newdomain", "test123"));
  170. assertEquals(Integer.valueOf(47), loaded.getOptionInt("newdomain", "test123"));
  171. // Check old settings are preserved
  172. assertTrue(loaded.hasOptionString("unit", "test"));
  173. assertEquals(ConfigTarget.TYPE.IRCD, loaded.getTarget().getType());
  174. assertEquals("DMDircircd!", loaded.getTarget().getData());
  175. }
  176. @Test
  177. public void testFiresSettingChanged() throws IOException, InvalidIdentityFileException {
  178. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  179. provider.addListener(changeListener);
  180. provider.setOption("new", "option", "boo");
  181. verify(changeListener).configChanged("new", "option");
  182. }
  183. @Test
  184. public void testDoesNotFireSettingChangedIfValueIsSame()
  185. throws IOException, InvalidIdentityFileException {
  186. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  187. provider.setOption("new", "option", "boo");
  188. provider.addListener(changeListener);
  189. provider.setOption("new", "option", "boo");
  190. verify(changeListener, never()).configChanged(anyString(), anyString());
  191. }
  192. @Test
  193. public void testFiresSettingChangedWhenUnset()
  194. throws IOException, InvalidIdentityFileException {
  195. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  196. provider.setOption("new", "option", "boo");
  197. provider.addListener(changeListener);
  198. provider.unsetOption("new", "option");
  199. verify(changeListener).configChanged("new", "option");
  200. }
  201. @Test
  202. public void testDoesNotFireSettingChangedIfNonExistantOptionUnset()
  203. throws IOException, InvalidIdentityFileException {
  204. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  205. provider.addListener(changeListener);
  206. provider.unsetOption("new", "option");
  207. verify(changeListener, never()).configChanged(anyString(), anyString());
  208. }
  209. @Test
  210. public void testDoesNotFireSettingChangedIfRemoved()
  211. throws IOException, InvalidIdentityFileException {
  212. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  213. provider.addListener(changeListener);
  214. provider.removeListener(changeListener);
  215. provider.setOption("new", "option", "boo");
  216. verify(changeListener, never()).configChanged(anyString(), anyString());
  217. }
  218. @Test
  219. public void testReloadLoadsExtraSettings()
  220. throws IOException, InvalidConfigFileException, InvalidIdentityFileException {
  221. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  222. copyFileAndReload(provider);
  223. assertTrue(provider.hasOption("more", "settings", PERMISSIVE_VALIDATOR));
  224. assertEquals("here", provider.getOption("more", "settings", PERMISSIVE_VALIDATOR));
  225. }
  226. @Test
  227. public void testReloadUnsetsMissingSettings()
  228. throws IOException, InvalidConfigFileException, InvalidIdentityFileException {
  229. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  230. copyFileAndReload(provider);
  231. assertFalse(provider.hasOption("unit", "test", PERMISSIVE_VALIDATOR));
  232. }
  233. @Test
  234. public void testReloadFiresSettingChangedForChangedOptions()
  235. throws IOException, InvalidConfigFileException, InvalidIdentityFileException {
  236. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  237. provider.addListener(changeListener);
  238. copyFileAndReload(provider);
  239. verify(changeListener).configChanged("meep", "moop");
  240. }
  241. @Test
  242. public void testReloadFiresSettingChangedForNewOptions()
  243. throws IOException, InvalidConfigFileException, InvalidIdentityFileException {
  244. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  245. provider.addListener(changeListener);
  246. copyFileAndReload(provider);
  247. verify(changeListener).configChanged("more", "settings");
  248. verify(changeListener).configChanged("more", "because");
  249. verify(changeListener).configChanged("more", "are");
  250. verify(changeListener).configChanged("more", "fun");
  251. }
  252. @Test
  253. public void testReloadFiresSettingChangedForRemovedOptions()
  254. throws IOException, InvalidConfigFileException, InvalidIdentityFileException {
  255. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  256. provider.addListener(changeListener);
  257. copyFileAndReload(provider);
  258. verify(changeListener).configChanged("unit", "test");
  259. }
  260. @Test
  261. public void testReloadDoesNotFireSettingChangedForUnchangedOptions()
  262. throws IOException, InvalidConfigFileException, InvalidIdentityFileException {
  263. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  264. provider.addListener(changeListener);
  265. copyFileAndReload(provider);
  266. verify(changeListener, never()).configChanged("meep", "mop");
  267. }
  268. private void copyFileAndReload(final ConfigProvider provider)
  269. throws IOException, InvalidConfigFileException {
  270. Files.copy(jimFsRule.getPath("simple-ircd-extra"), jimFsRule.getPath("simple-ircd"),
  271. StandardCopyOption.REPLACE_EXISTING);
  272. provider.reload();
  273. }
  274. private ConfigFileBackedConfigProvider getProvider(final String file)
  275. throws IOException, InvalidIdentityFileException {
  276. return new ConfigFileBackedConfigProvider(identityManager, jimFsRule.getPath(file), false);
  277. }
  278. }