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 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  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.DMDircMBassador;
  24. import com.dmdirc.interfaces.config.ConfigChangeListener;
  25. import com.dmdirc.interfaces.config.ConfigProvider;
  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 com.google.common.jimfs.Configuration;
  31. import com.google.common.jimfs.Jimfs;
  32. import java.io.IOException;
  33. import java.nio.file.FileSystem;
  34. import java.nio.file.Files;
  35. import java.nio.file.StandardCopyOption;
  36. import org.junit.Before;
  37. import org.junit.Test;
  38. import org.junit.runner.RunWith;
  39. import org.mockito.Mock;
  40. import org.mockito.runners.MockitoJUnitRunner;
  41. import static org.junit.Assert.assertEquals;
  42. import static org.junit.Assert.assertFalse;
  43. import static org.junit.Assert.assertNull;
  44. import static org.junit.Assert.assertTrue;
  45. import static org.mockito.Matchers.anyString;
  46. import static org.mockito.Mockito.never;
  47. import static org.mockito.Mockito.verify;
  48. @RunWith(MockitoJUnitRunner.class)
  49. public class ConfigFileBackedConfigProviderTest {
  50. private static final String[] FILES = {
  51. "simple-ircd", "simple-server", "profile-new", "profile-old", "profile-old-no-alts",
  52. "no-name", "no-target", "invalid-config-file", "simple-ircd-extra"
  53. };
  54. public static final PermissiveValidator<String> PERMISSIVE_VALIDATOR =
  55. new PermissiveValidator<>();
  56. @Mock private IdentityManager identityManager;
  57. @Mock private ConfigChangeListener changeListener;
  58. @Mock private DMDircMBassador eventBus;
  59. private FileSystem fs;
  60. @Before
  61. public void setUp() throws Exception {
  62. fs = Jimfs.newFileSystem(Configuration.unix());
  63. for (String file: FILES) {
  64. Files.copy(getClass().getResourceAsStream(file), fs.getPath(file));
  65. }
  66. }
  67. @Test(expected = InvalidIdentityFileException.class)
  68. public void testNoName() throws IOException, InvalidIdentityFileException {
  69. new ConfigFileBackedConfigProvider(identityManager, eventBus, fs.getPath("no-name"), false);
  70. }
  71. @Test(expected = InvalidIdentityFileException.class)
  72. public void testNoTarget() throws IOException, InvalidIdentityFileException {
  73. new ConfigFileBackedConfigProvider(identityManager, eventBus,fs.getPath("no-target"), false);
  74. }
  75. @Test(expected = InvalidIdentityFileException.class)
  76. public void testInvalidConfigFile() throws IOException, InvalidIdentityFileException {
  77. new ConfigFileBackedConfigProvider(identityManager, eventBus,
  78. fs.getPath("invalid-config-file"), false);
  79. }
  80. @Test
  81. public void testProfileSimple() throws IOException, InvalidIdentityFileException {
  82. final ConfigFileBackedConfigProvider provider = getProvider("profile-new");
  83. assertTrue(provider.isProfile());
  84. assertEquals("nick1\nnick2\nnick3", provider.getOption("profile", "nicknames"));
  85. assertEquals("ident", provider.getOption("profile", "ident"));
  86. assertEquals("Guy Incognito", provider.getOption("profile", "realname"));
  87. }
  88. @Test
  89. public void testProfileOldWithAltNicks() throws IOException, InvalidIdentityFileException {
  90. final ConfigFileBackedConfigProvider provider = getProvider("profile-old");
  91. assertTrue(provider.isProfile());
  92. assertEquals("nick1\nnick2\nnick3", provider.getOption("profile", "nicknames"));
  93. assertEquals("ident", provider.getOption("profile", "ident"));
  94. assertEquals("Guy Incognito", provider.getOption("profile", "realname"));
  95. assertFalse(provider.hasOptionString("profile", "nickname"));
  96. assertFalse(provider.hasOptionString("profile", "altnicknames"));
  97. }
  98. @Test
  99. public void testProfileOldWithNoAlts() throws IOException, InvalidIdentityFileException {
  100. final ConfigFileBackedConfigProvider provider = getProvider("profile-old-no-alts");
  101. assertTrue(provider.isProfile());
  102. assertEquals("nick1", provider.getOption("profile", "nicknames"));
  103. assertEquals("ident", provider.getOption("profile", "ident"));
  104. assertEquals("Guy Incognito", provider.getOption("profile", "realname"));
  105. assertFalse(provider.hasOptionString("profile", "nickname"));
  106. assertFalse(provider.hasOptionString("profile", "altnicknames"));
  107. }
  108. @Test
  109. public void testProfileNonProfileConfig() throws IOException, InvalidIdentityFileException {
  110. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  111. assertFalse(provider.isProfile());
  112. }
  113. @Test
  114. public void testReadsIrcdTarget() throws IOException, InvalidIdentityFileException {
  115. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  116. assertEquals(ConfigTarget.TYPE.IRCD, provider.getTarget().getType());
  117. assertEquals("DMDircircd!", provider.getTarget().getData());
  118. }
  119. @Test
  120. public void testReadsServerTarget() throws IOException, InvalidIdentityFileException {
  121. final ConfigFileBackedConfigProvider provider = getProvider("simple-server");
  122. assertEquals(ConfigTarget.TYPE.SERVER, provider.getTarget().getType());
  123. assertEquals("test123", provider.getTarget().getData());
  124. }
  125. @Test
  126. public void testSetsOrder() throws IOException, InvalidIdentityFileException {
  127. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  128. assertEquals(5000, provider.getTarget().getOrder());
  129. }
  130. @Test
  131. public void testHasOptionPermissiveValidator()
  132. throws IOException, InvalidIdentityFileException {
  133. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  134. assertTrue(provider.hasOption("unit", "test", PERMISSIVE_VALIDATOR));
  135. assertFalse(provider.hasOption("unit", "untest", PERMISSIVE_VALIDATOR));
  136. assertFalse(provider.hasOption("foo", "test", PERMISSIVE_VALIDATOR));
  137. }
  138. @Test
  139. public void testHasOptionFailingValidator() throws IOException, InvalidIdentityFileException {
  140. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  141. assertFalse(provider.hasOption("unit", "test", new NumericalValidator(0, 100)));
  142. }
  143. @Test
  144. public void testGetOptionPermissioveValidator()
  145. throws IOException, InvalidIdentityFileException {
  146. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  147. assertEquals("true", provider.getOption("unit", "test", PERMISSIVE_VALIDATOR));
  148. }
  149. @Test
  150. public void testGetOptionFailingValidator() throws IOException, InvalidIdentityFileException {
  151. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  152. assertNull(provider.getOption("unit", "test", new NumericalValidator(0, 100)));
  153. }
  154. @Test
  155. public void testUnsetOption() throws IOException, InvalidIdentityFileException {
  156. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  157. provider.unsetOption("unit", "test");
  158. assertFalse(provider.hasOption("unit", "test", PERMISSIVE_VALIDATOR));
  159. }
  160. @Test
  161. public void testSetOptionBoolean() throws IOException, InvalidIdentityFileException {
  162. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  163. provider.setOption("new", "option", true);
  164. assertEquals("true", provider.getOption("new", "option", PERMISSIVE_VALIDATOR));
  165. }
  166. @Test
  167. public void testSetOptionInt() throws IOException, InvalidIdentityFileException {
  168. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  169. provider.setOption("new", "option", 1234);
  170. assertEquals("1234", provider.getOption("new", "option", PERMISSIVE_VALIDATOR));
  171. }
  172. @Test
  173. public void testSetOptionList() throws IOException, InvalidIdentityFileException {
  174. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  175. provider.setOption("new", "option", Lists.newArrayList("first", "second"));
  176. assertEquals("first\nsecond", provider.getOption("new", "option", PERMISSIVE_VALIDATOR));
  177. }
  178. @Test
  179. public void testSetOptionListWithSingleEntry()
  180. throws IOException, InvalidIdentityFileException {
  181. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  182. provider.setOption("new", "option", Lists.newArrayList("first"));
  183. assertEquals("first", provider.getOption("new", "option", PERMISSIVE_VALIDATOR));
  184. }
  185. @Test
  186. public void testSaveSimple() throws IOException, InvalidIdentityFileException {
  187. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  188. provider.setOption("newdomain", "test123", 47);
  189. provider.save();
  190. final ConfigFileBackedConfigProvider loaded = getProvider("simple-ircd");
  191. assertTrue(loaded.hasOptionInt("newdomain", "test123"));
  192. assertEquals(Integer.valueOf(47), loaded.getOptionInt("newdomain", "test123"));
  193. // Check old settings are preserved
  194. assertTrue(loaded.hasOptionString("unit", "test"));
  195. assertEquals(ConfigTarget.TYPE.IRCD, loaded.getTarget().getType());
  196. assertEquals("DMDircircd!", loaded.getTarget().getData());
  197. }
  198. @Test
  199. public void testFiresSettingChanged() throws IOException, InvalidIdentityFileException {
  200. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  201. provider.addListener(changeListener);
  202. provider.setOption("new", "option", "boo");
  203. verify(changeListener).configChanged("new", "option");
  204. }
  205. @Test
  206. public void testDoesNotFireSettingChangedIfValueIsSame()
  207. throws IOException, InvalidIdentityFileException {
  208. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  209. provider.setOption("new", "option", "boo");
  210. provider.addListener(changeListener);
  211. provider.setOption("new", "option", "boo");
  212. verify(changeListener, never()).configChanged(anyString(), anyString());
  213. }
  214. @Test
  215. public void testFiresSettingChangedWhenUnset()
  216. throws IOException, InvalidIdentityFileException {
  217. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  218. provider.setOption("new", "option", "boo");
  219. provider.addListener(changeListener);
  220. provider.unsetOption("new", "option");
  221. verify(changeListener).configChanged("new", "option");
  222. }
  223. @Test
  224. public void testDoesNotFireSettingChangedIfNonExistantOptionUnset()
  225. throws IOException, InvalidIdentityFileException {
  226. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  227. provider.addListener(changeListener);
  228. provider.unsetOption("new", "option");
  229. verify(changeListener, never()).configChanged(anyString(), anyString());
  230. }
  231. @Test
  232. public void testDoesNotFireSettingChangedIfRemoved()
  233. throws IOException, InvalidIdentityFileException {
  234. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  235. provider.addListener(changeListener);
  236. provider.removeListener(changeListener);
  237. provider.setOption("new", "option", "boo");
  238. verify(changeListener, never()).configChanged(anyString(), anyString());
  239. }
  240. @Test
  241. public void testReloadLoadsExtraSettings()
  242. throws IOException, InvalidConfigFileException, InvalidIdentityFileException {
  243. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  244. copyFileAndReload(provider);
  245. assertTrue(provider.hasOption("more", "settings", PERMISSIVE_VALIDATOR));
  246. assertEquals("here", provider.getOption("more", "settings", PERMISSIVE_VALIDATOR));
  247. }
  248. @Test
  249. public void testReloadUnsetsMissingSettings()
  250. throws IOException, InvalidConfigFileException, InvalidIdentityFileException {
  251. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  252. copyFileAndReload(provider);
  253. assertFalse(provider.hasOption("unit", "test", PERMISSIVE_VALIDATOR));
  254. }
  255. @Test
  256. public void testReloadFiresSettingChangedForChangedOptions()
  257. throws IOException, InvalidConfigFileException, InvalidIdentityFileException {
  258. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  259. provider.addListener(changeListener);
  260. copyFileAndReload(provider);
  261. verify(changeListener).configChanged("meep", "moop");
  262. }
  263. @Test
  264. public void testReloadFiresSettingChangedForNewOptions()
  265. throws IOException, InvalidConfigFileException, InvalidIdentityFileException {
  266. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  267. provider.addListener(changeListener);
  268. copyFileAndReload(provider);
  269. verify(changeListener).configChanged("more", "settings");
  270. verify(changeListener).configChanged("more", "because");
  271. verify(changeListener).configChanged("more", "are");
  272. verify(changeListener).configChanged("more", "fun");
  273. }
  274. @Test
  275. public void testReloadFiresSettingChangedForRemovedOptions()
  276. throws IOException, InvalidConfigFileException, InvalidIdentityFileException {
  277. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  278. provider.addListener(changeListener);
  279. copyFileAndReload(provider);
  280. verify(changeListener).configChanged("unit", "test");
  281. }
  282. @Test
  283. public void testReloadDoesNotFireSettingChangedForUnchangedOptions()
  284. throws IOException, InvalidConfigFileException, InvalidIdentityFileException {
  285. final ConfigFileBackedConfigProvider provider = getProvider("simple-ircd");
  286. provider.addListener(changeListener);
  287. copyFileAndReload(provider);
  288. verify(changeListener, never()).configChanged("meep", "mop");
  289. }
  290. private void copyFileAndReload(final ConfigProvider provider)
  291. throws IOException, InvalidConfigFileException {
  292. Files.copy(fs.getPath("simple-ircd-extra"), fs.getPath("simple-ircd"),
  293. StandardCopyOption.REPLACE_EXISTING);
  294. provider.reload();
  295. }
  296. private ConfigFileBackedConfigProvider getProvider(final String file)
  297. throws IOException, InvalidIdentityFileException {
  298. return new ConfigFileBackedConfigProvider(identityManager, eventBus,
  299. fs.getPath(file), false);
  300. }
  301. }