--- /dev/null
+/*
+ * Copyright © 2017 AT&T, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common.NetworkTransaction;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.NetworkUtils;
+import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.common.network.RequestProcessor;
+import org.opendaylight.transportpce.test.AbstractTest;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.Network;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev150608.NetworkKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+
+public class NetworkTransactionServiceTest extends AbstractTest {
+
+ private NetworkTransactionService networkTransactionService;
+ private LogicalDatastoreType defaultDatastore = LogicalDatastoreType.CONFIGURATION;
+ private NetworkBuilder nwBuilder = new NetworkBuilder();
+ private NetworkId nwId = new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID);
+ private Network defaultData;
+ ExecutorService executor;
+
+
+ private static final Logger LOG = LoggerFactory
+ .getLogger(NetworkTransactionServiceTest.class);
+
+ InstanceIdentifier<Network> nwInstanceIdentifier = InstanceIdentifier
+ .builder(Network.class,
+ new NetworkKey(
+ new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+ .build();
+
+
+ @Before
+ public void instantiate() {
+
+ networkTransactionService = new NetworkTransactionImpl(new RequestProcessor(getDataBroker()));
+ nwBuilder.setNetworkId(nwId);
+ nwBuilder.setKey(nwBuilder.getKey());
+ defaultData = nwBuilder.build();
+ executor = Executors.newFixedThreadPool(3);
+
+ }
+
+ @Test
+ public void WhenOneThreadIsWritingOtherThreadsAreWaiting() {
+
+ Thread t1 = new Thread(runnable);
+ Thread t2 = new Thread(runnable);
+ Thread t3 = new Thread(runnable);
+
+ t1.start();
+ t2.start();
+ t3.start();
+
+ //Check thread 2 is waiting to acquire lock when thread 1 is executing
+ Assert.assertTrue(t2.getState().equals(Thread.State.WAITING));
+
+ LOG.info(t3.getState().toString());
+ //Check thread 3 is waiting to acquire lock when thread 1 is executing
+ Assert.assertTrue(t3.getState().equals(Thread.State.WAITING));
+
+ try {
+ t1.join();
+ //Check thread 3 is waiting to acquire lock when thread 1 is finished and thread is still in executing
+ Assert.assertTrue(t3.getState().equals(Thread.State.WAITING));
+ t2.join();
+ t3.join();
+ } catch (InterruptedException e) {
+ LOG.error(e.getMessage());
+ }
+ }
+
+ Runnable runnable = new Runnable() {
+ @Override
+ public void run() {
+ networkTransactionService.merge(defaultDatastore, nwInstanceIdentifier, defaultData);
+ try {
+
+ //Add delay to mock thread execution delay
+ Thread.sleep(10000);
+ } catch (InterruptedException e) {
+ LOG.error(e.getMessage());
+ }
+ networkTransactionService.submit();
+
+ }
+ };
+}