Adding subscriber channel join, recv and jump test cases.
diff --git a/src/test/utils/Channels.py b/src/test/utils/Channels.py
index 90d4f3c..3c4ff45 100644
--- a/src/test/utils/Channels.py
+++ b/src/test/utils/Channels.py
@@ -29,8 +29,12 @@
         self.onos_ctrl = OnosCtrl('org.onosproject.igmp')
         self.onos_ctrl.activate()
 
-    def igmp_join(self, groups):
+    def igmp_load_ssm_config(self, groups):
         self.ssm_table_load(groups)
+
+    def igmp_join(self, groups, ssm_load = False):
+        if ssm_load:
+            self.igmp_load_ssm_config(groups)
         igmp = IGMPv3(type = IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30,
                       gaddr='224.0.1.1')
         for g in groups:
@@ -83,6 +87,9 @@
     def __init__(self, num, iface = 'veth0', iface_mcast = 'veth2', mcast_cb = None):
         self.num = num
         self.channels = self.generate(self.num)
+        self.group_channel_map = {}
+        for i in range(self.num):
+            self.group_channel_map[self.channels[i]] = i
         self.state = self.Stopped
         self.streams = None
         self.channel_states = {}
@@ -122,13 +129,16 @@
                 chan = 0
 
         if self.get_state(chan) == self.Joined:
-            return chan
+            return chan, 0
 
         groups = [self.channels[chan]]
+        #load the ssm table first
+        self.igmp_load_ssm_config(groups)
+        join_start = monotonic.monotonic()
         self.igmp_join(groups)
         self.set_state(chan, self.Joined)
         self.last_chan = chan
-        return chan
+        return chan, join_start
 
     def leave(self, chan):
         if chan is None:
@@ -170,14 +180,23 @@
             s_next = chan
         else:
             s_next = 0
+        if self.num - s_next < 2:
+            s_next = 0
         chan = random.randint(s_next, self.num)
         return self.join(chan)
 
     def gaddr(self, chan):
+        '''Return the group address for a channel'''
         if chan >= self.num:
             return None
         return self.channels[chan]
 
+    def caddr(self, group):
+        '''Return a channel given a group addr'''
+        if self.group_channel_map.has_key(group):
+            return self.group_channel_map[group]
+        return None
+
     def recv_cb(self, pkt):
         '''Default channel receive callback'''
         log.debug('Received packet from source %s, destination %s' %(pkt[IP].src, pkt[IP].dst))