Move static method to non static method in `ApfTestHelpers`

This changes is for follow-up CL to support different apfjni version in the constructor.

Bug: 391118179
Test: atest NetworkStackTests
Change-Id: Idb7140f7f3f6fe9b40571db5e5cbceab03dde8cc
diff --git a/tests/unit/src/android/net/apf/ApfFilterTest.kt b/tests/unit/src/android/net/apf/ApfFilterTest.kt
index 42986c5..9dfc707 100644
--- a/tests/unit/src/android/net/apf/ApfFilterTest.kt
+++ b/tests/unit/src/android/net/apf/ApfFilterTest.kt
@@ -70,9 +70,6 @@
 import android.net.apf.ApfCounterTracker.Counter.PASSED_MLD
 import android.net.apf.ApfFilter.Dependencies
 import android.net.apf.ApfTestHelpers.Companion.TIMEOUT_MS
-import android.net.apf.ApfTestHelpers.Companion.consumeInstalledProgram
-import android.net.apf.ApfTestHelpers.Companion.consumeTransmittedPackets
-import android.net.apf.ApfTestHelpers.Companion.verifyProgramRun
 import android.net.apf.BaseApfGenerator.APF_VERSION_3
 import android.net.apf.BaseApfGenerator.APF_VERSION_6
 import android.net.nsd.NsdManager
@@ -274,9 +271,11 @@
     private val handler by lazy { Handler(handlerThread.looper) }
     private var writerSocket = FileDescriptor()
     private var igmpWriteSocket = FileDescriptor()
+    private lateinit var apfTestHelpers: ApfTestHelpers
 
     @Before
     fun setUp() {
+        apfTestHelpers = ApfTestHelpers()
         MockitoAnnotations.initMocks(this)
         // mock anycast6 address from /proc/net/anycast6
         doReturn(hostAnycast6Addresses).`when`(dependencies).getAnycast6Addresses(any())
@@ -328,7 +327,7 @@
         shutdownApfFilters()
         handler.waitForIdle(TIMEOUT_MS)
         Mockito.framework().clearInlineMocks()
-        ApfTestHelpers.resetTransmittedPacketMemory()
+        apfTestHelpers.resetTransmittedPacketMemory()
         handlerThread.quitSafely()
         handlerThread.join()
     }
@@ -386,7 +385,7 @@
     }
 
     private fun doTestEtherTypeAllowListFilter(apfFilter: ApfFilter) {
-        val program = consumeInstalledProgram(apfController, installCnt = 2)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
 
         // Using scapy to generate IPv4 mDNS packet:
         //   eth = Ether(src="E8:9F:80:66:60:BB", dst="01:00:5E:00:00:FB")
@@ -398,7 +397,7 @@
             01005e0000fbe89f806660bb080045000035000100004011d812c0a80101e00000f
             b14e914e900214d970000010000010000000000000161056c6f63616c00000c0001
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(mdnsPkt),
@@ -414,7 +413,7 @@
             333300000001e89f806660bb86dd6000000000103afffe800000000000000000000000
             000001ff0200000000000000000000000000018600600700080e100000000000000e10
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(raPkt),
@@ -424,7 +423,7 @@
         // Using scapy to generate ethernet packet with type 0x88A2:
         //  p = Ether(type=0x88A2)/Raw(load="01")
         val ethPkt = "ffffffffffff047bcb463fb588a23031"
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(ethPkt),
@@ -496,7 +495,7 @@
     fun testIPv4PacketFilterOnV6OnlyNetwork() {
         val apfFilter = getApfFilter()
         apfFilter.updateClatInterfaceState(true)
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
 
         // Using scapy to generate IPv4 mDNS packet:
         //   eth = Ether(src="E8:9F:80:66:60:BB", dst="01:00:5E:00:00:FB")
@@ -508,7 +507,7 @@
             01005e0000fbe89f806660bb080045000035000100004011d812c0a80101e00000f
             b14e914e900214d970000010000010000000000000161056c6f63616c00000c0001
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(mdnsPkt),
@@ -522,7 +521,7 @@
         val nonUdpPkt = """
             ffffffffffff00112233445508004500001400010000400cb934c0a80101ffffffff
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(nonUdpPkt),
@@ -536,7 +535,7 @@
         val fragmentUdpPkt = """
             ffffffffffff0011223344550800450000140001200a40119925c0a80101ffffffff
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(fragmentUdpPkt),
@@ -551,7 +550,7 @@
         val nonDhcpServerPkt = """
             ffffffffffff00112233445508004500001c000100004011b927c0a80101ffffffff0035004600083dba
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(nonDhcpServerPkt),
@@ -586,7 +585,7 @@
             0000000000000000000000000000000000000000000000000000638253633501023604c0
             a801010104ffffff000304c0a80101330400015180060408080808ff
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(dhcp4Pkt),
@@ -605,7 +604,7 @@
             0000000000000000000000000000000000000000000000000000638253633501023604c0
             a801010104ffffff000304c0a80101330400015180060408080808ff
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(dhcp4PktDf),
@@ -624,7 +623,7 @@
             01005e0000fbe89f806660bb08004500001d000100034011f75dc0a8010ac0a8
             01146f63616c00000c0001
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(fragmentedUdpPkt),
@@ -636,7 +635,7 @@
     fun testLoopbackFilter() {
         val apfConfig = getDefaultConfig()
         val apfFilter = getApfFilter(apfConfig)
-        val program = consumeInstalledProgram(apfController, installCnt = 2)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         // Using scapy to generate echo-ed broadcast packet:
         //   ether = Ether(src=${ifParams.macAddr}, dst='ff:ff:ff:ff:ff:ff')
         //   ip = IP(src='192.168.1.1', dst='255.255.255.255', proto=21)
@@ -644,7 +643,7 @@
         val nonDhcpBcastPkt = """
             ffffffffffff020304050607080045000014000100004015b92bc0a80101ffffffff
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
                 apfFilter.mApfVersionSupported,
                 program,
                 HexDump.hexStringToByteArray(nonDhcpBcastPkt),
@@ -656,7 +655,7 @@
     @Test
     fun testInvalidIgmpPacketDropped() {
         val apfFilter = getIgmpApfFilter()
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
         // Using scapy to generate invalid length IGMPv1 general query packet:
         //   ether = Ether(src='00:11:22:33:44:55', dst='01:00:5e:00:00:01')
         //   ip = IP(src='10.0.0.2', dst='224.0.0.1', len=24, proto=2)
@@ -666,7 +665,7 @@
             01005e00000100112233445508004500001800010000400290e00a000002e00000011100eeff010203040506
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(payloadLen10Pkt),
@@ -682,7 +681,7 @@
             01005e00000100112233445508004500001400010000400290e40a000002e00000011100eeff010203
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(payloadLen7Pkt),
@@ -699,7 +698,7 @@
             01005e00000300112233445508004500001c000100000102cfda0a000002e00000031100eeff00000000
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(pktWithWrongDst),
@@ -715,7 +714,7 @@
             01005e00000100112233445508004500001c000100000102cfdc0a000002e00000015100aeff00000000
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(pktWithWrongType),
@@ -727,7 +726,7 @@
     @Test
     fun testIgmpV1ReportDropped() {
         val apfFilter = getIgmpApfFilter()
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
         // Using scapy to generate IGMPv1 report packet:
         //   ether = Ether(src='00:11:22:33:44:55', dst='01:00:5e:7f:00:01')
         //   ip = IP(src='10.0.0.2', dst='239.0.0.1')
@@ -737,7 +736,7 @@
             01005e7f000100112233445508004500001c000100000102c0dc0a000002ef0000011200fefdef000001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(pkt),
@@ -749,7 +748,7 @@
     @Test
     fun testIgmpV1GeneralQueryPassed() {
         val apfFilter = getIgmpApfFilter()
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
         // Using scapy to generate IGMPv1 general query packet:
         //   ether = Ether(src='00:11:22:33:44:55', dst='01:00:5e:00:00:01')
         //   ip = IP(src='10.0.0.2', dst='224.0.0.1')
@@ -759,7 +758,7 @@
             01005e00000100112233445508004500001c000100000102cfdc0a000002e00000011100eeff00000000
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(pkt),
@@ -771,7 +770,7 @@
     @Test
     fun testIgmpV2ReportDropped() {
         val apfFilter = getIgmpApfFilter()
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
         // Using scapy to generate IGMPv2 report packet:
         //   ether = Ether(src='00:11:22:33:44:55', dst='01:00:5e:7f:00:01')
         //   ip = IP(src='10.0.0.2', dst='239.0.0.1')
@@ -781,7 +780,7 @@
             01005e7f000100112233445508004500001c000100000102c0dc0a000002ef0000011614fae9ef000001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(v2ReportPkt),
@@ -797,7 +796,7 @@
             01005e7f000100112233445508004500001c000100000102c0dc0a000002ef0000011714f9e9ef000001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(v2LeaveReportPkt),
@@ -809,7 +808,7 @@
     @Test
     fun testIgmpV2GeneralQueryReplied() {
         val apfFilter = getIgmpApfFilter()
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
         // Using scapy to generate IGMPv2 general query packet without router alert option:
         //   ether = Ether(src='00:11:22:33:44:55', dst='01:00:5e:00:00:01')
         //   ip = IP(src='10.0.0.2', dst='224.0.0.1')
@@ -819,7 +818,7 @@
             01005e00000100112233445508004500001c000100000102cfdc0a000002e00000011114eeeb00000000
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(pkt),
@@ -929,7 +928,7 @@
             """.replace("\\s+".toRegex(), "").trim().uppercase()
         )
 
-        val transmitPackets = ApfTestHelpers.getAllTransmittedPackets()
+        val transmitPackets = apfTestHelpers.getAllTransmittedPackets()
             .map { HexDump.toHexString(it).uppercase() }.toSet()
         assertEquals(igmpv2ReportPkts, transmitPackets)
     }
@@ -938,7 +937,7 @@
     @Test
     fun testIgmpV2GeneralQueryWithRouterAlertOptionReplied() {
         val apfFilter = getIgmpApfFilter()
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
         // Using scapy to generate IGMPv2 general query packet with router alert option:
         //   ether = Ether(src='00:11:22:33:44:55', dst='01:00:5e:00:00:01')
         //   ip = IP(src='10.0.0.2', dst='224.0.0.1', options=[IPOption_Router_Alert()])
@@ -949,7 +948,7 @@
             00000000
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(pkt),
@@ -1060,7 +1059,7 @@
             """.replace("\\s+".toRegex(), "").trim().uppercase()
         )
 
-        val transmitPackets = ApfTestHelpers.getAllTransmittedPackets()
+        val transmitPackets = apfTestHelpers.getAllTransmittedPackets()
             .map { HexDump.toHexString(it).uppercase() }.toSet()
         assertEquals(igmpv2ReportPkts, transmitPackets)
     }
@@ -1069,7 +1068,7 @@
     @Test
     fun testIgmpV2GroupSpecificQueryPassed() {
         val apfFilter = getIgmpApfFilter()
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
         // Using scapy to generate IGMPv2 group specific query packet without router alert option:
         //   ether = Ether(src='00:11:22:33:44:55', dst='01:00:5e:7f:00:01')
         //   ip = IP(src='10.0.0.2', dst='239.0.0.1')
@@ -1079,7 +1078,7 @@
             01005e7f000100112233445508004500001c000100000102c0dc0a000002ef0000011114ffe9ef000001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(pkt),
@@ -1091,7 +1090,7 @@
     @Test
     fun testIgmpV3ReportDropped() {
         val apfFilter = getIgmpApfFilter()
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
         // Using scapy to generate IGMPv3 report packet without router alert option:
         //   ether = Ether(src='00:11:22:33:44:55', dst='01:00:5e:00:00:16')
         //   ip = IP(src='10.0.0.2', dst='224.0.0.22')
@@ -1102,7 +1101,7 @@
             0102000000ef000001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(pkt),
@@ -1114,7 +1113,7 @@
     @Test
     fun testIgmpV3GeneralQueryReplied() {
         val apfFilter = getIgmpApfFilter()
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
         // Using scapy to generate IGMPv3 general query packet without router alert option:
         //   ether = Ether(src='00:11:22:33:44:55', dst='01:00:5e:00:00:01')
         //   ip = IP(src='10.0.0.2', dst='224.0.0.1')
@@ -1125,14 +1124,14 @@
             00000000
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(pkt),
             DROPPED_IGMP_V3_GENERAL_QUERY_REPLIED
         )
 
-        val transmittedIgmpv3Reports = consumeTransmittedPackets(1)
+        val transmittedIgmpv3Reports = apfTestHelpers.consumeTransmittedPackets(1)
 
         // ###[ Ethernet ]###
         //   dst       = 01:00:5e:00:00:16
@@ -1199,7 +1198,7 @@
     @Test
     fun testIgmpV3GeneralQueryWithRouterAlertOptionReplied() {
         val apfFilter = getIgmpApfFilter()
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
         // Using scapy to generate IGMPv3 general query packet with router alert option:
         //   ether = Ether(src='00:11:22:33:44:55', dst='01:00:5e:00:00:01')
         //   ip = IP(src='10.0.0.2', dst='224.0.0.1', options=[IPOption_Router_Alert()])
@@ -1210,14 +1209,14 @@
             000000000000000
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(pkt),
             DROPPED_IGMP_V3_GENERAL_QUERY_REPLIED
         )
 
-        val transmittedIgmpv3Reports = consumeTransmittedPackets(1)
+        val transmittedIgmpv3Reports = apfTestHelpers.consumeTransmittedPackets(1)
 
         // ###[ Ethernet ]###
         //   dst       = 01:00:5e:00:00:16
@@ -1284,7 +1283,7 @@
     @Test
     fun testIgmpV3GroupSpecificQueryPassed() {
         val apfFilter = getIgmpApfFilter()
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
         // Using scapy to generate IGMPv3 group specific query packet
         //   ether = Ether(src='00:11:22:33:44:55', dst='01:00:5e:7f:00:01')
         //   ip = IP(src='10.0.0.2', dst='239.0.0.1')
@@ -1295,7 +1294,7 @@
             00000000
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(pkt),
@@ -1307,7 +1306,7 @@
     @Test
     fun testIgmpV3GroupAndSourceSpecificQueryPassed() {
         val apfFilter = getIgmpApfFilter()
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
         // Using scapy to generate IGMPv3 group and source specific query packet
         //   ether = Ether(src='00:11:22:33:44:55', dst='01:00:5e:7f:00:01')
         //   ip = IP(src='10.0.0.2', dst='239.0.0.1')
@@ -1318,7 +1317,7 @@
             00000010a000001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(pkt),
@@ -1331,12 +1330,12 @@
         val apfConfig = getDefaultConfig()
         apfConfig.multicastFilter = true
         val apfFilter = getApfFilter(apfConfig)
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         val linkAddress = LinkAddress(InetAddress.getByAddress(hostIpv4Address), 24)
         val lp = LinkProperties()
         lp.addLinkAddress(linkAddress)
         apfFilter.setLinkProperties(lp)
-        val program = consumeInstalledProgram(apfController, installCnt = 1)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
 
         // Using scapy to generate DHCP4 offer packet:
         //   ether = Ether(src='00:11:22:33:44:55', dst='ff:ff:ff:ff:ff:ff')
@@ -1366,7 +1365,7 @@
             0000000000000000000000000000000000000000000000000000638253633501023604c0
             a801010104ffffff000304c0a80101330400015180060408080808ff
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(dhcp4Pkt),
@@ -1380,7 +1379,7 @@
         val nonDhcpMcastPkt = """
             ffffffffffff001122334455080045000014000100004015d929c0a80101e0000001
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(nonDhcpMcastPkt),
@@ -1394,7 +1393,7 @@
         val nonDhcpBcastPkt = """
             ffffffffffff001122334455080045000014000100004015b92bc0a80101ffffffff
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(nonDhcpBcastPkt),
@@ -1408,7 +1407,7 @@
         val nonDhcpNetBcastPkt = """
             ffffffffffff001122334455080045000014000100004015ae2cc0a801010a0000ff
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(nonDhcpNetBcastPkt),
@@ -1422,7 +1421,7 @@
         val nonDhcpUcastPkt = """
             020304050607001122334455080045000014000100004015f780c0a80101c0a80102
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(nonDhcpUcastPkt),
@@ -1436,7 +1435,7 @@
         val nonDhcpUcastL2BcastPkt = """
             ffffffffffff001122334455080045000014000100004015f780c0a80101c0a80102
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(nonDhcpUcastL2BcastPkt),
@@ -1447,9 +1446,9 @@
     @Test
     fun testArpFilterDropPktsOnV6OnlyNetwork() {
         val apfFilter = getApfFilter()
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         apfFilter.updateClatInterfaceState(true)
-        val program = consumeInstalledProgram(apfController, installCnt = 1)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
 
         // Drop ARP request packet when clat is enabled
         // Using scapy to generate ARP request packet:
@@ -1459,7 +1458,7 @@
         val arpPkt = """
             010203040506000102030405080600010800060400015c857e3c74e1c0a8012200000000000000000000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(arpPkt),
@@ -1490,9 +1489,9 @@
         apfConfig.multicastFilter = true
         apfConfig.ieee802_3Filter = true
         val apfFilter = getApfFilter(apfConfig)
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         apfFilter.addTcpKeepalivePacketFilter(1, parcel)
-        var program = consumeInstalledProgram(apfController, installCnt = 1)
+        var program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
 
         // Drop IPv4 keepalive ack
         // Using scapy to generate IPv4 TCP keepalive ack packet with seq + 1:
@@ -1504,7 +1503,7 @@
             01020304050600010203040508004500002800010000400666c50a0000060a000005d4313039499602d2
             7e916116501020004b4f0000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(keepaliveAckPkt),
@@ -1521,7 +1520,7 @@
             01020304050600010203040508004500002800010000400666c50a0000060a000005d431303949960336
             7e916115501020004aec0000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(nonKeepaliveAckPkt1),
@@ -1539,7 +1538,7 @@
             01020304050600010203040508004500003200010000400666bb0a0000060a000005d4313039499602d27
             e91611650102000372c000000010203040506070809
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(nonKeepaliveAckPkt2),
@@ -1556,7 +1555,7 @@
             01020304050600010203040508004500002800010000400666c40a0000070a0000055ba0ff987e91610c4
             2f697155010200066e60000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(otherSrcKeepaliveAck),
@@ -1565,15 +1564,15 @@
 
         // test IPv4 packets when TCP keepalive filter is removed
         apfFilter.removeKeepalivePacketFilter(1)
-        program = consumeInstalledProgram(apfController, installCnt = 1)
-        verifyProgramRun(
+        program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(keepaliveAckPkt),
             PASSED_IPV4_UNICAST
         )
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(otherSrcKeepaliveAck),
@@ -1600,9 +1599,9 @@
         apfConfig.multicastFilter = true
         apfConfig.ieee802_3Filter = true
         val apfFilter = getApfFilter(apfConfig)
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         apfFilter.addNattKeepalivePacketFilter(1, parcel)
-        val program = consumeInstalledProgram(apfController, installCnt = 1)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
 
         // Drop IPv4 keepalive response packet
         // Using scapy to generate IPv4 NAT-T keepalive ack packet with payload 0xff:
@@ -1614,7 +1613,7 @@
         val validNattPkt = """
             01020304050600010203040508004500001d00010000401166c50a0000060a000005119404000009d73cff
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(validNattPkt),
@@ -1631,7 +1630,7 @@
         val invalidNattPkt = """
             01020304050600010203040508004500001d00010000401166c50a0000060a000005119404000009d83cfe
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(invalidNattPkt),
@@ -1649,7 +1648,7 @@
             01020304050600010203040508004500002600010000401166bc0a0000060a000005119404000012c2120
             0010203040506070809
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(nonNattPkt),
@@ -1667,7 +1666,7 @@
             01020304050600010203040508004500002600010000401166bb0a0000070a000005119404000012c2110
             0010203040506070809
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(otherSrcNonNattPkt),
@@ -1678,7 +1677,7 @@
     @Test
     fun testIPv4TcpPort7Filter() {
         val apfFilter = getApfFilter()
-        val program = consumeInstalledProgram(apfController, installCnt = 2)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
 
         // Drop IPv4 TCP port 7 packet
         // Using scapy to generate IPv4 TCP port 7 packet:
@@ -1690,7 +1689,7 @@
             01020304050600010203040508004500002800010000400666c50a0000060a00000500140007000000000
             0000000500220007bbd0000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(tcpPort7Pkt),
@@ -1707,7 +1706,7 @@
             01020304050600010203040508004500002800012000400646c50a0000060a00000500140050000000000
             0000000500220007b740000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(initialFragmentTcpPkt),
@@ -1724,7 +1723,7 @@
             01020304050600010203040508004500002800012064400646610a0000060a00000500140050000000000
             0000000500220007b740000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(fragmentTcpPkt),
@@ -1737,14 +1736,14 @@
         val apfConfig = getDefaultConfig()
         apfConfig.multicastFilter = true
         val apfFilter = getApfFilter(apfConfig)
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         val lp = LinkProperties()
         for (addr in hostIpv6Addresses) {
             lp.addLinkAddress(LinkAddress(InetAddress.getByAddress(addr), 64))
         }
         apfFilter.setLinkProperties(lp)
         apfFilter.setDozeMode(true)
-        val program = consumeInstalledProgram(apfController, installCnt = 2)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         // Using scapy to generate non ICMPv6 sent to ff00::/8 (multicast prefix) packet:
         // eth = Ether(src="00:01:02:03:04:05", dst="01:02:03:04:05:06")
         // ip6 = IPv6(src="2001::200:1a:1122:3344", dst="ff00::1", nh=59)
@@ -1753,7 +1752,7 @@
             ffffffffffff00112233445586dd6000000000003b4020010000000000000200001a11223344ff00000
             0000000000000000000000000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(nonIcmpv6McastPkt),
@@ -1769,7 +1768,7 @@
             02030405060700010203040586dd6000000000083aff20010000000000000200001a11223344ff00000
             000000000000000000000000180001a3a00000000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(icmpv6EchoPkt),
@@ -1780,13 +1779,13 @@
     @Test
     fun testIPv6PacketFilter() {
         val apfFilter = getApfFilter()
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         val lp = LinkProperties()
         for (addr in hostIpv6Addresses) {
             lp.addLinkAddress(LinkAddress(InetAddress.getByAddress(addr), 64))
         }
         apfFilter.setLinkProperties(lp)
-        val program = consumeInstalledProgram(apfController, installCnt = 1)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
         // Using scapy to generate non ICMPv6 packet:
         // eth = Ether(src="00:01:02:03:04:05", dst="01:02:03:04:05:06")
         // ip6 = IPv6(src="2001::200:1a:1122:3344", dst="2001::200:1a:3344:1122", nh=59)
@@ -1795,7 +1794,7 @@
             ffffffffffff00112233445586dd6000000000003b4020010000000000000200001a112233442001000
             0000000000200001a33441122
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(nonIcmpv6Pkt),
@@ -1811,7 +1810,7 @@
             01020304050600010203040586dd6000000000183aff20010000000000000200001a11223344ff02000
             000000000000000000000000188007227a000000000000000000000000000000000000000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(icmpv6McastNaPkt),
@@ -1826,7 +1825,7 @@
             01020304050600010203040586dd600000000000004020010000000000000200001a112233442001000
             0000000000200001a33441122
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(ipv6WithHopByHopOptionPkt),
@@ -1837,7 +1836,7 @@
     @Test
     fun testArpFilterDropPktsNoIPv4() {
         val apfFilter = getApfFilter()
-        val program = consumeInstalledProgram(apfController, installCnt = 2)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
 
         // Drop ARP request packet with invalid hw type
         // Using scapy to generate ARP request packet with invalid hw type :
@@ -1847,7 +1846,7 @@
         val invalidHwTypePkt = """
             01020304050600010203040508060003080000040001c0a8012200000000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(invalidHwTypePkt),
@@ -1862,7 +1861,7 @@
         val invalidProtoTypePkt = """
             010203040506000102030405080600010014060000015c857e3c74e1000000000000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(invalidProtoTypePkt),
@@ -1879,7 +1878,7 @@
             0000000000000000c0a8012200000000000000000000000000000000000000000000
             0000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(invalidHwLenPkt),
@@ -1896,7 +1895,7 @@
             00000000000000000000000000000000000000000000000000000000000000000000
             000000000000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(invalidProtoLenPkt),
@@ -1911,7 +1910,7 @@
         val invalidOpPkt = """
             010203040506000102030405080600010800060400055c857e3c74e1c0a8012200000000000000000000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(invalidOpPkt),
@@ -1926,7 +1925,7 @@
         val noHostArpReplyPkt = """
             010203040506000102030405080600010800060400025c857e3c74e10000000000000000000000000000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(noHostArpReplyPkt),
@@ -1941,7 +1940,7 @@
         val garpReplyPkt = """
             ffffffffffff000102030405080600010800060400025c857e3c74e1c0a8012200000000000000000000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(garpReplyPkt),
@@ -1952,7 +1951,7 @@
     @Test
     fun testArpFilterPassPktsNoIPv4() {
         val apfFilter = getApfFilter()
-        val program = consumeInstalledProgram(apfController, installCnt = 2)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         // Pass non-broadcast ARP reply packet
         // Using scapy to generate unicast ARP reply packet:
         // eth = Ether(src="00:01:02:03:04:05", dst="01:02:03:04:05:06")
@@ -1961,7 +1960,7 @@
         val nonBcastArpReplyPkt = """
             010203040506000102030405080600010800060400025c857e3c74e10102030400000000000000000000
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(nonBcastArpReplyPkt),
@@ -1976,7 +1975,7 @@
         val arpRequestPkt = """
             ffffffffffff000102030405080600010800060400015c857e3c74e1c0a8012200000000000001020304
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(arpRequestPkt),
@@ -1987,12 +1986,12 @@
     @Test
     fun testArpFilterDropPktsWithIPv4() {
         val apfFilter = getApfFilter()
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         val linkAddress = LinkAddress(InetAddress.getByAddress(hostIpv4Address), 24)
         val lp = LinkProperties()
         lp.addLinkAddress(linkAddress)
         apfFilter.setLinkProperties(lp)
-        val program = consumeInstalledProgram(apfController, installCnt = 1)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
         // Drop ARP reply packet is not for the device
         // Using scapy to generate ARP reply packet not for the device:
         // eth = Ether(src="00:01:02:03:04:05", dst="FF:FF:FF:FF:FF:FF")
@@ -2001,7 +2000,7 @@
         val otherHostArpReplyPkt = """
             ffffffffffff000102030405080600010800060400025c857e3c74e1c0a8012200000000000001020304
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(otherHostArpReplyPkt),
@@ -2016,7 +2015,7 @@
         val otherHostArpRequestPkt = """
             ffffffffffff000102030405080600010800060400015c857e3c74e1c0a8012200000000000001020304
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(otherHostArpRequestPkt),
@@ -2027,12 +2026,12 @@
     @Test
     fun testArpFilterPassPktsWithIPv4() {
         val apfFilter = getApfFilter()
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         val linkAddress = LinkAddress(InetAddress.getByAddress(hostIpv4Address), 24)
         val lp = LinkProperties()
         lp.addLinkAddress(linkAddress)
         apfFilter.setLinkProperties(lp)
-        val program = consumeInstalledProgram(apfController, installCnt = 1)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
 
         // Using scapy to generate ARP broadcast reply packet:
         // eth = Ether(src="00:01:02:03:04:05", dst="FF:FF:FF:FF:FF:FF")
@@ -2041,7 +2040,7 @@
         val bcastArpReplyPkt = """
             ffffffffffff000102030405080600010800060400025c857e3c74e1c0a801220000000000000a000001
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             HexDump.hexStringToByteArray(bcastArpReplyPkt),
@@ -2054,12 +2053,12 @@
     @Test
     fun testArpTransmit() {
         val apfFilter = getApfFilter()
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         val linkAddress = LinkAddress(InetAddress.getByAddress(hostIpv4Address), 24)
         val lp = LinkProperties()
         lp.addLinkAddress(linkAddress)
         apfFilter.setLinkProperties(lp)
-        val program = consumeInstalledProgram(apfController, installCnt = 1)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
         val receivedArpPacketBuf = ArpPacket.buildArpPacket(
             arpBroadcastMacAddress,
             senderMacAddress,
@@ -2070,14 +2069,14 @@
         )
         val receivedArpPacket = ByteArray(ARP_ETHER_IPV4_LEN)
         receivedArpPacketBuf.get(receivedArpPacket)
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             receivedArpPacket,
             DROPPED_ARP_REQUEST_REPLIED
         )
 
-        val transmittedPackets = consumeTransmittedPackets(1)
+        val transmittedPackets = apfTestHelpers.consumeTransmittedPackets(1)
         val expectedArpReplyBuf = ArpPacket.buildArpPacket(
             senderMacAddress,
             apfFilter.mHardwareAddress,
@@ -2099,12 +2098,12 @@
         val apfConfig = getDefaultConfig()
         apfConfig.handleArpOffload = false
         val apfFilter = getApfFilter(apfConfig)
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         val linkAddress = LinkAddress(InetAddress.getByAddress(hostIpv4Address), 24)
         val lp = LinkProperties()
         lp.addLinkAddress(linkAddress)
         apfFilter.setLinkProperties(lp)
-        val program = consumeInstalledProgram(apfController, installCnt = 1)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
         val receivedArpPacketBuf = ArpPacket.buildArpPacket(
             arpBroadcastMacAddress,
             senderMacAddress,
@@ -2115,7 +2114,7 @@
         )
         val receivedArpPacket = ByteArray(ARP_ETHER_IPV4_LEN)
         receivedArpPacketBuf.get(receivedArpPacket)
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             receivedArpPacket,
@@ -2129,7 +2128,7 @@
         doReturn(listOf<ByteArray>()).`when`(dependencies).getAnycast6Addresses(any())
         val apfFilter = getApfFilter()
         // validate NS packet check when there is no IPv6 address
-        val program = consumeInstalledProgram(apfController, installCnt = 2)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         // Using scapy to generate IPv6 NS packet:
         // eth = Ether(src="00:01:02:03:04:05", dst="01:02:03:04:05:06")
         // ip6 = IPv6(src="2001::200:1a:1122:3344", dst="2001::200:1a:3344:1122", hlim=255)
@@ -2141,7 +2140,7 @@
             00000020010000000000000200001A33441122
         """.replace("\\s+".toRegex(), "").trim()
         // when there is no IPv6 addresses -> pass NS packet
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(nsPkt),
@@ -2153,7 +2152,7 @@
     @IgnoreUpTo(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
     fun testNsFilter() {
         val apfFilter = getApfFilter()
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         val lp = LinkProperties()
         for (addr in hostIpv6Addresses) {
             lp.addLinkAddress(LinkAddress(InetAddress.getByAddress(addr), 64))
@@ -2171,9 +2170,9 @@
         }
 
         apfFilter.setLinkProperties(lp)
-        consumeInstalledProgram(apfController, installCnt = 1)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
         apfFilter.updateClatInterfaceState(true)
-        val program = consumeInstalledProgram(apfController, installCnt = 1)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
 
         // validate Ethernet dst address check
         // Using scapy to generate IPv6 NS packet:
@@ -2188,7 +2187,7 @@
             000020010000000000000200001A334411220201000102030405
         """.replace("\\s+".toRegex(), "").trim()
         // invalid unicast ether dst -> pass
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(nonHostDstMacNsPkt),
@@ -2207,7 +2206,7 @@
             0000000020010000000000000200001A334411220201000102030405
         """.replace("\\s+".toRegex(), "").trim()
         // mcast dst mac is not one of solicited mcast mac derived from one of device's ip -> pass
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(nonMcastDstMacNsPkt),
@@ -2227,7 +2226,7 @@
         """.replace("\\s+".toRegex(), "").trim()
         // mcast dst mac is one of solicited mcast mac derived from one of device's ip
         // -> drop and replied
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(hostMcastDstMacNsPkt),
@@ -2246,7 +2245,7 @@
             00000000000200001A334411220101000102030405
         """.replace("\\s+".toRegex(), "").trim()
         // mcast dst mac is broadcast address -> drop and replied
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(broadcastNsPkt),
@@ -2267,7 +2266,7 @@
             00000020010000000000000200001A334411220101000102030405
         """.replace("\\s+".toRegex(), "").trim()
         // dst ip is one of device's ip -> drop and replied
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(validHostDstIpNsPkt),
@@ -2287,7 +2286,7 @@
             0101000102030405
         """.replace("\\s+".toRegex(), "").trim()
         // dst ip is device's anycast address -> drop and replied
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(validHostAnycastDstIpNsPkt),
@@ -2306,7 +2305,7 @@
             E30000000020010000000000000200001A334411220101000102030405
         """.replace("\\s+".toRegex(), "").trim()
         // unicast dst ip is not one of device's ip -> pass
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(nonHostUcastDstIpNsPkt),
@@ -2325,7 +2324,7 @@
             1C0000000020010000000000000200001A334411220101000102030405
         """.replace("\\s+".toRegex(), "").trim()
         // mcast dst ip is not one of solicited mcast ip derived from one of device's ip -> pass
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(nonHostMcastDstIpNsPkt),
@@ -2344,7 +2343,7 @@
                     "000020010000000000000200001A334411220101000102030405"
         // mcast dst ip is one of solicited mcast ip derived from one of device's ip
         //   -> drop and replied
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(hostMcastDstIpNsPkt),
@@ -2365,7 +2364,7 @@
             000200001A334411220101010203040506
         """.replace("\\s+".toRegex(), "").trim()
         // payload len < 24 -> drop
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(shortNsPkt),
@@ -2384,7 +2383,7 @@
             00000000000200001A444455550101010203040506
         """.replace("\\s+".toRegex(), "").trim()
         // target ip is not one of device's ip -> drop
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(otherHostNsPkt),
@@ -2403,7 +2402,7 @@
             00000020010000000000000200001A334411220101010203040506
         """.replace("\\s+".toRegex(), "").trim()
         // hoplimit is not 255 -> drop
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(invalidHoplimitNsPkt),
@@ -2422,7 +2421,7 @@
             00000020010000000000000200001A334411220101010203040506
         """.replace("\\s+".toRegex(), "").trim()
         // icmp6 code is not 0 -> drop
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(invalidIcmpCodeNsPkt),
@@ -2441,7 +2440,7 @@
             16CE0000000020010000000000000200001A123456780101010203040506
         """.replace("\\s+".toRegex(), "").trim()
         // target ip is one of tentative address -> pass
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(tentativeTargetIpNsPkt),
@@ -2460,7 +2459,7 @@
             00000020010000000000000200001C225566660101010203040506
         """.replace("\\s+".toRegex(), "").trim()
         // target ip is none of {non-tentative, anycast} -> drop
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(invalidTargetIpNsPkt),
@@ -2479,7 +2478,7 @@
             00001A334411220201020304050607
         """.replace("\\s+".toRegex(), "").trim()
         // DAD NS request -> pass
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(dadNsPkt),
@@ -2497,7 +2496,7 @@
             000000000200001A33441122
         """.replace("\\s+".toRegex(), "").trim()
         // payload len < 32 -> pass
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(noOptionNsPkt),
@@ -2516,7 +2515,7 @@
             000020010000000000000200001A334411220101010203040506
         """.replace("\\s+".toRegex(), "").trim()
         // non-DAD src IPv6 is FF::/8 -> drop
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(nonDadMcastSrcIpPkt),
@@ -2535,7 +2534,7 @@
             140000000020010000000000000200001A334411220101010203040506
         """.replace("\\s+".toRegex(), "").trim()
         // non-DAD src IPv6 is 00::/8 -> drop
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(nonDadLoopbackSrcIpPkt),
@@ -2556,7 +2555,7 @@
             05060101010203040506
         """.replace("\\s+".toRegex(), "").trim()
         // non-DAD with multiple options, SLLA in 2nd option -> pass
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(sllaNotFirstOptionNsPkt),
@@ -2575,7 +2574,7 @@
             20010000000000000200001A334411220201010203040506
         """.replace("\\s+".toRegex(), "").trim()
         // non-DAD with one option but not SLLA -> pass
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(noSllaOptionNsPkt),
@@ -2595,7 +2594,7 @@
             0506
         """.replace("\\s+".toRegex(), "").trim()
         // non-DAD, SLLA is multicast MAC -> drop
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(mcastMacSllaOptionNsPkt),
@@ -2614,7 +2613,7 @@
         }
 
         apfFilter.setLinkProperties(lp)
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
         val validIpv6Addresses = hostIpv6Addresses + hostAnycast6Addresses
         val expectPackets = mutableListOf<ByteArray>()
         for (addr in validIpv6Addresses) {
@@ -2627,7 +2626,7 @@
                 addr
             )
 
-            verifyProgramRun(
+            apfTestHelpers.verifyProgramRun(
                 apfFilter.mApfVersionSupported,
                 program,
                 receivedUcastNsPacket,
@@ -2659,7 +2658,7 @@
                 addr
             )
 
-            verifyProgramRun(
+            apfTestHelpers.verifyProgramRun(
                 apfFilter.mApfVersionSupported,
                 program,
                 receivedMcastNsPacket,
@@ -2677,7 +2676,7 @@
             expectPackets.add(expectedMcastNaPacket)
         }
 
-        val transmitPackets = consumeTransmittedPackets(expectPackets.size)
+        val transmitPackets = apfTestHelpers.consumeTransmittedPackets(expectPackets.size)
         for (i in transmitPackets.indices) {
             assertContentEquals(expectPackets[i], transmitPackets[i])
         }
@@ -2695,7 +2694,7 @@
             lp.addLinkAddress(LinkAddress(InetAddress.getByAddress(addr), 64))
         }
         apfFilter.setLinkProperties(lp)
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
         // Using scapy to generate IPv6 NS packet:
         // eth = Ether(src="00:01:02:03:04:05", dst="02:03:04:05:06:07")
         // ip6 = IPv6(src="2001::200:1a:1122:3344", dst="ff02::1:ff44:1122", hlim=255, tc=20)
@@ -2707,14 +2706,14 @@
             0200001A11223344FF0200000000000000000001FF4411228700952D0000
             000020010000000000000200001A334411220101000102030405
         """.replace("\\s+".toRegex(), "").trim()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(hostMcastDstIpNsPkt),
             DROPPED_IPV6_NS_REPLIED_NON_DAD
         )
 
-        val transmitPkts = consumeTransmittedPackets(1)
+        val transmitPkts = apfTestHelpers.consumeTransmittedPackets(1)
         // Using scapy to generate IPv6 NA packet:
         // eth = Ether(src="02:03:04:05:06:07", dst="00:01:02:03:04:05")
         // ip6 = IPv6(src="2001::200:1a:3344:1122", dst="2001::200:1a:1122:3344", hlim=255, tc=20)
@@ -2743,7 +2742,7 @@
         }
 
         apfFilter.setLinkProperties(lp)
-        val program = consumeInstalledProgram(apfController, installCnt = 3)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 3)
         val validIpv6Addresses = hostIpv6Addresses + hostAnycast6Addresses
         for (addr in validIpv6Addresses) {
             // unicast solicited NS request
@@ -2755,7 +2754,7 @@
                 addr
             )
 
-            verifyProgramRun(
+            apfTestHelpers.verifyProgramRun(
                 apfFilter.mApfVersionSupported,
                 program,
                 receivedUcastNsPacket,
@@ -2777,7 +2776,7 @@
                 addr
             )
 
-            verifyProgramRun(
+            apfTestHelpers.verifyProgramRun(
                 apfFilter.mApfVersionSupported,
                 program,
                 receivedMcastNsPacket,
@@ -2793,12 +2792,12 @@
         apfConfig.multicastFilter = enableMultiCastFilter
         apfConfig.handleIpv4PingOffload = true
         val apfFilter = getApfFilter(apfConfig)
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         val linkAddress = LinkAddress(InetAddress.getByAddress(hostIpv4Address), 24)
         val lp = LinkProperties()
         lp.addLinkAddress(linkAddress)
         apfFilter.setLinkProperties(lp)
-        val program = consumeInstalledProgram(apfController, installCnt = 1)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
         return Pair(apfFilter, program)
     }
 
@@ -2817,14 +2816,14 @@
             000010800b3b10001007b68656c6c6f
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(ipv4EchoRequestPkt),
             DROPPED_IPV4_PING_REQUEST_REPLIED
         )
 
-        val transmitPkt = consumeTransmittedPackets(1)[0]
+        val transmitPkt = apfTestHelpers.consumeTransmittedPackets(1)[0]
 
         // ###[ Ethernet ]###
         //   dst       = 01:02:03:04:05:06
@@ -2876,7 +2875,7 @@
             0000168656c6c6f
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(ipv4EchoRequestPkt),
@@ -2898,7 +2897,7 @@
             00001940400000800b3b10001007b68656c6c6f
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(ipv4EchoRequestPkt),
@@ -2920,7 +2919,7 @@
             0006f0800b3b10001007b68656c6c6f
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(ipv4EchoRequestPkt),
@@ -2942,7 +2941,7 @@
             000ff0800b3b10001007b68656c6c6f
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(ipv4EchoRequestPkt),
@@ -2964,7 +2963,7 @@
             000010000bbb10001007b68656c6c6f
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(ipv4EchoReplyPkt),
@@ -2978,7 +2977,7 @@
         val apfConfig = getDefaultConfig()
         apfConfig.handleMdnsOffload = true
         val apfFilter = getApfFilter(apfConfig)
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         val captor = ArgumentCaptor.forClass(OffloadEngine::class.java)
         verify(nsdManager).registerOffloadEngine(
             eq(ifParams.name),
@@ -3010,7 +3009,7 @@
         val apfConfig = getDefaultConfig()
         apfConfig.handleMdnsOffload = true
         val apfFilter = getApfFilter(apfConfig)
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         val captor = ArgumentCaptor.forClass(OffloadEngine::class.java)
         verify(nsdManager).registerOffloadEngine(
             eq(ifParams.name),
@@ -3031,7 +3030,7 @@
         visibleOnHandlerThread(handler) {
             offloadEngine.onOffloadServiceUpdated(castOffloadInfo)
         }
-        consumeInstalledProgram(apfController, installCnt = 1)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
         val corruptedOffloadInfo = OffloadServiceInfo(
             OffloadServiceInfo.Key("gambit", "_${"a".repeat(63)}._tcp"),
             listOf(),
@@ -3057,7 +3056,7 @@
             apfConfig.multicastFilter = true
         }
         val apfFilter = getApfFilter(apfConfig)
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         val captor = ArgumentCaptor.forClass(OffloadEngine::class.java)
         verify(nsdManager).registerOffloadEngine(
             eq(ifParams.name),
@@ -3070,7 +3069,7 @@
         val lp = LinkProperties()
         if (v6Only) {
             apfFilter.updateClatInterfaceState(true)
-            consumeInstalledProgram(apfController, installCnt = 1)
+            apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
         } else {
             val ipv4LinkAddress = LinkAddress(InetAddress.getByAddress(hostIpv4Address), 24)
             lp.addLinkAddress(ipv4LinkAddress)
@@ -3078,7 +3077,7 @@
         val ipv6LinkAddress = LinkAddress(hostLinkLocalIpv6Address, 64)
         lp.addLinkAddress(ipv6LinkAddress)
         apfFilter.setLinkProperties(lp)
-        consumeInstalledProgram(apfController, installCnt = 1)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
         val castOffloadInfo = OffloadServiceInfo(
             OffloadServiceInfo.Key("gambit-3cb56c6253638b3641e3d289013cc0ae", "_googlecast._tcp"),
             listOf(),
@@ -3103,7 +3102,7 @@
                 offloadEngine.onOffloadServiceRemoved(tvRemoteOffloadInfo)
             }
         }
-        val program = consumeInstalledProgram(
+        val program = apfTestHelpers.consumeInstalledProgram(
             apfController,
             installCnt = if (removeTvRemoteRecord) 3 else 2
         )
@@ -3126,14 +3125,14 @@
             617374045f746370056c6f63616c00000c0001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(castIPv4MdnsPtrQuery),
             DROPPED_MDNS_REPLIED
         )
 
-        var transmitPkt = consumeTransmittedPackets(1)[0]
+        var transmitPkt = apfTestHelpers.consumeTransmittedPackets(1)[0]
 
         // ###[ Ethernet ]###
         //   dst       = 01:00:5e:00:00:fb
@@ -3278,14 +3277,14 @@
             617374045f746370056c6f63616c00000c0001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(castIPv4MdnsTxtQuery),
             DROPPED_MDNS_REPLIED
         )
 
-        transmitPkt = consumeTransmittedPackets(1)[0]
+        transmitPkt = apfTestHelpers.consumeTransmittedPackets(1)[0]
 
         assertContentEquals(
             HexDump.hexStringToByteArray(expectedIPv4CastMdnsReply),
@@ -3304,14 +3303,14 @@
             747672656d6f746532045f746370056c6f63616c00000c0001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(tvRemoteIPv4MdnsPtrQuery),
             DROPPED_MDNS_REPLIED
         )
 
-        transmitPkt = consumeTransmittedPackets(1)[0]
+        transmitPkt = apfTestHelpers.consumeTransmittedPackets(1)[0]
 
         // ###[ Ethernet ]###
         //  dst       = 01:00:5e:00:00:fb
@@ -3451,7 +3450,7 @@
             045f746370056c6f63616c00000c0001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(airplayIPv4MdnsPtrQuery),
@@ -3470,7 +3469,7 @@
             747672656d6f746532045f746370056c6f63616c00000c0001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(tvRemoteIPv4MdnsPtrQuery),
@@ -3494,7 +3493,7 @@
             676c6563617374045f746370056c6f63616c00000c0001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(castIPv4MdnsPtrQueryWithOption),
@@ -3518,7 +3517,7 @@
             617374045f746370056c6f63616c00000c0001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(castIPv4MdnsPtrQuery),
@@ -3544,7 +3543,7 @@
             6f63616c00
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(tvRemoteIPv4MdnsPtrAnswer),
@@ -3566,7 +3565,7 @@
             000fb14e914e9000da73168656c6c6f
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(corruptedIPv4MdnsPkt),
@@ -3591,14 +3590,14 @@
             3616c00000c0001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(castIPv6MdnsPtrQuery),
             DROPPED_MDNS_REPLIED
         )
 
-        var transmitPkt = consumeTransmittedPackets(1)[0]
+        var transmitPkt = apfTestHelpers.consumeTransmittedPackets(1)[0]
 
         // ###[ Ethernet ]###
         //  dst       = 33:33:00:00:00:fb
@@ -3741,14 +3740,14 @@
             336432383930313363633061650b5f676f6f676c6563617374c01500100001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(castIPv6MdnsTxtQuery),
             DROPPED_MDNS_REPLIED
         )
 
-        transmitPkt = consumeTransmittedPackets(1)[0]
+        transmitPkt = apfTestHelpers.consumeTransmittedPackets(1)[0]
 
         assertContentEquals(
             HexDump.hexStringToByteArray(expectedIPv6CastMdnsReply),
@@ -3768,14 +3767,14 @@
             46370056c6f63616c00000c0001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(tvRemoteIPv6MdnsPtrQuery),
             DROPPED_MDNS_REPLIED
         )
 
-        transmitPkt = consumeTransmittedPackets(1)[0]
+        transmitPkt = apfTestHelpers.consumeTransmittedPackets(1)[0]
 
         // ###[ Ethernet ]###
         // dst       = 33:33:00:00:00:fb
@@ -3912,7 +3911,7 @@
             0000c0001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(airplayIPv6MdnsPtrQuery),
@@ -3932,7 +3931,7 @@
             46370056c6f63616c00000c0001
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(tvRemoteIPv6MdnsPtrQuery),
@@ -3958,7 +3957,7 @@
             726f6964747672656d6f746532045f746370056c6f63616c00
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(tvRemoteIPv6MdnsPtrAnswer),
@@ -3981,7 +3980,7 @@
             656c6c6f
         """.replace("\\s+".toRegex(), "").trim()
 
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             apfFilter.mApfVersionSupported,
             program,
             HexDump.hexStringToByteArray(corruptedIPv6MdnsPkt),
@@ -3992,13 +3991,13 @@
     @Test
     fun testApfProgramUpdate() {
         val apfFilter = getApfFilter()
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         // add IPv4 address, expect to have apf program update
         val lp = LinkProperties()
         val linkAddress = LinkAddress(InetAddress.getByAddress(hostIpv4Address), 24)
         lp.addLinkAddress(linkAddress)
         apfFilter.setLinkProperties(lp)
-        consumeInstalledProgram(apfController, installCnt = 1)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
 
         // add the same IPv4 address, expect to have no apf program update
         apfFilter.setLinkProperties(lp)
@@ -4010,7 +4009,7 @@
         }
 
         apfFilter.setLinkProperties(lp)
-        consumeInstalledProgram(apfController, installCnt = 1)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
 
         // add the same IPv6 addresses, expect to have no apf program update
         apfFilter.setLinkProperties(lp)
@@ -4029,7 +4028,7 @@
         }
 
         apfFilter.setLinkProperties(lp)
-        consumeInstalledProgram(apfController, installCnt = 1)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
 
         // add the same IPv6 addresses, expect to have no apf program update
         apfFilter.setLinkProperties(lp)
@@ -4047,13 +4046,13 @@
         val apfConfig = getDefaultConfig()
         apfConfig.handleIgmpOffload = true
         val apfFilter = getApfFilter(apfConfig)
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         val addr = InetAddress.getByName("239.0.0.1") as Inet4Address
         mcastAddrs.add(addr)
         doReturn(mcastAddrs).`when`(dependencies).getIPv4MulticastAddresses(any())
         val testPacket = HexDump.hexStringToByteArray("000000")
         Os.write(igmpWriteSocket, testPacket, 0, testPacket.size)
-        consumeInstalledProgram(apfController, installCnt = 1)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
 
         Os.write(igmpWriteSocket, testPacket, 0, testPacket.size)
         Thread.sleep(NO_CALLBACK_TIMEOUT_MS)
@@ -4062,7 +4061,7 @@
         mcastAddrs.remove(addr)
         doReturn(mcastAddrs).`when`(dependencies).getIPv4MulticastAddresses(any())
         Os.write(igmpWriteSocket, testPacket, 0, testPacket.size)
-        consumeInstalledProgram(apfController, installCnt = 1)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
     }
 
     @Test
@@ -4077,9 +4076,9 @@
     @Test
     fun testApfFilterResumeWillCleanUpTheApfMemoryRegion() {
         val apfFilter = getApfFilter()
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         apfFilter.resume()
-        val program = consumeInstalledProgram(apfController, installCnt = 1)
+        val program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
         assertContentEquals(ByteArray(4096) { 0 }, program)
     }
 
@@ -4095,7 +4094,7 @@
         )
         doReturn(mcastAddrs).`when`(dependencies).getIPv4MulticastAddresses(any())
         val apfFilter = getApfFilter()
-        consumeInstalledProgram(apfController, installCnt = 2)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 2)
         assertEquals(mcastAddrs.toSet(), apfFilter.mIPv4MulticastAddresses)
         assertEquals(mcastAddrsExcludeAllHost.toSet(), apfFilter.mIPv4McastAddrsExcludeAllHost)
 
@@ -4104,7 +4103,7 @@
         mcastAddrsExcludeAllHost.add(addr)
         doReturn(mcastAddrs).`when`(dependencies).getIPv4MulticastAddresses(any())
         apfFilter.updateIPv4MulticastAddrs()
-        consumeInstalledProgram(apfController, installCnt = 1)
+        apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
         assertEquals(mcastAddrs.toSet(), apfFilter.mIPv4MulticastAddresses)
         assertEquals(mcastAddrsExcludeAllHost.toSet(), apfFilter.mIPv4McastAddrsExcludeAllHost)
 
diff --git a/tests/unit/src/android/net/apf/ApfGeneratorTest.kt b/tests/unit/src/android/net/apf/ApfGeneratorTest.kt
index 96b4067..98ef45d 100644
--- a/tests/unit/src/android/net/apf/ApfGeneratorTest.kt
+++ b/tests/unit/src/android/net/apf/ApfGeneratorTest.kt
@@ -26,12 +26,7 @@
 import android.net.apf.ApfTestHelpers.Companion.DROP
 import android.net.apf.ApfTestHelpers.Companion.MIN_PKT_SIZE
 import android.net.apf.ApfTestHelpers.Companion.PASS
-import android.net.apf.ApfTestHelpers.Companion.assertDrop
-import android.net.apf.ApfTestHelpers.Companion.assertPass
-import android.net.apf.ApfTestHelpers.Companion.assertVerdict
-import android.net.apf.ApfTestHelpers.Companion.consumeTransmittedPackets
 import android.net.apf.ApfTestHelpers.Companion.decodeCountersIntoMap
-import android.net.apf.ApfTestHelpers.Companion.verifyProgramRun
 import android.net.apf.BaseApfGenerator.APF_VERSION_2
 import android.net.apf.BaseApfGenerator.APF_VERSION_3
 import android.net.apf.BaseApfGenerator.APF_VERSION_6
@@ -54,6 +49,7 @@
 import kotlin.test.assertEquals
 import kotlin.test.assertFailsWith
 import org.junit.After
+import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -76,10 +72,16 @@
     private val clampSize = 2048
 
     private val testPacket = byteArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)
+    private lateinit var apfTestHelpers: ApfTestHelpers
+
+    @Before
+    fun setUp() {
+        apfTestHelpers = ApfTestHelpers()
+    }
 
     @After
     fun tearDown() {
-        ApfTestHelpers.resetTransmittedPacketMemory()
+        apfTestHelpers.resetTransmittedPacketMemory()
     }
 
     @Test
@@ -442,7 +444,7 @@
         )
         assertContentEquals(
                 listOf("0: pass"),
-                ApfTestHelpers.disassembleApf(program).map { it.trim() }
+                apfTestHelpers.disassembleApf(program).map { it.trim() }
         )
 
         var gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
@@ -455,7 +457,7 @@
         )
         assertContentEquals(
                 listOf("0: drop"),
-                ApfTestHelpers.disassembleApf(program).map { it.trim() }
+                apfTestHelpers.disassembleApf(program).map { it.trim() }
         )
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
@@ -471,7 +473,7 @@
         )
         assertContentEquals(
                 listOf("0: pass        counter=129"),
-                ApfTestHelpers.disassembleApf(program).map { it.trim() }
+                apfTestHelpers.disassembleApf(program).map { it.trim() }
         )
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
@@ -488,7 +490,7 @@
         )
         assertContentEquals(
                 listOf("0: drop        counter=1000"),
-                ApfTestHelpers.disassembleApf(program).map { it.trim() }
+                apfTestHelpers.disassembleApf(program).map { it.trim() }
         )
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
@@ -504,7 +506,7 @@
         )
         assertContentEquals(
                 listOf("0: pass        counter=11"),
-                ApfTestHelpers.disassembleApf(program).map { it.trim() }
+                apfTestHelpers.disassembleApf(program).map { it.trim() }
         )
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
@@ -520,7 +522,7 @@
         )
         assertContentEquals(
                 listOf("0: drop        counter=46"),
-                ApfTestHelpers.disassembleApf(program).map { it.trim() }
+                apfTestHelpers.disassembleApf(program).map { it.trim() }
         )
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
@@ -543,7 +545,7 @@
         assertContentEquals(listOf(
                 "0: allocate    r0",
                 "2: allocate    1500"
-        ), ApfTestHelpers.disassembleApf(program).map { it.trim() })
+        ), apfTestHelpers.disassembleApf(program).map { it.trim() })
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
         gen.addTransmitWithoutChecksum()
@@ -559,7 +561,7 @@
         assertContentEquals(listOf(
                 "0: transmit    ip_ofs=255",
                 "4: transmitudp ip_ofs=30, csum_ofs=40, csum_start=50, partial_csum=0x0100",
-        ), ApfTestHelpers.disassembleApf(program).map { it.trim() })
+        ), apfTestHelpers.disassembleApf(program).map { it.trim() })
 
         val largeByteArray = ByteArray(256) { 0x01 }
         gen = ApfV6Generator(largeByteArray, APF_VERSION_6, ramSize, clampSize)
@@ -577,7 +579,7 @@
                         "0: data        256, " + "01".repeat(256),
                         "259: debugbuf    size=1533"
                 ),
-                ApfTestHelpers.disassembleApf(program).map { it.trim() }
+                apfTestHelpers.disassembleApf(program).map { it.trim() }
         )
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
@@ -619,7 +621,7 @@
                 "25: write       0x80000000",
                 "30: write       0xfffffffe",
                 "35: write       0xfffefdfc"
-        ), ApfTestHelpers.disassembleApf(program).map { it.trim() })
+        ), apfTestHelpers.disassembleApf(program).map { it.trim() })
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
         gen.addWriteU8(R0)
@@ -644,7 +646,7 @@
                 "6: ewrite1     r1",
                 "8: ewrite2     r1",
                 "10: ewrite4     r1"
-        ), ApfTestHelpers.disassembleApf(program).map { it.trim() })
+        ), apfTestHelpers.disassembleApf(program).map { it.trim() })
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
         gen.addDataCopy(0, 10)
@@ -661,7 +663,7 @@
                 "0: datacopy    src=0, len=10",
                 "2: datacopy    src=1, len=5",
                 "5: pktcopy     src=1000, len=255"
-        ), ApfTestHelpers.disassembleApf(program).map { it.trim() })
+        ), apfTestHelpers.disassembleApf(program).map { it.trim() })
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
         gen.addDataCopyFromR0(5)
@@ -680,7 +682,7 @@
                 "3: epktcopy     src=r0, len=5",
                 "6: edatacopy    src=r0, len=r1",
                 "8: epktcopy     src=r0, len=r1"
-        ), ApfTestHelpers.disassembleApf(program).map{ it.trim() })
+        ), apfTestHelpers.disassembleApf(program).map{ it.trim() })
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
         gen.addJumpIfBytesAtR0Equal(byteArrayOf('a'.code.toByte()), ApfV4Generator.DROP_LABEL)
@@ -693,7 +695,7 @@
         ), program)
         assertContentEquals(listOf(
                 "0: jbseq       r0, 0x1, DROP, 61"
-        ), ApfTestHelpers.disassembleApf(program).map{ it.trim() })
+        ), apfTestHelpers.disassembleApf(program).map{ it.trim() })
 
         val qnames = byteArrayOf(1, 'A'.code.toByte(), 1, 'B'.code.toByte(), 0, 0)
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
@@ -708,7 +710,7 @@
         assertContentEquals(listOf(
                 "0: jdnsqne     r0, DROP, 12, (1)A(1)B(0)(0)",
                 "10: jdnsqeq     r0, DROP, 12, (1)A(1)B(0)(0)"
-        ), ApfTestHelpers.disassembleApf(program).map{ it.trim() })
+        ), apfTestHelpers.disassembleApf(program).map{ it.trim() })
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
         gen.addJumpIfPktAtR0DoesNotContainDnsQSafe(qnames, 0x0c, ApfV4Generator.DROP_LABEL)
@@ -722,7 +724,7 @@
         assertContentEquals(listOf(
                 "0: jdnsqnesafe r0, DROP, 12, (1)A(1)B(0)(0)",
                 "10: jdnsqeqsafe r0, DROP, 12, (1)A(1)B(0)(0)"
-        ), ApfTestHelpers.disassembleApf(program).map{ it.trim() })
+        ), apfTestHelpers.disassembleApf(program).map{ it.trim() })
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
         gen.addJumpIfPktAtR0DoesNotContainDnsA(qnames, ApfV4Generator.DROP_LABEL)
@@ -736,7 +738,7 @@
         assertContentEquals(listOf(
                 "0: jdnsane     r0, DROP, (1)A(1)B(0)(0)",
                 "9: jdnsaeq     r0, DROP, (1)A(1)B(0)(0)"
-        ), ApfTestHelpers.disassembleApf(program).map{ it.trim() })
+        ), apfTestHelpers.disassembleApf(program).map{ it.trim() })
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
         gen.addJumpIfPktAtR0DoesNotContainDnsASafe(qnames, ApfV4Generator.DROP_LABEL)
@@ -750,7 +752,7 @@
         assertContentEquals(listOf(
                 "0: jdnsanesafe r0, DROP, (1)A(1)B(0)(0)",
                 "9: jdnsaeqsafe r0, DROP, (1)A(1)B(0)(0)"
-        ), ApfTestHelpers.disassembleApf(program).map{ it.trim() })
+        ), apfTestHelpers.disassembleApf(program).map{ it.trim() })
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
         gen.addJumpIfOneOf(R1, List(32) { (it + 1).toLong() }.toSet(), DROP_LABEL)
@@ -773,7 +775,7 @@
         assertContentEquals(listOf(
                 "0: joneof      r0, DROP, { 0, 128, 256, 65536 }",
                 "20: jnoneof     r1, DROP, { 0, 128, 256, 65536 }"
-        ), ApfTestHelpers.disassembleApf(program).map{ it.trim() })
+        ), apfTestHelpers.disassembleApf(program).map{ it.trim() })
 
         gen = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
         gen.addJumpIfBytesAtR0EqualsAnyOf(listOf(byteArrayOf(1, 2), byteArrayOf(3, 4)), DROP_LABEL)
@@ -792,7 +794,7 @@
                 "0: jbseq       r0, 0x2, DROP, { 0102, 0304 }",
                 "9: jbsne       r0, 0x2, DROP, { 0102, 0304 }",
                 "18: jbsne       r0, 0x2, DROP, 0101"
-        ), ApfTestHelpers.disassembleApf(program).map{ it.trim() })
+        ), apfTestHelpers.disassembleApf(program).map{ it.trim() })
     }
 
     @Test
@@ -812,8 +814,8 @@
                 .addWriteU32(R1)
                 .addTransmitWithoutChecksum()
                 .generate()
-        assertPass(APF_VERSION_6, program, ByteArray(MIN_PKT_SIZE))
-        val transmitPackets = consumeTransmittedPackets(1)
+        apfTestHelpers.assertPass(APF_VERSION_6, program, ByteArray(MIN_PKT_SIZE))
+        val transmitPackets = apfTestHelpers.consumeTransmittedPackets(1)
         assertContentEquals(
                 byteArrayOf(
                         0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xff.toByte(),
@@ -843,8 +845,8 @@
                 .addPacketCopyFromR0LenR1()
                 .addTransmitWithoutChecksum()
                 .generate()
-        assertPass(APF_VERSION_6, program, testPacket)
-        val transmitPackets = consumeTransmittedPackets(1)
+        apfTestHelpers.assertPass(APF_VERSION_6, program, testPacket)
+        val transmitPackets = apfTestHelpers.consumeTransmittedPackets(1)
         assertContentEquals(
                 byteArrayOf(33, 34, 35, 1, 2, 3, 4, 33, 34, 35, 1, 2, 3, 4),
                 transmitPackets[0]
@@ -870,9 +872,9 @@
                 "26: datacopy    src=9, len=3",
                 "29: datacopy    src=3, len=6",
                 "32: transmit    ip_ofs=255"
-        ), ApfTestHelpers.disassembleApf(program).map{ it.trim() })
-        assertPass(APF_VERSION_6, program, testPacket)
-        val transmitPackets = consumeTransmittedPackets(1)
+        ), apfTestHelpers.disassembleApf(program).map{ it.trim() })
+        apfTestHelpers.assertPass(APF_VERSION_6, program, testPacket)
+        val transmitPackets = apfTestHelpers.consumeTransmittedPackets(1)
         val transmitPkt = HexDump.toHexString(transmitPackets[0])
         assertEquals("112233445566223344778899112233445566", transmitPkt)
     }
@@ -902,9 +904,9 @@
             "277: datacopy    src=258, len=5",
             "281: datacopy    src=255, len=5",
             "284: transmit    ip_ofs=255"
-        ), ApfTestHelpers.disassembleApf(program).map{ it.trim() })
-        assertPass(APF_VERSION_6, program, testPacket)
-        val transmitPackets = consumeTransmittedPackets(1)
+        ), apfTestHelpers.disassembleApf(program).map{ it.trim() })
+        apfTestHelpers.assertPass(APF_VERSION_6, program, testPacket)
+        val transmitPackets = apfTestHelpers.consumeTransmittedPackets(1)
         val transmitPkt = HexDump.toHexString(transmitPackets[0])
         assertEquals(
             "01".repeat(290) + "02".repeat(5) + "01".repeat(3) + "02".repeat(2),
@@ -929,9 +931,9 @@
             "311: datacopy    src=3, len=255",
             "314: datacopy    src=258, len=45",
             "318: transmit    ip_ofs=255"
-        ), ApfTestHelpers.disassembleApf(program).map{ it.trim() })
-        assertPass(APF_VERSION_6, program, testPacket)
-        val transmitPackets = consumeTransmittedPackets(1)
+        ), apfTestHelpers.disassembleApf(program).map{ it.trim() })
+        apfTestHelpers.assertPass(APF_VERSION_6, program, testPacket)
+        val transmitPackets = apfTestHelpers.consumeTransmittedPackets(1)
         val transmitPkt = HexDump.toHexString(transmitPackets[0])
         assertEquals( "03".repeat(255) + "04".repeat(45), transmitPkt)
     }
@@ -942,17 +944,17 @@
                 .addDrop()
                 .addPass()
                 .generate()
-        assertDrop(APF_VERSION_6, program, testPacket)
+        apfTestHelpers.assertDrop(APF_VERSION_6, program, testPacket)
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addCountAndDrop(Counter.DROPPED_ETH_BROADCAST)
                 .generate()
-        verifyProgramRun(APF_VERSION_6, program, testPacket, DROPPED_ETH_BROADCAST)
+        apfTestHelpers.verifyProgramRun(APF_VERSION_6, program, testPacket, DROPPED_ETH_BROADCAST)
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addCountAndPass(Counter.PASSED_ARP_REQUEST)
                 .generate()
-        verifyProgramRun(APF_VERSION_6, program, testPacket, PASSED_ARP_REQUEST)
+        apfTestHelpers.verifyProgramRun(APF_VERSION_6, program, testPacket, PASSED_ARP_REQUEST)
     }
 
     @Test
@@ -976,7 +978,7 @@
                 .addPass()
                 .generate()
         var dataRegion = ByteArray(Counter.totalSize()) { 0 }
-        assertVerdict(APF_VERSION_6, PASS, program, testPacket, dataRegion)
+        apfTestHelpers.assertVerdict(APF_VERSION_6, PASS, program, testPacket, dataRegion)
         var counterMap = decodeCountersIntoMap(dataRegion)
         var expectedMap = getInitialMap()
         expectedMap[PASSED_ARP_REQUEST] = 2
@@ -1009,7 +1011,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
                 APF_VERSION_6,
                 program,
                 testPacket,
@@ -1023,7 +1025,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             testPacket,
@@ -1037,7 +1039,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
                 APF_VERSION_6,
                 program,
                 testPacket,
@@ -1051,7 +1053,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             testPacket,
@@ -1065,7 +1067,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
                 APF_VERSION_6,
                 program,
                 testPacket,
@@ -1079,7 +1081,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             testPacket,
@@ -1093,7 +1095,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
                 APF_VERSION_6,
                 program,
                 testPacket,
@@ -1107,7 +1109,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             testPacket,
@@ -1122,7 +1124,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
                 APF_VERSION_6,
                 program,
                 testPacket,
@@ -1137,7 +1139,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             testPacket,
@@ -1151,7 +1153,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
                 APF_VERSION_6,
                 program,
                 testPacket,
@@ -1165,7 +1167,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             testPacket,
@@ -1179,7 +1181,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
                 APF_VERSION_6,
                 program,
                 testPacket,
@@ -1193,7 +1195,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             testPacket,
@@ -1207,7 +1209,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
                 APF_VERSION_6,
                 program,
                 testPacket,
@@ -1221,7 +1223,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             testPacket,
@@ -1235,7 +1237,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
                 APF_VERSION_6,
                 program,
                 testPacket,
@@ -1249,7 +1251,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             testPacket,
@@ -1263,7 +1265,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
                 APF_VERSION_6,
                 program,
                 testPacket,
@@ -1277,7 +1279,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             testPacket,
@@ -1294,7 +1296,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
                 APF_VERSION_6,
                 program,
                 testPacket,
@@ -1311,7 +1313,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             testPacket,
@@ -1328,7 +1330,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
                 APF_VERSION_6,
                 program,
                 testPacket,
@@ -1345,7 +1347,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             testPacket,
@@ -1360,7 +1362,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
                 APF_VERSION_6,
                 program,
                 testPacket,
@@ -1375,7 +1377,7 @@
                 .addPass()
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
             APF_VERSION_6,
             program,
             testPacket,
@@ -1390,7 +1392,7 @@
                 .addCountAndDrop(Counter.DROPPED_ETH_BROADCAST)
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(
+        apfTestHelpers.verifyProgramRun(
                 APF_VERSION_6,
                 program,
                 testPacket,
@@ -1402,7 +1404,13 @@
                 .addCountAndPass(Counter.PASSED_ARP_REQUEST)
                 .addCountTrampoline()
                 .generate()
-        verifyProgramRun(APF_VERSION_6, program, testPacket, PASSED_ARP_REQUEST, incTotal = false)
+        apfTestHelpers.verifyProgramRun(
+            APF_VERSION_6,
+            program,
+            testPacket,
+            PASSED_ARP_REQUEST,
+            incTotal = false
+        )
     }
 
     @Test
@@ -1412,7 +1420,7 @@
                 .addCountTrampoline()
                 .generate()
         var dataRegion = ByteArray(Counter.totalSize()) { 0 }
-        assertVerdict(APF_VERSION_6, DROP, program, testPacket, dataRegion)
+        apfTestHelpers.assertVerdict(APF_VERSION_6, DROP, program, testPacket, dataRegion)
         assertContentEquals(ByteArray(Counter.totalSize()) { 0 }, dataRegion)
 
         program = ApfV4Generator(APF_VERSION_2, ramSize, clampSize)
@@ -1420,7 +1428,7 @@
                 .addCountTrampoline()
                 .generate()
         dataRegion = ByteArray(Counter.totalSize()) { 0 }
-        assertVerdict(APF_VERSION_6, PASS, program, testPacket, dataRegion)
+        apfTestHelpers.assertVerdict(APF_VERSION_6, PASS, program, testPacket, dataRegion)
         assertContentEquals(ByteArray(Counter.totalSize()) { 0 }, dataRegion)
     }
 
@@ -1431,7 +1439,7 @@
                 .addAllocate(65535)
                 .addDrop()
                 .generate()
-        verifyProgramRun(APF_VERSION_6, program, testPacket, PASSED_ALLOCATE_FAILURE)
+        apfTestHelpers.verifyProgramRun(APF_VERSION_6, program, testPacket, PASSED_ALLOCATE_FAILURE)
     }
 
     @Test
@@ -1444,7 +1452,7 @@
                 .addTransmitWithoutChecksum()
                 .addDrop()
                 .generate()
-        verifyProgramRun(APF_VERSION_6, program, testPacket, PASSED_TRANSMIT_FAILURE)
+        apfTestHelpers.verifyProgramRun(APF_VERSION_6, program, testPacket, PASSED_TRANSMIT_FAILURE)
     }
 
     @Test
@@ -1483,8 +1491,8 @@
                         true // isUdp
                 )
                 .generate()
-        assertPass(APF_VERSION_6, program, testPacket)
-        val transmitPackets = consumeTransmittedPackets(1)
+        apfTestHelpers.assertPass(APF_VERSION_6, program, testPacket)
+        val transmitPackets = apfTestHelpers.consumeTransmittedPackets(1)
         val txBuf = ByteBuffer.wrap(transmitPackets[0])
         Struct.parse(EthernetHeader::class.java, txBuf)
         val ipv4Hdr = Struct.parse(Ipv4Header::class.java, txBuf)
@@ -1524,28 +1532,28 @@
                 .addJumpIfPktAtR0ContainDnsQ(needlesMatch, 0x01, DROP_LABEL) // arg2=qtype
                 .addPass()
                 .generate()
-        assertDrop(APF_VERSION_6, program, udpPayload)
+        apfTestHelpers.assertDrop(APF_VERSION_6, program, udpPayload)
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addLoadImmediate(R0, 0)
                 .addJumpIfPktAtR0ContainDnsQSafe(needlesMatch, 0x01, DROP_LABEL)
                 .addPass()
                 .generate()
-        assertDrop(APF_VERSION_6, program, udpPayload)
+        apfTestHelpers.assertDrop(APF_VERSION_6, program, udpPayload)
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addLoadImmediate(R0, 0)
                 .addJumpIfPktAtR0DoesNotContainDnsQ(needlesMatch, 0x01, DROP_LABEL) // arg2=qtype
                 .addPass()
                 .generate()
-        assertPass(APF_VERSION_6, program, udpPayload)
+        apfTestHelpers.assertPass(APF_VERSION_6, program, udpPayload)
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addLoadImmediate(R0, 0)
                 .addJumpIfPktAtR0DoesNotContainDnsQSafe(needlesMatch, 0x01, DROP_LABEL) // arg2=qtype
                 .addPass()
                 .generate()
-        assertPass(APF_VERSION_6, program, udpPayload)
+        apfTestHelpers.assertPass(APF_VERSION_6, program, udpPayload)
 
         val badUdpPayload = intArrayOf(
                 0x00, 0x00, 0x00, 0x00, // tid = 0x00, flags = 0x00,
@@ -1567,14 +1575,26 @@
                 .addJumpIfPktAtR0ContainDnsQ(needlesMatch, 0x01, DROP_LABEL) // arg2=qtype
                 .addPass()
                 .generate()
-        verifyProgramRun(APF_VERSION_6, program, badUdpPayload, CORRUPT_DNS_PACKET, result = DROP)
+        apfTestHelpers.verifyProgramRun(
+            APF_VERSION_6,
+            program,
+            badUdpPayload,
+            CORRUPT_DNS_PACKET,
+            result = DROP
+        )
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addLoadImmediate(R0, 0)
                 .addJumpIfPktAtR0ContainDnsQSafe(needlesMatch, 0x01, DROP_LABEL) // arg2=qtype
                 .addPass()
                 .generate()
-        verifyProgramRun(APF_VERSION_6, program, badUdpPayload, CORRUPT_DNS_PACKET, result = PASS)
+        apfTestHelpers.verifyProgramRun(
+            APF_VERSION_6,
+            program,
+            badUdpPayload,
+            CORRUPT_DNS_PACKET,
+            result = PASS
+        )
     }
 
     @Test
@@ -1613,28 +1633,28 @@
                 .addJumpIfPktAtR0ContainDnsA(needlesMatch, DROP_LABEL)
                 .addPass()
                 .generate()
-        assertDrop(APF_VERSION_6, program, udpPayload)
+        apfTestHelpers.assertDrop(APF_VERSION_6, program, udpPayload)
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addLoadImmediate(R0, 0)
                 .addJumpIfPktAtR0ContainDnsASafe(needlesMatch, DROP_LABEL)
                 .addPass()
                 .generate()
-        assertDrop(APF_VERSION_6, program, udpPayload)
+        apfTestHelpers.assertDrop(APF_VERSION_6, program, udpPayload)
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addLoadImmediate(R0, 0)
                 .addJumpIfPktAtR0DoesNotContainDnsA(needlesMatch, DROP_LABEL)
                 .addPass()
                 .generate()
-        assertPass(APF_VERSION_6, program, udpPayload)
+        apfTestHelpers.assertPass(APF_VERSION_6, program, udpPayload)
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addLoadImmediate(R0, 0)
                 .addJumpIfPktAtR0DoesNotContainDnsASafe(needlesMatch, DROP_LABEL)
                 .addPass()
                 .generate()
-        assertPass(APF_VERSION_6, program, udpPayload)
+        apfTestHelpers.assertPass(APF_VERSION_6, program, udpPayload)
 
         val badUdpPayload = intArrayOf(
                 0x00, 0x00, 0x84, 0x00, // tid = 0x00, flags = 0x8400,
@@ -1660,14 +1680,26 @@
                 .addJumpIfPktAtR0ContainDnsA(needlesMatch, DROP_LABEL)
                 .addPass()
                 .generate()
-        verifyProgramRun(APF_VERSION_6, program, badUdpPayload, CORRUPT_DNS_PACKET, result = DROP)
+        apfTestHelpers.verifyProgramRun(
+            APF_VERSION_6,
+            program,
+            badUdpPayload,
+            CORRUPT_DNS_PACKET,
+            result = DROP
+        )
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addLoadImmediate(R0, 0)
                 .addJumpIfPktAtR0ContainDnsASafe(needlesMatch, DROP_LABEL)
                 .addPass()
                 .generate()
-        verifyProgramRun(APF_VERSION_6, program, badUdpPayload, CORRUPT_DNS_PACKET, result = PASS)
+        apfTestHelpers.verifyProgramRun(
+            APF_VERSION_6,
+            program,
+            badUdpPayload,
+            CORRUPT_DNS_PACKET,
+            result = PASS
+        )
     }
 
     @Test
@@ -1687,7 +1719,7 @@
                 )
                 .addPass()
                 .generate()
-        assertDrop(APF_VERSION_6, program, testPacket)
+        apfTestHelpers.assertDrop(APF_VERSION_6, program, testPacket)
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addLoadImmediate(R0, 2)
@@ -1697,7 +1729,7 @@
                 )
                 .addPass()
                 .generate()
-        assertPass(APF_VERSION_6, program, testPacket)
+        apfTestHelpers.assertPass(APF_VERSION_6, program, testPacket)
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addLoadImmediate(R0, 1)
@@ -1707,7 +1739,7 @@
                 )
                 .addPass()
                 .generate()
-        assertDrop(APF_VERSION_6, program, testPacket)
+        apfTestHelpers.assertDrop(APF_VERSION_6, program, testPacket)
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addLoadImmediate(R0, 0)
@@ -1717,7 +1749,7 @@
                 )
                 .addPass()
                 .generate()
-        assertPass(APF_VERSION_6, program, testPacket)
+        apfTestHelpers.assertPass(APF_VERSION_6, program, testPacket)
     }
 
     @Test
@@ -1727,28 +1759,28 @@
                 .addJumpIfOneOf(R0, setOf(1, 2, 3, 128, 255), DROP_LABEL)
                 .addPass()
                 .generate()
-        assertDrop(APF_VERSION_6, program, testPacket)
+        apfTestHelpers.assertDrop(APF_VERSION_6, program, testPacket)
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addLoadImmediate(R0, 254)
                 .addJumpIfOneOf(R0, setOf(1, 2, 3, 128, 255), DROP_LABEL)
                 .addPass()
                 .generate()
-        assertPass(APF_VERSION_6, program, testPacket)
+        apfTestHelpers.assertPass(APF_VERSION_6, program, testPacket)
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addLoadImmediate(R0, 254)
                 .addJumpIfNoneOf(R0, setOf(1, 2, 3, 128, 255), DROP_LABEL)
                 .addPass()
                 .generate()
-        assertDrop(APF_VERSION_6, program, testPacket)
+        apfTestHelpers.assertDrop(APF_VERSION_6, program, testPacket)
 
         program = ApfV6Generator(APF_VERSION_6, ramSize, clampSize)
                 .addLoadImmediate(R0, 255)
                 .addJumpIfNoneOf(R0, setOf(1, 2, 3, 128, 255), DROP_LABEL)
                 .addPass()
                 .generate()
-        assertPass(APF_VERSION_6, program, testPacket)
+        apfTestHelpers.assertPass(APF_VERSION_6, program, testPacket)
     }
 
     @Test
@@ -1758,7 +1790,7 @@
                 .generate()
         val dataRegion = ByteArray(ramSize - program.size) { 0 }
 
-        assertVerdict(APF_VERSION_6, PASS, program, testPacket, dataRegion)
+        apfTestHelpers.assertVerdict(APF_VERSION_6, PASS, program, testPacket, dataRegion)
         // offset 3 in the data region should contain if the interpreter is APFv6 mode or not
         assertEquals(1, dataRegion[3])
     }
diff --git a/tests/unit/src/android/net/apf/ApfStandaloneTest.kt b/tests/unit/src/android/net/apf/ApfStandaloneTest.kt
index 2a918f8..b47eac6 100644
--- a/tests/unit/src/android/net/apf/ApfStandaloneTest.kt
+++ b/tests/unit/src/android/net/apf/ApfStandaloneTest.kt
@@ -38,6 +38,7 @@
 import com.android.net.module.util.NetworkStackConstants.ICMPV6_ROUTER_SOLICITATION
 import com.android.testutils.DevSdkIgnoreRunner
 import kotlin.test.assertEquals
+import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -56,6 +57,12 @@
     private val etherTypeDenyList = listOf(0x88A2, 0x88A4, 0x88B8, 0x88CD, 0x88E1, 0x88E3)
     private val ramSize = 1024
     private val clampSize = 1024
+    private lateinit var apfTestHelpers: ApfTestHelpers
+
+    @Before
+    fun setUp() {
+        apfTestHelpers = ApfTestHelpers()
+    }
 
     fun runApfTest(isSuspendMode: Boolean) {
         val program = generateApfV4Program(isSuspendMode)
@@ -78,7 +85,7 @@
         val packetBadEtherType =
                 HexDump.hexStringToByteArray("ffffffffffff047bcb463fb588a201")
         val dataRegion = ByteArray(Counter.totalSize()) { 0 }
-        ApfTestHelpers.assertVerdict(
+        apfTestHelpers.assertVerdict(
             APF_VERSION_4,
             ApfTestHelpers.DROP,
             program,
@@ -154,7 +161,7 @@
             c0a801013204c0a80164ff
         """.replace("\\s+".toRegex(), "").trim()
         val dhcpRequestPkt = HexDump.hexStringToByteArray(dhcpRequestPktRawBytes)
-        ApfTestHelpers.assertVerdict(
+        apfTestHelpers.assertVerdict(
             APF_VERSION_4,
             ApfTestHelpers.DROP,
             program,
@@ -195,7 +202,7 @@
             0000000000000000000000028500c81d00000000
         """.replace("\\s+".toRegex(), "").trim()
         val rsPkt = HexDump.hexStringToByteArray(rsPktRawBytes)
-        ApfTestHelpers.assertVerdict(APF_VERSION_4, ApfTestHelpers.DROP, program, rsPkt, dataRegion)
+        apfTestHelpers.assertVerdict(APF_VERSION_4, ApfTestHelpers.DROP, program, rsPkt, dataRegion)
         assertEquals(mapOf<Counter, Long>(
                 Counter.TOTAL_PACKETS to 3,
                 Counter.DROPPED_RS to 1,
@@ -238,7 +245,7 @@
                 00000000
             """.replace("\\s+".toRegex(), "").trim()
             val pingRequestPkt = HexDump.hexStringToByteArray(pingRequestPktRawBytes)
-            ApfTestHelpers.assertVerdict(
+            apfTestHelpers.assertVerdict(
                 APF_VERSION_4,
                 ApfTestHelpers.DROP,
                 program,
diff --git a/tests/unit/src/android/net/apf/ApfTest.java b/tests/unit/src/android/net/apf/ApfTest.java
index dfeacf4..6bf3a2f 100644
--- a/tests/unit/src/android/net/apf/ApfTest.java
+++ b/tests/unit/src/android/net/apf/ApfTest.java
@@ -18,7 +18,6 @@
 
 import static android.net.apf.ApfCounterTracker.Counter.getCounterEnumFromOffset;
 import static android.net.apf.ApfTestHelpers.TIMEOUT_MS;
-import static android.net.apf.ApfTestHelpers.consumeInstalledProgram;
 import static android.net.apf.ApfTestHelpers.DROP;
 import static android.net.apf.ApfTestHelpers.MIN_PKT_SIZE;
 import static android.net.apf.ApfTestHelpers.PASS;
@@ -179,6 +178,7 @@
     private HandlerThread mHandlerThread;
     private Handler mHandler;
     private long mCurrentTimeMs;
+    private ApfTestHelpers mApfTestHelpers;
 
     @Before
     public void setUp() throws Exception {
@@ -202,6 +202,7 @@
         mHandlerThread = new HandlerThread("ApfTestThread");
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
+        mApfTestHelpers = new ApfTestHelpers();
     }
 
     private void shutdownApfFilters() throws Exception {
@@ -274,58 +275,58 @@
     }
 
     private void assertPass(ApfV4Generator gen) throws ApfV4Generator.IllegalInstructionException {
-        ApfTestHelpers.assertPass(mApfVersion, gen);
+        mApfTestHelpers.assertPass(mApfVersion, gen);
     }
 
     private void assertDrop(ApfV4Generator gen) throws ApfV4Generator.IllegalInstructionException {
-        ApfTestHelpers.assertDrop(mApfVersion, gen);
+        mApfTestHelpers.assertDrop(mApfVersion, gen);
     }
 
     private void assertPass(byte[] program, byte[] packet) {
-        ApfTestHelpers.assertPass(mApfVersion, program, packet);
+        mApfTestHelpers.assertPass(mApfVersion, program, packet);
     }
 
     private void assertDrop(byte[] program, byte[] packet) {
-        ApfTestHelpers.assertDrop(mApfVersion, program, packet);
+        mApfTestHelpers.assertDrop(mApfVersion, program, packet);
     }
 
     private void assertPass(byte[] program, byte[] packet, int filterAge) {
-        ApfTestHelpers.assertPass(mApfVersion, program, packet, filterAge);
+        mApfTestHelpers.assertPass(mApfVersion, program, packet, filterAge);
     }
 
     private void assertDrop(byte[] program, byte[] packet, int filterAge) {
-        ApfTestHelpers.assertDrop(mApfVersion, program, packet, filterAge);
+        mApfTestHelpers.assertDrop(mApfVersion, program, packet, filterAge);
     }
 
     private void assertPass(ApfV4Generator gen, byte[] packet, int filterAge)
             throws ApfV4Generator.IllegalInstructionException {
-        ApfTestHelpers.assertPass(mApfVersion, gen, packet, filterAge);
+        mApfTestHelpers.assertPass(mApfVersion, gen, packet, filterAge);
     }
 
     private void assertDrop(ApfV4Generator gen, byte[] packet, int filterAge)
             throws ApfV4Generator.IllegalInstructionException {
-        ApfTestHelpers.assertDrop(mApfVersion, gen, packet, filterAge);
+        mApfTestHelpers.assertDrop(mApfVersion, gen, packet, filterAge);
     }
 
     private void assertDataMemoryContents(int expected, byte[] program, byte[] packet,
             byte[] data, byte[] expectedData) throws Exception {
-        ApfTestHelpers.assertDataMemoryContents(mApfVersion, expected, program, packet, data,
+        mApfTestHelpers.assertDataMemoryContents(mApfVersion, expected, program, packet, data,
                 expectedData, false /* ignoreInterpreterVersion */);
     }
 
     private void assertDataMemoryContentsIgnoreVersion(int expected, byte[] program,
             byte[] packet, byte[] data, byte[] expectedData) throws Exception {
-        ApfTestHelpers.assertDataMemoryContents(mApfVersion, expected, program, packet, data,
+        mApfTestHelpers.assertDataMemoryContents(mApfVersion, expected, program, packet, data,
                 expectedData, true /* ignoreInterpreterVersion */);
     }
 
     private void assertVerdict(String msg, int expected, byte[] program,
             byte[] packet, int filterAge) {
-        ApfTestHelpers.assertVerdict(mApfVersion, msg, expected, program, packet, filterAge);
+        mApfTestHelpers.assertVerdict(mApfVersion, msg, expected, program, packet, filterAge);
     }
 
     private void assertVerdict(int expected, byte[] program, byte[] packet) {
-        ApfTestHelpers.assertVerdict(mApfVersion, expected, program, packet);
+        mApfTestHelpers.assertVerdict(mApfVersion, expected, program, packet);
     }
 
     /**
@@ -1003,9 +1004,9 @@
         String pcap_filename = stageFile(R.raw.apf);
         for (String tcpdump_filter : tcpdump_filters) {
             byte[] apf_program = Bpf2Apf.convert(
-                ApfTestHelpers.compileToBpf(tcpdump_filter));
+                mApfTestHelpers.compileToBpf(tcpdump_filter));
             assertTrue("Failed to match for filter: " + tcpdump_filter,
-                    ApfTestHelpers.compareBpfApf(
+                    mApfTestHelpers.compareBpfApf(
                         mApfVersion, tcpdump_filter, pcap_filename, apf_program));
         }
     }
@@ -1042,13 +1043,14 @@
         config.multicastFilter = DROP_MULTICAST;
         config.ieee802_3Filter = DROP_802_3_FRAMES;
         final ApfFilter apfFilter = getApfFilter(config);
-        consumeInstalledProgram(mApfController, 2 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 2 /* installCnt */);
         apfFilter.setLinkProperties(lp);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         byte[] data = new byte[Counter.totalSize()];
         final boolean result;
 
-        result = ApfTestHelpers.dropsAllPackets(
+        result = mApfTestHelpers.dropsAllPackets(
             mApfVersion, program, data, pcapFilename);
         Log.i(TAG, "testApfFilterPcapFile(): Data counters: " + HexDump.toHexString(data, false));
 
@@ -1191,10 +1193,11 @@
         ApfConfiguration config = getDefaultConfig();
         config.multicastFilter = DROP_MULTICAST;
         final ApfFilter apfFilter = getApfFilter(config);
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         apfFilter.setLinkProperties(lp);
 
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         ByteBuffer packet = ByteBuffer.wrap(new byte[100]);
         if (SdkLevel.isAtLeastV()) {
@@ -1246,7 +1249,8 @@
     public void testApfFilterIPv6() throws Exception {
         ApfConfiguration config = getDefaultConfig();
         ApfFilter apfFilter = getApfFilter(config);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Verify empty IPv6 packet is passed
         ByteBuffer packet = makeIpv6Packet(IPPROTO_UDP);
@@ -1659,10 +1663,11 @@
         ApfConfiguration config = getDefaultConfig();
         config.ieee802_3Filter = DROP_802_3_FRAMES;
         final ApfFilter apfFilter = getApfFilter(config);
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         apfFilter.setLinkProperties(lp);
 
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Construct IPv4 and IPv6 multicast packets.
         ByteBuffer mcastv4packet = makeIpv4Packet(IPPROTO_UDP);
@@ -1697,7 +1702,7 @@
 
         // Turn on multicast filter and verify it works
         apfFilter.setMulticastFilter(true);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         assertDrop(program, mcastv4packet.array());
         assertDrop(program, mcastv6packet.array());
         assertDrop(program, bcastv4packet1.array());
@@ -1706,7 +1711,7 @@
 
         // Turn off multicast filter and verify it's off
         apfFilter.setMulticastFilter(false);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         assertPass(program, mcastv4packet.array());
         assertPass(program, mcastv6packet.array());
         assertPass(program, bcastv4packet1.array());
@@ -1718,9 +1723,9 @@
         config.ieee802_3Filter = DROP_802_3_FRAMES;
         clearInvocations(mApfController);
         final ApfFilter apfFilter2 = getApfFilter(config);
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         apfFilter2.setLinkProperties(lp);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         assertDrop(program, mcastv4packet.array());
         assertDrop(program, mcastv6packet.array());
         assertDrop(program, bcastv4packet1.array());
@@ -1745,7 +1750,8 @@
     private void doTestApfFilterMulticastPingWhileDozing(boolean isLightDozing) throws Exception {
         final ApfConfiguration configuration = getDefaultConfig();
         final ApfFilter apfFilter = getApfFilter(configuration);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         final ArgumentCaptor<BroadcastReceiver> receiverCaptor =
                 ArgumentCaptor.forClass(BroadcastReceiver.class);
         verify(mDependencies).addDeviceIdleReceiver(receiverCaptor.capture());
@@ -1767,13 +1773,13 @@
             doReturn(true).when(mPowerManager).isDeviceIdleMode();
             receiver.onReceive(mContext, new Intent(ACTION_DEVICE_IDLE_MODE_CHANGED));
         }
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         // ...and even while dozing...
         assertPass(program, packet.array());
 
         // ...but when the multicast filter is also enabled, drop the multicast pings to save power.
         apfFilter.setMulticastFilter(true);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         assertDrop(program, packet.array());
 
         // However, we should still let through all other ICMPv6 types.
@@ -1792,7 +1798,7 @@
             doReturn(false).when(mPowerManager).isDeviceIdleMode();
             receiver.onReceive(mContext, new Intent(ACTION_DEVICE_IDLE_MODE_CHANGED));
         }
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         assertPass(program, packet.array());
     }
 
@@ -1801,7 +1807,8 @@
     public void testApfFilter802_3() throws Exception {
         ApfConfiguration config = getDefaultConfig();
         ApfFilter apfFilter = getApfFilter(config);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Verify empty packet of 100 zero bytes is passed
         // Note that eth-type = 0 makes it an IEEE802.3 frame
@@ -1819,7 +1826,7 @@
         // Now turn on the filter
         config.ieee802_3Filter = DROP_802_3_FRAMES;
         apfFilter = getApfFilter(config);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Verify that IEEE802.3 frame is dropped
         // In this case ethtype is used for payload length
@@ -1844,7 +1851,8 @@
 
         ApfConfiguration config = getDefaultConfig();
         ApfFilter apfFilter = getApfFilter(config);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Verify empty packet of 100 zero bytes is passed
         // Note that eth-type = 0 makes it an IEEE802.3 frame
@@ -1862,7 +1870,7 @@
         // Now add IPv4 to the black list
         config.ethTypeBlackList = ipv4BlackList;
         apfFilter = getApfFilter(config);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Verify that IPv4 frame will be dropped
         setIpv4VersionFields(packet);
@@ -1875,7 +1883,7 @@
         // Now let us have both IPv4 and IPv6 in the black list
         config.ethTypeBlackList = ipv4Ipv6BlackList;
         apfFilter = getApfFilter(config);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Verify that IPv4 frame will be dropped
         setIpv4VersionFields(packet);
@@ -1913,7 +1921,8 @@
         config.multicastFilter = DROP_MULTICAST;
         config.ieee802_3Filter = DROP_802_3_FRAMES;
         ApfFilter apfFilter = getApfFilter(config);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Verify initially ARP request filter is off, and GARP filter is on.
         verifyArpFilter(program, PASS);
@@ -1923,11 +1932,11 @@
         LinkProperties lp = new LinkProperties();
         assertTrue(lp.addLinkAddress(linkAddress));
         apfFilter.setLinkProperties(lp);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         verifyArpFilter(program, DROP);
 
         apfFilter.setLinkProperties(new LinkProperties());
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         // Inform ApfFilter of loss of IP and verify ARP filtering is off
         verifyArpFilter(program, PASS);
     }
@@ -2197,7 +2206,8 @@
         // Verify new program generated if ApfFilter witnesses RA
         clearInvocations(mApfController);
         pretendPacketReceived(packet.array());
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         verifyRaLifetime(program, packet, lifetime);
         return program;
     }
@@ -2216,7 +2226,8 @@
         config.multicastFilter = DROP_MULTICAST;
         config.ieee802_3Filter = DROP_802_3_FRAMES;
         ApfFilter apfFilter = getApfFilter(config);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         final int ROUTER_LIFETIME = 1000;
         final int PREFIX_VALID_LIFETIME = 200;
@@ -2300,7 +2311,8 @@
         config.multicastFilter = DROP_MULTICAST;
         config.ieee802_3Filter = DROP_802_3_FRAMES;
         final ApfFilter apfFilter = getApfFilter(config);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         final int RA_REACHABLE_TIME = 1800;
         final int RA_RETRANSMISSION_TIMER = 1234;
 
@@ -2315,7 +2327,7 @@
 
         // Assume apf is shown the given RA, it generates program to filter it.
         pretendPacketReceived(raPacket);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         assertDrop(program, raPacket);
 
         // A packet with different reachable time should be passed.
@@ -2340,7 +2352,7 @@
         config.multicastFilter = DROP_MULTICAST;
         config.ieee802_3Filter = DROP_802_3_FRAMES;
         final ApfFilter apfFilter = getApfFilter(config);
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         final int routerLifetime = 1000;
         final int timePassedSeconds = 12;
@@ -2355,7 +2367,8 @@
         synchronized (apfFilter) {
             apfFilter.installNewProgram();
         }
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         verifyRaLifetime(program, basePacket, routerLifetime, timePassedSeconds);
 
         // Packet should be passed if the program is installed after 1/6 * lifetime from last seen
@@ -2365,7 +2378,7 @@
         synchronized (apfFilter) {
             apfFilter.installNewProgram();
         }
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         assertDrop(program, basePacket.array());
 
         mCurrentTimeMs += DateUtils.SECOND_IN_MILLIS;
@@ -2373,7 +2386,7 @@
         synchronized (apfFilter) {
             apfFilter.installNewProgram();
         }
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         assertPass(program, basePacket.array());
     }
 
@@ -2446,12 +2459,13 @@
     @Test
     public void testMatchedRaUpdatesLifetime() throws Exception {
         final ApfFilter apfFilter = getApfFilter(getDefaultConfig());
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Create an RA and build an APF program
         byte[] ra = new RaPacketBuilder(1800 /* router lifetime */).build();
         pretendPacketReceived(ra);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // lifetime dropped significantly, assert pass
         ra = new RaPacketBuilder(200 /* router lifetime */).build();
@@ -2459,7 +2473,7 @@
 
         // update program with the new RA
         pretendPacketReceived(ra);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // assert program was updated and new lifetimes were taken into account.
         assertDrop(program, ra);
@@ -2470,7 +2484,7 @@
         final ApfConfiguration config = getDefaultConfig();
         config.acceptRaMinLft = 180;
         ApfFilter apfFilter = getApfFilter(config);
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         // Template packet:
         // Frame 1: 150 bytes on wire (1200 bits), 150 bytes captured (1200 bits)
         // Ethernet II, Src: Netgear_23:67:2c (28:c6:8e:23:67:2c), Dst: IPv6mcast_01 (33:33:00:00:00:01)
@@ -2522,7 +2536,7 @@
                     String.format(packetStringFmt, lifetime + lifetime));
             // feed the RA into APF and generate the filter, the filter shouldn't crash.
             pretendPacketReceived(ra);
-            consumeInstalledProgram(mApfController, 1 /* installCnt */);
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         }
     }
 
@@ -2534,7 +2548,7 @@
         final ApfConfiguration config = getDefaultConfig();
         config.acceptRaMinLft = 180;
         final ApfFilter apfFilter = getApfFilter(config);
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Create an initial RA and build an APF program
         byte[] ra = new RaPacketBuilder(1800 /* router lifetime */)
@@ -2542,7 +2556,8 @@
                 .build();
 
         pretendPacketReceived(ra);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // repeated RA is dropped
         assertDrop(program, ra);
@@ -2562,7 +2577,7 @@
         final ApfConfiguration config = getDefaultConfig();
         config.acceptRaMinLft = 180;
         final ApfFilter apfFilter = getApfFilter(config);
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Create an initial RA and build an APF program
         byte[] ra = new RaPacketBuilder(1800 /* router lifetime */)
@@ -2570,7 +2585,8 @@
                 .build();
 
         pretendPacketReceived(ra);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // repeated RA is dropped
         assertDrop(program, ra);
@@ -2597,13 +2613,14 @@
         final ApfConfiguration config = getDefaultConfig();
         config.acceptRaMinLft = 180;
         final ApfFilter apfFilter = getApfFilter(config);
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Create an initial RA and build an APF program
         byte[] ra = new RaPacketBuilder(0 /* router lifetime */).build();
 
         pretendPacketReceived(ra);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // repeated RA is dropped
         assertDrop(program, ra);
@@ -2625,13 +2642,14 @@
         final ApfConfiguration config = getDefaultConfig();
         config.acceptRaMinLft = 180;
         final ApfFilter apfFilter = getApfFilter(config);
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Create an initial RA and build an APF program
         byte[] ra = new RaPacketBuilder(100 /* router lifetime */).build();
 
         pretendPacketReceived(ra);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // repeated RA is dropped
         assertDrop(program, ra);
@@ -2661,13 +2679,14 @@
         final ApfConfiguration config = getDefaultConfig();
         config.acceptRaMinLft = 180;
         final ApfFilter apfFilter = getApfFilter(config);
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Create an initial RA and build an APF program
         byte[] ra = new RaPacketBuilder(200 /* router lifetime */).build();
 
         pretendPacketReceived(ra);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // repeated RA is dropped
         assertDrop(program, ra);
@@ -2693,13 +2712,14 @@
         final ApfConfiguration config = getDefaultConfig();
         config.acceptRaMinLft = 180;
         final ApfFilter apfFilter = getApfFilter(config);
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Create an initial RA and build an APF program
         byte[] ra = new RaPacketBuilder(1800 /* router lifetime */).build();
 
         pretendPacketReceived(ra);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // repeated RA is dropped
         assertDrop(program, ra);
@@ -2731,12 +2751,13 @@
         final ApfConfiguration config = getDefaultConfig();
         config.acceptRaMinLft = 180;
         final ApfFilter apfFilter = getApfFilter(config);
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Create an initial RA and build an APF program
         byte[] ra = new RaPacketBuilder(1800 /* router lifetime */).build();
         pretendPacketReceived(ra);
-        byte[] program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // repeated RA is dropped.
         assertDrop(program, ra);
@@ -2745,37 +2766,37 @@
         ra = new RaPacketBuilder(599 /* router lifetime */).build();
         assertPass(program, ra);
         pretendPacketReceived(ra);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         assertDrop(program, ra);
 
         ra = new RaPacketBuilder(180 /* router lifetime */).build();
         assertPass(program, ra);
         pretendPacketReceived(ra);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         assertDrop(program, ra);
 
         ra = new RaPacketBuilder(0 /* router lifetime */).build();
         assertPass(program, ra);
         pretendPacketReceived(ra);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         assertDrop(program, ra);
 
         ra = new RaPacketBuilder(180 /* router lifetime */).build();
         assertPass(program, ra);
         pretendPacketReceived(ra);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         assertDrop(program, ra);
 
         ra = new RaPacketBuilder(599 /* router lifetime */).build();
         assertPass(program, ra);
         pretendPacketReceived(ra);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         assertDrop(program, ra);
 
         ra = new RaPacketBuilder(1800 /* router lifetime */).build();
         assertPass(program, ra);
         pretendPacketReceived(ra);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         assertDrop(program, ra);
     }
 
@@ -2821,11 +2842,11 @@
         config.apfVersionSupported = 2;
         config.apfRamSize = 512;
         final ApfFilter apfFilter = getApfFilter(config);
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         final byte[] ra = buildLargeRa();
         pretendPacketReceived(ra);
         // The generated program size will be 529, which is larger than 512
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         verify(mNetworkQuirkMetrics).setEvent(NetworkQuirkEvent.QE_APF_OVER_SIZE_FAILURE);
         verify(mNetworkQuirkMetrics).statsWrite();
     }
@@ -2839,7 +2860,8 @@
         final long durationTimeMs = config.minMetricsSessionDurationMs;
         doReturn(startTimeMs).when(mDependencies).elapsedRealtime();
         final ApfFilter apfFilter = getApfFilter(config);
-        byte[] program = consumeInstalledProgram(mApfController, 2 /* installCnt */);
+        byte[] program =
+            mApfTestHelpers.consumeInstalledProgram(mApfController, 2 /* installCnt */);
         int maxProgramSize = 0;
         int numProgramUpdated = 0;
         maxProgramSize = Math.max(maxProgramSize, program.length);
@@ -2859,13 +2881,13 @@
         expectedData[passedIpv6IcmpCounterIdx + 3] += 1;
         assertDataMemoryContentsIgnoreVersion(PASS, program, ra, data, expectedData);
         pretendPacketReceived(ra);
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         maxProgramSize = Math.max(maxProgramSize, program.length);
         numProgramUpdated++;
 
         apfFilter.setMulticastFilter(true);
         // setMulticastFilter will trigger program installation.
-        program = consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        program = mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         maxProgramSize = Math.max(maxProgramSize, program.length);
         numProgramUpdated++;
 
@@ -2918,7 +2940,7 @@
         final long durationTimeMs = config.minMetricsSessionDurationMs;
         doReturn(startTimeMs).when(mDependencies).elapsedRealtime();
         final ApfFilter apfFilter = getApfFilter(config);
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         final int routerLifetime = 1000;
         final int prefixValidLifetime = 200;
@@ -2956,20 +2978,20 @@
         // Inject RA packets. Calling assertProgramUpdateAndGet()/assertNoProgramUpdate() is to make
         // sure that the RA packet has been processed.
         pretendPacketReceived(ra1.build());
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         pretendPacketReceived(ra2.build());
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         pretendPacketReceived(raInvalid.build());
         Thread.sleep(NO_CALLBACK_TIMEOUT_MS);
         verify(mApfController, never()).installPacketFilter(any());
         pretendPacketReceived(raZeroRouterLifetime.build());
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         pretendPacketReceived(raZeroPioValidLifetime.build());
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         pretendPacketReceived(raZeroRdnssLifetime.build());
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
         pretendPacketReceived(raZeroRioRouteLifetime.build());
-        consumeInstalledProgram(mApfController, 1 /* installCnt */);
+        mApfTestHelpers.consumeInstalledProgram(mApfController, 1 /* installCnt */);
 
         // Write metrics data to statsd pipeline when shutdown.
         doReturn(startTimeMs + durationTimeMs).when(mDependencies).elapsedRealtime();
diff --git a/tests/unit/src/android/net/apf/ApfTestHelpers.kt b/tests/unit/src/android/net/apf/ApfTestHelpers.kt
index f105ac4..0a4cdb6 100644
--- a/tests/unit/src/android/net/apf/ApfTestHelpers.kt
+++ b/tests/unit/src/android/net/apf/ApfTestHelpers.kt
@@ -27,7 +27,8 @@
 import org.mockito.Mockito.timeout
 import org.mockito.Mockito.verify
 
-class ApfTestHelpers private constructor() {
+class ApfTestHelpers {
+    private val apfJniUtils = ApfJniUtils()
     companion object {
         const val TIMEOUT_MS: Long = 1000
         const val PASS: Int = 1
@@ -36,7 +37,6 @@
         // Interpreter will just accept packets without link layer headers, so pad fake packet to at
         // least the minimum packet size.
         const val MIN_PKT_SIZE: Int = 15
-        private val apfJniUtils = ApfJniUtils()
         private fun label(code: Int): String {
             return when (code) {
                 PASS -> "PASS"
@@ -53,172 +53,6 @@
             assertEquals(label(expected), label(got))
         }
 
-        private fun assertVerdict(
-            apfVersion: Int,
-            expected: Int,
-            program: ByteArray,
-            packet: ByteArray,
-            filterAge: Int
-        ) {
-            val msg = """Unexpected APF verdict. To debug:
-                apf_run
-                    --program ${HexDump.toHexString(program)}
-                    --packet ${HexDump.toHexString(packet)}
-                    --age $filterAge
-                    ${if (apfVersion > 4) " --v6" else ""}
-                    --trace " + " | less\n
-            """
-            assertReturnCodesEqual(
-                msg,
-                expected,
-                apfJniUtils.apfSimulate(apfVersion, program, packet, null, filterAge)
-            )
-        }
-
-        @Throws(BaseApfGenerator.IllegalInstructionException::class)
-        private fun assertVerdict(
-            apfVersion: Int,
-            expected: Int,
-            gen: ApfV4Generator,
-            packet: ByteArray,
-            filterAge: Int
-        ) {
-            assertVerdict(apfVersion, expected, gen.generate(), packet, null, filterAge)
-        }
-
-        private fun assertVerdict(
-            apfVersion: Int,
-            expected: Int,
-            program: ByteArray,
-            packet: ByteArray,
-            data: ByteArray?,
-            filterAge: Int
-        ) {
-            val msg = "Unexpected APF verdict. To debug: \n" + """
-                apf_run
-                    --program ${HexDump.toHexString(program)}
-                    --packet ${HexDump.toHexString(packet)}
-                    ${if (data != null) "--data ${HexDump.toHexString(data)}" else ""}
-                    --age $filterAge
-                    ${if (apfVersion > 4) "--v6" else ""}
-                    --trace | less
-            """.replace("\n", " ").replace("\\s+".toRegex(), " ") + "\n"
-            assertReturnCodesEqual(
-                msg,
-                expected,
-                apfJniUtils.apfSimulate(apfVersion, program, packet, data, filterAge)
-            )
-        }
-
-        /**
-         * Runs the APF program with customized data region and checks the return code.
-         */
-        fun assertVerdict(
-            apfVersion: Int,
-            expected: Int,
-            program: ByteArray,
-            packet: ByteArray,
-            data: ByteArray?
-        ) {
-            assertVerdict(apfVersion, expected, program, packet, data, filterAge = 0)
-        }
-
-        /**
-         * Runs the APF program and checks the return code is equals to expected value. If not, the
-         * customized message is printed.
-         */
-        @JvmStatic
-        fun assertVerdict(
-            apfVersion: Int,
-            msg: String,
-            expected: Int,
-            program: ByteArray?,
-            packet: ByteArray?,
-            filterAge: Int
-        ) {
-            assertReturnCodesEqual(
-                msg,
-                expected,
-                apfJniUtils.apfSimulate(apfVersion, program, packet, null, filterAge)
-            )
-        }
-
-        /**
-         * Runs the APF program and checks the return code is equals to expected value.
-         */
-        @JvmStatic
-        fun assertVerdict(apfVersion: Int, expected: Int, program: ByteArray, packet: ByteArray) {
-            assertVerdict(apfVersion, expected, program, packet, 0)
-        }
-
-        /**
-         * Runs the APF program and checks the return code is PASS.
-         */
-        @JvmStatic
-        fun assertPass(apfVersion: Int, program: ByteArray, packet: ByteArray, filterAge: Int) {
-            assertVerdict(apfVersion, PASS, program, packet, filterAge)
-        }
-
-        /**
-         * Runs the APF program and checks the return code is PASS.
-         */
-        @JvmStatic
-        fun assertPass(apfVersion: Int, program: ByteArray, packet: ByteArray) {
-            assertVerdict(apfVersion, PASS, program, packet)
-        }
-
-        /**
-         * Runs the APF program and checks the return code is DROP.
-         */
-        @JvmStatic
-        fun assertDrop(apfVersion: Int, program: ByteArray, packet: ByteArray, filterAge: Int) {
-            assertVerdict(apfVersion, DROP, program, packet, filterAge)
-        }
-
-        /**
-         * Runs the APF program and checks the return code is DROP.
-         */
-        @JvmStatic
-        fun assertDrop(apfVersion: Int, program: ByteArray, packet: ByteArray) {
-            assertVerdict(apfVersion, DROP, program, packet)
-        }
-
-        /**
-         * Runs the APF program and checks the return code is PASS.
-         */
-        @Throws(BaseApfGenerator.IllegalInstructionException::class)
-        @JvmStatic
-        fun assertPass(apfVersion: Int, gen: ApfV4Generator, packet: ByteArray, filterAge: Int) {
-            assertVerdict(apfVersion, PASS, gen, packet, filterAge)
-        }
-
-        /**
-         * Runs the APF program and checks the return code is DROP.
-         */
-        @Throws(BaseApfGenerator.IllegalInstructionException::class)
-        @JvmStatic
-        fun assertDrop(apfVersion: Int, gen: ApfV4Generator, packet: ByteArray, filterAge: Int) {
-            assertVerdict(apfVersion, DROP, gen, packet, filterAge)
-        }
-
-        /**
-         * Runs the APF program and checks the return code is PASS.
-         */
-        @Throws(BaseApfGenerator.IllegalInstructionException::class)
-        @JvmStatic
-        fun assertPass(apfVersion: Int, gen: ApfV4Generator) {
-            assertVerdict(apfVersion, PASS, gen, ByteArray(MIN_PKT_SIZE), 0)
-        }
-
-        /**
-         * Runs the APF program and checks the return code is DROP.
-         */
-        @Throws(BaseApfGenerator.IllegalInstructionException::class)
-        @JvmStatic
-        fun assertDrop(apfVersion: Int, gen: ApfV4Generator) {
-            assertVerdict(apfVersion, DROP, gen, ByteArray(MIN_PKT_SIZE), 0)
-        }
-
         /**
          * Checks the generated APF program equals to the expected value.
          */
@@ -234,69 +68,6 @@
             }
         }
 
-        /**
-         * Runs the APF program and checks the return code and data regions
-         * equals to expected value.
-         */
-        @Throws(BaseApfGenerator.IllegalInstructionException::class, Exception::class)
-        @JvmStatic
-        fun assertDataMemoryContents(
-            apfVersion: Int,
-            expected: Int,
-            program: ByteArray?,
-            packet: ByteArray?,
-            data: ByteArray,
-            expectedData: ByteArray,
-            ignoreInterpreterVersion: Boolean
-        ) {
-            assertReturnCodesEqual(
-                expected,
-                apfJniUtils.apfSimulate(apfVersion, program, packet, data, 0)
-            )
-
-            if (ignoreInterpreterVersion) {
-                val apfVersionIdx = (Counter.totalSize() +
-                        APF_VERSION.offset())
-                val apfProgramIdIdx = (Counter.totalSize() +
-                        APF_PROGRAM_ID.offset())
-                for (i in 0..3) {
-                    data[apfVersionIdx + i] = 0
-                    data[apfProgramIdIdx + i] = 0
-                }
-            }
-            // assertArrayEquals() would only print one byte, making debugging difficult.
-            if (!expectedData.contentEquals(data)) {
-                throw Exception(
-                    ("\nprogram:     " + HexDump.toHexString(program) +
-                     "\ndata memory: " + HexDump.toHexString(data) +
-                     "\nexpected:    " + HexDump.toHexString(expectedData))
-                )
-            }
-        }
-
-        fun verifyProgramRun(
-            version: Int,
-            program: ByteArray,
-            pkt: ByteArray,
-            targetCnt: Counter,
-            cntMap: MutableMap<Counter, Long> = mutableMapOf(),
-            dataRegion: ByteArray = ByteArray(Counter.totalSize()) { 0 },
-            incTotal: Boolean = true,
-            result: Int = if (targetCnt.name.startsWith("PASSED")) PASS else DROP
-        ) {
-            assertVerdict(version, result, program, pkt, dataRegion)
-            cntMap[targetCnt] = cntMap.getOrDefault(targetCnt, 0) + 1
-            if (incTotal) {
-                cntMap[TOTAL_PACKETS] = cntMap.getOrDefault(TOTAL_PACKETS, 0) + 1
-            }
-            val errMsg = "Counter is not increased properly. To debug: \n" +
-                    " apf_run --program ${HexDump.toHexString(program)} " +
-                    "--packet ${HexDump.toHexString(pkt)} " +
-                    "--data ${HexDump.toHexString(dataRegion)} --age 0 " +
-                    "${if (version == APF_VERSION_6) "--v6" else "" } --trace  | less \n"
-            assertEquals(cntMap, decodeCountersIntoMap(dataRegion), errMsg)
-        }
-
         fun decodeCountersIntoMap(counterBytes: ByteArray): Map<Counter, Long> {
             val counters = Counter::class.java.enumConstants
             val ret = HashMap<Counter, Long>()
@@ -313,68 +84,282 @@
             }
             return ret
         }
+    }
 
-        @JvmStatic
-        fun consumeInstalledProgram(
-            apfController: ApfFilter.IApfController,
-            installCnt: Int
-        ): ByteArray {
-            val programCaptor = ArgumentCaptor.forClass(
-                ByteArray::class.java
+    private fun assertVerdict(
+        apfVersion: Int,
+        expected: Int,
+        program: ByteArray,
+        packet: ByteArray,
+        filterAge: Int
+    ) {
+        val msg = """Unexpected APF verdict. To debug:
+                apf_run
+                    --program ${HexDump.toHexString(program)}
+                    --packet ${HexDump.toHexString(packet)}
+                    --age $filterAge
+                    ${if (apfVersion > 4) " --v6" else ""}
+                    --trace " + " | less\n
+            """
+        assertReturnCodesEqual(
+            msg,
+            expected,
+            apfJniUtils.apfSimulate(apfVersion, program, packet, null, filterAge)
+        )
+    }
+
+    @Throws(BaseApfGenerator.IllegalInstructionException::class)
+    private fun assertVerdict(
+        apfVersion: Int,
+        expected: Int,
+        gen: ApfV4Generator,
+        packet: ByteArray,
+        filterAge: Int
+    ) {
+        assertVerdict(apfVersion, expected, gen.generate(), packet, null, filterAge)
+    }
+
+    private fun assertVerdict(
+        apfVersion: Int,
+        expected: Int,
+        program: ByteArray,
+        packet: ByteArray,
+        data: ByteArray?,
+        filterAge: Int
+    ) {
+        val msg = "Unexpected APF verdict. To debug: \n" + """
+                apf_run
+                    --program ${HexDump.toHexString(program)}
+                    --packet ${HexDump.toHexString(packet)}
+                    ${if (data != null) "--data ${HexDump.toHexString(data)}" else ""}
+                    --age $filterAge
+                    ${if (apfVersion > 4) "--v6" else ""}
+                    --trace | less
+            """.replace("\n", " ").replace("\\s+".toRegex(), " ") + "\n"
+        assertReturnCodesEqual(
+            msg,
+            expected,
+            apfJniUtils.apfSimulate(apfVersion, program, packet, data, filterAge)
+        )
+    }
+
+    /**
+     * Runs the APF program with customized data region and checks the return code.
+     */
+    fun assertVerdict(
+        apfVersion: Int,
+        expected: Int,
+        program: ByteArray,
+        packet: ByteArray,
+        data: ByteArray?
+    ) {
+        assertVerdict(apfVersion, expected, program, packet, data, filterAge = 0)
+    }
+
+    /**
+     * Runs the APF program and checks the return code is equals to expected value. If not, the
+     * customized message is printed.
+     */
+    fun assertVerdict(
+        apfVersion: Int,
+        msg: String,
+        expected: Int,
+        program: ByteArray?,
+        packet: ByteArray?,
+        filterAge: Int
+    ) {
+        assertReturnCodesEqual(
+            msg,
+            expected,
+            apfJniUtils.apfSimulate(apfVersion, program, packet, null, filterAge)
+        )
+    }
+
+    /**
+     * Runs the APF program and checks the return code is equals to expected value.
+     */
+    fun assertVerdict(apfVersion: Int, expected: Int, program: ByteArray, packet: ByteArray) {
+        assertVerdict(apfVersion, expected, program, packet, 0)
+    }
+
+    /**
+     * Runs the APF program and checks the return code is PASS.
+     */
+    fun assertPass(apfVersion: Int, program: ByteArray, packet: ByteArray, filterAge: Int) {
+        assertVerdict(apfVersion, PASS, program, packet, filterAge)
+    }
+
+    /**
+     * Runs the APF program and checks the return code is PASS.
+     */
+    fun assertPass(apfVersion: Int, program: ByteArray, packet: ByteArray) {
+        assertVerdict(apfVersion, PASS, program, packet)
+    }
+
+    /**
+     * Runs the APF program and checks the return code is DROP.
+     */
+    fun assertDrop(apfVersion: Int, program: ByteArray, packet: ByteArray, filterAge: Int) {
+        assertVerdict(apfVersion, DROP, program, packet, filterAge)
+    }
+
+    /**
+     * Runs the APF program and checks the return code is DROP.
+     */
+    fun assertDrop(apfVersion: Int, program: ByteArray, packet: ByteArray) {
+        assertVerdict(apfVersion, DROP, program, packet)
+    }
+
+    /**
+     * Runs the APF program and checks the return code is PASS.
+     */
+    @Throws(BaseApfGenerator.IllegalInstructionException::class)
+    fun assertPass(apfVersion: Int, gen: ApfV4Generator, packet: ByteArray, filterAge: Int) {
+        assertVerdict(apfVersion, PASS, gen, packet, filterAge)
+    }
+
+    /**
+     * Runs the APF program and checks the return code is DROP.
+     */
+    @Throws(BaseApfGenerator.IllegalInstructionException::class)
+    fun assertDrop(apfVersion: Int, gen: ApfV4Generator, packet: ByteArray, filterAge: Int) {
+        assertVerdict(apfVersion, DROP, gen, packet, filterAge)
+    }
+
+    /**
+     * Runs the APF program and checks the return code is PASS.
+     */
+    @Throws(BaseApfGenerator.IllegalInstructionException::class)
+    fun assertPass(apfVersion: Int, gen: ApfV4Generator) {
+        assertVerdict(apfVersion, PASS, gen, ByteArray(MIN_PKT_SIZE), 0)
+    }
+
+    /**
+     * Runs the APF program and checks the return code is DROP.
+     */
+    @Throws(BaseApfGenerator.IllegalInstructionException::class)
+    fun assertDrop(apfVersion: Int, gen: ApfV4Generator) {
+        assertVerdict(apfVersion, DROP, gen, ByteArray(MIN_PKT_SIZE), 0)
+    }
+
+    /**
+     * Runs the APF program and checks the return code and data regions
+     * equals to expected value.
+     */
+    @Throws(BaseApfGenerator.IllegalInstructionException::class, Exception::class)
+    fun assertDataMemoryContents(
+        apfVersion: Int,
+        expected: Int,
+        program: ByteArray?,
+        packet: ByteArray?,
+        data: ByteArray,
+        expectedData: ByteArray,
+        ignoreInterpreterVersion: Boolean
+    ) {
+        assertReturnCodesEqual(
+            expected,
+            apfJniUtils.apfSimulate(apfVersion, program, packet, data, 0)
+        )
+
+        if (ignoreInterpreterVersion) {
+            val apfVersionIdx = (Counter.totalSize() +
+                    APF_VERSION.offset())
+            val apfProgramIdIdx = (Counter.totalSize() +
+                    APF_PROGRAM_ID.offset())
+            for (i in 0..3) {
+                data[apfVersionIdx + i] = 0
+                data[apfProgramIdIdx + i] = 0
+            }
+        }
+        // assertArrayEquals() would only print one byte, making debugging difficult.
+        if (!expectedData.contentEquals(data)) {
+            throw Exception(
+                ("\nprogram:     " + HexDump.toHexString(program) +
+                        "\ndata memory: " + HexDump.toHexString(data) +
+                        "\nexpected:    " + HexDump.toHexString(expectedData))
             )
-
-            verify(apfController, timeout(TIMEOUT_MS).times(installCnt)).installPacketFilter(
-                programCaptor.capture()
-            )
-
-            clearInvocations<Any>(apfController)
-            return programCaptor.value
         }
+    }
 
-        fun consumeTransmittedPackets(
-            expectCnt: Int
-        ): List<ByteArray> {
-            val transmittedPackets = apfJniUtils.getAllTransmittedPackets()
-            assertEquals(expectCnt, transmittedPackets.size)
-            resetTransmittedPacketMemory()
-            return transmittedPackets
+    fun verifyProgramRun(
+        version: Int,
+        program: ByteArray,
+        pkt: ByteArray,
+        targetCnt: Counter,
+        cntMap: MutableMap<Counter, Long> = mutableMapOf(),
+        dataRegion: ByteArray = ByteArray(Counter.totalSize()) { 0 },
+        incTotal: Boolean = true,
+        result: Int = if (targetCnt.name.startsWith("PASSED")) PASS else DROP
+    ) {
+        assertVerdict(version, result, program, pkt, dataRegion)
+        cntMap[targetCnt] = cntMap.getOrDefault(targetCnt, 0) + 1
+        if (incTotal) {
+            cntMap[TOTAL_PACKETS] = cntMap.getOrDefault(TOTAL_PACKETS, 0) + 1
         }
+        val errMsg = "Counter is not increased properly. To debug: \n" +
+                " apf_run --program ${HexDump.toHexString(program)} " +
+                "--packet ${HexDump.toHexString(pkt)} " +
+                "--data ${HexDump.toHexString(dataRegion)} --age 0 " +
+                "${if (version == APF_VERSION_6) "--v6" else "" } --trace  | less \n"
+        assertEquals(cntMap, decodeCountersIntoMap(dataRegion), errMsg)
+    }
 
-        fun resetTransmittedPacketMemory() {
-            apfJniUtils.resetTransmittedPacketMemory()
-        }
+    fun consumeInstalledProgram(
+        apfController: ApfFilter.IApfController,
+        installCnt: Int
+    ): ByteArray {
+        val programCaptor = ArgumentCaptor.forClass(
+            ByteArray::class.java
+        )
 
-        fun disassembleApf(program: ByteArray): Array<String> {
-            return apfJniUtils.disassembleApf(program)
-        }
+        verify(apfController, timeout(TIMEOUT_MS).times(installCnt)).installPacketFilter(
+            programCaptor.capture()
+        )
 
-        fun getAllTransmittedPackets(): List<ByteArray> {
-            return apfJniUtils.allTransmittedPackets
-        }
+        clearInvocations<Any>(apfController)
+        return programCaptor.value
+    }
 
-        @JvmStatic
-        fun compareBpfApf(
-            apfVersion: Int,
-            filter: String,
-            pcapFilename: String,
-            apfProgram: ByteArray
-        ): Boolean {
-            return apfJniUtils.compareBpfApf(apfVersion, filter, pcapFilename, apfProgram)
-        }
+    fun consumeTransmittedPackets(
+        expectCnt: Int
+    ): List<ByteArray> {
+        val transmittedPackets = apfJniUtils.getAllTransmittedPackets()
+        assertEquals(expectCnt, transmittedPackets.size)
+        resetTransmittedPacketMemory()
+        return transmittedPackets
+    }
 
-        @JvmStatic
-        fun compileToBpf(filter: String): String {
-            return apfJniUtils.compileToBpf(filter)
-        }
+    fun resetTransmittedPacketMemory() {
+        apfJniUtils.resetTransmittedPacketMemory()
+    }
 
-        @JvmStatic
-        fun dropsAllPackets(
-            apfVersion: Int,
-            program: ByteArray,
-            data: ByteArray,
-            pcapFilename: String
-        ): Boolean {
-            return apfJniUtils.dropsAllPackets(apfVersion, program, data, pcapFilename)
-        }
+    fun disassembleApf(program: ByteArray): Array<String> {
+        return apfJniUtils.disassembleApf(program)
+    }
+
+    fun getAllTransmittedPackets(): List<ByteArray> {
+        return apfJniUtils.allTransmittedPackets
+    }
+
+    fun compareBpfApf(
+        apfVersion: Int,
+        filter: String,
+        pcapFilename: String,
+        apfProgram: ByteArray
+    ): Boolean {
+        return apfJniUtils.compareBpfApf(apfVersion, filter, pcapFilename, apfProgram)
+    }
+
+    fun compileToBpf(filter: String): String {
+        return apfJniUtils.compileToBpf(filter)
+    }
+
+    fun dropsAllPackets(
+        apfVersion: Int,
+        program: ByteArray,
+        data: ByteArray,
+        pcapFilename: String
+    ): Boolean {
+        return apfJniUtils.dropsAllPackets(apfVersion, program, data, pcapFilename)
     }
 }