package org.opendaylight.controller.cluster.raft;
import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.same;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
+
import akka.japi.Procedure;
import java.util.Collections;
-import org.hamcrest.BaseMatcher;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
-import org.mockito.Matchers;
+import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.internal.matchers.Same;
import org.opendaylight.controller.cluster.DataPersistenceProvider;
import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockPayload;
-import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockReplicatedLogEntry;
-import org.opendaylight.controller.cluster.raft.base.messages.DeleteEntries;
import org.opendaylight.controller.cluster.raft.behaviors.RaftActorBehavior;
+import org.opendaylight.controller.cluster.raft.persisted.DeleteEntries;
+import org.opendaylight.controller.cluster.raft.persisted.SimpleReplicatedLogEntry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
MockitoAnnotations.initMocks(this);
context = new RaftActorContextImpl(null, null, "test",
- new ElectionTermImpl(mockPersistence, "test", LOG),
- -1, -1, Collections.<String,String>emptyMap(), configParams, mockPersistence, LOG);
+ new ElectionTermImpl(mockPersistence, "test", LOG), -1, -1, Collections.<String,String>emptyMap(),
+ configParams, mockPersistence, applyState -> { }, LOG);
}
private void verifyPersist(Object message) throws Exception {
- verifyPersist(message, new Same(message));
+ verifyPersist(message, new Same(message), true);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
- private void verifyPersist(Object message, Matcher<?> matcher) throws Exception {
+ private void verifyPersist(Object message, ArgumentMatcher<?> matcher, boolean async) throws Exception {
ArgumentCaptor<Procedure> procedure = ArgumentCaptor.forClass(Procedure.class);
- verify(mockPersistence).persist(Matchers.argThat(matcher), procedure.capture());
+ if (async) {
+ verify(mockPersistence).persistAsync(argThat(matcher), procedure.capture());
+ } else {
+ verify(mockPersistence).persist(argThat(matcher), procedure.capture());
+ }
procedure.getValue().apply(message);
}
public void testAppendAndPersistExpectingNoCapture() throws Exception {
ReplicatedLog log = ReplicatedLogImpl.newInstance(context);
- MockReplicatedLogEntry logEntry1 = new MockReplicatedLogEntry(1, 1, new MockPayload("1"));
+ ReplicatedLogEntry logEntry1 = new SimpleReplicatedLogEntry(1, 1, new MockPayload("1"));
- log.appendAndPersist(logEntry1);
+ log.appendAndPersist(logEntry1, null, true);
verifyPersist(logEntry1);
reset(mockPersistence);
- MockReplicatedLogEntry logEntry2 = new MockReplicatedLogEntry(1, 2, new MockPayload("2"));
- Procedure<ReplicatedLogEntry> mockCallback = Mockito.mock(Procedure.class);
- log.appendAndPersist(logEntry2, mockCallback);
+ ReplicatedLogEntry logEntry2 = new SimpleReplicatedLogEntry(2, 1, new MockPayload("2"));
+ Procedure<ReplicatedLogEntry> mockCallback = mock(Procedure.class);
+ log.appendAndPersist(logEntry2, mockCallback, true);
verifyPersist(logEntry2);
public void testAppendAndPersisWithDuplicateEntry() throws Exception {
ReplicatedLog log = ReplicatedLogImpl.newInstance(context);
- Procedure<ReplicatedLogEntry> mockCallback = Mockito.mock(Procedure.class);
- MockReplicatedLogEntry logEntry = new MockReplicatedLogEntry(1, 1, new MockPayload("1"));
+ Procedure<ReplicatedLogEntry> mockCallback = mock(Procedure.class);
+ ReplicatedLogEntry logEntry = new SimpleReplicatedLogEntry(1, 1, new MockPayload("1"));
- log.appendAndPersist(logEntry, mockCallback);
+ log.appendAndPersist(logEntry, mockCallback, true);
verifyPersist(logEntry);
reset(mockPersistence, mockCallback);
- log.appendAndPersist(logEntry, mockCallback);
+ log.appendAndPersist(logEntry, mockCallback, true);
verifyNoMoreInteractions(mockPersistence, mockCallback);
ReplicatedLog log = ReplicatedLogImpl.newInstance(context);
- MockReplicatedLogEntry logEntry1 = new MockReplicatedLogEntry(1, 2, new MockPayload("2"));
- MockReplicatedLogEntry logEntry2 = new MockReplicatedLogEntry(1, 3, new MockPayload("3"));
+ final ReplicatedLogEntry logEntry1 = new SimpleReplicatedLogEntry(2, 1, new MockPayload("2"));
+ final ReplicatedLogEntry logEntry2 = new SimpleReplicatedLogEntry(3, 1, new MockPayload("3"));
- log.appendAndPersist(logEntry1);
+ log.appendAndPersist(logEntry1, null, true);
verifyPersist(logEntry1);
reset(mockPersistence);
- log.appendAndPersist(logEntry2);
+ log.appendAndPersist(logEntry2, null, true);
verifyPersist(logEntry2);
ReplicatedLog log = ReplicatedLogImpl.newInstance(context);
int dataSize = 600;
- MockReplicatedLogEntry logEntry = new MockReplicatedLogEntry(1, 2, new MockPayload("2", dataSize));
+ ReplicatedLogEntry logEntry = new SimpleReplicatedLogEntry(2, 1, new MockPayload("2", dataSize));
- log.appendAndPersist(logEntry);
+ log.appendAndPersist(logEntry, null, true);
verifyPersist(logEntry);
reset(mockPersistence);
- logEntry = new MockReplicatedLogEntry(1, 3, new MockPayload("3", 5));
+ logEntry = new SimpleReplicatedLogEntry(3, 1, new MockPayload("3", 5));
- log.appendAndPersist(logEntry);
+ log.appendAndPersist(logEntry, null, true);
verifyPersist(logEntry);
assertEquals("size", 2, log.size());
ReplicatedLog log = ReplicatedLogImpl.newInstance(context);
- log.append(new MockReplicatedLogEntry(1, 0, new MockPayload("0")));
- log.append(new MockReplicatedLogEntry(1, 1, new MockPayload("1")));
- log.append(new MockReplicatedLogEntry(1, 2, new MockPayload("2")));
+ log.append(new SimpleReplicatedLogEntry(0, 1, new MockPayload("0")));
+ log.append(new SimpleReplicatedLogEntry(1, 1, new MockPayload("1")));
+ log.append(new SimpleReplicatedLogEntry(2, 1, new MockPayload("2")));
log.removeFromAndPersist(1);
DeleteEntries deleteEntries = new DeleteEntries(1);
- verifyPersist(deleteEntries, match(deleteEntries));
+ verifyPersist(deleteEntries, match(deleteEntries), false);
assertEquals("size", 1, log.size());
verifyNoMoreInteractions(mockPersistence);
}
- public Matcher<DeleteEntries> match(final DeleteEntries actual){
- return new BaseMatcher<DeleteEntries>() {
- @Override
- public boolean matches(Object o) {
- DeleteEntries other = (DeleteEntries) o;
- return actual.getFromIndex() == other.getFromIndex();
- }
-
- @Override
- public void describeTo(Description description) {
- description.appendText("DeleteEntries: fromIndex: " + actual.getFromIndex());
- }
- };
+ public ArgumentMatcher<DeleteEntries> match(final DeleteEntries actual) {
+ return other -> actual.getFromIndex() == other.getFromIndex();
}
}