Re: [libvirt] [PATCH] rpc: add testing of RPC JSON (de)serialization

2015-05-25 Thread Martin Kletzander

On Fri, May 22, 2015 at 01:36:14PM +0100, Daniel P. Berrange wrote:

The virNetServer class has the ability to serialize its state
to a JSON file, and then re-load that data after an in-place
execve() call to re-connect to active file handles. This data
format is critical ABI that must have compatibility across
releases, so it should be tested...
---
src/libvirt_remote.syms|   1 +
src/rpc/virnetserver.c |   4 +-
src/rpc/virnetserver.h |   3 +
src/rpc/virnetserverclient.c   |  13 +-
src/rpc/virnetserverservice.c  |   6 +-
tests/Makefile.am  |   7 +
tests/virnetserverdata/README  |  14 +
.../virnetserverdata/input-data-anon-clients.json  |  63 +
tests/virnetserverdata/input-data-initial.json |  62 +
.../virnetserverdata/output-data-anon-clients.json |  63 +
tests/virnetserverdata/output-data-initial.json|  63 +
tests/virnetservertest.c   | 290 +
12 files changed, 579 insertions(+), 10 deletions(-)
create mode 100644 tests/virnetserverdata/README
create mode 100644 tests/virnetserverdata/input-data-anon-clients.json
create mode 100644 tests/virnetserverdata/input-data-initial.json
create mode 100644 tests/virnetserverdata/output-data-anon-clients.json
create mode 100644 tests/virnetserverdata/output-data-initial.json
create mode 100644 tests/virnetservertest.c

diff --git a/src/libvirt_remote.syms b/src/libvirt_remote.syms
index 950e56e..bdd68f6 100644
--- a/src/libvirt_remote.syms
+++ b/src/libvirt_remote.syms
@@ -77,6 +77,7 @@ xdr_virNetMessageError;


# rpc/virnetserver.h
+virNetServerAddClient;
virNetServerAddProgram;
virNetServerAddService;
virNetServerAddShutdownInhibition;
diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c
index 42427dc..091a1dc 100644
--- a/src/rpc/virnetserver.c
+++ b/src/rpc/virnetserver.c
@@ -259,8 +259,8 @@ static int 
virNetServerDispatchNewMessage(virNetServerClientPtr client,
}


-static int virNetServerAddClient(virNetServerPtr srv,
- virNetServerClientPtr client)
+int virNetServerAddClient(virNetServerPtr srv,
+  virNetServerClientPtr client)
{
virObjectLock(srv);

diff --git a/src/rpc/virnetserver.h b/src/rpc/virnetserver.h
index 8c5ae07..4b452be 100644
--- a/src/rpc/virnetserver.h
+++ b/src/rpc/virnetserver.h
@@ -79,6 +79,9 @@ int virNetServerAddService(virNetServerPtr srv,
   virNetServerServicePtr svc,
   const char *mdnsEntryName);

+int virNetServerAddClient(virNetServerPtr srv,
+  virNetServerClientPtr client);
+
int virNetServerAddProgram(virNetServerPtr srv,
   virNetServerProgramPtr prog);

diff --git a/src/rpc/virnetserverclient.c b/src/rpc/virnetserverclient.c
index 34c1994..0e3a71f 100644
--- a/src/rpc/virnetserverclient.c
+++ b/src/rpc/virnetserverclient.c
@@ -536,13 +536,14 @@ virJSONValuePtr 
virNetServerClientPreExecRestart(virNetServerClientPtr client)
goto error;
}

-if (client-privateData  client-privateDataPreExecRestart 
-!(child = client-privateDataPreExecRestart(client, 
client-privateData)))
-goto error;
+if (client-privateData  client-privateDataPreExecRestart) {
+if (!(child = client-privateDataPreExecRestart(client, 
client-privateData)))
+goto error;

-if (virJSONValueObjectAppend(object, privateData, child)  0) {
-virJSONValueFree(child);
-goto error;
+if (virJSONValueObjectAppend(object, privateData, child)  0) {
+virJSONValueFree(child);
+goto error;
+}
}

virObjectUnlock(client);
diff --git a/src/rpc/virnetserverservice.c b/src/rpc/virnetserverservice.c
index d3cf31a..4df26cb 100644
--- a/src/rpc/virnetserverservice.c
+++ b/src/rpc/virnetserverservice.c
@@ -303,12 +303,15 @@ virNetServerServicePtr virNetServerServiceNewFD(int fd,

/* IO callback is initially disabled, until we're ready
 * to deal with incoming clients */
+virObjectRef(svc);
if (virNetSocketAddIOCallback(svc-socks[i],
  0,
  virNetServerServiceAccept,
  svc,
-  virObjectFreeCallback)  0)
+  virObjectFreeCallback)  0) {
+virObjectUnref(svc);
goto error;
+}
}


@@ -388,7 +391,6 @@ virNetServerServicePtr 
virNetServerServiceNewPostExecRestart(virJSONValuePtr obj
  svc,
  virObjectFreeCallback)  0) {
virObjectUnref(svc);
-virObjectUnref(sock);
goto error;
}
}
diff --git a/tests/Makefile.am 

[libvirt] [PATCH] rpc: add testing of RPC JSON (de)serialization

2015-05-22 Thread Daniel P. Berrange
The virNetServer class has the ability to serialize its state
to a JSON file, and then re-load that data after an in-place
execve() call to re-connect to active file handles. This data
format is critical ABI that must have compatibility across
releases, so it should be tested...
---
 src/libvirt_remote.syms|   1 +
 src/rpc/virnetserver.c |   4 +-
 src/rpc/virnetserver.h |   3 +
 src/rpc/virnetserverclient.c   |  13 +-
 src/rpc/virnetserverservice.c  |   6 +-
 tests/Makefile.am  |   7 +
 tests/virnetserverdata/README  |  14 +
 .../virnetserverdata/input-data-anon-clients.json  |  63 +
 tests/virnetserverdata/input-data-initial.json |  62 +
 .../virnetserverdata/output-data-anon-clients.json |  63 +
 tests/virnetserverdata/output-data-initial.json|  63 +
 tests/virnetservertest.c   | 290 +
 12 files changed, 579 insertions(+), 10 deletions(-)
 create mode 100644 tests/virnetserverdata/README
 create mode 100644 tests/virnetserverdata/input-data-anon-clients.json
 create mode 100644 tests/virnetserverdata/input-data-initial.json
 create mode 100644 tests/virnetserverdata/output-data-anon-clients.json
 create mode 100644 tests/virnetserverdata/output-data-initial.json
 create mode 100644 tests/virnetservertest.c

diff --git a/src/libvirt_remote.syms b/src/libvirt_remote.syms
index 950e56e..bdd68f6 100644
--- a/src/libvirt_remote.syms
+++ b/src/libvirt_remote.syms
@@ -77,6 +77,7 @@ xdr_virNetMessageError;
 
 
 # rpc/virnetserver.h
+virNetServerAddClient;
 virNetServerAddProgram;
 virNetServerAddService;
 virNetServerAddShutdownInhibition;
diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c
index 42427dc..091a1dc 100644
--- a/src/rpc/virnetserver.c
+++ b/src/rpc/virnetserver.c
@@ -259,8 +259,8 @@ static int 
virNetServerDispatchNewMessage(virNetServerClientPtr client,
 }
 
 
-static int virNetServerAddClient(virNetServerPtr srv,
- virNetServerClientPtr client)
+int virNetServerAddClient(virNetServerPtr srv,
+  virNetServerClientPtr client)
 {
 virObjectLock(srv);
 
diff --git a/src/rpc/virnetserver.h b/src/rpc/virnetserver.h
index 8c5ae07..4b452be 100644
--- a/src/rpc/virnetserver.h
+++ b/src/rpc/virnetserver.h
@@ -79,6 +79,9 @@ int virNetServerAddService(virNetServerPtr srv,
virNetServerServicePtr svc,
const char *mdnsEntryName);
 
+int virNetServerAddClient(virNetServerPtr srv,
+  virNetServerClientPtr client);
+
 int virNetServerAddProgram(virNetServerPtr srv,
virNetServerProgramPtr prog);
 
diff --git a/src/rpc/virnetserverclient.c b/src/rpc/virnetserverclient.c
index 34c1994..0e3a71f 100644
--- a/src/rpc/virnetserverclient.c
+++ b/src/rpc/virnetserverclient.c
@@ -536,13 +536,14 @@ virJSONValuePtr 
virNetServerClientPreExecRestart(virNetServerClientPtr client)
 goto error;
 }
 
-if (client-privateData  client-privateDataPreExecRestart 
-!(child = client-privateDataPreExecRestart(client, 
client-privateData)))
-goto error;
+if (client-privateData  client-privateDataPreExecRestart) {
+if (!(child = client-privateDataPreExecRestart(client, 
client-privateData)))
+goto error;
 
-if (virJSONValueObjectAppend(object, privateData, child)  0) {
-virJSONValueFree(child);
-goto error;
+if (virJSONValueObjectAppend(object, privateData, child)  0) {
+virJSONValueFree(child);
+goto error;
+}
 }
 
 virObjectUnlock(client);
diff --git a/src/rpc/virnetserverservice.c b/src/rpc/virnetserverservice.c
index d3cf31a..4df26cb 100644
--- a/src/rpc/virnetserverservice.c
+++ b/src/rpc/virnetserverservice.c
@@ -303,12 +303,15 @@ virNetServerServicePtr virNetServerServiceNewFD(int fd,
 
 /* IO callback is initially disabled, until we're ready
  * to deal with incoming clients */
+virObjectRef(svc);
 if (virNetSocketAddIOCallback(svc-socks[i],
   0,
   virNetServerServiceAccept,
   svc,
-  virObjectFreeCallback)  0)
+  virObjectFreeCallback)  0) {
+virObjectUnref(svc);
 goto error;
+}
 }
 
 
@@ -388,7 +391,6 @@ virNetServerServicePtr 
virNetServerServiceNewPostExecRestart(virJSONValuePtr obj
   svc,
   virObjectFreeCallback)  0) {
 virObjectUnref(svc);
-virObjectUnref(sock);
 goto error;
 }
 }
diff --git a/tests/Makefile.am