diff mbox series

[v6,11/21] libqtest: make bufwrite rely on the TransportOps

Message ID 20191129213424.6290-12-alxndr@bu.edu (mailing list archive)
State New, archived
Headers show
Series Add virtual device fuzzing support | expand

Commit Message

Alexander Bulekov Nov. 29, 2019, 9:34 p.m. UTC
When using qtest "in-process" communication, qtest_sendf directly calls
a function in the server (qtest.c). Previously, bufwrite used
socket_send, which bypasses the TransportOps enabling the call into
qtest.c. This change replaces the socket_send calls with ops->send,
maintaining the benefits of the direct socket_send call, while adding
support for in-process qtest calls.

Signed-off-by: Alexander Bulekov <alxndr@bu.edu>
---
 tests/libqtest.c | 4 ++--
 tests/libqtest.h | 3 +++
 2 files changed, 5 insertions(+), 2 deletions(-)

Comments

Stefan Hajnoczi Jan. 3, 2020, 11:10 a.m. UTC | #1
On Fri, Nov 29, 2019 at 09:34:46PM +0000, Oleinik, Alexander wrote:
> When using qtest "in-process" communication, qtest_sendf directly calls
> a function in the server (qtest.c). Previously, bufwrite used
> socket_send, which bypasses the TransportOps enabling the call into
> qtest.c. This change replaces the socket_send calls with ops->send,
> maintaining the benefits of the direct socket_send call, while adding
> support for in-process qtest calls.
> 
> Signed-off-by: Alexander Bulekov <alxndr@bu.edu>
> ---
>  tests/libqtest.c | 4 ++--
>  tests/libqtest.h | 3 +++
>  2 files changed, 5 insertions(+), 2 deletions(-)

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Philippe Mathieu-Daudé Jan. 3, 2020, 4:45 p.m. UTC | #2
On 11/29/19 10:34 PM, Oleinik, Alexander wrote:
> When using qtest "in-process" communication, qtest_sendf directly calls
> a function in the server (qtest.c). Previously, bufwrite used
> socket_send, which bypasses the TransportOps enabling the call into
> qtest.c. This change replaces the socket_send calls with ops->send,
> maintaining the benefits of the direct socket_send call, while adding
> support for in-process qtest calls.
> 
> Signed-off-by: Alexander Bulekov <alxndr@bu.edu>
> ---
>   tests/libqtest.c | 4 ++--
>   tests/libqtest.h | 3 +++
>   2 files changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index ac4b6ab5f0..a7df92319a 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -1080,8 +1080,8 @@ void qtest_bufwrite(QTestState *s, uint64_t addr, const void *data, size_t size)
>   
>       bdata = g_base64_encode(data, size);
>       qtest_sendf(s, "b64write 0x%" PRIx64 " 0x%zx ", addr, size);
> -    socket_send(s->fd, bdata, strlen(bdata));
> -    socket_send(s->fd, "\n", 1);
> +    s->ops.send(s, bdata);
> +    s->ops.send(s, "\n");

Ah, is this the send_line() from patch #5?

Now it makes sense to move the send("\n") there and call it send_line().

Moving the send(\n) we get this in patch #5:

  static void qtest_client_socket_send_line(QTestState *s,
                                            const char *bufline)
  {
      socket_send(s->fd, bufline, strlen(bufline));
      socket_send(s->fd, "\n", 1);
  }

>       qtest_rsp(s, 0);
>       g_free(bdata);
>   }
> diff --git a/tests/libqtest.h b/tests/libqtest.h
> index c9e21e05b3..0e9b8908ef 100644
> --- a/tests/libqtest.h
> +++ b/tests/libqtest.h
> @@ -729,4 +729,7 @@ bool qtest_probe_child(QTestState *s);
>    */
>   void qtest_set_expected_status(QTestState *s, int status);
>   
> +QTestState *qtest_inproc_init(bool log, const char* arch,
> +                    void (*send)(void*, const char*));
> +void qtest_client_inproc_recv(void *opaque, const char *str);
>   #endif
>
Alexander Bulekov Jan. 15, 2020, 8:38 p.m. UTC | #3
On 200103 1745, Philippe Mathieu-Daudé wrote:
> On 11/29/19 10:34 PM, Oleinik, Alexander wrote:
> > When using qtest "in-process" communication, qtest_sendf directly calls
> > a function in the server (qtest.c). Previously, bufwrite used
> > socket_send, which bypasses the TransportOps enabling the call into
> > qtest.c. This change replaces the socket_send calls with ops->send,
> > maintaining the benefits of the direct socket_send call, while adding
> > support for in-process qtest calls.
> > 
> > Signed-off-by: Alexander Bulekov <alxndr@bu.edu>
> > ---
> >   tests/libqtest.c | 4 ++--
> >   tests/libqtest.h | 3 +++
> >   2 files changed, 5 insertions(+), 2 deletions(-)
> > 
> > diff --git a/tests/libqtest.c b/tests/libqtest.c
> > index ac4b6ab5f0..a7df92319a 100644
> > --- a/tests/libqtest.c
> > +++ b/tests/libqtest.c
> > @@ -1080,8 +1080,8 @@ void qtest_bufwrite(QTestState *s, uint64_t addr, const void *data, size_t size)
> >       bdata = g_base64_encode(data, size);
> >       qtest_sendf(s, "b64write 0x%" PRIx64 " 0x%zx ", addr, size);
> > -    socket_send(s->fd, bdata, strlen(bdata));
> > -    socket_send(s->fd, "\n", 1);
> > +    s->ops.send(s, bdata);
> > +    s->ops.send(s, "\n");
> 
> Ah, is this the send_line() from patch #5?
> 
> Now it makes sense to move the send("\n") there and call it send_line().
> 
> Moving the send(\n) we get this in patch #5:
> 
>  static void qtest_client_socket_send_line(QTestState *s,
>                                            const char *bufline)
>  {
>      socket_send(s->fd, bufline, strlen(bufline));
>      socket_send(s->fd, "\n", 1);
>  }

Would this also involve changing all of the
qtest_{clock_step,in,out,read,write...} functions to remove the '\n'
from the calls to qtest_sendf? Not that it matters much, but it also
seems to double the number of syscalls needed to send each qtest
command.

> >       qtest_rsp(s, 0);
> >       g_free(bdata);
> >   }
> > diff --git a/tests/libqtest.h b/tests/libqtest.h
> > index c9e21e05b3..0e9b8908ef 100644
> > --- a/tests/libqtest.h
> > +++ b/tests/libqtest.h
> > @@ -729,4 +729,7 @@ bool qtest_probe_child(QTestState *s);
> >    */
> >   void qtest_set_expected_status(QTestState *s, int status);
> > +QTestState *qtest_inproc_init(bool log, const char* arch,
> > +                    void (*send)(void*, const char*));
> > +void qtest_client_inproc_recv(void *opaque, const char *str);
> >   #endif
> > 
>
diff mbox series

Patch

diff --git a/tests/libqtest.c b/tests/libqtest.c
index ac4b6ab5f0..a7df92319a 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -1080,8 +1080,8 @@  void qtest_bufwrite(QTestState *s, uint64_t addr, const void *data, size_t size)
 
     bdata = g_base64_encode(data, size);
     qtest_sendf(s, "b64write 0x%" PRIx64 " 0x%zx ", addr, size);
-    socket_send(s->fd, bdata, strlen(bdata));
-    socket_send(s->fd, "\n", 1);
+    s->ops.send(s, bdata);
+    s->ops.send(s, "\n");
     qtest_rsp(s, 0);
     g_free(bdata);
 }
diff --git a/tests/libqtest.h b/tests/libqtest.h
index c9e21e05b3..0e9b8908ef 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -729,4 +729,7 @@  bool qtest_probe_child(QTestState *s);
  */
 void qtest_set_expected_status(QTestState *s, int status);
 
+QTestState *qtest_inproc_init(bool log, const char* arch,
+                    void (*send)(void*, const char*));
+void qtest_client_inproc_recv(void *opaque, const char *str);
 #endif