2 * Copyright (c) 2015 Cisco Systems, 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.dom.broker;
10 import static org.junit.Assert.assertNotNull;
11 import static org.mockito.ArgumentMatchers.any;
12 import static org.mockito.ArgumentMatchers.anyMap;
13 import static org.mockito.Mockito.doNothing;
14 import static org.mockito.Mockito.doReturn;
16 import com.google.common.util.concurrent.Futures;
17 import java.util.Collection;
18 import java.util.Collections;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.mockito.Mock;
22 import org.mockito.MockitoAnnotations;
23 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
24 import org.opendaylight.mdsal.dom.api.DOMDataTreeCursorAwareTransaction;
25 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
26 import org.opendaylight.mdsal.dom.api.DOMDataTreeProducer;
27 import org.opendaylight.mdsal.dom.api.DOMDataTreeProducerBusyException;
28 import org.opendaylight.mdsal.dom.api.DOMDataTreeProducerException;
29 import org.opendaylight.mdsal.dom.api.DOMDataTreeService;
30 import org.opendaylight.mdsal.dom.api.DOMDataTreeShardingConflictException;
31 import org.opendaylight.mdsal.dom.broker.util.TestModel;
32 import org.opendaylight.mdsal.dom.spi.shard.DOMDataTreeShardProducer;
33 import org.opendaylight.mdsal.dom.spi.shard.DOMDataTreeShardWriteTransaction;
34 import org.opendaylight.mdsal.dom.spi.shard.WriteableDOMDataTreeShard;
35 import org.opendaylight.mdsal.dom.spi.store.DOMStoreTransactionChain;
36 import org.opendaylight.mdsal.dom.spi.store.DOMStoreWriteTransaction;
37 import org.opendaylight.yangtools.concepts.ListenerRegistration;
38 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
40 public class ShardedDOMDataTreeProducerSingleShardTest {
43 private static final DOMDataTreeIdentifier ROOT_ID = new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL,
44 YangInstanceIdentifier.empty());
45 private static final DOMDataTreeIdentifier TEST_ID = new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL,
48 private static final Collection<DOMDataTreeIdentifier> SUBTREES_ROOT = Collections.singleton(ROOT_ID);
49 private static final Collection<DOMDataTreeIdentifier> SUBTREES_TEST = Collections.singleton(TEST_ID);
51 interface MockTestShard extends WriteableDOMDataTreeShard {
55 @Mock(name = "rootShard")
56 private MockTestShard rootShard;
59 @Mock(name = "storeWriteTx")
60 private DOMStoreWriteTransaction writeTxMock;
63 private DOMDataTreeShardProducer producerMock;
66 private DOMDataTreeShardWriteTransaction shardTxMock;
68 @Mock(name = "storeTxChain")
69 private DOMStoreTransactionChain txChainMock;
72 private ShardedDOMDataTreeProducer rootProducer;
74 private DOMDataTreeService treeService;
75 private ListenerRegistration<MockTestShard> shardReg;
76 private DOMDataTreeProducer producer;
79 public void setUp() throws DOMDataTreeShardingConflictException {
80 MockitoAnnotations.initMocks(this);
81 doReturn(Collections.singleton(ROOT_ID)).when(rootProducer).getSubtrees();
82 doNothing().when(rootProducer).subshardAdded(anyMap());
83 final ShardedDOMDataTree impl = new ShardedDOMDataTree();
85 shardReg = impl.registerDataTreeShard(ROOT_ID, rootShard, rootProducer);
87 doReturn("rootShard").when(rootShard).toString();
88 doReturn(producerMock).when(rootShard).createProducer(any(Collection.class));
89 doReturn(shardTxMock).when(producerMock).createTransaction();
90 doNothing().when(producerMock).close();
91 doNothing().when(shardTxMock).ready();
92 doReturn(Futures.immediateFuture(null)).when(shardTxMock).submit();
94 producer = treeService.createProducer(SUBTREES_ROOT);
97 @Test(expected = IllegalArgumentException.class)
98 public void createProducerWithEmptyList() {
99 treeService.createProducer(Collections.emptySet());
102 @Test(expected = DOMDataTreeProducerBusyException.class)
103 public void closeWithTxOpened() throws DOMDataTreeProducerException {
104 producer.createTransaction(false);
109 public void closeWithTxSubmitted() throws DOMDataTreeProducerException {
110 final DOMDataTreeCursorAwareTransaction tx = producer.createTransaction(false);
115 @Test(expected = IllegalStateException.class)
116 public void allocateTxWithTxOpen() {
117 producer.createTransaction(false);
118 producer.createTransaction(false);
122 @Test(expected = IllegalStateException.class)
123 public void allocateChildProducerWithTxOpen() {
124 producer.createTransaction(false);
125 producer.createProducer(SUBTREES_TEST);
129 public void allocateChildProducerWithTxSubmmited() {
130 producer.createTransaction(false).commit();
131 final DOMDataTreeProducer childProducer = producer.createProducer(SUBTREES_TEST);
132 assertNotNull(childProducer);
135 @Test(expected = IllegalArgumentException.class)
136 public void writeChildProducerDataToParentTx() {
137 final DOMDataTreeProducer childProducer = producer.createProducer(SUBTREES_TEST);
138 assertNotNull(childProducer);
139 final DOMDataTreeCursorAwareTransaction parentTx = producer.createTransaction(true);
140 parentTx.createCursor(TEST_ID);
144 public void allocateTxWithTxSubmitted() {
145 producer.createTransaction(false).commit();
146 producer.createTransaction(false);