private MockTelemetryModule generateTelemetryModules(boolean addParameter) {
    AppInsightsConfigurationBuilder mockParser = createMockParser(true, true, false);
    ApplicationInsightsXmlConfiguration appConf = mockParser.build(null);
    appConf.setInstrumentationKey(MOCK_IKEY);

    TelemetryModulesXmlElement modulesXmlElement = new TelemetryModulesXmlElement();
    ArrayList<AddTypeXmlElement> modules = new ArrayList<AddTypeXmlElement>();
    AddTypeXmlElement addXmlElement = new AddTypeXmlElement();
    addXmlElement.setType("com.microsoft.applicationinsights.internal.config.MockTelemetryModule");

    if (addParameter) {
      final ParamXmlElement param1 = new ParamXmlElement();
      param1.setName("param1");
      param1.setValue("value1");

      ArrayList<ParamXmlElement> list = new ArrayList<ParamXmlElement>();
      list.add(param1);

      addXmlElement.setParameters(list);
    }

    modules.add(addXmlElement);
    modulesXmlElement.setAdds(modules);
    appConf.setModules(modulesXmlElement);

    TelemetryConfiguration mockConfiguration = new TelemetryConfiguration();

    initializeWithFactory(mockParser, mockConfiguration);

    MockTelemetryModule module =
        (MockTelemetryModule) mockConfiguration.getTelemetryModules().get(0);

    return module;
  }
  // Suppress non relevant warning due to mockito internal stuff
  @SuppressWarnings("unchecked")
  private AppInsightsConfigurationBuilder createMockParser(
      boolean withChannel, boolean setChannel, boolean withPerformanceModules) {
    AppInsightsConfigurationBuilder mockParser =
        Mockito.mock(AppInsightsConfigurationBuilder.class);

    ApplicationInsightsXmlConfiguration appConf = new ApplicationInsightsXmlConfiguration();

    appConf.setSdkLogger(new SDKLoggerXmlElement());

    if (withChannel) {
      ChannelXmlElement channelXmlElement = new ChannelXmlElement();
      channelXmlElement.setEndpointAddress(MOCK_ENDPOINT);

      String channelType = null;
      if (setChannel) {
        channelType = "com.microsoft.applicationinsights.internal.channel.stdout.StdOutChannel";
        channelXmlElement.setType(channelType);
      }

      appConf.setChannel(channelXmlElement);
    }
    if (withPerformanceModules) {
      PerformanceCountersXmlElement performanceCountersXmlElement =
          new PerformanceCountersXmlElement();
      appConf.setPerformance(performanceCountersXmlElement);
    }
    Mockito.doReturn(appConf).when(mockParser).build(any(InputStream.class));

    return mockParser;
  }
  @Test
  public void testContextInitializers() {
    AppInsightsConfigurationBuilder mockParser = createMockParser(true, true, false);
    ApplicationInsightsXmlConfiguration appConf = mockParser.build(null);
    appConf.setInstrumentationKey(MOCK_IKEY);

    ContextInitializersXmlElement contextInitializersXmlElement =
        new ContextInitializersXmlElement();
    ArrayList<AddTypeXmlElement> contexts = new ArrayList<AddTypeXmlElement>();
    AddTypeXmlElement addXmlElement = new AddTypeXmlElement();
    addXmlElement.setType(
        "com.microsoft.applicationinsights.extensibility.initializer.DeviceInfoContextInitializer");
    contexts.add(addXmlElement);
    contextInitializersXmlElement.setAdds(contexts);
    appConf.setContextInitializers(contextInitializersXmlElement);

    TelemetryConfiguration mockConfiguration = new TelemetryConfiguration();

    initializeWithFactory(mockParser, mockConfiguration);

    assertEquals(mockConfiguration.isTrackingDisabled(), false);
    assertEquals(mockConfiguration.getInstrumentationKey(), MOCK_IKEY);
    assertEquals(mockConfiguration.getContextInitializers().size(), 3);
    assertTrue(mockConfiguration.getTelemetryInitializers().isEmpty());
    assertTrue(mockConfiguration.getChannel() instanceof StdOutChannel);
  }
  @Test
  public void testDefaultChannelWithData() {
    AppInsightsConfigurationBuilder mockParser = createMockParserWithDefaultChannel(true);
    ApplicationInsightsXmlConfiguration appConf = mockParser.build(null);
    appConf.setInstrumentationKey(MOCK_IKEY);
    appConf.getChannel().setDeveloperMode(true);

    TelemetryConfiguration mockConfiguration = new TelemetryConfiguration();

    initializeWithFactory(mockParser, mockConfiguration);

    assertEquals(mockConfiguration.getChannel().isDeveloperMode(), true);
  }
  @Test
  public void testInitializeWithEmptyGetInstrumentationKey() throws Exception {
    AppInsightsConfigurationBuilder mockParser = createMockParser(false, true, false);
    ApplicationInsightsXmlConfiguration appConf = mockParser.build(null);
    appConf.setInstrumentationKey("");

    TelemetryConfiguration mockConfiguration = new TelemetryConfiguration();

    initializeWithFactory(mockParser, mockConfiguration);

    assertEquals(mockConfiguration.isTrackingDisabled(), false);
    assertTrue(mockConfiguration.getChannel() instanceof InProcessTelemetryChannel);
  }
  private void ikeyTest(String configurationIkey, String expectedIkey) {
    // Make sure that there is no exception when fetching the i-key by having both
    // the i-key and channel in the configuration, otherwise the channel won't be instantiated
    AppInsightsConfigurationBuilder mockParser = createMockParser(true, false, false);

    ApplicationInsightsXmlConfiguration appConf = new ApplicationInsightsXmlConfiguration();
    appConf.setInstrumentationKey(configurationIkey);
    Mockito.doReturn(appConf).when(mockParser).build(any(InputStream.class));

    TelemetryConfiguration mockConfiguration = new TelemetryConfiguration();

    initializeWithFactory(mockParser, mockConfiguration);
    assertEquals(mockConfiguration.getInstrumentationKey(), expectedIkey);
    assertTrue(mockConfiguration.getChannel() instanceof InProcessTelemetryChannel);
  }
  @Test
  public void testInitializeAllDefaults() throws Exception {
    AppInsightsConfigurationBuilder mockParser = createMockParser(true, true, false);
    ApplicationInsightsXmlConfiguration appConf = mockParser.build(null);
    appConf.setInstrumentationKey(MOCK_IKEY);

    TelemetryConfiguration mockConfiguration = new TelemetryConfiguration();

    initializeWithFactory(mockParser, mockConfiguration);

    assertEquals(mockConfiguration.isTrackingDisabled(), false);
    assertEquals(mockConfiguration.getInstrumentationKey(), MOCK_IKEY);
    assertEquals(mockConfiguration.getContextInitializers().size(), 2);
    assertTrue(mockConfiguration.getTelemetryInitializers().isEmpty());
    assertTrue(mockConfiguration.getChannel() instanceof StdOutChannel);
  }
  @Test
  public void testPerformanceModules() {
    AppInsightsConfigurationBuilder mockParser = createMockParser(true, true, true);
    ApplicationInsightsXmlConfiguration appConf = mockParser.build(null);
    appConf.setInstrumentationKey(MOCK_IKEY);
    appConf.getChannel().setDeveloperMode(true);

    TelemetryConfigurationFactory.INSTANCE.setPerformanceCountersSection(
        "com.microsoft.applicationinsights.internal.config");
    TelemetryConfiguration mockConfiguration = new TelemetryConfiguration();

    initializeWithFactory(mockParser, mockConfiguration);

    assertEquals(mockConfiguration.getTelemetryModules().size(), 1);
    assertTrue(mockConfiguration.getTelemetryModules().get(0) instanceof MockPerformanceModule);
    assertTrue(
        ((MockPerformanceModule) mockConfiguration.getTelemetryModules().get(0))
            .initializeWasCalled);
    assertTrue(
        ((MockPerformanceModule) mockConfiguration.getTelemetryModules().get(0))
            .addConfigurationDataWasCalled);
  }
  @Test
  public void testWithEmptySections() {
    AppInsightsConfigurationBuilder mockParser =
        Mockito.mock(AppInsightsConfigurationBuilder.class);

    ApplicationInsightsXmlConfiguration appConf = new ApplicationInsightsXmlConfiguration();
    appConf.setInstrumentationKey(MOCK_IKEY);
    appConf.setTelemetryInitializers(null);
    appConf.setContextInitializers(null);
    appConf.setModules(null);
    appConf.setSdkLogger(null);
    Mockito.doReturn(appConf).when(mockParser).build(any(InputStream.class));

    TelemetryConfiguration mockConfiguration = new TelemetryConfiguration();

    initializeWithFactory(mockParser, mockConfiguration);

    assertEquals(mockConfiguration.isTrackingDisabled(), false);
    assertEquals(mockConfiguration.getInstrumentationKey(), MOCK_IKEY);
    assertEquals(mockConfiguration.getContextInitializers().size(), 2);
    assertTrue(mockConfiguration.getChannel() instanceof InProcessTelemetryChannel);
  }