Commit 3e5e0e1a authored by Utkarsh Ayachit's avatar Utkarsh Ayachit

Adding a new test for TestSocketCommunicator.

Add a tests for vtkSocketCommunicator. Also added a driver (vtkTestDriver)
that can be used when adding tests that need to run multiple executables.
Currently vtkTestDriver is simple: it simply spawn executables with commandlines
specified.

Change-Id: I03a53c827a99ba02519442f3059f86cd3d9484e5
parent 7e722408
r"""
This is a script that can be used to run tests that require multiple
executables to be run e.g. those client-server tests.
Usage:
python vtkTestDriver.py --process exe1 arg11 arg12 ...
--process exe2 arg21 arg22 ...
--process ...
"""
import sys
import subprocess
# Extract arguments for each process to execute.
command_lists = []
prev = None
for idx in range(1, len(sys.argv)):
if sys.argv[idx] == "--process":
if prev:
command_lists.append(sys.argv[prev:idx])
prev = idx+1
if prev <= len(sys.argv):
command_lists.append(sys.argv[prev:])
procs = []
for cmdlist in command_lists:
print "Executing '", " ".join(cmdlist), "'"
proc = subprocess.Popen(cmdlist)
procs.append(proc)
# Now wait for each of the processes to terminate.
# If ctest times out, it will kill this process and all subprocesses will be
# terminated anyways, so we don't need to handle timeout specially.
for proc in procs:
proc.wait()
vtk_add_test_cxx(TestFieldDataSerialization.cxx NO_DATA NO_VALID NO_OUTPUT)
vtk_test_cxx_executable(${vtk-module}CxxTests)
if (PYTHON_EXECUTABLE)
vtk_module_test_executable(
${vtk-module}-TestSocketCommunicator TestSocketCommunicator.cxx)
add_test(NAME ${vtk-module}-TestSocketCommunicator
COMMAND ${PYTHON_EXECUTABLE}
${VTK_CMAKE_DIR}/vtkTestDriver.py
# indicate that the processes are not run sequentially,
--process
$<TARGET_FILE:${vtk-module}-TestSocketCommunicator>
-T ${VTK_TEST_OUTPUT_DIR}
--server
--process
$<TARGET_FILE:${vtk-module}-TestSocketCommunicator>
-T ${VTK_TEST_OUTPUT_DIR}
)
endif()
/*=========================================================================
Program: Visualization Toolkit
Module: TestSocketCommunicator.cxx
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// This test tests vtkSocketCommunicator.
#include "vtkNew.h"
#include "vtkSocketCommunicator.h"
#include "vtkSocketController.h"
#include "vtkTesting.h"
#include "vtkServerSocket.h"
#include "vtkPolyData.h"
#include "vtkDoubleArray.h"
#include <vtksys/ios/sstream>
#define MESSAGE(x)\
cout << (is_server? "SERVER" : "CLIENT") << ":" x << endl;
int main(int argc, char **argv)
{
vtkNew<vtkTesting> testing;
testing->AddArguments(argc, const_cast<const char **>(argv));
bool is_server = false;
for (int cc=1; cc < argc; cc++)
{
if (argv[cc] &&
(strcmp(argv[cc], "--server") == 0||
strcmp(argv[cc], "\"--server\"") == 0))
{
is_server = true;
break;
}
}
vtksys_ios::ostringstream stream;
stream << testing->GetTempDirectory() << "/TestSocketCommunicator."
<< (is_server? "server" : "client") << ".log";
// initialize the socket controller.
vtkNew<vtkSocketController> controller;
controller->Initialize(&argc, &argv);
vtkSocketCommunicator* comm = vtkSocketCommunicator::SafeDownCast(
controller->GetCommunicator());
comm->SetReportErrors(1);
comm->LogToFile(stream.str().c_str());
if (is_server)
{
MESSAGE("Waiting on 10240");
controller->WaitForConnection(10240);
}
else
{
MESSAGE("Connecting to 10240");
controller->ConnectTo("localhost", 10240);
}
if (!comm->Handshake())
{
return EXIT_FAILURE;
}
MESSAGE("Connected.");
int idata = 0;
double ddata = 0;
vtkNew<vtkDoubleArray> dArray;
vtkNew<vtkPolyData> pData;
for (int cc=0; cc < 2; cc++)
{
MESSAGE("---- Test stage " << cc << "----");
if (is_server)
{
idata = 10;
ddata = 10.0;
dArray->SetNumberOfTuples(10);
dArray->FillComponent(0, 10.0);
pData->Initialize();
controller->Send(&idata, 1, 1, 101011);
controller->Send(&ddata, 1, 1, 101012);
controller->Send(dArray.GetPointer(), 1, 101013);
controller->Send(pData.GetPointer(), 1, 101014);
}
else
{
controller->Receive(&idata, 1, 1, 101011);
controller->Receive(&ddata, 1, 1, 101012);
controller->Receive(dArray.GetPointer(), 1, 101013);
controller->Receive(pData.GetPointer(), 1, 101014);
if (idata != 10 ||
ddata != 10.0 ||
dArray->GetNumberOfTuples() != 10 ||
dArray->GetValue(9) != 10.0)
{
MESSAGE("ERROR: Communication failed!!!");
return EXIT_FAILURE;
}
}
MESSAGE(" .... PASSED!");
// switch the flags so server becomes client and client becomes server and
// ship messages around.
is_server = !is_server;
}
MESSAGE("All's well!");
return EXIT_SUCCESS;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment