[LTP] [PATCH] ltp: detect the test id automatically

Li Wang liwang@redhat.com
Thu Mar 16 04:39:11 CET 2017


On Wed, Mar 15, 2017 at 5:18 PM, Cyril Hrubis <chrubis@suse.cz> wrote:
> Hi!
>> >> +static void get_tid(char *argv[])
>> >> +{
>> >> +     char *p;
>> >> +
>> >> +     tst_test->tid = (p = strrchr(argv[0], '/')) ? p+1 : argv[0];
>> >> +}
>> >
>> > This is interesting idea, but this oneliner is ugly and does not work
>> > when you execute the testcase by full path, i.e.
>> > /opt/ltp/testcases/bin/foo01 would end up with
>> > opt/ltp/testcases/bin/foo01 in tid.
>>
>> Really?
>>
>> This words is cut from strrchr() Manual page.
>>
>> "DESCRIPTION
>>
>>        The strrchr() function returns a pointer to the last occurrence
>>  of  the  character  c  in  the
>>        string s.
>> "
>
> Ah, I was blind and missed the r in the middle, indeed the strrchr()
> returns the last occurence.
>
>> Actually I have tested some kind of situation and compile the whole
>> LTP with this change, I didn't find any abnormal things which involved
>> by this path :)
>
> It will work fine I guess. But the standard allows argv[0] to be empty
> string though and you can pass any string as argv[0] to the execve() as
> well.

Yes! we should make sure that argv[0] is neither 'NULL' nor point to
an empty string before assigned to tst_test->tid. And then no matter
what the string it is like, we only using it as a string. I think that
would be safe for LTP.


Method_1:
-------------
 $cat tst_test.c

static void get_tid(char *argv[])
{
       char *p;
       int chk = 1;

       chk = argv[0] == NULL ? 0 : strcmp(argv[0], "\0");
       if (chk == 0)
               tst_brk(TBROK, "No tid set in test structure");

       tst_test->tid = (p = strrchr(argv[0], '/')) ? p+1 : argv[0];
}


static void do_setup(int argc, char *argv[])
{
...
        if (!tst_test->tid)
               get_tid(argv);
...
}

>
> So if we go this way we should add sanity checks if there is something
> sensible in the argv[0].
>
>> > And I wonder if we can avoid runtime detection, which is always tricky.
>> > Maybe we can just do:
>> >
>> > struct tst_test test = {
>> >         .id = __FILE__,
>> > };
>> >
>> > And strip the .c suffix in the test library if present. That way we
>> > would avoid this kind of copy&paste errors.
>>
>> Hmm, I have no objection with this method, but it seems still need the
>> author to write ".tid = __FILE__" each time. To strip the .c suffix is
>> also need additional work in some place.
>
> I think that this is just a little more robust solution, but yes it's
> less elegant one.

Not sure if I understand this way correctly, something achieved as:

Method_2:
------------

$ cat tst_test.h

struct tst_test {
       char tid[128];
...
}


$ cat tst_test.c

static void get_tid(void)
{
       char *p;

       p = (strrchr(tst_test->tid, '.'));
       if (p)
               *p = '\0';
}

static void do_setup(int argc, char *argv[])
{
       if (tst_test->tid[0] == '\0')
                tst_brk(TBROK, "No tid set in test structure");
       else
               get_tid();
...
}


$ cat ioctl06.c

 static struct tst_test test = {
       .tid = __FILE__,
...
}

>
> Anyway looking at the code the tid is only used when creating temporary
> directory/shm so that it's clear which testcase these global resources
> belongs to. So as far as we can easily identify which test has created
> the temp directory given it's name it's fine.
>

What we do to get tid is early than create a temp directory. Looking
at function setup_ipc(), no matter if we need temp dir or not, the
tst_test->tid should be available there. So this is a general demand
to ltp testcase not specified.


I drafted above two methods for comparison, I prefer to go method_1,
because it makes LTP authors no need to consider ".tid=" any more.
what do you think?

-- 
Regards,
Li Wang
Email: liwang@redhat.com


More information about the ltp mailing list