[ONOS-6986] Implement getGroups in GroupProgrammable

Change-Id: I9f25bddb6a8baad74e8e74abd44187a9c3f6520a
diff --git a/core/net/src/test/java/org/onosproject/net/group/impl/GroupManagerTest.java b/core/net/src/test/java/org/onosproject/net/group/impl/GroupManagerTest.java
index 2415eea..7135c49 100644
--- a/core/net/src/test/java/org/onosproject/net/group/impl/GroupManagerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/group/impl/GroupManagerTest.java
@@ -21,6 +21,7 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.onlab.junit.TestTools;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.MplsLabel;
 import org.onosproject.cfg.ComponentConfigAdapter;
@@ -28,11 +29,13 @@
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.DefaultApplicationId;
 import org.onosproject.core.GroupId;
+import org.onosproject.mastership.MastershipServiceAdapter;
 import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DefaultDevice;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.MastershipRole;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.device.DeviceServiceAdapter;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
@@ -67,6 +70,7 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
@@ -89,7 +93,7 @@
     private static final Device FOO_DEV =
             new DefaultDevice(FOO_PID, FOO_DID, Device.Type.SWITCH, "", "", "", "", null, ANNOTATIONS);
 
-    private GroupManager mgr;
+    private static GroupManager mgr;
     private GroupService groupService;
     private GroupProviderRegistry providerRegistry;
     private TestGroupListener internalListener = new TestGroupListener();
@@ -108,6 +112,7 @@
         mgr.deviceService = new TestDeviceService();
         mgr.cfgService = new ComponentConfigAdapter();
         mgr.store = new SimpleGroupStore();
+        mgr.mastershipService = new TestMastershipService();
         injectEventDispatcher(mgr, new TestEventDispatcher());
         providerRegistry = mgr;
 
@@ -302,6 +307,27 @@
         testRemoveGroup(FOO_DID);
     }
 
+    @Test
+    public void fallbackPoll() {
+        // Test Group creation before AUDIT process
+        testGroupCreationBeforeAudit(FOO_DID);
+        programmableTestCleanUp();
+
+        // Test audit with extraneous and missing groups
+        testAuditWithExtraneousMissingGroups(FOO_DID);
+
+        // Test audit with confirmed groups
+        Group createdGroup = testAuditWithConfirmedGroups(FOO_DID);
+        GroupDriverProvider fallback = (GroupDriverProvider) mgr.defaultProvider();
+
+        fallback.init(mgr.deviceService, fallback.groupProviderService, mgr.mastershipService, 1);
+
+        TestTools.assertAfter(2000, () -> {
+            Group e = mgr.getGroups(FOO_DID).iterator().next();
+            assertEquals("incorrect group", createdGroup, e);
+        });
+    }
+
     private void programmableTestCleanUp() {
         groupOperations.clear();
         lastDeviceIdProgrammable = null;
@@ -414,7 +440,7 @@
     }
 
     // Test AUDIT with confirmed groups
-    private void testAuditWithConfirmedGroups(DeviceId deviceId) {
+    private Group testAuditWithConfirmedGroups(DeviceId deviceId) {
         GroupKey key = new DefaultGroupKey("group1BeforeAudit".getBytes());
         Group createdGroup = groupService.getGroup(deviceId, key);
         createdGroup = new DefaultGroup(createdGroup.id(),
@@ -424,6 +450,7 @@
         List<Group> groupEntries = Collections.singletonList(createdGroup);
         providerService.pushGroupMetrics(deviceId, groupEntries);
         internalListener.validateEvent(Collections.singletonList(GroupEvent.Type.GROUP_ADDED));
+        return createdGroup;
     }
 
     // Test group add bucket operations
@@ -649,7 +676,7 @@
         internalListener.validateEvent(Collections.singletonList(GroupEvent.Type.GROUP_REMOVE_FAILED));
     }
 
-    private Group createSouthboundGroupEntry(GroupId gId,
+    private static Group createSouthboundGroupEntry(GroupId gId,
                                              List<PortNumber> ports,
                                              long referenceCount, DeviceId deviceId) {
         List<PortNumber> outPorts = new ArrayList<>();
@@ -749,6 +776,13 @@
         }
     }
 
+    private class TestMastershipService extends MastershipServiceAdapter {
+        @Override
+        public MastershipRole getLocalRole(DeviceId deviceId) {
+            return MastershipRole.MASTER;
+        }
+    }
+
     private class TestDriverManager extends DriverManager {
         TestDriverManager(DriverRegistry registry) {
             this.registry = registry;
@@ -766,6 +800,11 @@
             lastDeviceIdProgrammable = deviceId;
             groupOperations.addAll(groupOps.operations());
         }
+
+        @Override
+        public Collection<Group> getGroups() {
+            return ImmutableList.of(mgr.getGroups(FOO_DID).iterator().next());
+        }
     }
 
     public void validate(DeviceId expectedDeviceId,
@@ -783,5 +822,3 @@
         lastDeviceIdProgrammable = null;
     }
 }
-
-