Add TransmitQueue unit tests
[controller.git] / opendaylight / md-sal / cds-access-client / src / test / java / org / opendaylight / controller / cluster / access / client / MockedSnapshotStore.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.access.client;
9
10 import akka.actor.ActorRef;
11 import akka.dispatch.OnComplete;
12 import akka.pattern.Patterns;
13 import akka.persistence.SelectedSnapshot;
14 import akka.persistence.SnapshotMetadata;
15 import akka.persistence.SnapshotSelectionCriteria;
16 import akka.persistence.snapshot.japi.SnapshotStore;
17 import com.google.common.base.Preconditions;
18 import java.util.Optional;
19 import scala.concurrent.Future;
20 import scala.concurrent.Promise;
21
22 /**
23  * Instantiated by akka. MockedSnapshotStore forwards method calls as
24  * {@link MockedSnapshotStoreMessage} messages to delegate actor. Delegate reference
25  * must be sent as a message to this snapshot store.
26  */
27 class MockedSnapshotStore extends SnapshotStore {
28
29     private static final long TIMEOUT = 1000;
30
31     private ActorRef delegate;
32
33     /**
34      * Marker interface for messages produced by MockedSnapshotStore.
35      */
36     interface MockedSnapshotStoreMessage {
37     }
38
39     @Override
40     public Future<Optional<SelectedSnapshot>> doLoadAsync(final String persistenceId,
41                                                           final SnapshotSelectionCriteria criteria) {
42         return askDelegate(new LoadRequest(persistenceId, criteria));
43     }
44
45     @Override
46     public Future<Void> doSaveAsync(final SnapshotMetadata metadata, final Object snapshot) {
47         return askDelegate(new SaveRequest(metadata, snapshot));
48     }
49
50     @Override
51     public Future<Void> doDeleteAsync(final SnapshotMetadata metadata) {
52         return askDelegate(new DeleteByMetadataRequest(metadata));
53     }
54
55     @Override
56     public Future<Void> doDeleteAsync(final String persistenceId, final SnapshotSelectionCriteria criteria) {
57         return askDelegate(new DeleteByCriteriaRequest(persistenceId, criteria));
58     }
59
60     @Override
61     public void unhandled(final Object message) {
62         if (message instanceof ActorRef) {
63             delegate = (ActorRef) message;
64             return;
65         }
66         super.unhandled(message);
67     }
68
69     private <T> Future<T> askDelegate(final MockedSnapshotStoreMessage message) {
70         Preconditions.checkNotNull(delegate, "Delegate ref wasn't sent");
71         final Future<Object> ask = Patterns.ask(delegate, message, TIMEOUT);
72         return transform(ask);
73     }
74
75     private <T> Future<T> transform(final Future<Object> future) {
76         final Promise<T> promise = new scala.concurrent.impl.Promise.DefaultPromise<>();
77         future.onComplete(new OnComplete<Object>() {
78             @Override
79             public void onComplete(final Throwable failure, final Object success) throws Throwable {
80                 if (success instanceof Throwable) {
81                     promise.failure((Throwable) success);
82                     return;
83                 }
84                 if (success == Void.TYPE) {
85                     promise.success(null);
86                     return;
87                 }
88                 promise.success((T) success);
89             }
90         }, context().dispatcher());
91         return promise.future();
92     }
93
94     class LoadRequest implements MockedSnapshotStoreMessage {
95         private final String persistenceId;
96         private final SnapshotSelectionCriteria criteria;
97
98         LoadRequest(final String persistenceId, final SnapshotSelectionCriteria criteria) {
99             this.persistenceId = persistenceId;
100             this.criteria = criteria;
101         }
102
103         public String getPersistenceId() {
104             return persistenceId;
105         }
106
107         public SnapshotSelectionCriteria getCriteria() {
108             return criteria;
109         }
110     }
111
112     class DeleteByCriteriaRequest implements MockedSnapshotStoreMessage {
113         private final String persistenceId;
114         private final SnapshotSelectionCriteria criteria;
115
116         DeleteByCriteriaRequest(final String persistenceId, final SnapshotSelectionCriteria criteria) {
117             this.persistenceId = persistenceId;
118             this.criteria = criteria;
119         }
120
121         public String getPersistenceId() {
122             return persistenceId;
123         }
124
125         public SnapshotSelectionCriteria getCriteria() {
126             return criteria;
127         }
128     }
129
130     class DeleteByMetadataRequest implements MockedSnapshotStoreMessage {
131         private final SnapshotMetadata metadata;
132
133         DeleteByMetadataRequest(final SnapshotMetadata metadata) {
134             this.metadata = metadata;
135         }
136
137         public SnapshotMetadata getMetadata() {
138             return metadata;
139         }
140     }
141
142     class SaveRequest implements MockedSnapshotStoreMessage {
143         private final SnapshotMetadata metadata;
144         private final Object snapshot;
145
146         SaveRequest(final SnapshotMetadata metadata, final Object snapshot) {
147             this.metadata = metadata;
148             this.snapshot = snapshot;
149         }
150
151         public SnapshotMetadata getMetadata() {
152             return metadata;
153         }
154
155         public Object getSnapshot() {
156             return snapshot;
157         }
158     }
159 }