@Test public void testResolveInstrumentationKeyWithPendingStatus() { //setup MockProfileFetcher mockFetcher = new MockProfileFetcher(); mockFetcher.setAppIdToReturn("appId"); mockFetcher.setResultStatus(ProfileFetcherResultTaskStatus.PENDING); InstrumentationKeyResolver.INSTANCE.setProfileFetcher(mockFetcher); //run String appId = InstrumentationKeyResolver.INSTANCE.resolveInstrumentationKey("ikey"); //validate Assert.assertNull(appId); Assert.assertEquals(1, mockFetcher.callCount()); //mimic calling resolver again after some time mockFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); appId = InstrumentationKeyResolver.INSTANCE.resolveInstrumentationKey("ikey"); Assert.assertEquals("cid-v1:appId", appId); //fetcher will be called again since the task was pending (i.e. not yet in the cache) Assert.assertEquals(2, mockFetcher.callCount()); }
@Test public void testResolveInstrumentationKey() { //setup MockProfileFetcher mockFetcher = new MockProfileFetcher(); mockFetcher.setAppIdToReturn("id1"); InstrumentationKeyResolver.INSTANCE.setProfileFetcher(mockFetcher); //run String appId = InstrumentationKeyResolver.INSTANCE.resolveInstrumentationKey("ikey"); //validate Assert.assertEquals("cid-v1:id1", appId); Assert.assertEquals(1, mockFetcher.callCount()); }
@Test public void testResponseHeaderIsSetForRequestContext() throws Exception { mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); mockProfileFetcher.setAppIdToReturn("myId"); Map<String, List<String>> headers = HttpHelper.sendRequestAndGetHeaders(server.getPortNumber()); List<String> requestContextValues = headers.get(TelemetryCorrelationUtils.REQUEST_CONTEXT_HEADER_NAME); Assert.assertNotNull(requestContextValues); Assert.assertTrue(requestContextValues.size() == 1); String requestContext = requestContextValues.get(0); Assert.assertEquals("appId=cid-v1:myId", requestContext); }
@Test public void testInstrumentationKeyIsResolvedDuringModuleInit() { Assert.assertEquals(0, mockProfileFetcher.callCount()); String ikey = TelemetryConfiguration.getActive().getInstrumentationKey(); //calling resolver now will actually retrieve the appId from the completed task mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); mockProfileFetcher.setAppIdToReturn("someAppId"); String appId = InstrumentationKeyResolver.INSTANCE.resolveInstrumentationKey(ikey); Assert.assertEquals(1, mockProfileFetcher.callCount()); Assert.assertEquals("cid-v1:someAppId", appId); //calling it again should retrieve appId from cache (i.e. fetcher call count remains 2) appId = InstrumentationKeyResolver.INSTANCE.resolveInstrumentationKey(ikey); Assert.assertEquals(1, mockProfileFetcher.callCount()); Assert.assertEquals("cid-v1:someAppId", appId); }
@Before public void testInitialize() { // initialize mock profile fetcher (for resolving ikeys to appIds) mockProfileFetcher = new MockProfileFetcher(); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.PENDING); InstrumentationKeyResolver.INSTANCE.setProfileFetcher(mockProfileFetcher); InstrumentationKeyResolver.INSTANCE.clearCache(); defaultModule = new WebRequestTrackingTelemetryModule(); defaultModule.initialize(TelemetryConfiguration.getActive()); channel.reset(); }
@Before public void testInitialize() { // initialize mock profile fetcher (for resolving ikeys to appIds) mockProfileFetcher = new MockProfileFetcher(); InstrumentationKeyResolver.INSTANCE.setProfileFetcher(mockProfileFetcher); InstrumentationKeyResolver.INSTANCE.clearCache(); }
@Test public void testTracestateIsNotResolvedWithNullRequest() { Map<String, String> headers = new HashMap<>(); String incomingTracestate = getTracestateHeaderValue("id1"); headers.put(TraceContextCorrelation.TRACESTATE_HEADER_NAME, incomingTracestate); RequestTelemetry requestTelemetry = new RequestTelemetry(); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); mockProfileFetcher.setAppIdToReturn("id2"); TraceContextCorrelation.resolveRequestSource(null, requestTelemetry, "ikey1"); Assert.assertNull(requestTelemetry.getSource()); }
@Test public void testIkeyResolvedFromCache() { //setup MockProfileFetcher mockFetcher = new MockProfileFetcher(); mockFetcher.setAppIdToReturn("appId"); InstrumentationKeyResolver.INSTANCE.setProfileFetcher(mockFetcher); //run Assert.assertEquals(0, mockFetcher.callCount()); InstrumentationKeyResolver.INSTANCE.resolveInstrumentationKey("ikey"); Assert.assertEquals(1, mockFetcher.callCount()); //resolving the same ikey should not generate new call to fetcher InstrumentationKeyResolver.INSTANCE.resolveInstrumentationKey("ikey"); Assert.assertEquals(1, mockFetcher.callCount()); //resolving another ikey increases call count InstrumentationKeyResolver.INSTANCE.resolveInstrumentationKey("ikey2"); Assert.assertEquals(2, mockFetcher.callCount()); } }
@Test public void testInstrumentationKeyIsResolvedIfModifiedAtRuntime() { Assert.assertEquals(0, mockProfileFetcher.callCount()); mockProfileFetcher.setAppIdToReturn("id2"); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); Assert.assertEquals(1, mockProfileFetcher.callCount()); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.PENDING); mockProfileFetcher.setAppIdToReturn("id3"); defaultModule.onEndRequest(request, null); Assert.assertEquals(2, mockProfileFetcher.callCount()); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); Assert.assertEquals(3, mockProfileFetcher.callCount()); Assert.assertEquals(3, mockProfileFetcher.callCount()); ServletRequest request3 = ServletUtils.createServletRequestWithHeaders(headers); defaultModule.onBeginRequest(request3, response); Assert.assertEquals(3, mockProfileFetcher.callCount()); Assert.assertEquals(3, mockProfileFetcher.callCount()); RequestTelemetry requestTelemetry3 = ThreadContext.getRequestTelemetryContext().getHttpRequestTelemetry(); Assert.assertEquals("cid-v1:id1", requestTelemetry3.getSource());
@Before public void testInitialize() { // initialize mock profile fetcher (for resolving ikeys to appIds) mockProfileFetcher = new MockProfileFetcher(); InstrumentationKeyResolver.INSTANCE.setProfileFetcher(mockProfileFetcher); InstrumentationKeyResolver.INSTANCE.clearCache(); }
@Test public void testTracestateIsNotResolvedIfHeaderIsEmpty() { Map<String, String> headers = new HashMap<>(); headers.put(TraceContextCorrelation.TRACESTATE_HEADER_NAME, ""); HttpServletRequest request = ServletUtils.createServletRequestWithHeaders(headers); RequestTelemetry requestTelemetry = new RequestTelemetry(); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); mockProfileFetcher.setAppIdToReturn("id1"); TraceContextCorrelation.resolveRequestSource(request, requestTelemetry, "ikey1"); Assert.assertNull(requestTelemetry.getSource()); }
@Test public void testResolveInstrumentationKeyWithFailedStatus() { //setup MockProfileFetcher mockFetcher = new MockProfileFetcher(); mockFetcher.setAppIdToReturn("appId"); mockFetcher.setResultStatus(ProfileFetcherResultTaskStatus.FAILED); InstrumentationKeyResolver.INSTANCE.setProfileFetcher(mockFetcher); //run String appId = InstrumentationKeyResolver.INSTANCE.resolveInstrumentationKey("ikey"); //validate Assert.assertNull(appId); Assert.assertEquals(1, mockFetcher.callCount()); //mimic calling resolver again after some time mockFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); appId = InstrumentationKeyResolver.INSTANCE.resolveInstrumentationKey("ikey"); Assert.assertEquals("cid-v1:appId", appId); //fetcher will be called again since the previous attempt failed Assert.assertEquals(2, mockFetcher.callCount()); }
@Test public void testTracestateIsNotResolvedWithNullIkey() { Map<String, String> headers = new HashMap<>(); String incomingTracestate = getTracestateHeaderValue("id1"); headers.put(TraceContextCorrelation.TRACESTATE_HEADER_NAME, incomingTracestate); HttpServletRequest request = ServletUtils.createServletRequestWithHeaders(headers); RequestTelemetry requestTelemetry = new RequestTelemetry(); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); mockProfileFetcher.setAppIdToReturn("id2"); TraceContextCorrelation.resolveRequestSource(request, requestTelemetry, null); Assert.assertNull(requestTelemetry.getSource()); }
@Test public void testResolveInstrumentationKeyWhenExceptionThrown() { //setup MockProfileFetcher mockFetcher = new MockProfileFetcher(); mockFetcher.setAppIdToReturn("appId"); mockFetcher.setExceptionOn(true); InstrumentationKeyResolver.INSTANCE.setProfileFetcher(mockFetcher); //run String appId = InstrumentationKeyResolver.INSTANCE.resolveInstrumentationKey("ikey"); //validate no exception is thrown back to the caller and appId is null Assert.assertNull(appId); Assert.assertEquals(1, mockFetcher.callCount()); //mimic calling resolver again after some time mockFetcher.setExceptionOn(false); mockFetcher.setResultStatus(ProfileFetcherResultTaskStatus.PENDING); appId = InstrumentationKeyResolver.INSTANCE.resolveInstrumentationKey("ikey"); //result is still null since fetcher returns a task in pending state Assert.assertNull(appId); //fetcher will be called again since the previous attempt failed Assert.assertEquals(2, mockFetcher.callCount()); //mimic final call which returns the completed task mockFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); appId = InstrumentationKeyResolver.INSTANCE.resolveInstrumentationKey("ikey"); Assert.assertEquals("cid-v1:appId", appId); Assert.assertEquals(3, mockFetcher.callCount()); }
@Test public void testRequestContextIsNotResolvedWithNullRequest() { //setup Hashtable<String, String> headers = new Hashtable<String, String>(); String incomingRequestContextHeader = getRequestContextHeaderValue("id1", "Worker Role"); headers.put(TelemetryCorrelationUtils.REQUEST_CONTEXT_HEADER_NAME, incomingRequestContextHeader); RequestTelemetry requestTelemetry = new RequestTelemetry(); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); mockProfileFetcher.setAppIdToReturn("id2"); //run TelemetryCorrelationUtils.resolveRequestSource(null, requestTelemetry, "ike1"); //validate Assert.assertNull(requestTelemetry.getSource()); }
@Test public void testTracestateIsNotResolvedWhenHeaderNotPresent() { Map<String, String> headers = new HashMap<>(); HttpServletRequest request = ServletUtils.createServletRequestWithHeaders(headers); RequestTelemetry requestTelemetry = new RequestTelemetry(); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); mockProfileFetcher.setAppIdToReturn("id1"); TraceContextCorrelation.resolveRequestSource(request, requestTelemetry, "ikey1"); Assert.assertNull(requestTelemetry.getSource()); }
@Test public void testTracestateIsResolved() { Map<String, String> headers = new HashMap<>(); String incomingTracestate = getTracestateHeaderValue("id1"); headers.put(TraceContextCorrelation.TRACESTATE_HEADER_NAME, incomingTracestate); HttpServletRequest request = ServletUtils.createServletRequestWithHeaders(headers); RequestTelemetry requestTelemetry = new RequestTelemetry(); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); mockProfileFetcher.setAppIdToReturn("id2"); TraceContextCorrelation.resolveRequestSource(request, requestTelemetry, "ikey1"); Assert.assertEquals("cid-v1:id1", requestTelemetry.getSource()); }
@Test public void testTracestateIsNotResolvedWithNullRequestTelemetry() { Map<String, String> headers = new HashMap<>(); String incomingTracestate = getTracestateHeaderValue("id1"); headers.put(TraceContextCorrelation.TRACESTATE_HEADER_NAME, incomingTracestate); HttpServletRequest request = ServletUtils.createServletRequestWithHeaders(headers); RequestTelemetry requestTelemetry = new RequestTelemetry(); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); mockProfileFetcher.setAppIdToReturn("id2"); TraceContextCorrelation.resolveRequestSource(request, null, "ikey1"); Assert.assertNull(requestTelemetry.getSource()); }
@Test public void testRequestContextIsNotResolvedIfNoHeaderPresent() { //setup Hashtable<String, String> headers = new Hashtable<String, String>(); HttpServletRequest request = ServletUtils.createServletRequestWithHeaders(headers); RequestTelemetry requestTelemetry = new RequestTelemetry(); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); mockProfileFetcher.setAppIdToReturn("id1"); //run TelemetryCorrelationUtils.resolveRequestSource(request, requestTelemetry, "ikey1"); //validate source is not set as the incoming request had no Request-Context header. Assert.assertNull(requestTelemetry.getSource()); }
@Test(expected = AssertionError.class) public void testTraceStateIsNotResolvedIfHeaderDoesntHaveAzureComponent() { Map<String, String> headers = new HashMap<>(); // get tracestate with non azure component String incomingTracestate = getTracestateHeaderValue(null); headers.put(TraceContextCorrelation.TRACESTATE_HEADER_NAME, incomingTracestate); HttpServletRequest request = ServletUtils.createServletRequestWithHeaders(headers); RequestTelemetry requestTelemetry = new RequestTelemetry(); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); mockProfileFetcher.setAppIdToReturn("id1"); TraceContextCorrelation.resolveRequestSource(request, requestTelemetry, "ikey1"); Assert.assertNull(requestTelemetry.getSource()); }