[Tarantool-patches] [PATCH 2/2] test: unit/popen -- provide a child process
Nikita Pettik
korablev at tarantool.org
Thu Mar 26 03:59:26 MSK 2020
On 26 Mar 03:47, Alexander Turenko wrote:
> I think it is good thing to depend less on a system environment.
>
> It is not clear why the problem appears in the first place and why it is
> gone after the patch. This confuses me a bit.
>
> Anyway, I'll CC Nikita to do necessary amount runs with and withour the
> patch to say for sure whether it actually helps versus flaky test fails.
> Nikita, can you please verify it?
Yep, I've already verified - patch really fixes the problem.
> Other than that the patch looks okay except several minor points, see
> below.
>
> Whether you'll fix those point or not, I think the patch does not
> require re-review with me: Nikita's check should be enough.
>
> LGTM.
>
> WBR, Alexander Turenko.
>
> On Tue, Mar 24, 2020 at 01:03:47PM +0300, Cyrill Gorcunov wrote:
> > Testing via plain C interface with a shell is not stable,
> > the shell might simply be misconfigured or not found and
> > we will simply stuck forever (the signal handling in libev
> > is tricky and requires at least idle cycles or similar to
> > pass event processing). Thus lets rather run a program we
> > know is presenting in the system (popen-child executable).
> >
> > Fixes #4811
> >
> > Signed-off-by: Cyrill Gorcunov <gorcunov at gmail.com>
> > ---
> > test/unit/CMakeLists.txt | 4 +++
> > test/unit/popen-child.c | 71 ++++++++++++++++++++++++++++++++++++++++
> > test/unit/popen.c | 18 ++++++----
> > 3 files changed, 86 insertions(+), 7 deletions(-)
> > create mode 100644 test/unit/popen-child.c
>
> >
> > diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt
> > index bc6aebdcb..e1d506f58 100644
> > --- a/test/unit/CMakeLists.txt
> > +++ b/test/unit/CMakeLists.txt
> > @@ -246,5 +246,9 @@ target_link_libraries(swim_errinj.test unit swim)
> > add_executable(merger.test merger.test.c)
> > target_link_libraries(merger.test unit core box)
> >
> > +#
> > +# Client for popen.test
> > +add_executable(popen-child popen-child.c)
> > +
>
> Let's add the generated executable to .gitignore (for in-source build).
>
> > + // read -n X and the just echo data read
>
> Nit: Our style guide follows kernel's one and forbids C99 style
> comments.
>
> > + if (!strcmp(argv[1], "read") &&
> > + !strcmp(argv[2], "-n")) {
> > + ssize_t nr = (ssize_t)atoi(argv[3]);
> > + if (nr <= 0) {
> > + fprintf(stderr, "Wrong number of args\n");
> > + exit(1);
> > + }
> > +
> > + if (nr >= (ssize_t)sizeof(buf)) {
> > + fprintf(stderr, "Too many bytes to read\n");
> > + exit(1);
> > + }
> > +
> > + ssize_t n = read(STDIN_FILENO, buf, nr);
> > + if (n != nr) {
> > + fprintf(stderr, "Can't read from stdin\n");
> > + exit(1);
> > + }
>
> I understand that `nr` is small here and it is hard to find a condition
> when a singletone read will be partial, but since the patch is about
> stability of testing (and we maybe will add more cases: maybe for even
> border conditions like pipe buffer overrun) I would handle this
> situation just in case and read in a loop.
>
> The same for write below.
>
> > +
> > + n = write(STDOUT_FILENO, buf, nr);
> > + if (n != nr) {
> > + fprintf(stderr, "Can't write to stdout\n");
> > + exit(1);
> > + }
> > @@ -237,6 +238,9 @@ main(int argc, char *argv[])
> > //say_logger_init(NULL, S_DEBUG, 0, "plain", 0);
> > memory_init();
> >
> > + snprintf(popen_child_path, sizeof(popen_child_path),
> > + "%s/test/unit/popen-child", getenv("BUILDDIR"));
> > +
>
> It works for in-source and out-of-source build when is run under
> test-run. It is okay in fact.
>
> However I think it is convenient to have a default that, say, allows to
> run ./test/unit/popen.test from a build directory w/o manual setting of
> BUILDDIR. It seems logical to set BUILDDIR to '.' by default (if
> getenv() returns NULL).
More information about the Tarantool-patches
mailing list