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.ArgumentMatchers.eq;
11 import static org.mockito.Mockito.doReturn;
12 import static org.mockito.Mockito.never;
13 import static org.mockito.Mockito.verify;
15 import akka.japi.Procedure;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.junit.runner.RunWith;
19 import org.mockito.ArgumentCaptor;
20 import org.mockito.Mock;
21 import org.mockito.junit.MockitoJUnitRunner;
22 import org.opendaylight.controller.cluster.DataPersistenceProvider;
23 import org.opendaylight.controller.cluster.PersistentDataProvider;
24 import org.opendaylight.controller.cluster.raft.messages.Payload;
25 import org.opendaylight.controller.cluster.raft.messages.PersistentPayload;
28 * Unit tests for RaftActorDelegatingPersistentDataProvider.
30 * @author Thomas Pantelis
32 @RunWith(MockitoJUnitRunner.StrictStubs.class)
33 public class RaftActorDelegatingPersistentDataProviderTest {
34 private static final Payload PERSISTENT_PAYLOAD = new TestPersistentPayload();
36 private static final Payload NON_PERSISTENT_PAYLOAD = new TestNonPersistentPayload();
38 private static final Object OTHER_DATA_OBJECT = new Object();
41 private ReplicatedLogEntry mockPersistentLogEntry;
44 private ReplicatedLogEntry mockNonPersistentLogEntry;
47 private DataPersistenceProvider mockDelegateProvider;
50 private PersistentDataProvider mockPersistentProvider;
52 @SuppressWarnings("rawtypes")
54 private Procedure mockProcedure;
56 private RaftActorDelegatingPersistentDataProvider provider;
60 doReturn(PERSISTENT_PAYLOAD).when(mockPersistentLogEntry).getData();
61 doReturn(NON_PERSISTENT_PAYLOAD).when(mockNonPersistentLogEntry).getData();
62 provider = new RaftActorDelegatingPersistentDataProvider(mockDelegateProvider, mockPersistentProvider);
65 @SuppressWarnings("unchecked")
67 public void testPersistWithPersistenceEnabled() {
68 doReturn(true).when(mockDelegateProvider).isRecoveryApplicable();
70 provider.persist(mockPersistentLogEntry, mockProcedure);
71 verify(mockDelegateProvider).persist(mockPersistentLogEntry, mockProcedure);
73 provider.persist(mockNonPersistentLogEntry, mockProcedure);
74 verify(mockDelegateProvider).persist(mockNonPersistentLogEntry, mockProcedure);
76 provider.persist(OTHER_DATA_OBJECT, mockProcedure);
77 verify(mockDelegateProvider).persist(OTHER_DATA_OBJECT, mockProcedure);
80 @SuppressWarnings({ "unchecked", "rawtypes" })
82 public void testPersistWithPersistenceDisabled() throws Exception {
83 doReturn(false).when(mockDelegateProvider).isRecoveryApplicable();
85 provider.persist(mockPersistentLogEntry, mockProcedure);
87 ArgumentCaptor<Procedure> procedureCaptor = ArgumentCaptor.forClass(Procedure.class);
88 verify(mockPersistentProvider).persist(eq(PERSISTENT_PAYLOAD), procedureCaptor.capture());
89 verify(mockDelegateProvider, never()).persist(mockNonPersistentLogEntry, mockProcedure);
90 procedureCaptor.getValue().apply(PERSISTENT_PAYLOAD);
91 verify(mockProcedure).apply(mockPersistentLogEntry);
93 provider.persist(mockNonPersistentLogEntry, mockProcedure);
94 verify(mockDelegateProvider).persist(mockNonPersistentLogEntry, mockProcedure);
96 provider.persist(OTHER_DATA_OBJECT, mockProcedure);
97 verify(mockDelegateProvider).persist(OTHER_DATA_OBJECT, mockProcedure);
100 static class TestNonPersistentPayload extends Payload {
101 private static final long serialVersionUID = 1L;
109 public int serializedSize() {
114 protected Object writeReplace() {
116 throw new UnsupportedOperationException();
120 static class TestPersistentPayload extends TestNonPersistentPayload implements PersistentPayload {
121 private static final long serialVersionUID = 1L;