/* * Copyright (c) 2014 Cisco Systems, 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.html */ package org.opendaylight.controller.netconf.it; import static java.lang.Thread.sleep; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import static org.opendaylight.controller.netconf.it.NetconfITSecureTest.getSessionListener; import com.google.common.base.Throwables; import com.google.common.collect.Lists; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.util.HashedWheelTimer; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.opendaylight.controller.netconf.api.NetconfMessage; import org.opendaylight.controller.netconf.client.NetconfClientDispatcher; import org.opendaylight.controller.netconf.client.NetconfClientDispatcherImpl; import org.opendaylight.controller.netconf.client.TestingNetconfClient; import org.opendaylight.controller.netconf.test.tool.Main.Params; import org.opendaylight.controller.netconf.test.tool.NetconfDeviceSimulator; import org.opendaylight.controller.netconf.util.test.XmlFileLoader; import org.opendaylight.controller.sal.connect.netconf.listener.NetconfDeviceCommunicator; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcResult; public class NetconfITSecureTestTool { //set up port both for testool device and test public static final int PORT = 17833; private static final InetSocketAddress TLS_ADDRESS = new InetSocketAddress("127.0.0.1", PORT); private String xmlFile = "netconfMessages/editConfig.xml"; private ExecutorService msgExec = Executors.newFixedThreadPool(8); Collection> tasks = new LinkedList>(); final NetconfDeviceSimulator netconfDeviceSimulator = new NetconfDeviceSimulator(); @Before public void setUp() throws Exception { //Set up parameters for testtool device Params params = new Params(); params.debug = true; params.deviceCount = 1; params.startingPort = PORT; params.ssh = true; params.exi = true; final List openDevices = netconfDeviceSimulator.start(params); } @After public void tearDown() throws Exception { } /** * Test all requests are handled properly and no mismatch occurs in listener */ @Test(timeout = 6*60*1000) public void testSecureStress() throws Exception { final int requests = 4000; List> tasks = new ArrayList<>(); final NetconfClientDispatcher dispatch = new NetconfClientDispatcherImpl(new NioEventLoopGroup(), new NioEventLoopGroup(), new HashedWheelTimer()); final NetconfDeviceCommunicator sessionListener = getSessionListener(); try (TestingNetconfClient netconfClient = new TestingNetconfClient("testing-ssh-client", dispatch, NetconfITSecureTest.getClientConfiguration(sessionListener, TLS_ADDRESS));) { final AtomicInteger responseCounter = new AtomicInteger(0); final List>> futures = Lists.newArrayList(); for (int i = 0; i < requests; i++) { NetconfMessage getConfig = XmlFileLoader.xmlFileToNetconfMessage(xmlFile); getConfig = NetconfITSecureTest.changeMessageId(getConfig,i); Runnable worker = new NetconfITSecureTestToolRunnable(getConfig,i, sessionListener, futures, responseCounter); tasks.add(msgExec.submit(worker)); } msgExec.shutdown(); // Wait for every future for (final Future task : tasks){ try { task.get(3, TimeUnit.MINUTES); } catch (final TimeoutException e) { fail(String.format("Request %d is not responding", tasks.indexOf(task))); } } for (final ListenableFuture> future : futures) { try { future.get(3, TimeUnit.MINUTES); } catch (final TimeoutException e) { fail(String.format("Reply %d is not responding", futures.indexOf(future))); } } sleep(5000); assertEquals(requests, responseCounter.get()); } } class NetconfITSecureTestToolRunnable implements Runnable { private NetconfMessage getConfig; private int it; private NetconfDeviceCommunicator sessionListener; private List>> futures; private AtomicInteger responseCounter; public NetconfITSecureTestToolRunnable(NetconfMessage getConfig, int it, NetconfDeviceCommunicator sessionListener, List>> futures, AtomicInteger responseCounter){ this.getConfig = getConfig; this.it = it; this.sessionListener = sessionListener; this.futures = futures; this.responseCounter = responseCounter; } @Override public void run(){ ListenableFuture> netconfMessageFuture; netconfMessageFuture = sessionListener.sendRequest(getConfig, QName.create("namespace", "2012-12-12", "get")); futures.add(netconfMessageFuture); Futures.addCallback(netconfMessageFuture, new FutureCallback>() { @Override public void onSuccess(final RpcResult result) { if(result.isSuccessful()&result.getErrors().isEmpty()) { responseCounter.incrementAndGet(); } else { fail(String.format("Message result not ok %s", result.getErrors().toString())); } } @Override public void onFailure(final Throwable t) { fail(String.format("Message failed %s", Throwables.getStackTraceAsString(t))); } } ); } } }