diff --git a/internal/pkg/application/igmp_test.go b/internal/pkg/application/igmp_test.go
index 8f132bd..1c346aa 100644
--- a/internal/pkg/application/igmp_test.go
+++ b/internal/pkg/application/igmp_test.go
@@ -17,7 +17,9 @@
 
 import (
 	"context"
+	"errors"
 	"net"
+	"sync"
 	"testing"
 	"time"
 	"voltha-go-controller/internal/pkg/of"
@@ -443,46 +445,6 @@
 	}
 }
 
-//func TestIgmpv2QueryPacket(t *testing.T) {
-// 	type args struct {
-// 		mcip    net.IP
-// 		vlan    of.VlanType
-// 		selfip  net.IP
-// 		pbit    uint8
-// 		maxResp uint32
-// 	}
-// 	tests := []struct {
-// 		name    string
-// 		args    args
-// 		want    []byte
-// 		wantErr bool
-// 	}{
-// 		{
-// 			name: "IgmpReportv3Layer",
-// 			args: args{
-// 				vlan:    22,
-// 				selfip:  net.ParseIP("224.0.0.1"),
-// 				pbit:    0,
-// 				maxResp: 1,
-// 				mcip:    net.ParseIP("0.0.0.0"),
-// 			},
-// 			wantErr: true,
-// 		},
-// 	}
-// 	for _, tt := range tests {
-// 		t.Run(tt.name, func(t *testing.T) {
-// 			got, err := Igmpv2QueryPacket(tt.args.mcip, tt.args.vlan, tt.args.selfip, tt.args.pbit, tt.args.maxResp)
-// 			if (err != nil) != tt.wantErr {
-// 				t.Errorf("Igmpv2QueryPacket() error = %v, wantErr %v", err, tt.wantErr)
-// 				return
-// 			}
-// 			if !reflect.DeepEqual(got, tt.want) {
-// 				t.Errorf("Igmpv2QueryPacket() = %v, want %v", got, tt.want)
-// 			}
-// 		})
-// 	}
-// }
-
 func Test_getVersion(t *testing.T) {
 	type args struct {
 		ver string
@@ -552,3 +514,205 @@
 		})
 	}
 }
+
+func TestAddToPendingPool(t *testing.T) {
+	type args struct {
+		cntx     context.Context
+		device   string
+		groupKey string
+	}
+
+	group := &IgmpGroup{
+		GroupName:             "test_key",
+		GroupID:               uint32(256),
+		PendingGroupForDevice: make(map[string]time.Time),
+	}
+	tests := []struct {
+		name string
+		args args
+		want bool
+	}{
+		{
+			name: "AddToPendingPool_true",
+			args: args{
+				device:   "SDX6320031",
+				cntx:     context.Background(),
+				groupKey: "test_key",
+			},
+			want: true,
+		},
+		{
+			name: "AddToPendingPool_false",
+			args: args{
+				device:   "SDX6320031",
+				cntx:     context.Background(),
+				groupKey: "test_key",
+			},
+			want: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			switch tt.name {
+			case "AddToPendingPool_true":
+				va := GetApplication()
+				va.IgmpGroups.Store("test_key", group)
+				dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
+				db = dbintf
+				dbintf.EXPECT().PutIgmpGroup(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).Times(1)
+				if got := AddToPendingPool(tt.args.cntx, tt.args.device, tt.args.groupKey); got != tt.want {
+					t.Errorf("AddToPendingPool() = %v, want %v", got, tt.want)
+				}
+			case "AddToPendingPool_false":
+				va := GetApplication()
+				va.IgmpGroups.Store("test_key", group)
+				dbintf := mocks.NewMockDBIntf(gomock.NewController(t))
+				db = dbintf
+				dbintf.EXPECT().PutIgmpGroup(gomock.Any(), gomock.Any(), gomock.Any()).Return(errors.New("failed")).Times(1)
+				if got := AddToPendingPool(tt.args.cntx, tt.args.device, tt.args.groupKey); got != tt.want {
+					t.Errorf("AddToPendingPool() = %v, want %v", got, tt.want)
+				}
+			}
+		})
+	}
+}
+
+func TestGetMcastServiceForSubAlarm(t *testing.T) {
+	type args struct {
+		uniPort *VoltPort
+		mvp     *MvlanProfile
+	}
+	mvp := &MvlanProfile{
+		Name: "mvlan_test",
+	}
+	voltPort := &VoltPort{
+		Name:   "16777472",
+		Device: "SDX6320031",
+		ID:     16777472,
+		State:  PortStateUp,
+	}
+	voltServ := &VoltService{
+		VoltServiceOper: VoltServiceOper{
+			Device: "SDX6320031",
+		},
+		VoltServiceCfg: VoltServiceCfg{
+			IgmpEnabled:      true,
+			MvlanProfileName: "mvlan_test",
+			Name:             "SDX6320031-1_SDX6320031-1-4096-2310-4096-65",
+		},
+	}
+	voltPortVnets := make([]*VoltPortVnet, 0)
+	voltPortVnet := &VoltPortVnet{
+		Device:      "SDX6320031",
+		Port:        "16777472",
+		IgmpEnabled: true,
+		services:    sync.Map{},
+	}
+	tests := []struct {
+		name string
+		args args
+		want string
+	}{
+		{
+			name: "GetMcastServiceForSubAlarm",
+			args: args{
+				uniPort: voltPort,
+				mvp:     mvp,
+			},
+			want: "SDX6320031-1_SDX6320031-1-4096-2310-4096-65",
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			switch tt.name {
+			case "GetMcastServiceForSubAlarm":
+				va := GetApplication()
+				voltPortVnets = append(voltPortVnets, voltPortVnet)
+				voltPortVnet.services.Store("SDX6320031-1_SDX6320031-1-4096-2310-4096-65", voltServ)
+				va.VnetsByPort.Store("16777472", voltPortVnets)
+				if got := GetMcastServiceForSubAlarm(tt.args.uniPort, tt.args.mvp); got != tt.want {
+					t.Errorf("GetMcastServiceForSubAlarm() = %v, want %v", got, tt.want)
+				}
+			}
+		})
+	}
+}
+
+func TestSendQueryExpiredEventGroupSpecific(t *testing.T) {
+	type args struct {
+		portKey string
+		igd     *IgmpGroupDevice
+		igc     *IgmpGroupChannel
+	}
+	mvp := &MvlanProfile{
+		Name: "mvlan_test",
+	}
+	voltServ := &VoltService{
+		VoltServiceOper: VoltServiceOper{
+			Device: "SDX6320031",
+		},
+		VoltServiceCfg: VoltServiceCfg{
+			IgmpEnabled:      true,
+			MvlanProfileName: "mvlan_test",
+			Name:             "SDX6320031-1_SDX6320031-1-4096-2310-4096-65",
+		},
+	}
+	voltPortVnets := make([]*VoltPortVnet, 0)
+	voltPortVnet := &VoltPortVnet{
+		Device:      "SDX6320031",
+		Port:        "16777472",
+		IgmpEnabled: true,
+		services:    sync.Map{},
+	}
+	tests := []struct {
+		name string
+		args args
+	}{
+		{
+			name: "SendQueryExpiredEventGroupSpecific",
+			args: args{
+				portKey: "16777472",
+				igd: &IgmpGroupDevice{
+					Mvlan: of.VlanAny,
+				},
+				igc: &IgmpGroupChannel{},
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			va := GetApplication()
+			voltPortVnets = append(voltPortVnets, voltPortVnet)
+			voltPortVnet.services.Store("SDX6320031-1_SDX6320031-1-4096-2310-4096-65", voltServ)
+			va.VnetsByPort.Store("16777472", voltPortVnets)
+			va.MvlanProfilesByTag.Store(of.VlanAny, mvp)
+			SendQueryExpiredEventGroupSpecific(tt.args.portKey, tt.args.igd, tt.args.igc)
+		})
+	}
+}
+
+func TestVoltApplication_GetPonPortID(t *testing.T) {
+	type args struct {
+		device    string
+		uniPortID string
+	}
+	tests := []struct {
+		name string
+		args args
+		want uint32
+	}{
+		{
+			name: "RestoreIgmpGroupsFromDb",
+			args: args{},
+			want: uint32(255),
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			va := &VoltApplication{}
+			if got := va.GetPonPortID(tt.args.device, tt.args.uniPortID); got != tt.want {
+				t.Errorf("VoltApplication.GetPonPortID() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
