diff --git a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigLoader.java b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigLoader.java index 22f612aff0..1622df1a9c 100644 --- a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigLoader.java +++ b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigLoader.java @@ -41,8 +41,10 @@ import static org.slf4j.LoggerFactory.getLogger; @Component(immediate = true) public class ComponentConfigLoader { - private static final File CFG_FILE = new File("../config/component-cfg.json"); private static final int RETRY_DELAY = 5_000; // millis between retries + private static final String CFG_JSON = "../config/component-cfg.json"; + + static File cfgFile = new File(CFG_JSON); private final Logger log = getLogger(getClass()); @@ -78,15 +80,15 @@ public class ComponentConfigLoader { */ private void loadConfigs() { try { - if (CFG_FILE.exists()) { - root = (ObjectNode) new ObjectMapper().readTree(CFG_FILE); + if (cfgFile.exists()) { + root = (ObjectNode) new ObjectMapper().readTree(cfgFile); root.fieldNames().forEachRemaining(pendingComponents::add); - SharedExecutors.getTimer().schedule(loader, RETRY_DELAY, RETRY_DELAY); - log.info("Loaded initial component configuration from {}", CFG_FILE); + SharedExecutors.getTimer().schedule(loader, 0, RETRY_DELAY); + log.info("Loaded initial component configuration from {}", cfgFile); } } catch (Exception e) { log.warn("Unable to load initial component configuration from {}", - CFG_FILE, e); + cfgFile, e); } } /* diff --git a/core/net/src/test/java/org/onosproject/cfg/impl/ComponentConfigLoaderTest.java b/core/net/src/test/java/org/onosproject/cfg/impl/ComponentConfigLoaderTest.java new file mode 100644 index 0000000000..856092eab8 --- /dev/null +++ b/core/net/src/test/java/org/onosproject/cfg/impl/ComponentConfigLoaderTest.java @@ -0,0 +1,113 @@ +/* + * Copyright 2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onosproject.cfg.impl; + +import com.google.common.collect.ImmutableSet; +import com.google.common.io.Files; +import org.junit.Before; +import org.junit.Test; +import org.onosproject.cfg.ComponentConfigAdapter; + +import java.io.File; +import java.io.IOException; +import java.util.Set; + +import static com.google.common.io.ByteStreams.toByteArray; +import static com.google.common.io.Files.write; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.onlab.junit.TestTools.assertAfter; + +/** + * UnitTest for ComponentLoader. + */ +public class ComponentConfigLoaderTest { + + static final File TEST_DIR = Files.createTempDir(); + + private static final String FOO_COMPONENT = "fooComponent"; + + private ComponentConfigLoader loader; + + private TestConfigService service; + + /* + * Method to SetUp the test environment with test file, a config loader a service, + * and assign it to the loader.configService for the test. + */ + @Before + public void setUp() { + ComponentConfigLoader.cfgFile = new File(TEST_DIR, "test.json"); + loader = new ComponentConfigLoader(); + service = new TestConfigService(); + loader.configService = service; + } + + /* + * Tests that the component in the json receives the correct configuration. + */ + @Test + public void basics() throws IOException { + stageTestResource("basic.json"); + loader.activate(); + assertAfter(1_000, () -> assertEquals("incorrect component", FOO_COMPONENT, service.component)); + } + + /* + * Tests that the component is null if the file has a bad configuration format + * for which it yielded an exception. Can't test the exception because it happens + * in a different thread, + */ + @Test + public void badConfig() throws IOException { + stageTestResource("badConfig.json"); + loader.activate(); + assertAfter(1_000, () -> assertNull("incorrect component", service.component)); + + } + + /* + * Writes the necessary file for the tests in the temporary directory + */ + static void stageTestResource(String name) throws IOException { + byte[] bytes = toByteArray(ComponentConfigLoaderTest.class.getResourceAsStream(name)); + write(bytes, ComponentConfigLoader.cfgFile); + } + + /* + * Mockup class for the config service. + */ + private class TestConfigService extends ComponentConfigAdapter { + + private String component; + private String name; + private String value; + + @Override + public Set getComponentNames() { + return ImmutableSet.of(FOO_COMPONENT); + } + + @Override + public void setProperty(String componentName, String name, String value) { + this.component = componentName; + this.name = name; + this.value = value; + + } + } +} \ No newline at end of file diff --git a/core/net/src/test/resources/org/onosproject/cfg/impl/badConfig.json b/core/net/src/test/resources/org/onosproject/cfg/impl/badConfig.json new file mode 100644 index 0000000000..a76552e5d2 --- /dev/null +++ b/core/net/src/test/resources/org/onosproject/cfg/impl/badConfig.json @@ -0,0 +1,5 @@ +{ + "fooComponent": { + badconfig + } +} \ No newline at end of file diff --git a/core/net/src/test/resources/org/onosproject/cfg/impl/basic.json b/core/net/src/test/resources/org/onosproject/cfg/impl/basic.json new file mode 100644 index 0000000000..dd3292431d --- /dev/null +++ b/core/net/src/test/resources/org/onosproject/cfg/impl/basic.json @@ -0,0 +1,5 @@ +{ + "fooComponent": { + "testProperty": true + } +} \ No newline at end of file