On 06/17/2018 06:18 AM, Alex Bennée wrote:
> Philippe Mathieu-Daudé <f4...@amsat.org> writes:
> 
>> Hi Alex,
>>
>> On 06/15/2018 04:46 PM, Alex Bennée wrote:
>>> The fixed path and ports get in the way of running our tests and
>>> builds in parallel. Instead of using TESTPATH we use mkdtemp() and
>>> instead of a fixed port we allow the kernel to assign one and query it
>>> afterwards.
>>>
>>> Signed-off-by: Alex Bennée <alex.ben...@linaro.org>
>>> ---
>>>  tests/tcg/multiarch/linux-test.c | 37 ++++++++++++++++----------------
>>>  1 file changed, 19 insertions(+), 18 deletions(-)
>>>
>>> diff --git a/tests/tcg/multiarch/linux-test.c 
>>> b/tests/tcg/multiarch/linux-test.c
>>> index 6f2c531474..3f73b96420 100644
>>> --- a/tests/tcg/multiarch/linux-test.c
>>> +++ b/tests/tcg/multiarch/linux-test.c
>>> @@ -41,8 +41,6 @@
>>>  #include <setjmp.h>
>>>  #include <sys/shm.h>
>>>
>>> -#define TESTPATH "/tmp/linux-test.tmp"
>>> -#define TESTPORT 7654
>>>  #define STACK_SIZE 16384
>>>
>>>  static void error1(const char *filename, int line, const char *fmt, ...)
>>> @@ -85,19 +83,15 @@ static void test_file(void)
>>>      struct iovec vecs[2];
>>>      DIR *dir;
>>>      struct dirent *de;
>>> +    char template[] = "/tmp/linux-test-XXXXXX";
>>
>> Since /tmp doesn't always fit, can this be:
>>
>>        char *tmpbase = getenv("TMPDIR");
>>        char *template = g_strdup_printf("%s/qemu-test-XXXXXX",
>>                                         tmpbase ? tmpbase : "/tmp");
> 
> It depends if we want to honour TMPDIR, is /tmp not likely to be there?

My /tmp is a not huge tmpfs and I had troubles running iotests which let
some dangling big files on failure. Now I prefer run tests with
TMPDIR=/scratch where I have plenty of slower space.
Shouldn't be a problem here however.

> 
> Either way we can't use glib functions for these tests to keep the
> compilation simple.

char template[PATH_MAX] + snprintf() :)

> 
>>
>>> +    char *tmpdir = mkdtemp(template);
>>
>>        g_free(template);
>>
>>>
>>> -    /* clean up, just in case */
>>> -    unlink(TESTPATH "/file1");
>>> -    unlink(TESTPATH "/file2");
>>> -    unlink(TESTPATH "/file3");
>>> -    rmdir(TESTPATH);
>>> +    chk_error(strlen(tmpdir));
>>>
>>>      if (getcwd(cur_dir, sizeof(cur_dir)) == NULL)
>>>          error("getcwd");
>>>
>>> -    chk_error(mkdir(TESTPATH, 0755));
>>> -
>>> -    chk_error(chdir(TESTPATH));
>>> +    chk_error(chdir(tmpdir));
>>>
>>>      /* open/read/write/close/readv/writev/lseek */
>>>
>>> @@ -163,7 +157,7 @@ static void test_file(void)
>>>          st.st_mtime != 1000)
>>>          error("stat time");
>>>
>>> -    chk_error(stat(TESTPATH, &st));
>>> +    chk_error(stat(tmpdir, &st));
>>>      if (!S_ISDIR(st.st_mode))
>>>          error("stat mode");
>>>
>>> @@ -185,7 +179,7 @@ static void test_file(void)
>>>          error("stat mode");
>>>
>>>      /* getdents */
>>> -    dir = opendir(TESTPATH);
>>> +    dir = opendir(tmpdir);
>>>      if (!dir)
>>>          error("opendir");
>>>      len = 0;
>>> @@ -207,7 +201,7 @@ static void test_file(void)
>>>      chk_error(unlink("file3"));
>>>      chk_error(unlink("file2"));
>>>      chk_error(chdir(cur_dir));
>>> -    chk_error(rmdir(TESTPATH));
>>> +    chk_error(rmdir(tmpdir));
>>>  }
>>>
>>>  static void test_fork(void)
>>> @@ -264,7 +258,7 @@ static int server_socket(void)
>>>      chk_error(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)));
>>>
>>>      sockaddr.sin_family = AF_INET;
>>> -    sockaddr.sin_port = htons(TESTPORT);
>>> +    sockaddr.sin_port = htons(0); /* choose random ephemeral port) */
>>>      sockaddr.sin_addr.s_addr = 0;
>>>      chk_error(bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)));
>>>      chk_error(listen(fd, 0));
>>> @@ -272,7 +266,7 @@ static int server_socket(void)
>>>
>>>  }
>>>
>>> -static int client_socket(void)
>>> +static int client_socket(uint16_t port)
>>>  {
>>>      int fd;
>>>      struct sockaddr_in sockaddr;
>>> @@ -280,7 +274,7 @@ static int client_socket(void)
>>>      /* server socket */
>>>      fd = chk_error(socket(PF_INET, SOCK_STREAM, 0));
>>>      sockaddr.sin_family = AF_INET;
>>> -    sockaddr.sin_port = htons(TESTPORT);
>>> +    sockaddr.sin_port = htons(port);
>>>      inet_aton("127.0.0.1", &sockaddr.sin_addr);
>>>      chk_error(connect(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)));
>>>      return fd;
>>> @@ -292,10 +286,17 @@ static void test_socket(void)
>>>  {
>>>      int server_fd, client_fd, fd, pid, ret, val;
>>>      struct sockaddr_in sockaddr;
>>> -    socklen_t len;
>>> +    struct sockaddr_in server_addr;
>>> +    socklen_t len, socklen;
>>> +    uint16_t server_port;
>>>      char buf[512];
>>>
>>>      server_fd = server_socket();
>>> +    /* find out what port we got */
>>> +    socklen = sizeof(server_addr);
>>> +    ret = getsockname(server_fd, &server_addr, &socklen);
>>> +    chk_error(ret);
>>> +    server_port = ntohs(server_addr.sin_port);
>>>
>>>      /* test a few socket options */
>>>      len = sizeof(val);
>>> @@ -305,7 +306,7 @@ static void test_socket(void)
>>>
>>>      pid = chk_error(fork());
>>>      if (pid == 0) {
>>> -        client_fd = client_socket();
>>> +        client_fd = client_socket(server_port);
>>>          send(client_fd, socket_msg, sizeof(socket_msg), 0);
>>>          close(client_fd);
>>>          exit(0);
>>>
> 
> 
> --
> Alex Bennée
> 

Reply via email to