Cleaning up intent tests setup/teardown to avoid cascading failures
with respect to binding ID generator.

Change-Id: Ia4778f16ff5a3ecb26062e7d7b2c36493081140d
diff --git a/core/api/src/test/java/org/onosproject/net/intent/AbstractIntentTest.java b/core/api/src/test/java/org/onosproject/net/intent/AbstractIntentTest.java
index c4e5f9f..2999da5 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/AbstractIntentTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/AbstractIntentTest.java
@@ -17,20 +17,20 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.onosproject.core.IdGenerator;
 
+/**
+ * Basis for all intent-related tests. It cleanly binds and unbinds a
+ * deterministic mock generator as part of set-up and tear-down.
+ */
 public abstract class AbstractIntentTest {
 
-    protected IdGenerator idGenerator = new MockIdGenerator();
-
     @Before
-    public void setUp() throws Exception {
-        Intent.unbindIdGenerator(idGenerator);
-        Intent.bindIdGenerator(idGenerator);
+    public void setUp() {
+        MockIdGenerator.cleanBind();
     }
 
     @After
     public void tearDown() {
-        Intent.unbindIdGenerator(idGenerator);
+        MockIdGenerator.unbind();
     }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/intent/IntentDataTest.java b/core/api/src/test/java/org/onosproject/net/intent/IntentDataTest.java
index de215c6..f7bb7a3 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/IntentDataTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/IntentDataTest.java
@@ -15,14 +15,12 @@
  */
 package org.onosproject.net.intent;
 
-import org.junit.After;
+import com.google.common.testing.EqualsTester;
 import org.junit.Before;
 import org.junit.Test;
 import org.onosproject.core.IdGenerator;
 import org.onosproject.store.Timestamp;
 
-import com.google.common.testing.EqualsTester;
-
 import static junit.framework.TestCase.assertFalse;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
@@ -33,7 +31,7 @@
 /**
  * Unit tests for intent data objects.
  */
-public class IntentDataTest {
+public class IntentDataTest extends AbstractIntentTest {
 
     private Timestamp timestamp1;
     private Timestamp timestamp2;
@@ -53,10 +51,8 @@
     IdGenerator idGenerator;
 
     @Before
-    public void setUpTest() {
-        idGenerator = new MockIdGenerator();
-        Intent.unbindIdGenerator(idGenerator);
-        Intent.bindIdGenerator(idGenerator);
+    public void setUp() {
+        super.setUp();
 
         timestamp1 = new MockTimestamp(1);
         timestamp2 = new MockTimestamp(2);
@@ -74,11 +70,6 @@
         data3Copy = new IntentData(intent3, IntentState.INSTALLED, timestamp3);
     }
 
-    @After
-    public void tearDownTest() {
-        Intent.unbindIdGenerator(idGenerator);
-    }
-
     /**
      * Checks that intent data objects are properly constructed.
      */
diff --git a/core/api/src/test/java/org/onosproject/net/intent/IntentServiceTest.java b/core/api/src/test/java/org/onosproject/net/intent/IntentServiceTest.java
index 1bafca8..2ae87fb 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/IntentServiceTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/IntentServiceTest.java
@@ -18,7 +18,6 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
-import org.onosproject.core.IdGenerator;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -32,7 +31,7 @@
 /**
  * Suite of tests for the intent service contract.
  */
-public class IntentServiceTest {
+public class IntentServiceTest extends AbstractIntentTest {
 
     public static final int IID = 123;
     public static final int INSTALLABLE_IID = 234;
@@ -41,20 +40,18 @@
 
     protected TestableIntentService service;
     protected TestListener listener = new TestListener();
-    protected IdGenerator idGenerator = new MockIdGenerator();
 
     @Before
     public void setUp() {
+        super.setUp();
         service = createIntentService();
         service.addListener(listener);
-        Intent.unbindIdGenerator(idGenerator);
-        Intent.bindIdGenerator(idGenerator);
     }
 
     @After
     public void tearDown() {
         service.removeListener(listener);
-        Intent.unbindIdGenerator(idGenerator);
+        super.tearDown();
     }
 
     /**
diff --git a/core/api/src/test/java/org/onosproject/net/intent/MockIdGenerator.java b/core/api/src/test/java/org/onosproject/net/intent/MockIdGenerator.java
index 2059cfc..ecf6cb7 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/MockIdGenerator.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/MockIdGenerator.java
@@ -22,18 +22,38 @@
 /**
  * Mock id generator for testing.
  */
-public class MockIdGenerator implements IdGenerator {
+public final class MockIdGenerator implements IdGenerator {
+
+    public static final MockIdGenerator INSTANCE = new MockIdGenerator();
 
     private static boolean generatorIsBound = false;
-    private static MockIdGenerator idGenerator;
-    public static void bindNewGenerator() {
+
+    // Ban public construction
+    private MockIdGenerator() {
+    }
+
+    /**
+     * Binds clean mock generator to the intent.
+     */
+    public static synchronized void cleanBind() {
+        INSTANCE.nextId = new AtomicLong(0);
         if (!generatorIsBound) {
             generatorIsBound = true;
-            idGenerator = new MockIdGenerator();
-            Intent.unbindIdGenerator(idGenerator);
-            Intent.bindIdGenerator(idGenerator);
+            Intent.unbindIdGenerator(INSTANCE);
+            Intent.bindIdGenerator(INSTANCE);
         }
     }
+
+    /**
+     * Unbinds mock generator from the intent.
+     */
+    public static synchronized void unbind() {
+        if (generatorIsBound) {
+            generatorIsBound = false;
+            Intent.unbindIdGenerator(INSTANCE);
+        }
+    }
+
     private AtomicLong nextId = new AtomicLong(0);
 
     @Override