092d262ae8fe034ccc83d073a4b585a961a3713f
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / databroker / actors / dds / TestUtils.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.databroker.actors.dds;
9
10 import java.util.concurrent.Future;
11 import java.util.concurrent.TimeUnit;
12 import org.junit.Assert;
13 import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier;
14 import org.opendaylight.controller.cluster.access.concepts.FrontendIdentifier;
15 import org.opendaylight.controller.cluster.access.concepts.FrontendType;
16 import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier;
17 import org.opendaylight.controller.cluster.access.concepts.MemberName;
18 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
19
20 final class TestUtils {
21     @FunctionalInterface
22     public interface RunnableWithException {
23         void run() throws Exception;
24     }
25
26     static final MemberName MEMBER_NAME = MemberName.forName("member-1");
27     static final FrontendType FRONTEND_TYPE = FrontendType.forName("type-1");
28     static final FrontendIdentifier FRONTEND_ID = FrontendIdentifier.create(MEMBER_NAME, FRONTEND_TYPE);
29     static final ClientIdentifier CLIENT_ID = ClientIdentifier.create(FRONTEND_ID, 0);
30     static final LocalHistoryIdentifier HISTORY_ID = new LocalHistoryIdentifier(CLIENT_ID, 0L);
31     static final TransactionIdentifier TRANSACTION_ID = new TransactionIdentifier(HISTORY_ID, 0L);
32
33     private static final long TIMEOUT = 3;
34
35     private TestUtils() {
36
37     }
38
39     /**
40      * Asserts, that future result when it completes is equal to given object.
41      * Future must complete in {@link TestUtils#TIMEOUT} seconds.
42      *
43      * @param expected expected result
44      * @param actual   future
45      * @param <T>      type
46      * @throws Exception exception
47      */
48     static <T> void assertFutureEquals(final T expected, final Future<T> actual) throws Exception {
49         Assert.assertEquals(expected, getWithTimeout(actual));
50     }
51
52     /**
53      * Calls {@link Future#get(long, TimeUnit)} with {@link TestUtils#TIMEOUT} in seconds.
54      *
55      * @param future future
56      * @param <T>    type
57      * @return future result
58      * @throws Exception exception
59      */
60     static <T> T getWithTimeout(final Future<T> future) throws Exception {
61         return future.get(TIMEOUT, TimeUnit.SECONDS);
62     }
63
64     /**
65      * Asserts that given operation invocation, will throw an exception of given class.
66      *
67      * @param operation         operation
68      * @param expectedException expected exception class
69      * @param message           message, when expected exception isn't thrown
70      * @return expected exception instance. Can be used for additional assertions.
71      * @throws Exception unexpected exception.
72      */
73     //Throwable is propagated if doesn't match the expected type
74     @SuppressWarnings("checkstyle:IllegalCatch")
75     static <T extends Throwable> T assertOperationThrowsException(final RunnableWithException operation,
76                                                                   final Class<T> expectedException,
77                                                                   final String message) throws Exception {
78         try {
79             operation.run();
80             throw new AssertionError(message + expectedException);
81         } catch (final Throwable e) {
82             if (!e.getClass().equals(expectedException)) {
83                 throw e;
84             }
85             return expectedException.cast(e);
86         }
87     }
88
89     /**
90      * Asserts, that when given operation is run, exception of given class is thrown.
91      *
92      * @param operation         operation
93      * @param expectedException expected exception class
94      * @return expected exception instance. Can be used for additional assertions.
95      * @throws Exception unexpected exception.
96      */
97     static <T extends Throwable> T assertOperationThrowsException(final RunnableWithException operation,
98                                                                   final Class<T> expectedException)
99             throws Exception {
100         return assertOperationThrowsException(operation, expectedException, "Operation should throw exception: ");
101     }
102 }