FileConfigSubscription extends ConfigSubscription<T> { @Override public boolean nextConfig(long timeout) { if (!file.exists() && !file.isFile()) throw new IllegalArgumentException("Not a file: "+file); if (checkReloaded()) { log.log(FINE, "User forced config reload at " + System.currentTimeMillis()); setConfigIfChanged(updateConfig()); ConfigState<T> configState = getConfigState(); log.log(FINE, "Config updated at " + System.currentTimeMillis() + ", changed: " + configState.isConfigChanged()); log.log(FINE, "Config: " + configState.getConfig().toString()); return true; } if (file.lastModified()!=ts) { setConfigIncGen(updateConfig()); return true; } try { Thread.sleep(timeout); } catch (InterruptedException e) { throw new ConfigInterruptedException(e); } return false; } FileConfigSubscription(ConfigKey<T> key, ConfigSubscriber subscriber, File f); @Override boolean nextConfig(long timeout); @Override boolean subscribe(long timeout);  }
@Test public void require_that_new_config_is_detected_in_time() throws IOException, InterruptedException { writeConfig("intval", "23"); ConfigSubscriber subscriber = new ConfigSubscriber(new FileSource(TEST_TYPES_FILE)); ConfigSubscription<SimpletypesConfig> sub = new FileConfigSubscription<>( new ConfigKey<>(SimpletypesConfig.class, ""), subscriber, TEST_TYPES_FILE); assertTrue(sub.nextConfig(1000)); assertThat(sub.getConfigState().getConfig().intval(), is(23)); Thread.sleep(1000); writeConfig("intval", "33"); assertTrue(sub.nextConfig(1000)); assertThat(sub.getConfigState().getConfig().intval(), is(33)); }
@Test public void require_that_new_config_is_detected_on_reload() throws IOException { writeConfig("intval", "23"); ConfigSubscriber subscriber = new ConfigSubscriber(new FileSource(TEST_TYPES_FILE)); ConfigSubscription<SimpletypesConfig> sub = new FileConfigSubscription<>( new ConfigKey<>(SimpletypesConfig.class, ""), subscriber, TEST_TYPES_FILE); assertTrue(sub.nextConfig(1000)); assertThat(sub.getConfigState().getConfig().intval(), is(23)); writeConfig("intval", "33"); sub.reload(1); assertTrue(sub.nextConfig(1000)); ConfigSubscription.ConfigState<SimpletypesConfig> configState = sub.getConfigState(); assertThat(configState.getConfig().intval(), is(33)); assertTrue(configState.isConfigChanged()); assertTrue(configState.isGenerationChanged()); assertTrue(sub.isConfigChangedAndReset(7L)); assertSame(configState, sub.getConfigState()); assertTrue(configState.isConfigChanged()); assertTrue(configState.isGenerationChanged()); assertTrue(sub.isConfigChangedAndReset(1L)); assertNotSame(configState, sub.getConfigState()); configState = sub.getConfigState(); assertFalse(configState.isConfigChanged()); assertFalse(configState.isGenerationChanged()); sub.reload(2); assertTrue(sub.nextConfig(1000)); configState = sub.getConfigState(); assertThat(configState.getConfig().intval(), is(33)); assertFalse(configState.isConfigChanged()); assertTrue(configState.isGenerationChanged()); assertFalse(sub.isConfigChangedAndReset(2L)); assertNotSame(configState, sub.getConfigState()); configState = sub.getConfigState(); assertFalse(configState.isConfigChanged()); assertFalse(configState.isGenerationChanged()); }
@Test public void require_that_dir_config_id_reference_is_not_changed() { final String cfgDir = "src/test/resources/configs/foo"; final String cfgId = "dir:" + cfgDir; final ConfigKey<TestReferenceConfig> key = new ConfigKey<>(TestReferenceConfig.class, cfgId); ConfigSubscriber subscriber = new ConfigSubscriber(); ConfigSubscription<TestReferenceConfig> sub = ConfigSubscription.get(key, subscriber, new DirSource(new File(cfgDir)), new TimingValues()); assertTrue(sub.nextConfig(1000)); assertThat(sub.getConfigState().getConfig().configId(), is(cfgId)); }
@Test(expected = IllegalArgumentException.class) public void require_that_bad_file_throws_exception() throws IOException { writeConfig("intval", "23"); ConfigSubscriber subscriber = new ConfigSubscriber(new FileSource(TEST_TYPES_FILE)); ConfigSubscription<SimpletypesConfig> sub = new FileConfigSubscription<>( new ConfigKey<>(SimpletypesConfig.class, ""), subscriber, TEST_TYPES_FILE); sub.reload(1); Files.delete(TEST_TYPES_FILE.toPath()); sub.nextConfig(0); }