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.mdsal.trace.impl;
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;
17 public class CloseTrackedRegistryTest {
19 private static class SomethingClosable extends AbstractCloseTracked<SomethingClosable> implements AutoCloseable {
20 SomethingClosable(final CloseTrackedRegistry<SomethingClosable> transactionChainRegistry) {
21 super(transactionChainRegistry);
26 removeFromTrackedRegistry();
31 public void testDuplicateAllocationContexts() {
32 final CloseTrackedRegistry<SomethingClosable> registry =
33 new CloseTrackedRegistry<>(this, "testDuplicateAllocationContexts", true);
35 for (int i = 0; i < 100; i++) {
36 SomethingClosable isClosedManyTimes = new SomethingClosable(registry);
37 isClosedManyTimes.close();
38 someOtherMethodWhichDoesNotClose(registry);
40 @SuppressWarnings({ "resource", "unused" })
41 SomethingClosable forgotToCloseOnce = new SomethingClosable(registry);
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"));
55 fail("Unexpected number of added, not removed: " + entry.getNumberAddedNotRemoved());
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)) {
67 fail("Iterable did not contain any element matching predicate");
70 @SuppressWarnings({ "resource", "unused" })
71 private static void someOtherMethodWhichDoesNotClose(final CloseTrackedRegistry<SomethingClosable> registry) {
72 new SomethingClosable(registry);
76 @SuppressWarnings({ "unused", "resource" })
77 public void testDebugContextDisabled() {
78 final CloseTrackedRegistry<SomethingClosable> debugContextDisabledRegistry =
79 new CloseTrackedRegistry<>(this, "testDebugContextDisabled", false);
81 SomethingClosable forgotToCloseOnce = new SomethingClosable(debugContextDisabledRegistry);
83 Set<CloseTrackedRegistryReportEntry<SomethingClosable>>
84 closeRegistryReport = debugContextDisabledRegistry.getAllUnique();
85 assertThat(closeRegistryReport).hasSize(1);
87 CloseTrackedRegistryReportEntry<SomethingClosable>
88 closeRegistryReportEntry1 = closeRegistryReport.iterator().next();
89 assertThat(closeRegistryReportEntry1.getNumberAddedNotRemoved()).isEqualTo(1);
90 assertThat(closeRegistryReportEntry1.getStackTraceElements()).isEmpty();