@Override
    public IntDeviceConfig getConfig() {
        return intConfig.get();
    }
@Test
    public void testPushIntAppConfig() throws IOException {
        IntReportConfig config = getIntReportConfig("/report-config.json");
        NetworkConfigEvent event =
                new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED, APP_ID,
                        config, null, IntReportConfig.class);
        networkConfigListener.event(event);

        // We expected that the manager will store the device config which
        // converted from the app config.
        IntDeviceConfig expectedConfig = createIntDeviceConfig();
        IntDeviceConfig actualConfig = manager.getConfig();
        assertEquals(expectedConfig, actualConfig);

        // Install watch subnets via netcfg
        // In the report-config.json, there are 3 subnets we want to watch
        // For subnet 0.0.0.0/0, the IntManager will create only one IntIntent with an empty selector.
        Set<IntIntent> expectedIntIntents = Sets.newHashSet();
        ConsistentMap<IntIntentId, IntIntent> intentMap = TestUtils.getField(manager, "intentMap");
        IntIntent.Builder baseIntentBuilder = IntIntent.builder()
                .withReportType(IntIntent.IntReportType.TRACKED_FLOW)
                .withReportType(IntIntent.IntReportType.DROPPED_PACKET)
                .withReportType(IntIntent.IntReportType.CONGESTED_QUEUE)
                .withTelemetryMode(IntIntent.TelemetryMode.POSTCARD);

        // Watch IP Src == subnet 1
        TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
                .matchIPSrc(IpPrefix.valueOf(WATCHED_SUBNET_1))
                .build();
        expectedIntIntents.add(baseIntentBuilder.withSelector(expectedSelector).build());
        // Watch IP Dst == subnet 1
        expectedSelector = DefaultTrafficSelector.builder()
                .matchIPDst(IpPrefix.valueOf(WATCHED_SUBNET_1))
                .build();
        expectedIntIntents.add(baseIntentBuilder.withSelector(expectedSelector).build());
        // Watch IP Src == subnet 2
        expectedSelector = DefaultTrafficSelector.builder()
                .matchIPSrc(IpPrefix.valueOf(WATCHED_SUBNET_2))
                .build();
        expectedIntIntents.add(baseIntentBuilder.withSelector(expectedSelector).build());
        // Watch IP Dst == subnet 2
        expectedSelector = DefaultTrafficSelector.builder()
                .matchIPDst(IpPrefix.valueOf(WATCHED_SUBNET_2))
                .build();
        expectedIntIntents.add(baseIntentBuilder.withSelector(expectedSelector).build());
        // Any packets
        expectedSelector = DefaultTrafficSelector.emptySelector();
        expectedIntIntents.add(baseIntentBuilder.withSelector(expectedSelector).build());

        // The INT intent installation order can be random, so we need to collect
        // all expected INT intents and check if actual intent exists.
        assertAfter(50, 100, () -> assertEquals(5, intentMap.size()));
        intentMap.entrySet().forEach(entry -> {
            IntIntent actualIntIntent = entry.getValue().value();
            assertTrue(expectedIntIntents.contains(actualIntIntent));
        });
    }