13542ab202650c34f3bfc53ca3edf54e0f702ad5
[mdsal.git] / trace / mdsal-trace-impl / src / test / java / org / opendaylight / mdsal / trace / impl / CloseTrackedRegistryTest.java
1 /*
2  * Copyright (c) 2017 Red Hat, 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.mdsal.trace.impl;
9
10 import static com.google.common.truth.Truth.assertThat;
11 import static org.junit.Assert.fail;
12
13 import java.util.Set;
14 import java.util.function.Predicate;
15 import org.junit.Test;
16
17 public class CloseTrackedRegistryTest {
18
19     private static class SomethingClosable extends AbstractCloseTracked<SomethingClosable> implements AutoCloseable {
20         SomethingClosable(final CloseTrackedRegistry<SomethingClosable> transactionChainRegistry) {
21             super(transactionChainRegistry);
22         }
23
24         @Override
25         public void close() {
26             removeFromTrackedRegistry();
27         }
28     }
29
30     @Test
31     public void testDuplicateAllocationContexts() {
32         final CloseTrackedRegistry<SomethingClosable> registry =
33                 new CloseTrackedRegistry<>(this, "testDuplicateAllocationContexts", true);
34
35         for (int i = 0; i < 100; i++) {
36             SomethingClosable isClosedManyTimes = new SomethingClosable(registry);
37             isClosedManyTimes.close();
38             someOtherMethodWhichDoesNotClose(registry);
39         }
40         @SuppressWarnings({ "resource", "unused" })
41         SomethingClosable forgotToCloseOnce = new SomethingClosable(registry);
42
43         Set<CloseTrackedRegistryReportEntry<SomethingClosable>> uniqueNonClosed = registry.getAllUnique();
44         assertThat(uniqueNonClosed).hasSize(2);
45         assertThatIterableContains(uniqueNonClosed, entry ->
46             entry.getNumberAddedNotRemoved() == 100 || entry.getNumberAddedNotRemoved() == 1);
47         uniqueNonClosed.forEach(entry -> {
48             if (entry.getNumberAddedNotRemoved() == 100) {
49                 assertThatIterableContains(entry.getStackTraceElements(),
50                     element -> element.getMethodName().equals("someOtherMethodWhichDoesNotClose"));
51             } else if (entry.getNumberAddedNotRemoved() == 1) {
52                 assertThatIterableContains(entry.getStackTraceElements(),
53                     element -> element.getMethodName().equals("testDuplicateAllocationContexts"));
54             } else {
55                 fail("Unexpected number of added, not removed: " + entry.getNumberAddedNotRemoved());
56             }
57         });
58     }
59
60     // Something like this really should be in Google Truth...
61     private static <T> void assertThatIterableContains(final Iterable<T> iterable, final Predicate<T> predicate) {
62         for (T element : iterable) {
63             if (predicate.test(element)) {
64                 return;
65             }
66         }
67         fail("Iterable did not contain any element matching predicate");
68     }
69
70     @SuppressWarnings({ "resource", "unused" })
71     private static void someOtherMethodWhichDoesNotClose(final CloseTrackedRegistry<SomethingClosable> registry) {
72         new SomethingClosable(registry);
73     }
74
75     @Test
76     @SuppressWarnings({ "unused", "resource" })
77     public void testDebugContextDisabled() {
78         final CloseTrackedRegistry<SomethingClosable> debugContextDisabledRegistry =
79                 new CloseTrackedRegistry<>(this, "testDebugContextDisabled", false);
80
81         SomethingClosable forgotToCloseOnce = new SomethingClosable(debugContextDisabledRegistry);
82
83         Set<CloseTrackedRegistryReportEntry<SomethingClosable>>
84             closeRegistryReport = debugContextDisabledRegistry.getAllUnique();
85         assertThat(closeRegistryReport).hasSize(1);
86
87         CloseTrackedRegistryReportEntry<SomethingClosable>
88             closeRegistryReportEntry1 = closeRegistryReport.iterator().next();
89         assertThat(closeRegistryReportEntry1.getNumberAddedNotRemoved()).isEqualTo(1);
90         assertThat(closeRegistryReportEntry1.getStackTraceElements()).isEmpty();
91     }
92 }