1 package com.atlassian.vcache.internal.core.metrics;
2
3 import java.util.concurrent.CompletableFuture;
4
5 import com.atlassian.vcache.ExternalWriteOperationsUnbuffered;
6 import com.atlassian.vcache.PutPolicy;
7
8 import org.junit.Test;
9 import org.junit.runner.RunWith;
10 import org.mockito.runners.MockitoJUnitRunner;
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 @RunWith(MockitoJUnitRunner.class)
30 public abstract class TimedExternalWriteOperationsUnbufferedTest extends TimedExternalCacheTest
31 {
32 protected abstract ExternalWriteOperationsUnbuffered<String> getDelegateOps();
33 protected abstract TimedExternalWriteOperationsUnbuffered<String> getTimed();
34
35 @Test
36 public void put_success() throws Exception
37 {
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 CompletableFuture<Boolean> passedResult = getTimed().put("foo", "value", PutPolicy.ADD_ONLY);
44
45 assertThat(passedResult, equalTo(result));
46
47 verify(metricsCollector).record(eq(EXTERNAL), eq(CACHE_NAME), eq(TIMED_PUT_CALL), anyLong());
48 verifyNoMoreInteractions(metricsCollector);
49 }
50
51 @Test
52 public void put_fail() throws Exception
53 {
54 final CompletableFuture<Boolean> result = mock(CompletableFuture.class);
55 when(result.isCompletedExceptionally()).thenReturn(true);
56 when(getDelegateOps().put("foo", "value", PutPolicy.ADD_ONLY)).thenReturn(result);
57
58 final CompletableFuture<Boolean> passedResult = getTimed().put("foo", "value", PutPolicy.ADD_ONLY);
59
60 assertThat(passedResult, equalTo(result));
61
62 verify(metricsCollector).record(eq(EXTERNAL), eq(CACHE_NAME), eq(TIMED_PUT_CALL), anyLong());
63 verify(metricsCollector).record(eq(EXTERNAL), eq(CACHE_NAME), eq(NUMBER_OF_FAILED_PUT), eq(1L));
64 verifyNoMoreInteractions(metricsCollector);
65 }
66
67 @Test
68 public void remove_success() throws Exception
69 {
70 final CompletableFuture<Void> result = mock(CompletableFuture.class);
71 when(result.isCompletedExceptionally()).thenReturn(false);
72 when(getDelegateOps().remove(singletonList("foo"))).thenReturn(result);
73
74 final CompletableFuture<Void> passedResult = getTimed().remove("foo");
75
76 assertThat(passedResult, equalTo(result));
77
78 verify(metricsCollector).record(eq(EXTERNAL), eq(CACHE_NAME), eq(TIMED_REMOVE_CALL), anyLong());
79 verifyNoMoreInteractions(metricsCollector);
80 }
81
82 @Test
83 public void remove_fail() throws Exception
84 {
85 final CompletableFuture<Void> result = mock(CompletableFuture.class);
86 when(result.isCompletedExceptionally()).thenReturn(true);
87 when(getDelegateOps().remove(singletonList("foo"))).thenReturn(result);
88
89 final CompletableFuture<Void> passedResult = getTimed().remove("foo");
90
91 assertThat(passedResult, equalTo(result));
92
93 verify(metricsCollector).record(eq(EXTERNAL), eq(CACHE_NAME), eq(TIMED_REMOVE_CALL), anyLong());
94 verify(metricsCollector).record(eq(EXTERNAL), eq(CACHE_NAME), eq(NUMBER_OF_FAILED_REMOVE), eq(1L));
95 verifyNoMoreInteractions(metricsCollector);
96 }
97
98 @Test
99 public void removeAll_success() throws Exception
100 {
101 final CompletableFuture<Void> result = mock(CompletableFuture.class);
102 when(result.isCompletedExceptionally()).thenReturn(false);
103 when(getDelegateOps().removeAll()).thenReturn(result);
104
105 final CompletableFuture<Void> passedResult = getTimed().removeAll();
106
107 assertThat(passedResult, equalTo(result));
108
109 verify(metricsCollector).record(eq(EXTERNAL), eq(CACHE_NAME), eq(TIMED_REMOVE_ALL_CALL), anyLong());
110 verifyNoMoreInteractions(metricsCollector);
111 }
112
113 @Test
114 public void removeAll_fail() throws Exception
115 {
116 final CompletableFuture<Void> result = mock(CompletableFuture.class);
117 when(result.isCompletedExceptionally()).thenReturn(true);
118 when(getDelegateOps().removeAll()).thenReturn(result);
119
120 final CompletableFuture<Void> passedResult = getTimed().removeAll();
121
122 assertThat(passedResult, equalTo(result));
123
124 verify(metricsCollector).record(eq(EXTERNAL), eq(CACHE_NAME), eq(TIMED_REMOVE_ALL_CALL), anyLong());
125 verify(metricsCollector).record(eq(EXTERNAL), eq(CACHE_NAME), eq(NUMBER_OF_FAILED_REMOVE_ALL), eq(1L));
126 verifyNoMoreInteractions(metricsCollector);
127 }
128 }