private void simulateTransportError(int delegateFrom, int count) { for (int i = 0; i < count; i++) { int delegateId = delegateFrom + i; when(clientFactory.newClient(Matchers.<EurekaEndpoint>anyVararg())).thenReturn(clusterDelegates.get(delegateId)); when(requestExecutor.execute(clusterDelegates.get(delegateId))).thenThrow(new TransportException("simulated network error")); } }
@Test public void testRequestsReuseSameConnectionIfThereIsNoError() throws Exception { when(clientFactory.newClient(Matchers.<EurekaEndpoint>anyVararg())).thenReturn(clusterDelegates.get(0)); when(requestExecutor.execute(clusterDelegates.get(0))).thenReturn(EurekaHttpResponse.status(200)); // First request creates delegate, second reuses it for (int i = 0; i < 3; i++) { EurekaHttpResponse<Void> httpResponse = retryableClient.execute(requestExecutor); assertThat(httpResponse.getStatusCode(), is(equalTo(200))); } verify(clientFactory, times(1)).newClient(Matchers.<EurekaEndpoint>anyVararg()); verify(requestExecutor, times(3)).execute(clusterDelegates.get(0)); }
@Test public void testRequestIsRetriedOnConnectionError() throws Exception { when(clientFactory.newClient(Matchers.<EurekaEndpoint>anyVararg())).thenReturn(clusterDelegates.get(0), clusterDelegates.get(1)); when(requestExecutor.execute(clusterDelegates.get(0))).thenThrow(new TransportException("simulated network error")); when(requestExecutor.execute(clusterDelegates.get(1))).thenReturn(EurekaHttpResponse.status(200)); EurekaHttpResponse<Void> httpResponse = retryableClient.execute(requestExecutor); assertThat(httpResponse.getStatusCode(), is(equalTo(200))); verify(clientFactory, times(2)).newClient(Matchers.<EurekaEndpoint>anyVararg()); verify(requestExecutor, times(1)).execute(clusterDelegates.get(0)); verify(requestExecutor, times(1)).execute(clusterDelegates.get(1)); }
@Test public void test5xxStatusCodeResultsInRequestRetry() throws Exception { when(clientFactory.newClient(Matchers.<EurekaEndpoint>anyVararg())).thenReturn(clusterDelegates.get(0), clusterDelegates.get(1)); when(requestExecutor.execute(clusterDelegates.get(0))).thenReturn(EurekaHttpResponse.status(500)); when(requestExecutor.execute(clusterDelegates.get(1))).thenReturn(EurekaHttpResponse.status(200)); EurekaHttpResponse<Void> httpResponse = retryableClient.execute(requestExecutor); assertThat(httpResponse.getStatusCode(), is(equalTo(200))); verify(requestExecutor, times(1)).execute(clusterDelegates.get(0)); verify(requestExecutor, times(1)).execute(clusterDelegates.get(1)); }
@Before public void setUp() throws Exception { this.databaseOperator = mock(DatabaseOperator.class); this.storage = mock(Storage.class); when(this.databaseOperator.query( eq(StorageCleaner.SQL_FETCH_PVR), anyObject(), eq(TEST_PROJECT_ID))) .thenReturn(Arrays.asList("14/14-9.zip", "14/14-8.zip", "14/14-7.zip")); when(this.storage.delete("14/14-8.zip")).thenReturn(true); when(this.storage.delete("14/14-7.zip")).thenReturn(false); when(this.databaseOperator.update(any(), anyVararg())).thenReturn(1); }
@Test public void testQuarantineListIsResetWhenNoMoreServerAreAvailable() throws Exception { // First two call fail simulateTransportError(0, CLUSTER_SIZE); for (int i = 0; i < 2; i++) { executeWithTransportErrorExpectation(); } // Second call, should reset cluster quarantine list, and hit health node 0 when(clientFactory.newClient(Matchers.<EurekaEndpoint>anyVararg())).thenReturn(clusterDelegates.get(0)); reset(requestExecutor); when(requestExecutor.execute(clusterDelegates.get(0))).thenReturn(EurekaHttpResponse.status(200)); retryableClient.execute(requestExecutor); }
@Test public void testNonRedirectedRequestsAreServedByFirstClient() throws Exception { when(factory.newClient(Matchers.<EurekaEndpoint>anyVararg())).thenReturn(sourceClient); when(sourceClient.getApplications()).thenReturn( anEurekaHttpResponse(200, new Applications()).type(MediaType.APPLICATION_JSON_TYPE).build() ); RedirectingEurekaHttpClient httpClient = new RedirectingEurekaHttpClient(SERVICE_URL, factory, dnsService); httpClient.getApplications(); verify(factory, times(1)).newClient(Matchers.<EurekaEndpoint>anyVararg()); verify(sourceClient, times(1)).getApplications(); }
@Test public void testRedirectsAreFollowedAndClientIsPinnedToTheLastServer() throws Exception { setupRedirect(); RedirectingEurekaHttpClient httpClient = new RedirectingEurekaHttpClient(SERVICE_URL, factory, dnsService); // First call pins client to resolved IP httpClient.getApplications(); verify(factory, times(2)).newClient(Matchers.<EurekaEndpoint>anyVararg()); verify(sourceClient, times(1)).getApplications(); verify(dnsService, times(1)).resolveIp("another.discovery.test"); verify(redirectedClient, times(1)).getApplications(); // Second call goes straight to the same address httpClient.getApplications(); verify(factory, times(2)).newClient(Matchers.<EurekaEndpoint>anyVararg()); verify(sourceClient, times(1)).getApplications(); verify(dnsService, times(1)).resolveIp("another.discovery.test"); verify(redirectedClient, times(2)).getApplications(); }
public void setupRedirect() { when(factory.newClient(Matchers.<EurekaEndpoint>anyVararg())).thenReturn(sourceClient, redirectedClient); when(sourceClient.getApplications()).thenReturn( anEurekaHttpResponse(302, Applications.class) .headers(HttpHeaders.LOCATION, "http://another.discovery.test/eureka/v2/apps") .build() ); when(dnsService.resolveIp("another.discovery.test")).thenReturn("192.168.0.1"); when(redirectedClient.getApplications()).thenReturn( anEurekaHttpResponse(200, new Applications()).type(MediaType.APPLICATION_JSON_TYPE).build() ); }
@Test(timeout = 10000) public void testConcurrentRequestsLeaveLastSuccessfulDelegate() throws Exception { when(clientFactory.newClient(Matchers.<EurekaEndpoint>anyVararg())).thenReturn(clusterDelegates.get(0), clusterDelegates.get(1)); BlockingRequestExecutor executor0 = new BlockingRequestExecutor(); BlockingRequestExecutor executor1 = new BlockingRequestExecutor(); Thread thread0 = new Thread(new RequestExecutorRunner(executor0)); Thread thread1 = new Thread(new RequestExecutorRunner(executor1)); // Run parallel requests thread0.start(); executor0.awaitReady(); thread1.start(); executor1.awaitReady(); // Complete request, first thread first, second afterwards executor0.complete(); thread0.join(); executor1.complete(); thread1.join(); // Verify subsequent request done on delegate1 when(requestExecutor.execute(clusterDelegates.get(1))).thenReturn(EurekaHttpResponse.status(200)); EurekaHttpResponse<Void> httpResponse = retryableClient.execute(requestExecutor); assertThat(httpResponse.getStatusCode(), is(equalTo(200))); verify(clientFactory, times(2)).newClient(Matchers.<EurekaEndpoint>anyVararg()); verify(requestExecutor, times(0)).execute(clusterDelegates.get(0)); verify(requestExecutor, times(1)).execute(clusterDelegates.get(1)); }
@Test public void testSelectTracksWithMultipleAudioTracksReturnsAdaptiveTrackSelection() throws Exception { TrackSelection adaptiveTrackSelection = mock(TrackSelection.class); TrackSelection.Factory adaptiveTrackSelectionFactory = mock(TrackSelection.Factory.class); when(adaptiveTrackSelectionFactory.createTrackSelection(any(), any(), anyVararg())) .thenReturn(adaptiveTrackSelection); trackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory); trackSelector.init(invalidationListener, bandwidthMeter); TrackGroupArray trackGroupArray = singleTrackGroup(AUDIO_FORMAT, AUDIO_FORMAT); TrackSelectorResult result = trackSelector.selectTracks( new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroupArray); assertThat(result.length).isEqualTo(1); assertThat(result.selections.get(0)).isEqualTo(adaptiveTrackSelection); verify(adaptiveTrackSelectionFactory) .createTrackSelection(trackGroupArray.get(0), bandwidthMeter, 0, 1); }
@Test public void testSelectTracksWithMultipleVideoTracksReturnsAdaptiveTrackSelection() throws Exception { TrackSelection adaptiveTrackSelection = mock(TrackSelection.class); TrackSelection.Factory adaptiveTrackSelectionFactory = mock(TrackSelection.Factory.class); when(adaptiveTrackSelectionFactory.createTrackSelection(any(), any(), anyVararg())) .thenReturn(adaptiveTrackSelection); trackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory); trackSelector.init(invalidationListener, bandwidthMeter); TrackGroupArray trackGroupArray = singleTrackGroup(VIDEO_FORMAT, VIDEO_FORMAT); TrackSelectorResult result = trackSelector.selectTracks( new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroupArray); assertThat(result.length).isEqualTo(1); assertThat(result.selections.get(0)).isEqualTo(adaptiveTrackSelection); verify(adaptiveTrackSelectionFactory) .createTrackSelection(trackGroupArray.get(0), bandwidthMeter, 0, 1); }
@Test public void testOnConnectionErrorPinnedClientIsDestroyed() throws Exception { setupRedirect(); RedirectingEurekaHttpClient httpClient = new RedirectingEurekaHttpClient(SERVICE_URL, factory, dnsService); // First call pins client to resolved IP httpClient.getApplications(); verify(redirectedClient, times(1)).getApplications(); // Trigger connection error when(redirectedClient.getApplications()).thenThrow(new TransportException("simulated network error")); try { httpClient.getApplications(); fail("Expected transport error"); } catch (Exception ignored) { } // Subsequent connection shall create new httpClient reset(factory, sourceClient, dnsService, redirectedClient); setupRedirect(); httpClient.getApplications(); verify(factory, times(2)).newClient(Matchers.<EurekaEndpoint>anyVararg()); verify(sourceClient, times(1)).getApplications(); verify(dnsService, times(1)).resolveIp("another.discovery.test"); verify(redirectedClient, times(1)).getApplications(); } }
@Test public void testSelectTracksWithMultipleAudioTracksOverrideReturnsAdaptiveTrackSelection() throws Exception { TrackSelection adaptiveTrackSelection = mock(TrackSelection.class); TrackSelection.Factory adaptiveTrackSelectionFactory = mock(TrackSelection.Factory.class); when(adaptiveTrackSelectionFactory.createTrackSelection(any(), any(), anyVararg())) .thenReturn(adaptiveTrackSelection); trackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory); trackSelector.init(invalidationListener, bandwidthMeter); TrackGroupArray trackGroupArray = singleTrackGroup(AUDIO_FORMAT, AUDIO_FORMAT, AUDIO_FORMAT); trackSelector.setParameters( trackSelector .buildUponParameters() .setSelectionOverride( /* rendererIndex= */ 0, trackGroupArray, new SelectionOverride(/* groupIndex= */ 0, /* tracks= */ 1, 2))); TrackSelectorResult result = trackSelector.selectTracks( new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroupArray); assertThat(result.length).isEqualTo(1); assertThat(result.selections.get(0)).isEqualTo(adaptiveTrackSelection); verify(adaptiveTrackSelectionFactory) .createTrackSelection(trackGroupArray.get(0), bandwidthMeter, 1, 2); }
@Test public void testSelectTracksWithMultipleVideoTracksOverrideReturnsAdaptiveTrackSelection() throws Exception { TrackSelection adaptiveTrackSelection = mock(TrackSelection.class); TrackSelection.Factory adaptiveTrackSelectionFactory = mock(TrackSelection.Factory.class); when(adaptiveTrackSelectionFactory.createTrackSelection(any(), any(), anyVararg())) .thenReturn(adaptiveTrackSelection); trackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory); trackSelector.init(invalidationListener, bandwidthMeter); TrackGroupArray trackGroupArray = singleTrackGroup(VIDEO_FORMAT, VIDEO_FORMAT, VIDEO_FORMAT); trackSelector.setParameters( trackSelector .buildUponParameters() .setSelectionOverride( /* rendererIndex= */ 0, trackGroupArray, new SelectionOverride(/* groupIndex= */ 0, /* tracks= */ 1, 2))); TrackSelectorResult result = trackSelector.selectTracks( new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroupArray); assertThat(result.length).isEqualTo(1); assertThat(result.selections.get(0)).isEqualTo(adaptiveTrackSelection); verify(adaptiveTrackSelectionFactory) .createTrackSelection(trackGroupArray.get(0), bandwidthMeter, 1, 2); }
@Test public void shouldThrowOnIndexEntryConflict() throws Exception { // given IndexUpdater actual = mock( IndexUpdater.class ); IndexReader reader = mock( IndexReader.class ); when( reader.query( anyVararg() ) ).thenAnswer( invocation -> iterator( 101, 202 ) ); DeferredConflictCheckingIndexUpdater updater = new DeferredConflictCheckingIndexUpdater( actual, () -> reader, descriptor ); // when updater.process( add( 0, descriptor, tuple( 10, 11 ) ) ); try { updater.close(); fail( "Should have failed" ); } catch ( IndexEntryConflictException e ) { // then good assertThat( e.getMessage(), containsString( "101" ) ); assertThat( e.getMessage(), containsString( "202" ) ); } }
when( reader.query( anyVararg() ) ).thenAnswer( invocation -> iterator( 0 ) ); long nodeId = 0; List<IndexEntryUpdate<IndexDescriptor>> updates = new ArrayList<>();
@Test public void testDecisionDefinitionRetrievalByEmptyList() { given() .queryParam("decisionDefinitionIdIn", "") .then().expect() .statusCode(Status.OK.getStatusCode()) .when() .get(DECISION_DEFINITION_QUERY_URL); // assert query invocation InOrder inOrder = Mockito.inOrder(mockedQuery); inOrder.verify(mockedQuery, never()).decisionDefinitionIdIn(Matchers.<String[]>anyVararg()); inOrder.verify(mockedQuery).list(); }
@Test public void testCaseDefinitionRetrievalByEmptyList() { given() .queryParam("caseDefinitionIdIn", "") .then().expect() .statusCode(Status.OK.getStatusCode()) .when() .get(CASE_DEFINITION_QUERY_URL); // assert query invocation InOrder inOrder = Mockito.inOrder(mockedQuery); inOrder.verify(mockedQuery, never()).caseDefinitionIdIn(Matchers.<String[]>anyVararg()); inOrder.verify(mockedQuery).list(); }
@Test public void testDecisionRequirementsDefinitionRetrievalByEmptyList() { given() .queryParam("decisionRequirementsDefinitionIdIn", "") .then().expect() .statusCode(Status.OK.getStatusCode()) .when() .get(DECISION_REQUIREMENTS_DEFINITION_QUERY_URL); // assert query invocation InOrder inOrder = Mockito.inOrder(mockedQuery); inOrder.verify(mockedQuery, never()).decisionRequirementsDefinitionIdIn(Matchers.<String[]>anyVararg()); inOrder.verify(mockedQuery).list(); }