Added test file
Change-Id: Ie1a24924c6fe6d9a522640c7155976524b755ee0
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 1622df1..74ba193 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,11 +41,12 @@
 @Component(immediate = true)
 public class ComponentConfigLoader {
 
-    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);
 
+    protected int retryDelay = 5_000; // millis between retries
+    protected int stopRetryTime = 60_000; // deadline in millis
+
     private final Logger log = getLogger(getClass());
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -53,17 +54,19 @@
 
     private ObjectNode root;
     private final Set<String> pendingComponents = Sets.newHashSet();
+    private long initialTimestamp;
 
+    // TimerTask object that calls the load configuration for each component
+    // in the pending components set and cancels itself if the set is empty or
+    // after a set period of time.
+    protected final TimerTask loader = new TimerTask() {
 
-    /* TimerTask object that calls the load configuration for each component in the
-    pending components set and cancels itself if the set is mpty.
-    */
-    private final TimerTask loader = new TimerTask() {
         @Override
         public void run() {
             ImmutableSet.copyOf(pendingComponents)
                     .forEach(k -> loadConfig(k, (ObjectNode) root.path(k)));
-            if (pendingComponents.isEmpty()) {
+            if (pendingComponents.isEmpty()
+                    || System.currentTimeMillis() - initialTimestamp >= stopRetryTime) {
                 this.cancel();
             }
         }
@@ -71,19 +74,20 @@
 
     @Activate
     protected void activate() {
+        initialTimestamp = System.currentTimeMillis();
         this.loadConfigs();
         log.info("Started");
     }
-    /* loads the configurations for each component from the file in
-    ../config/component-cfg.json, adds them to a set and schedules a task to try
-    and load them.
-    */
+
+    // Loads the configurations for each component from the file in
+    // ../config/component-cfg.json, adds them to a set and schedules a task
+    // to try and load them.
     private void loadConfigs() {
         try {
             if (cfgFile.exists()) {
                 root = (ObjectNode) new ObjectMapper().readTree(cfgFile);
                 root.fieldNames().forEachRemaining(pendingComponents::add);
-                SharedExecutors.getTimer().schedule(loader, 0, RETRY_DELAY);
+                SharedExecutors.getTimer().schedule(loader, 0, retryDelay);
                 log.info("Loaded initial component configuration from {}", cfgFile);
             }
         } catch (Exception e) {
@@ -91,10 +95,9 @@
                      cfgFile, e);
         }
     }
-    /*
-    * loads a configuration for a single component and removes it from the
-    * components set
-    */
+
+    // Loads a configuration for a single component and removes it from the
+    // components set.
     private void loadConfig(String component, ObjectNode config) {
         if (configService.getComponentNames().contains(component)) {
             config.fieldNames()
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
index 856092e..03e2184 100644
--- a/core/net/src/test/java/org/onosproject/cfg/impl/ComponentConfigLoaderTest.java
+++ b/core/net/src/test/java/org/onosproject/cfg/impl/ComponentConfigLoaderTest.java
@@ -24,12 +24,13 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.lang.reflect.Field;
 import java.util.Set;
+import java.util.TimerTask;
 
 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.junit.Assert.*;
 import static org.onlab.junit.TestTools.assertAfter;
 
 /**
@@ -55,6 +56,8 @@
         loader = new ComponentConfigLoader();
         service = new TestConfigService();
         loader.configService = service;
+        loader.retryDelay = 50;
+        loader.stopRetryTime = 200;
     }
 
     /*
@@ -70,13 +73,34 @@
     /*
      * 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,
+     * in a different thread.
      */
     @Test
     public void badConfig() throws IOException {
         stageTestResource("badConfig.json");
         loader.activate();
-        assertAfter(1_000, () -> assertNull("incorrect component", service.component));
+        assertAfter(1_000, () -> assertNull("incorrect configuration", service.component));
+
+    }
+
+    /*
+     * Tests that tasks stops itself after the stopRetryTime if the component was
+     * not loaded.
+     */
+    @Test
+    public void noComponentForConfig() throws IOException {
+        stageTestResource("badComponent.json");
+        loader.activate();
+        assertAfter(loader.stopRetryTime + loader.retryDelay, () -> {
+            try {
+                Field state = TimerTask.class.getDeclaredField("state");
+                state.setAccessible(true);
+                assertEquals("incorrect component", state.getInt(loader.loader), 3);
+            } catch (Exception e) {
+                e.printStackTrace();
+                fail();
+            }
+        });
 
     }
 
diff --git a/core/net/src/test/resources/org/onosproject/cfg/impl/badComponent.json b/core/net/src/test/resources/org/onosproject/cfg/impl/badComponent.json
new file mode 100644
index 0000000..5c0ac35
--- /dev/null
+++ b/core/net/src/test/resources/org/onosproject/cfg/impl/badComponent.json
@@ -0,0 +1,5 @@
+{
+  "org.onosproject.proxyarp.ProxyArp2": {
+    "testProperty": true
+  }
+}
\ No newline at end of file