6e06279cd52e3eaea406f172bd96271f62b053e8
[controller.git] / opendaylight / md-sal / mdsal-trace / dom-impl / src / test / java / org / opendaylight / controller / md / sal / trace / tests / TracingBrokerTest.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.controller.md.sal.trace.tests;
9
10 import static com.google.common.truth.Truth.assertThat;
11 import static java.nio.charset.StandardCharsets.UTF_8;
12 import static java.util.Collections.singletonList;
13 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
14 import static org.mockito.Mockito.mock;
15
16 import java.io.ByteArrayOutputStream;
17 import java.io.PrintStream;
18 import org.junit.Test;
19 import org.opendaylight.controller.md.sal.binding.test.DataBrokerTestModule;
20 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
21 import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction;
22 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
23 import org.opendaylight.controller.md.sal.trace.dom.impl.TracingBroker;
24 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsaltrace.rev160908.Config;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsaltrace.rev160908.ConfigBuilder;
27
28 /**
29  * Test of {@link TracingBroker}.
30  *
31  * @author Michael Vorburger.ch
32  */
33 public class TracingBrokerTest {
34
35     @Test
36     public void testEnd2End() {
37         DataBrokerTestModule wiring = new DataBrokerTestModule(true);
38         wiring.getDataBroker(); // required so DataBrokerTestModule creates the DOMDataBroker
39         DOMDataBroker realDomBroker = wiring.getDOMDataBroker();
40         TracingBroker tracingDomBroker = new TracingBroker("Test", realDomBroker, new ConfigBuilder()
41                 // CONTROLLER-1877: configure it like the default/initial mdsaltrace_config.xml in mdsal-trace-api
42                 .setTransactionDebugContextEnabled(true)
43                 .setWriteWatches(singletonList("/this/will/never/exist"))
44                 .setRegistrationWatches(singletonList("/this/will/never/exist"))
45                 .build(),
46                 wiring.getBindingToNormalizedNodeCodec());
47         tracingDomBroker.newWriteOnlyTransaction().cancel();
48     }
49
50     @Test
51     @SuppressWarnings({ "resource", "unused" }) // Finding resource leaks is the point of this test
52     public void testPrintOpenTransactions() {
53         DOMDataBroker domDataBroker = mock(DOMDataBroker.class, RETURNS_DEEP_STUBS);
54         Config config = new ConfigBuilder().setTransactionDebugContextEnabled(true).build();
55         BindingNormalizedNodeSerializer codec = mock(BindingNormalizedNodeSerializer.class);
56         TracingBroker tracingBroker = new TracingBroker("mock", domDataBroker, config, codec);
57
58         for (int i = 0; i < 3; i++) {
59             DOMDataReadWriteTransaction tx = tracingBroker.newReadWriteTransaction();
60         }
61         DOMDataReadWriteTransaction anotherTx = tracingBroker.newReadWriteTransaction();
62
63         DOMTransactionChain txChain = tracingBroker.createTransactionChain(null);
64         DOMDataReadWriteTransaction txFromChain = txChain.newReadWriteTransaction();
65
66         ByteArrayOutputStream baos = new ByteArrayOutputStream();
67         PrintStream ps = new PrintStream(baos);
68         boolean printReturnValue = tracingBroker.printOpenTransactions(ps, 1);
69         String output = new String(baos.toByteArray(), UTF_8);
70
71         assertThat(printReturnValue).isTrue();
72         // Assert expectations about stack trace
73         assertThat(output).contains("testPrintOpenTransactions(TracingBrokerTest.java");
74         assertThat(output).doesNotContain(TracingBroker.class.getName());
75
76         String previousLine = "";
77         for (String line : output.split("\n")) {
78             if (line.contains("(...")) {
79                 assertThat(previousLine.contains("(...)")).isFalse();
80             }
81             previousLine = line;
82         }
83
84         // assert that the sorting works - the x3 is shown before the x1
85         assertThat(output).contains("  DataBroker : newReadWriteTransaction()\n    3x");
86
87         // We don't do any verify/times on the mocks,
88         // because the main point of the test is just to verify that
89         // printOpenTransactions runs through without any exceptions
90         // (e.g. it used to have a ClassCastException).
91     }
92
93 }