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.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;
21 public class CloseTrackedRegistryTest {
23 private static class SomethingClosable extends AbstractCloseTracked<SomethingClosable> implements AutoCloseable {
24 SomethingClosable(CloseTrackedRegistry<SomethingClosable> transactionChainRegistry) {
25 super(transactionChainRegistry);
30 removeFromTrackedRegistry();
35 public void testDuplicateAllocationContexts() {
36 final CloseTrackedRegistry<SomethingClosable> registry =
37 new CloseTrackedRegistry<>(this, "testDuplicateAllocationContexts", true);
39 for (int i = 0; i < 100; i++) {
40 SomethingClosable isClosedManyTimes = new SomethingClosable(registry);
41 isClosedManyTimes.close();
42 someOtherMethodWhichDoesNotClose(registry);
44 @SuppressWarnings({ "resource", "unused" })
45 SomethingClosable forgotToCloseOnce = new SomethingClosable(registry);
47 Set<CloseTrackedRegistryReportEntry<SomethingClosable>> uniqueNonClosed = registry.getAllUnique();
48 assertThat(uniqueNonClosed).hasSize(2);
49 assertThatIterableContains(uniqueNonClosed, entry ->
50 entry.getNumberAddedNotRemoved() == 100 || entry.getNumberAddedNotRemoved() == 1);
51 uniqueNonClosed.forEach(entry -> {
52 if (entry.getNumberAddedNotRemoved() == 100) {
53 assertThatIterableContains(entry.getStackTraceElements(),
54 element -> element.getMethodName().equals("someOtherMethodWhichDoesNotClose"));
55 } else if (entry.getNumberAddedNotRemoved() == 1) {
56 assertThatIterableContains(entry.getStackTraceElements(),
57 element -> element.getMethodName().equals("testDuplicateAllocationContexts"));
59 fail("Unexpected number of added, not removed: " + entry.getNumberAddedNotRemoved());
64 // Something like this really should be in Google Truth...
65 private <T> void assertThatIterableContains(Iterable<T> iterable, Predicate<T> predicate) {
66 for (T element : iterable) {
67 if (predicate.test(element)) {
71 fail("Iterable did not contain any element matching predicate");
74 @SuppressWarnings({ "resource", "unused" })
75 private void someOtherMethodWhichDoesNotClose(CloseTrackedRegistry<SomethingClosable> registry) {
76 new SomethingClosable(registry);
80 @SuppressWarnings({ "unused", "resource" })
81 public void testDebugContextDisabled() {
82 final CloseTrackedRegistry<SomethingClosable> debugContextDisabledRegistry =
83 new CloseTrackedRegistry<>(this, "testDebugContextDisabled", false);
85 SomethingClosable forgotToCloseOnce = new SomethingClosable(debugContextDisabledRegistry);
87 Set<CloseTrackedRegistryReportEntry<SomethingClosable>>
88 closeRegistryReport = debugContextDisabledRegistry.getAllUnique();
89 assertThat(closeRegistryReport).hasSize(1);
91 CloseTrackedRegistryReportEntry<SomethingClosable>
92 closeRegistryReportEntry1 = closeRegistryReport.iterator().next();
93 assertThat(closeRegistryReportEntry1.getNumberAddedNotRemoved()).isEqualTo(1);
94 assertThat(closeRegistryReportEntry1.getStackTraceElements()).isEmpty();