File: TestSocketCommunicator.cxx

package info (click to toggle)
vtk9 9.5.2%2Bdfsg3-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 205,916 kB
  • sloc: cpp: 2,336,565; ansic: 327,116; python: 111,200; yacc: 4,104; java: 3,977; sh: 3,032; xml: 2,771; perl: 2,189; lex: 1,787; makefile: 178; javascript: 165; objc: 153; tcl: 59
file content (141 lines) | stat: -rw-r--r-- 3,936 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
// This test tests vtkSocketCommunicator.
#include "vtkDoubleArray.h"
#include "vtkNew.h"
#include "vtkPolyData.h"
#include "vtkServerSocket.h"
#include "vtkSocketCommunicator.h"
#include "vtkSocketController.h"
#include "vtkTesting.h"

#include <sstream>

#define MESSAGE(x) cout << (is_server ? "SERVER" : "CLIENT") << ":" x << endl;

//-----------------------------------------------------------------------------
// This unit test make sure that we can Send/Receive a int, vtkDataArray and a vtkDataSet
bool TestSendReceiveDataArray(vtkSocketController* controller, bool& is_server)
{
  int idata = 0;
  double ddata = 0;
  vtkNew<vtkDoubleArray> dArray;
  vtkNew<vtkPolyData> pData;

  MESSAGE("---- TestSendReceiveDataArray ----")

  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, 1, 101013);
      controller->Send(pData, 1, 101014);
    }
    else
    {
      controller->Receive(&idata, 1, 1, 101011);
      controller->Receive(&ddata, 1, 1, 101012);
      controller->Receive(dArray, 1, 101013);
      controller->Receive(pData, 1, 101014);
      if (idata != 10 || ddata != 10.0 || dArray->GetNumberOfTuples() != 10 ||
        dArray->GetValue(9) != 10.0)
      {
        MESSAGE("ERROR: Communication failed!!!");
        return false;
      }
    }
    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 true;
}

//-----------------------------------------------------------------------------
// This unit test make sure that it is correctly checked, especially on Windows as it previously the
// server hangs indefinitely.
bool TestConnectionAbortHandling(vtkSocketController* controller, bool& is_server)
{
  MESSAGE("---- TestConnectionAbortHandling ----")
  MESSAGE("Check support of connection failure...")
  vtkNew<vtkDoubleArray> dArray;

  if (is_server)
  {
    controller->Receive(dArray, 1, 101013);
    MESSAGE("Error is expected, continue.")
  }
  else
  {
    MESSAGE("Kill the client")
    controller->TriggerBreakRMIs();
  }

  return true;
}

//-----------------------------------------------------------------------------
int main(int argc, char* argv[])
{
  vtkNew<vtkTesting> testing;
  testing->AddArguments(argc, 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;
    }
  }

  std::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.");

  bool succeed = true;
  succeed &= ::TestSendReceiveDataArray(controller, is_server);
  succeed &= ::TestConnectionAbortHandling(controller, is_server);

  if (succeed)
  {
    return EXIT_SUCCESS;
  }

  return EXIT_FAILURE;
}