2 * Copyright (c) 2015 Brocade Communications Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.cluster.raft;
10 import static org.mockito.Matchers.any;
11 import static org.mockito.Mockito.doAnswer;
12 import static org.mockito.Mockito.doNothing;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.verify;
15 import akka.japi.Procedure;
16 import com.google.protobuf.GeneratedMessage.GeneratedExtension;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.mockito.Mock;
21 import org.mockito.MockitoAnnotations;
22 import org.mockito.invocation.InvocationOnMock;
23 import org.mockito.stubbing.Answer;
24 import org.opendaylight.controller.cluster.DataPersistenceProvider;
25 import org.opendaylight.controller.cluster.PersistentDataProvider;
26 import org.opendaylight.controller.cluster.raft.protobuff.client.messages.Payload;
27 import org.opendaylight.controller.cluster.raft.protobuff.client.messages.PersistentPayload;
30 * Unit tests for RaftActorDelegatingPersistentDataProvider.
32 * @author Thomas Pantelis
34 public class RaftActorDelegatingPersistentDataProviderTest {
35 private static final Payload PERSISTENT_PAYLOAD = new TestPersistentPayload();
37 private static final Payload NON_PERSISTENT_PAYLOAD = new TestNonPersistentPayload();
39 private static final Object OTHER_DATA_OBJECT = new Object();
42 private ReplicatedLogEntry mockPersistentLogEntry;
45 private ReplicatedLogEntry mockNonPersistentLogEntry;
48 private DataPersistenceProvider mockDelegateProvider;
51 private PersistentDataProvider mockPersistentProvider;
53 @SuppressWarnings("rawtypes")
55 private Procedure mockProcedure;
57 private RaftActorDelegatingPersistentDataProvider provider;
59 @SuppressWarnings("unchecked")
61 public void setup() throws Exception {
62 MockitoAnnotations.initMocks(this);
63 doReturn(PERSISTENT_PAYLOAD).when(mockPersistentLogEntry).getData();
64 doReturn(NON_PERSISTENT_PAYLOAD).when(mockNonPersistentLogEntry).getData();
66 doAnswer(new Answer<Void>() {
68 public Void answer(InvocationOnMock invocation) throws Exception {
69 final Object[] args = invocation.getArguments();
70 ((Procedure<Object>)args[1]).apply(args[0]);
73 }).when(mockPersistentProvider).persist(any(Object.class), any(Procedure.class));
75 doNothing().when(mockDelegateProvider).persist(any(Object.class), any(Procedure.class));
76 doNothing().when(mockProcedure).apply(any(Object.class));
77 provider = new RaftActorDelegatingPersistentDataProvider(mockDelegateProvider, mockPersistentProvider);
80 @SuppressWarnings("unchecked")
82 public void testPersistWithPersistenceEnabled() {
83 doReturn(true).when(mockDelegateProvider).isRecoveryApplicable();
85 provider.persist(mockPersistentLogEntry, mockProcedure);
86 verify(mockDelegateProvider).persist(mockPersistentLogEntry, mockProcedure);
88 provider.persist(mockNonPersistentLogEntry, mockProcedure);
89 verify(mockDelegateProvider).persist(mockNonPersistentLogEntry, mockProcedure);
91 provider.persist(OTHER_DATA_OBJECT, mockProcedure);
92 verify(mockDelegateProvider).persist(OTHER_DATA_OBJECT, mockProcedure);
95 @SuppressWarnings("unchecked")
97 public void testPersistWithPersistenceDisabled() {
98 doReturn(false).when(mockDelegateProvider).isRecoveryApplicable();
100 provider.persist(mockPersistentLogEntry, mockProcedure);
101 verify(mockPersistentProvider).persist(mockPersistentLogEntry, mockProcedure);
103 provider.persist(mockNonPersistentLogEntry, mockProcedure);
104 verify(mockDelegateProvider).persist(mockNonPersistentLogEntry, mockProcedure);
106 provider.persist(OTHER_DATA_OBJECT, mockProcedure);
107 verify(mockDelegateProvider).persist(OTHER_DATA_OBJECT, mockProcedure);
110 static class TestNonPersistentPayload extends Payload {
111 @SuppressWarnings("rawtypes")
113 public <T> Map<GeneratedExtension, T> encode() {
118 public Payload decode(
119 org.opendaylight.controller.protobuff.messages.cluster.raft.AppendEntriesMessages.AppendEntries.ReplicatedLogEntry.Payload payload) {
129 static class TestPersistentPayload extends TestNonPersistentPayload implements PersistentPayload {