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

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