22 #include <sys/types.h>
23 #include <system_error>
25 #include "gtest/gtest.h"
35 #define BLOB_REPEAT_COUNT 5
37 TEST(IndiserverSingleDriver, MissingDriver)
44 std::string fakeDriverPath =
getTestExePath(
"fakedriver-not-existing");
48 fprintf(stderr,
"indiserver started\n");
54 TEST(IndiserverSingleDriver, ReplyToPing)
67 fprintf(stderr,
"indiserver started\n");
70 fprintf(stderr,
"fake driver started\n");
72 fakeDriver.
cnx.
expectXml(
"<getProperties version='1.7'/>");
73 fprintf(stderr,
"getProperties received");
80 fakeDriver.
cnx.
send(
"<pingRequest uid='1'/>\n");
83 client.
cnx.
send(
"<pingRequest uid='2'/>\n");
86 fakeDriver.
cnx.
send(
"<pingRequest uid='3'/>\n");
89 client.
cnx.
send(
"<pingRequest uid='4'/>\n");
107 fprintf(stderr,
"indiserver started\n");
114 fprintf(stderr,
"fake driver started\n");
116 fakeDriver.
cnx.
expectXml(
"<getProperties version='1.7'/>");
117 fprintf(stderr,
"getProperties received\n");
120 fakeDriver.
cnx.
send(
"<defBLOBVector device='" + name +
"' name='testblob' label='test label' group='test_group' state='Idle' perm='ro' timeout='100' timestamp='2018-01-01T00:00:00'>\n");
121 fakeDriver.
cnx.
send(
"<defBLOB name='content' label='content'/>\n");
122 fakeDriver.
cnx.
send(
"</defBLOBVector>\n");
128 startFakeDev(indiServer);
129 establishDriver(indiServer, fakeDriver,
"fakeDev1");
140 establishDriver(indiServer, fakeDriver, name);
146 fprintf(stderr,
"Client asks properties\n");
147 indiClient.
cnx.
send(
"<getProperties version='1.7'/>\n");
148 fakeDriver.
cnx.
expectXml(
"<getProperties version='1.7'/>");
150 fprintf(stderr,
"Driver sends properties\n");
151 fakeDriver.
cnx.
send(
"<defBLOBVector device='fakedev1' name='testblob' label='test label' group='test_group' state='Idle' perm='ro' timeout='100' timestamp='2018-01-01T00:00:00'>\n");
152 fakeDriver.
cnx.
send(
"<defBLOB name='content' label='content'/>\n");
153 fakeDriver.
cnx.
send(
"</defBLOBVector>\n");
155 fprintf(stderr,
"Client receive properties\n");
156 indiClient.
cnx.
expectXml(
"<defBLOBVector device=\"fakedev1\" name=\"testblob\" label=\"test label\" group=\"test_group\" state=\"Idle\" perm=\"ro\" timeout=\"100\" timestamp=\"2018-01-01T00:00:00\">");
157 indiClient.
cnx.
expectXml(
"<defBLOB name=\"content\" label=\"content\"/>");
161 TEST(IndiserverSingleDriver, DontLeakFds)
166 startFakeDev1(indiServer, fakeDriver);
172 #ifdef ENABLE_INDI_SHARED_MEMORY
188 indiServer.
checkOpenFdCount(fdCountIdle,
"Second unix connection released");
210 TEST(IndiserverSingleDriver, DontForwardUnaskedBlobDefToClient)
215 startFakeDev1(indiServer, fakeDriver);
219 indiClient.
connect(indiServer);
223 fprintf(stderr,
"Driver send new blob value\n");
224 fakeDriver.
cnx.
send(
"<setBLOBVector device='fakedev1' name='testblob' timestamp='2018-01-01T00:01:00'>\n");
225 fakeDriver.
cnx.
send(
"<oneBLOB name='content' size='21' format='.fits' enclen='29'>\n");
226 fakeDriver.
cnx.
send(
"MDEyMzQ1Njc4OTAxMjM0NTY3ODkK\n");
227 fakeDriver.
cnx.
send(
"</oneBLOB>\n");
228 fakeDriver.
cnx.
send(
"</setBLOBVector>\n");
231 fprintf(stderr,
"Client don't receive blob\n");
239 TEST(IndiserverSingleDriver, DontForwardOtherBlobDefToClient)
244 startFakeDev1(indiServer, fakeDriver);
248 indiClient.
connect(indiServer);
252 fprintf(stderr,
"Client ask blobs\n");
253 indiClient.
cnx.
send(
"<enableBLOB device='fakedev1' name='testblob2'>Also</enableBLOB>\n");
257 fprintf(stderr,
"Driver send new blob value\n");
258 fakeDriver.
cnx.
send(
"<setBLOBVector device='fakedev1' name='testblob' timestamp='2018-01-01T00:01:00'>\n");
259 fakeDriver.
cnx.
send(
"<oneBLOB name='content' size='21' format='.fits' enclen='29'>\n");
260 fakeDriver.
cnx.
send(
"MDEyMzQ1Njc4OTAxMjM0NTY3ODkK\n");
261 fakeDriver.
cnx.
send(
"</oneBLOB>\n");
262 fakeDriver.
cnx.
send(
"</setBLOBVector>\n");
265 fprintf(stderr,
"Client don't receive blob\n");
273 TEST(IndiserverSingleDriver, DropMisbehavingDriver)
278 startFakeDev1(indiServer, fakeDriver);
282 indiClient.
connect(indiServer);
286 fprintf(stderr,
"Client ask blobs\n");
287 indiClient.
cnx.
send(
"<enableBLOB device='fakedev1' name='testblob'>Also</enableBLOB>\n");
290 fprintf(stderr,
"Driver send new blob value - without actual attachment\n");
291 fakeDriver.
cnx.
send(
"<setBLOBVector device='fakedev1' name='testblob' timestamp='2018-01-01T00:01:00'>\n");
292 fakeDriver.
cnx.
send(
"<oneBLOB name='content' size='21' format='.fits' attached='true'/>\n");
293 fakeDriver.
cnx.
send(
"</setBLOBVector>\n");
298 TEST(IndiserverSingleDriver, ForwardBase64BlobToIPClient)
304 startFakeDev1(indiServer, fakeDriver);
312 fprintf(stderr,
"Client ask blobs\n");
313 indiClient.
cnx.
send(
"<enableBLOB device='fakedev1' name='testblob'>Also</enableBLOB>\n");
316 fprintf(stderr,
"Driver send new blob value\n");
317 fakeDriver.
cnx.
send(
"<setBLOBVector device='fakedev1' name='testblob' timestamp='2018-01-01T00:01:00'>\n");
318 fakeDriver.
cnx.
send(
"<oneBLOB name='content' size='20' format='.fits' enclen='29'>\n");
319 fakeDriver.
cnx.
send(
"MDEyMzQ1Njc4OTAxMjM0NTY3ODkK\n");
320 fakeDriver.
cnx.
send(
"</oneBLOB>\n");
321 fakeDriver.
cnx.
send(
"</setBLOBVector>\n");
324 fprintf(stderr,
"Client receive blob\n");
326 indiClient.
cnx.
expectXml(
"<setBLOBVector device='fakedev1' name='testblob' timestamp='2018-01-01T00:01:00'>");
327 indiClient.
cnx.
expectXml(
"<oneBLOB name='content' size='20' format='.fits' enclen='29'>");
328 indiClient.
cnx.
expect(
"\nMDEyMzQ1Njc4OTAxMjM0NTY3ODkK");
338 TEST(IndiserverSingleDriver, SnoopDriverPropertie)
344 startFakeDev1(indiServer, fakeDriver);
347 addDriver(indiServer, snoopDriver,
"snoopDriver");
352 snoopDriver.
cnx.
send(
"<getProperties version='1.7' device='fakedev1' name='testnumber1'/>\n");
357 fakeDriver.
cnx.
send(
"<defNumberVector device='fakedev1' name='testnumber1' label='test label' group='test_group' state='Idle' perm='rw' timeout='100' timestamp='2018-01-01T00:00:00'>\n");
358 fakeDriver.
cnx.
send(
"<defNumber name='content' label='content' min='0' max='100' step='1'>50</defNumber>\n");
359 fakeDriver.
cnx.
send(
"</defNumberVector>\n");
361 snoopDriver.
cnx.
expectXml(
"<defNumberVector device='fakedev1' name='testnumber1' label='test label' group='test_group' state='Idle' perm='rw' timeout='100' timestamp='2018-01-01T00:00:00'>");
362 snoopDriver.
cnx.
expectXml(
"<defNumber name='content' label='content' min='0' max='100' step='1'>");
375 #define DUMMY_BLOB_SIZE 64
377 #ifdef ENABLE_INDI_SHARED_MEMORY
379 TEST(IndiserverSingleDriver, ForwardBase64BlobToUnixClient)
385 startFakeDev1(indiServer, fakeDriver);
393 fprintf(stderr,
"Client ask blobs\n");
394 indiClient.
cnx.
send(
"<enableBLOB device='fakedev1' name='testblob'>Also</enableBLOB>\n");
397 fprintf(stderr,
"Driver send new blob value\n");
398 fakeDriver.
cnx.
send(
"<setBLOBVector device='fakedev1' name='testblob' timestamp='2018-01-01T00:01:00'>\n");
399 fakeDriver.
cnx.
send(
"<oneBLOB name='content' size='20' format='.fits' enclen='29'>\n");
400 fakeDriver.
cnx.
send(
"MDEyMzQ1Njc4OTAxMjM0NTY3ODkK\n");
401 fakeDriver.
cnx.
send(
"</oneBLOB>\n");
402 fakeDriver.
cnx.
send(
"</setBLOBVector>\n");
405 fprintf(stderr,
"Client receive blob\n");
407 indiClient.
cnx.
expectXml(
"<setBLOBVector device='fakedev1' name='testblob' timestamp='2018-01-01T00:01:00'>");
408 indiClient.
cnx.
expectXml(
"<oneBLOB name='content' size='20' format='.fits' attached='true'/>");
415 EXPECT_GE( receivedFd.
getSize(), 20);
422 void driverSendAttachedBlob(
DriverMock &fakeDriver, ssize_t size)
424 fprintf(stderr,
"Driver send new blob value as attachment\n");
427 ssize_t physical_size=0x10000;
428 if (physical_size < size) {
429 physical_size = size;
434 fd.allocate(physical_size);
436 char *
buffer = (
char*)malloc(physical_size);
437 for(
auto i = 0; i < physical_size; ++i)
439 buffer[i] = {(char)(
'0' + (i % 10))};
444 fakeDriver.
cnx.
send(
"<setBLOBVector device='fakedev1' name='testblob' timestamp='2018-01-01T00:01:00'>\n");
445 fakeDriver.
cnx.
send(
"<oneBLOB name='content' size='" +
std::to_string(size) +
"' format='.fits' attached='true'/>\n",
fd);
446 fakeDriver.
cnx.
send(
"</setBLOBVector>");
462 TEST(IndiserverSingleDriver, ForwardAttachedBlobToUnixClient)
468 startFakeDev1(indiServer, fakeDriver);
476 fprintf(stderr,
"Client ask blobs\n");
477 indiClient.
cnx.
send(
"<enableBLOB device='fakedev1' name='testblob'>Also</enableBLOB>\n");
485 driverSendAttachedBlob(fakeDriver, size);
488 fprintf(stderr,
"Client receive blob\n");
490 indiClient.
cnx.
expectXml(
"<setBLOBVector device='fakedev1' name='testblob' timestamp='2018-01-01T00:01:00'>");
498 EXPECT_GE( receivedFd.
getSize(), size);
506 TEST(IndiserverSingleDriver, ForwardAttachedBlobToIPClient)
512 startFakeDev1(indiServer, fakeDriver);
520 fprintf(stderr,
"Client ask blobs\n");
521 indiClient.
cnx.
send(
"<enableBLOB device='fakedev1' name='testblob'>Also</enableBLOB>\n");
527 driverSendAttachedBlob(fakeDriver, size);
530 fprintf(stderr,
"Client receive blob\n");
531 indiClient.
cnx.
expectXml(
"<setBLOBVector device='fakedev1' name='testblob' timestamp='2018-01-01T00:01:00'>");
534 indiClient.
cnx.
expect(
"\nMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDE=");
544 TEST(IndiserverSingleDriver, ForwardAttachedBlobToDriver)
550 startFakeDev1(indiServer, fakeDriver);
553 addDriver(indiServer, snoopDriver,
"snoopDriver");
558 snoopDriver.
cnx.
send(
"<getProperties version='1.7' device='fakedev1' name='testblob'/>\n");
559 snoopDriver.
cnx.
send(
"<enableBLOB device='fakedev1' name='testblob'>Also</enableBLOB>\n");
563 driverSendAttachedBlob(fakeDriver, size);
568 snoopDriver.
cnx.
expectXml(
"<setBLOBVector device='fakedev1' name='testblob' timestamp='2018-01-01T00:01:00'>");
569 snoopDriver.
cnx.
expectXml(
"<oneBLOB name='content' size='32' format='.fits' attached='true'/>\n");
575 EXPECT_GE( receivedFd.
getSize(), 32);
577 snoopDriver.
cnx.
expectXml(
"<setBLOBVector device='fakedev1' name='testblob' timestamp='2018-01-01T00:01:00'>");
578 snoopDriver.
cnx.
expectXml(
"<oneBLOB name='content' size='32' format='.fits'>\n");
579 snoopDriver.
cnx.
expect(
"\nMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDE=");
TEST(IndiserverSingleDriver, MissingDriver)
#define BLOB_REPEAT_COUNT
void connectFakeDev1Client(IndiServerController &, DriverMock &fakeDriver, IndiClientMock &indiClient)
void allowBufferReceive(bool state)
void expectBuffer(SharedBuffer &fd)
void expect(const std::string &content)
void send(const std::string &content)
void expectXml(const std::string &xml)
void connectUnix(const IndiServerController &server)
void connectTcp(const IndiServerController &server)
void connect(const IndiServerController &server)
void addDriver(const std::string &path)
void setFifo(bool enable)
std::string getUnixSocketPath() const
void startDriver(const std::string &driver)
void checkOpenFdCount(int expected, const std::string &msg)
void waitProcessEnd(int expectedExitCode)
std::vector< uint8_t > buffer
NLOHMANN_BASIC_JSON_TPL_DECLARATION std::string to_string(const NLOHMANN_BASIC_JSON_TPL &j)
user-defined to_string function for JSON values
std::string getTestExePath(const std::string &str)