1 package com.atlassian.vcache.internal.core.metrics; 2 3 import com.atlassian.vcache.ExternalWriteOperationsUnbuffered; 4 import com.atlassian.vcache.PutPolicy; 5 import org.junit.Test; 6 import org.junit.runner.RunWith; 7 import org.mockito.runners.MockitoJUnitRunner; 8 9 import java.util.concurrent.CompletableFuture; 10 import java.util.concurrent.CompletionStage; 11 12 import static com.atlassian.vcache.internal.MetricLabel.NUMBER_OF_FAILED_PUT; 13 import static com.atlassian.vcache.internal.MetricLabel.NUMBER_OF_FAILED_REMOVE; 14 import static com.atlassian.vcache.internal.MetricLabel.NUMBER_OF_FAILED_REMOVE_ALL; 15 import static com.atlassian.vcache.internal.MetricLabel.TIMED_PUT_CALL; 16 import static com.atlassian.vcache.internal.MetricLabel.TIMED_REMOVE_ALL_CALL; 17 import static com.atlassian.vcache.internal.MetricLabel.TIMED_REMOVE_CALL; 18 import static com.atlassian.vcache.internal.core.metrics.CacheType.EXTERNAL; 19 import static java.util.Collections.singletonList; 20 import static org.hamcrest.Matchers.equalTo; 21 import static org.junit.Assert.assertThat; 22 import static org.mockito.Matchers.anyLong; 23 import static org.mockito.Matchers.eq; 24 import static org.mockito.Mockito.mock; 25 import static org.mockito.Mockito.verify; 26 import static org.mockito.Mockito.verifyNoMoreInteractions; 27 import static org.mockito.Mockito.when; 28 29 @SuppressWarnings("unchecked") 30 @RunWith(MockitoJUnitRunner.class) 31 public abstract class TimedExternalWriteOperationsUnbufferedTest extends TimedExternalCacheTest { 32 protected abstract ExternalWriteOperationsUnbuffered<String> getDelegateOps(); 33 34 protected abstract TimedExternalWriteOperationsUnbuffered<String> getTimed(); 35 36 @Test 37 public void put_success() throws Exception { 38 final CompletableFuture<Boolean> result = mock(CompletableFuture.class); 39 when(result.isCompletedExceptionally()).thenReturn(false); 40 41 when(getDelegateOps().put("foo", "value", PutPolicy.ADD_ONLY)).thenReturn(result); 42 43 final CompletionStage<Boolean> passedResult = getTimed().put("foo", "value", PutPolicy.ADD_ONLY); 44 45 assertThat(passedResult, equalTo(result)); 46 47 verify(metricsRecorder).record(eq(CACHE_NAME), eq(EXTERNAL), eq(TIMED_PUT_CALL), anyLong()); 48 verifyNoMoreInteractions(metricsRecorder); 49 } 50 51 @Test 52 public void put_fail() throws Exception { 53 final CompletableFuture<Boolean> result = mock(CompletableFuture.class); 54 when(result.isCompletedExceptionally()).thenReturn(true); 55 when(getDelegateOps().put("foo", "value", PutPolicy.ADD_ONLY)).thenReturn(result); 56 57 final CompletionStage<Boolean> passedResult = getTimed().put("foo", "value", PutPolicy.ADD_ONLY); 58 59 assertThat(passedResult, equalTo(result)); 60 61 verify(metricsRecorder).record(eq(CACHE_NAME), eq(EXTERNAL), eq(TIMED_PUT_CALL), anyLong()); 62 verify(metricsRecorder).record(eq(CACHE_NAME), eq(EXTERNAL), eq(NUMBER_OF_FAILED_PUT), eq(1L)); 63 verifyNoMoreInteractions(metricsRecorder); 64 } 65 66 @Test 67 public void remove_success() throws Exception { 68 final CompletableFuture<Void> result = mock(CompletableFuture.class); 69 when(result.isCompletedExceptionally()).thenReturn(false); 70 when(getDelegateOps().remove(singletonList("foo"))).thenReturn(result); 71 72 final CompletionStage<Void> passedResult = getTimed().remove("foo"); 73 74 assertThat(passedResult, equalTo(result)); 75 76 verify(metricsRecorder).record(eq(CACHE_NAME), eq(EXTERNAL), eq(TIMED_REMOVE_CALL), anyLong()); 77 verifyNoMoreInteractions(metricsRecorder); 78 } 79 80 @Test 81 public void remove_fail() throws Exception { 82 final CompletableFuture<Void> result = mock(CompletableFuture.class); 83 when(result.isCompletedExceptionally()).thenReturn(true); 84 when(getDelegateOps().remove(singletonList("foo"))).thenReturn(result); 85 86 final CompletionStage<Void> passedResult = getTimed().remove("foo"); 87 88 assertThat(passedResult, equalTo(result)); 89 90 verify(metricsRecorder).record(eq(CACHE_NAME), eq(EXTERNAL), eq(TIMED_REMOVE_CALL), anyLong()); 91 verify(metricsRecorder).record(eq(CACHE_NAME), eq(EXTERNAL), eq(NUMBER_OF_FAILED_REMOVE), eq(1L)); 92 verifyNoMoreInteractions(metricsRecorder); 93 } 94 95 @Test 96 public void removeAll_success() throws Exception { 97 final CompletableFuture<Void> result = mock(CompletableFuture.class); 98 when(result.isCompletedExceptionally()).thenReturn(false); 99 when(getDelegateOps().removeAll()).thenReturn(result); 100 101 final CompletionStage<Void> passedResult = getTimed().removeAll(); 102 103 assertThat(passedResult, equalTo(result)); 104 105 verify(metricsRecorder).record(eq(CACHE_NAME), eq(EXTERNAL), eq(TIMED_REMOVE_ALL_CALL), anyLong()); 106 verifyNoMoreInteractions(metricsRecorder); 107 } 108 109 @Test 110 public void removeAll_fail() throws Exception { 111 final CompletableFuture<Void> result = mock(CompletableFuture.class); 112 when(result.isCompletedExceptionally()).thenReturn(true); 113 when(getDelegateOps().removeAll()).thenReturn(result); 114 115 final CompletionStage<Void> passedResult = getTimed().removeAll(); 116 117 assertThat(passedResult, equalTo(result)); 118 119 verify(metricsRecorder).record(eq(CACHE_NAME), eq(EXTERNAL), eq(TIMED_REMOVE_ALL_CALL), anyLong()); 120 verify(metricsRecorder).record(eq(CACHE_NAME), eq(EXTERNAL), eq(NUMBER_OF_FAILED_REMOVE_ALL), eq(1L)); 121 verifyNoMoreInteractions(metricsRecorder); 122 } 123 }