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.Matchers.any;
12 import static org.mockito.Matchers.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.store.DOMStoreTransactionChain;
33 import org.opendaylight.mdsal.dom.spi.store.DOMStoreWriteTransaction;
34 import org.opendaylight.mdsal.dom.store.inmemory.DOMDataTreeShardProducer;
35 import org.opendaylight.mdsal.dom.store.inmemory.DOMDataTreeShardWriteTransaction;
36 import org.opendaylight.mdsal.dom.store.inmemory.WriteableDOMDataTreeShard;
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(shardTxMock).ready();
91 doReturn(Futures.immediateFuture(null)).when(shardTxMock).submit();
93 producer = treeService.createProducer(SUBTREES_ROOT);
96 @Test(expected = IllegalArgumentException.class)
97 public void createProducerWithEmptyList() {
98 treeService.createProducer(Collections.<DOMDataTreeIdentifier>emptySet());
101 @Test(expected = DOMDataTreeProducerBusyException.class)
102 public void closeWithTxOpened() throws DOMDataTreeProducerException {
103 producer.createTransaction(false);
108 public void closeWithTxSubmitted() throws DOMDataTreeProducerException {
109 final DOMDataTreeCursorAwareTransaction tx = producer.createTransaction(false);
114 @Test(expected = IllegalStateException.class)
115 public void allocateTxWithTxOpen() {
116 producer.createTransaction(false);
117 producer.createTransaction(false);
121 @Test(expected = IllegalStateException.class)
122 public void allocateChildProducerWithTxOpen() {
123 producer.createTransaction(false);
124 producer.createProducer(SUBTREES_TEST);
128 public void allocateChildProducerWithTxSubmmited() {
129 producer.createTransaction(false).submit();
130 final DOMDataTreeProducer childProducer = producer.createProducer(SUBTREES_TEST);
131 assertNotNull(childProducer);
134 @Test(expected = IllegalArgumentException.class)
135 public void writeChildProducerDataToParentTx() {
136 final DOMDataTreeProducer childProducer = producer.createProducer(SUBTREES_TEST);
137 assertNotNull(childProducer);
138 final DOMDataTreeCursorAwareTransaction parentTx = producer.createTransaction(true);
139 parentTx.createCursor(TEST_ID);
143 public void allocateTxWithTxSubmitted() {
144 producer.createTransaction(false).submit();
145 producer.createTransaction(false);