1
/*=============================================================================
3
===============================================================================
4
Test the pstream server C++ facilities of XML-RPC for C/C++.
6
=============================================================================*/
8
#include <sys/socket.h>
14
#include "xmlrpc-c/girerr.hpp"
17
#include "xmlrpc-c/base.hpp"
18
#include "xmlrpc-c/registry.hpp"
19
#include "xmlrpc-c/server_pstream.hpp"
22
#include "server_pstream.hpp"
24
using namespace xmlrpc_c;
29
class sampleAddMethod : public method {
32
this->_signature = "i:ii";
33
this->_help = "This method adds two integers together";
36
execute(xmlrpc_c::paramList const& paramList,
37
value * const retvalP) {
39
int const addend(paramList.getInt(0));
40
int const adder(paramList.getInt(1));
42
paramList.verifyEnd(2);
44
*retvalP = value_int(addend + adder);
51
createTestFile(string const& contents,
54
string const filename("/tmp/xmlrpc_test_pstream");
55
unlink(filename.c_str());
57
rc = open(filename.c_str(), O_RDWR | O_CREAT);
58
unlink(filename.c_str());
61
throwf("Failed to create file '%s' as a test tool. errno=%d (%s)",
62
filename.c_str(), errno, strerror(errno));
68
rc = write(fd, contents.c_str(), contents.length());
71
throwf("write() of test file failed, errno=%d (%s)",
72
errno, strerror(errno));
74
unsigned int bytesWritten(rc);
76
if (bytesWritten != contents.length())
77
throwf("Short write");
80
rc = lseek(fd, 0, SEEK_SET);
83
throwf("lseek(0) of test file failed, errno=%d (%s)",
84
errno, strerror(errno));
93
class serverPstreamConnTestSuite : public testSuite {
96
virtual string suiteName() {
97
return "serverPstreamConnTestSuite";
99
virtual void runtests(unsigned int const) {
100
int const devNullFd(open("/dev/null", 0));
103
throwf("Failed to open /dev/null, needed for test.");
107
myRegistry.addMethod("sample.add", methodPtr(new sampleAddMethod));
109
registryPtr myRegistryP(new registry);
111
myRegistryP->addMethod("sample.add", methodPtr(new sampleAddMethod));
113
EXPECT_ERROR( // Empty options
114
serverPstreamConn::constrOpt opt;
115
serverPstreamConn server(opt);
118
EXPECT_ERROR( // No registry
119
serverPstreamConn server(serverPstreamConn::constrOpt()
123
EXPECT_ERROR( // No socket fd
124
serverPstreamConn server(serverPstreamConn::constrOpt()
125
.registryP(&myRegistry));
128
EXPECT_ERROR( // No such file descriptor
129
serverPstreamConn server(serverPstreamConn::constrOpt()
130
.registryP(&myRegistry)
135
serverPstreamConn server(serverPstreamConn::constrOpt()
136
.registryP(&myRegistry)
137
.socketFd(devNullFd));
140
server.runOnce(&eof);
145
createTestFile("junk", &fd);
147
serverPstreamConn server(serverPstreamConn::constrOpt()
148
.registryP(&myRegistry)
153
EXPECT_ERROR( // EOF in the middle of a packet
154
server.runOnce(&eof);
166
serverPstreamTestSuite::suiteName() {
167
return "serverPstreamTestSuite";
172
serverPstreamTestSuite::runtests(unsigned int const indentation) {
174
serverPstreamConnTestSuite().run(indentation + 1);