2 * Copyright (c) 2017 Red Hat, 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.md.sal.trace.closetracker.impl.tests;
10 import static com.google.common.truth.Truth.assertThat;
11 import static org.junit.Assert.fail;
14 import java.util.function.Predicate;
15 import org.junit.Test;
16 import org.opendaylight.controller.md.sal.trace.closetracker.impl.AbstractCloseTracked;
17 import org.opendaylight.controller.md.sal.trace.closetracker.impl.CloseTrackedRegistry;
18 import org.opendaylight.controller.md.sal.trace.closetracker.impl.CloseTrackedRegistryReportEntry;
20 public class CloseTrackedRegistryTest {
22 private static class SomethingClosable extends AbstractCloseTracked<SomethingClosable> implements AutoCloseable {
23 SomethingClosable(CloseTrackedRegistry<SomethingClosable> transactionChainRegistry) {
24 super(transactionChainRegistry);
29 removeFromTrackedRegistry();
34 public void testDuplicateAllocationContexts() {
35 final CloseTrackedRegistry<SomethingClosable> registry =
36 new CloseTrackedRegistry<>(this, "testDuplicateAllocationContexts", true);
38 for (int i = 0; i < 100; i++) {
39 SomethingClosable isClosedManyTimes = new SomethingClosable(registry);
40 isClosedManyTimes.close();
41 someOtherMethodWhichDoesNotClose(registry);
43 @SuppressWarnings({ "resource", "unused" })
44 SomethingClosable forgotToCloseOnce = new SomethingClosable(registry);
46 Set<CloseTrackedRegistryReportEntry<SomethingClosable>> uniqueNonClosed = registry.getAllUnique();
47 assertThat(uniqueNonClosed).hasSize(2);
48 assertThatIterableContains(uniqueNonClosed, entry ->
49 entry.getNumberAddedNotRemoved() == 100 || entry.getNumberAddedNotRemoved() == 1);
50 uniqueNonClosed.forEach(entry -> {
51 if (entry.getNumberAddedNotRemoved() == 100) {
52 assertThatIterableContains(entry.getStackTraceElements(),
53 element -> element.getMethodName().equals("someOtherMethodWhichDoesNotClose"));
54 } else if (entry.getNumberAddedNotRemoved() == 1) {
55 assertThatIterableContains(entry.getStackTraceElements(),
56 element -> element.getMethodName().equals("testDuplicateAllocationContexts"));
58 fail("Unexpected number of added, not removed: " + entry.getNumberAddedNotRemoved());
63 // Something like this really should be in Google Truth...
64 private <T> void assertThatIterableContains(Iterable<T> iterable, Predicate<T> predicate) {
65 for (T element : iterable) {
66 if (predicate.test(element)) {
70 fail("Iterable did not contain any element matching predicate");
73 @SuppressWarnings({ "resource", "unused" })
74 private void someOtherMethodWhichDoesNotClose(CloseTrackedRegistry<SomethingClosable> registry) {
75 new SomethingClosable(registry);
79 @SuppressWarnings({ "unused", "resource" })
80 public void testDebugContextDisabled() {
81 final CloseTrackedRegistry<SomethingClosable> debugContextDisabledRegistry =
82 new CloseTrackedRegistry<>(this, "testDebugContextDisabled", false);
84 SomethingClosable forgotToCloseOnce = new SomethingClosable(debugContextDisabledRegistry);
86 Set<CloseTrackedRegistryReportEntry<SomethingClosable>>
87 closeRegistryReport = debugContextDisabledRegistry.getAllUnique();
88 assertThat(closeRegistryReport).hasSize(1);
90 CloseTrackedRegistryReportEntry<SomethingClosable>
91 closeRegistryReportEntry1 = closeRegistryReport.iterator().next();
92 assertThat(closeRegistryReportEntry1.getNumberAddedNotRemoved()).isEqualTo(1);
93 assertThat(closeRegistryReportEntry1.getStackTraceElements()).isEmpty();