Add mockito-configuration to tests
[controller.git] / opendaylight / md-sal / sal-akka-raft / src / test / java / org / opendaylight / controller / cluster / raft / RaftActorSnapshotMessageSupportTest.java
1 /*
2  * Copyright (c) 2015 Brocade Communications Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.cluster.raft;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.mockito.Matchers.anyLong;
12 import static org.mockito.Matchers.eq;
13 import static org.mockito.Matchers.same;
14 import static org.mockito.Mockito.any;
15 import static org.mockito.Mockito.doNothing;
16 import static org.mockito.Mockito.doReturn;
17 import static org.mockito.Mockito.verify;
18 import akka.actor.ActorRef;
19 import akka.japi.Procedure;
20 import akka.persistence.SaveSnapshotFailure;
21 import akka.persistence.SaveSnapshotSuccess;
22 import akka.persistence.SnapshotMetadata;
23 import java.util.Collections;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.mockito.Mock;
27 import org.mockito.MockitoAnnotations;
28 import org.opendaylight.controller.cluster.DataPersistenceProvider;
29 import org.opendaylight.controller.cluster.raft.base.messages.ApplySnapshot;
30 import org.opendaylight.controller.cluster.raft.base.messages.CaptureSnapshotReply;
31 import org.opendaylight.controller.cluster.raft.behaviors.RaftActorBehavior;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 /**
36  * Unit tests for RaftActorSnapshotMessageSupport.
37  *
38  * @author Thomas Pantelis
39  */
40 public class RaftActorSnapshotMessageSupportTest {
41
42     private static final Logger LOG = LoggerFactory.getLogger(RaftActorRecoverySupportTest.class);
43
44     @Mock
45     private DataPersistenceProvider mockPersistence;
46
47     @Mock
48     private RaftActorBehavior mockBehavior;
49
50     @Mock
51     private RaftActorSnapshotCohort mockCohort;
52
53     @Mock
54     private SnapshotManager mockSnapshotManager;
55
56     @Mock
57     ActorRef mockRaftActorRef;
58
59     private RaftActorSnapshotMessageSupport support;
60
61     private RaftActorContext context;
62     private final DefaultConfigParamsImpl configParams = new DefaultConfigParamsImpl();
63
64     @Before
65     public void setup() {
66         MockitoAnnotations.initMocks(this);
67
68         doNothing().when(mockSnapshotManager).setApplySnapshotProcedure(any(Procedure.class));
69         doNothing().when(mockSnapshotManager).setCreateSnapshotCallable(any(Procedure.class));
70         doNothing().when(mockSnapshotManager).apply(any(ApplySnapshot.class));
71         doNothing().when(mockSnapshotManager).commit(any(long.class), any(RaftActorBehavior.class));
72         doNothing().when(mockSnapshotManager).persist(any(byte[].class), any(RaftActorBehavior.class), any(long.class));
73         doNothing().when(mockSnapshotManager).rollback();
74
75         context = new RaftActorContextImpl(mockRaftActorRef, null, "test",
76                 new ElectionTermImpl(mockPersistence, "test", LOG),
77                 -1, -1, Collections.<String,String>emptyMap(), configParams, mockPersistence, LOG) {
78             @Override
79             public SnapshotManager getSnapshotManager() {
80                 return mockSnapshotManager;
81             }
82         };
83
84         support = new RaftActorSnapshotMessageSupport(context, mockBehavior, mockCohort);
85
86         doReturn(true).when(mockPersistence).isRecoveryApplicable();
87
88         context.setReplicatedLog(ReplicatedLogImpl.newInstance(context, mockBehavior));
89     }
90
91     private void sendMessageToSupport(Object message) {
92         sendMessageToSupport(message, true);
93     }
94
95     private void sendMessageToSupport(Object message, boolean expHandled) {
96         boolean handled = support.handleSnapshotMessage(message, mockRaftActorRef);
97         assertEquals("complete", expHandled, handled);
98     }
99
100     @Test
101     public void testOnApplySnapshot() {
102
103         long lastAppliedDuringSnapshotCapture = 1;
104         long lastIndexDuringSnapshotCapture = 2;
105         byte[] snapshotBytes = {1,2,3,4,5};
106
107         Snapshot snapshot = Snapshot.create(snapshotBytes, Collections.<ReplicatedLogEntry>emptyList(),
108                 lastIndexDuringSnapshotCapture, 1, lastAppliedDuringSnapshotCapture, 1);
109
110         ApplySnapshot applySnapshot = new ApplySnapshot(snapshot);
111         sendMessageToSupport(applySnapshot);
112
113         verify(mockSnapshotManager).apply(applySnapshot);
114     }
115
116     @Test
117     public void testOnCaptureSnapshotReply() {
118
119         byte[] snapshot = {1,2,3,4,5};
120         sendMessageToSupport(new CaptureSnapshotReply(snapshot));
121
122         verify(mockSnapshotManager).persist(same(snapshot), same(mockBehavior), anyLong());
123     }
124
125     @Test
126     public void testOnSaveSnapshotSuccess() {
127
128         long sequenceNumber = 100;
129         sendMessageToSupport(new SaveSnapshotSuccess(new SnapshotMetadata("foo", sequenceNumber, 1234L)));
130
131         verify(mockSnapshotManager).commit(eq(sequenceNumber), same(mockBehavior));
132     }
133
134     @Test
135     public void testOnSaveSnapshotFailure() {
136
137         sendMessageToSupport(new SaveSnapshotFailure(new SnapshotMetadata("foo", 100, 1234L),
138                 new Throwable("mock")));
139
140         verify(mockSnapshotManager).rollback();
141     }
142
143     @Test
144     public void testOnCommitSnapshot() {
145
146         sendMessageToSupport(RaftActorSnapshotMessageSupport.COMMIT_SNAPSHOT);
147
148         verify(mockSnapshotManager).commit(eq(-1L), same(mockBehavior));
149     }
150
151     @Test
152     public void testUnhandledMessage() {
153
154         sendMessageToSupport("unhandled", false);
155     }
156 }