[PATCH v2 1/6] ws2_32/tests: Add tests for setting and getting socket options with shorter length.

Paul Gofman pgofman at codeweavers.com
Fri Mar 4 12:04:42 CST 2022


On 3/4/22 20:36, Zebediah Figura wrote:
>
>> +
>> +    /* Test option short length. */
>> +    for (i = 0; i < ARRAY_SIZE(test_optsize); ++i)
>> +    {
>> +        s2 = socket( test_optsize[i].af, test_optsize[i].type, 0 );
>> +        ok(s2 != INVALID_SOCKET, "socket() failed error %d\n", 
>> WSAGetLastError());
>> +        for (j = 0; j < 3; ++j)
>
> ARRAY_SIZE(test_optsize[i].sizes)?
>
> The way this test is structured does not make it very easy to read, 
> but I'm struggling to find a better option. The individual sockopts 
> seem very idiosyncratic...

Yes, those behaviour details don't seem to fit any obvious pattern. 
Maybe I can make it a bit easier if always code the values returned from 
getsockopt() instead of setting the "default" cases in the code?


>
> Finding a way to include TCP_NODELAY in this table, as well as finding 
> a way to test lengths less than 1 and greater than 4, would probably 
> be helpful. I don't know if you have those in your pending patches.

I am introducing TCP_NODELAY in the same table later, yeah. The reason 
that it is not here immediately is that TCP_NODELAY needs output length 
fixup in getsockopt() not to introduce obsucre todo_wine and the remove 
it, thus a separate patch.

I tested greater sizes separately for some options, I will add some 
tests (hopefully they are all work the same as size 4, at least those 
that I tried did). Didn't try length < 0 but I will.


>
>> +        {
>> +            DWORD expected_last_error, expected_value, 
>> expected_size, save_value;
>> +            int expected_err;
>> +
>> +            winetest_push_context("i %u, level %d, optname %d, len %u",
>> +                    i, test_optsize[i].level, 
>> test_optsize[i].optname, 1 << j);
>> +
>> +            size = sizeof(save_value);
>> +            err = getsockopt(s2, test_optsize[i].level, 
>> test_optsize[i].optname, (char*)&save_value, &size);
>> +            ok(!err, "Unexpected getsockopt result %d.\n", err);
>> +
>> +            if (test_optsize[i].accepts_short_len || j == 2)
>
> "j == 2" is not great, maybe "size = 1 << j;" earlier, and then "size 
> == 4" here, would be clearer.
>
>> +            {
>> +                expected_err = 0;
>> +                expected_last_error = ERROR_SUCCESS;
>> +                expected_size = test_optsize[i].sizes[j] ? 
>> test_optsize[i].sizes[j] : 4;
>> +                if (test_optsize[i].values[j])
>> +                    expected_value = test_optsize[i].values[j];
>> +                else if (expected_size == 4)
>> +                    expected_value = 1;
>> +                else
>> +                    expected_value = (0xdeadbeef & ~((1 << 
>> expected_size * 8) - 1)) | 1;
>
> This is not exactly easy to read. Maybe something like the following 
> would be clearer?
>
>     value = 1;
>     expected_value = 0xdeadbeef;
>     memcpy(&expected_value, &value, expected_size);

Yeah, sure.







More information about the wine-devel mailing list