signal-logging.c revision 1b5d61b8
135c4bbdfSmrg/**
235c4bbdfSmrg * Copyright © 2012 Canonical, Ltd.
335c4bbdfSmrg *
435c4bbdfSmrg *  Permission is hereby granted, free of charge, to any person obtaining a
535c4bbdfSmrg *  copy of this software and associated documentation files (the "Software"),
635c4bbdfSmrg *  to deal in the Software without restriction, including without limitation
735c4bbdfSmrg *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
835c4bbdfSmrg *  and/or sell copies of the Software, and to permit persons to whom the
935c4bbdfSmrg *  Software is furnished to do so, subject to the following conditions:
1035c4bbdfSmrg *
1135c4bbdfSmrg *  The above copyright notice and this permission notice (including the next
1235c4bbdfSmrg *  paragraph) shall be included in all copies or substantial portions of the
1335c4bbdfSmrg *  Software.
1435c4bbdfSmrg *
1535c4bbdfSmrg *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1635c4bbdfSmrg *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1735c4bbdfSmrg *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1835c4bbdfSmrg *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1935c4bbdfSmrg *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2035c4bbdfSmrg *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2135c4bbdfSmrg *  DEALINGS IN THE SOFTWARE.
2235c4bbdfSmrg */
2335c4bbdfSmrg
2435c4bbdfSmrg#ifdef HAVE_DIX_CONFIG_H
2535c4bbdfSmrg#include <dix-config.h>
2635c4bbdfSmrg#endif
2735c4bbdfSmrg
2835c4bbdfSmrg#include <stdint.h>
2935c4bbdfSmrg#include <unistd.h>
3035c4bbdfSmrg#include "assert.h"
3135c4bbdfSmrg#include "misc.h"
3235c4bbdfSmrg
331b5d61b8Smrg#include "tests-common.h"
341b5d61b8Smrg
3535c4bbdfSmrgstruct number_format_test {
3635c4bbdfSmrg    uint64_t number;
3735c4bbdfSmrg    char string[21];
3835c4bbdfSmrg    char hex_string[17];
3935c4bbdfSmrg};
4035c4bbdfSmrg
4135c4bbdfSmrgstruct signed_number_format_test {
4235c4bbdfSmrg    int64_t number;
4335c4bbdfSmrg    char string[21];
4435c4bbdfSmrg};
4535c4bbdfSmrg
4635c4bbdfSmrgstruct float_number_format_test {
4735c4bbdfSmrg    double number;
4835c4bbdfSmrg    char string[21];
4935c4bbdfSmrg};
5035c4bbdfSmrg
5135c4bbdfSmrgstatic Bool
5235c4bbdfSmrgcheck_signed_number_format_test(long int number)
5335c4bbdfSmrg{
5435c4bbdfSmrg    char string[21];
5535c4bbdfSmrg    char expected[21];
5635c4bbdfSmrg
5735c4bbdfSmrg    sprintf(expected, "%ld", number);
5835c4bbdfSmrg    FormatInt64(number, string);
5935c4bbdfSmrg    if(strncmp(string, expected, 21) != 0) {
6035c4bbdfSmrg        fprintf(stderr, "Failed to convert %jd to decimal string (expected %s but got %s)\n",
6135c4bbdfSmrg                (intmax_t) number, expected, string);
6235c4bbdfSmrg        return FALSE;
6335c4bbdfSmrg    }
6435c4bbdfSmrg
6535c4bbdfSmrg    return TRUE;
6635c4bbdfSmrg}
6735c4bbdfSmrg
6835c4bbdfSmrgstatic Bool
6935c4bbdfSmrgcheck_float_format_test(double number)
7035c4bbdfSmrg{
7135c4bbdfSmrg    char string[21];
7235c4bbdfSmrg    char expected[21];
7335c4bbdfSmrg
7435c4bbdfSmrg    /* we currently always print float as .2f */
7535c4bbdfSmrg    sprintf(expected, "%.2f", number);
7635c4bbdfSmrg
7735c4bbdfSmrg    FormatDouble(number, string);
7835c4bbdfSmrg    if(strncmp(string, expected, 21) != 0) {
7935c4bbdfSmrg        fprintf(stderr, "Failed to convert %f to string (%s vs %s)\n",
8035c4bbdfSmrg                number, expected, string);
8135c4bbdfSmrg        return FALSE;
8235c4bbdfSmrg    }
8335c4bbdfSmrg
8435c4bbdfSmrg    return TRUE;
8535c4bbdfSmrg}
8635c4bbdfSmrg
8735c4bbdfSmrgstatic Bool
8835c4bbdfSmrgcheck_number_format_test(long unsigned int number)
8935c4bbdfSmrg{
9035c4bbdfSmrg    char string[21];
9135c4bbdfSmrg    char expected[21];
9235c4bbdfSmrg
9335c4bbdfSmrg    sprintf(expected, "%lu", number);
9435c4bbdfSmrg
9535c4bbdfSmrg    FormatUInt64(number, string);
9635c4bbdfSmrg    if(strncmp(string, expected, 21) != 0) {
9735c4bbdfSmrg        fprintf(stderr, "Failed to convert %ju to decimal string (%s vs %s)\n",
9835c4bbdfSmrg                (intmax_t) number, expected, string);
9935c4bbdfSmrg        return FALSE;
10035c4bbdfSmrg    }
10135c4bbdfSmrg
10235c4bbdfSmrg    sprintf(expected, "%lx", number);
10335c4bbdfSmrg    FormatUInt64Hex(number, string);
10435c4bbdfSmrg    if(strncmp(string, expected, 17) != 0) {
10535c4bbdfSmrg        fprintf(stderr, "Failed to convert %ju to hexadecimal string (%s vs %s)\n",
10635c4bbdfSmrg                (intmax_t) number, expected, string);
10735c4bbdfSmrg        return FALSE;
10835c4bbdfSmrg    }
10935c4bbdfSmrg
11035c4bbdfSmrg    return TRUE;
11135c4bbdfSmrg}
11235c4bbdfSmrg
11335c4bbdfSmrg/* FIXME: max range stuff */
11435c4bbdfSmrgdouble float_tests[] = { 0, 5, 0.1, 0.01, 5.2342, 10.2301,
11535c4bbdfSmrg                         -1, -2.00, -0.6023, -1203.30
11635c4bbdfSmrg                        };
11735c4bbdfSmrg
11835c4bbdfSmrg#pragma GCC diagnostic push
11935c4bbdfSmrg#pragma GCC diagnostic ignored "-Woverflow"
12035c4bbdfSmrg
12135c4bbdfSmrgstatic void
12235c4bbdfSmrgnumber_formatting(void)
12335c4bbdfSmrg{
12435c4bbdfSmrg    int i;
12535c4bbdfSmrg    long unsigned int unsigned_tests[] = { 0,/* Zero */
12635c4bbdfSmrg                                           5, /* Single digit number */
12735c4bbdfSmrg                                           12, /* Two digit decimal number */
12835c4bbdfSmrg                                           37, /* Two digit hex number */
12935c4bbdfSmrg                                           0xC90B2, /* Large < 32 bit number */
13035c4bbdfSmrg                                           0x15D027BF211B37A, /* Large > 32 bit number */
13135c4bbdfSmrg                                           0xFFFFFFFFFFFFFFFF, /* Maximum 64-bit number */
13235c4bbdfSmrg    };
13335c4bbdfSmrg
13435c4bbdfSmrg    long int signed_tests[] = { 0,/* Zero */
13535c4bbdfSmrg                                5, /* Single digit number */
13635c4bbdfSmrg                                12, /* Two digit decimal number */
13735c4bbdfSmrg                                37, /* Two digit hex number */
13835c4bbdfSmrg                                0xC90B2, /* Large < 32 bit number */
13935c4bbdfSmrg                                0x15D027BF211B37A, /* Large > 32 bit number */
14035c4bbdfSmrg                                0x7FFFFFFFFFFFFFFF, /* Maximum 64-bit signed number */
14135c4bbdfSmrg                                -1, /* Single digit number */
14235c4bbdfSmrg                                -12, /* Two digit decimal number */
14335c4bbdfSmrg                                -0xC90B2, /* Large < 32 bit number */
14435c4bbdfSmrg                                -0x15D027BF211B37A, /* Large > 32 bit number */
14535c4bbdfSmrg                                -0x7FFFFFFFFFFFFFFF, /* Maximum 64-bit signed number */
14635c4bbdfSmrg    } ;
14735c4bbdfSmrg
1481b5d61b8Smrg    for (i = 0; i < ARRAY_SIZE(unsigned_tests); i++)
14935c4bbdfSmrg        assert(check_number_format_test(unsigned_tests[i]));
15035c4bbdfSmrg
1511b5d61b8Smrg    for (i = 0; i < ARRAY_SIZE(signed_tests); i++)
15235c4bbdfSmrg        assert(check_signed_number_format_test(signed_tests[i]));
15335c4bbdfSmrg
1541b5d61b8Smrg    for (i = 0; i < ARRAY_SIZE(float_tests); i++)
15535c4bbdfSmrg        assert(check_float_format_test(float_tests[i]));
15635c4bbdfSmrg}
15735c4bbdfSmrg#pragma GCC diagnostic pop
15835c4bbdfSmrg
15935c4bbdfSmrg#pragma GCC diagnostic push
16035c4bbdfSmrg#pragma GCC diagnostic ignored "-Wformat-security"
16135c4bbdfSmrg#pragma GCC diagnostic ignored "-Wformat"
16235c4bbdfSmrg#pragma GCC diagnostic ignored "-Wformat-extra-args"
16335c4bbdfSmrgstatic void logging_format(void)
16435c4bbdfSmrg{
16535c4bbdfSmrg    const char *log_file_path = "/tmp/Xorg-logging-test.log";
16635c4bbdfSmrg    const char *str = "%s %d %u %% %p %i";
16735c4bbdfSmrg    char buf[1024];
16835c4bbdfSmrg    int i;
16935c4bbdfSmrg    unsigned int ui;
17035c4bbdfSmrg    long li;
17135c4bbdfSmrg    unsigned long lui;
17235c4bbdfSmrg    FILE *f;
17335c4bbdfSmrg    char read_buf[2048];
17435c4bbdfSmrg    char *logmsg;
17535c4bbdfSmrg    uintptr_t ptr;
17635c4bbdfSmrg
17735c4bbdfSmrg    /* set up buf to contain ".....end" */
17835c4bbdfSmrg    memset(buf, '.', sizeof(buf));
17935c4bbdfSmrg    strcpy(&buf[sizeof(buf) - 4], "end");
18035c4bbdfSmrg
18135c4bbdfSmrg    LogInit(log_file_path, NULL);
1821b5d61b8Smrg    assert((f = fopen(log_file_path, "r")));
18335c4bbdfSmrg
18435c4bbdfSmrg#define read_log_msg(msg) do {                                  \
18535c4bbdfSmrg        msg = fgets(read_buf, sizeof(read_buf), f);             \
18635c4bbdfSmrg        assert(msg != NULL);                                   \
18735c4bbdfSmrg        msg = strchr(read_buf, ']');                            \
18835c4bbdfSmrg        assert(msg != NULL);                                    \
18935c4bbdfSmrg        assert(strlen(msg) > 2);                                \
19035c4bbdfSmrg        msg = msg + 2; /* advance past [time.stamp] */          \
19135c4bbdfSmrg    } while (0)
19235c4bbdfSmrg
19335c4bbdfSmrg    /* boring test message */
19435c4bbdfSmrg    LogMessageVerbSigSafe(X_ERROR, -1, "test message\n");
19535c4bbdfSmrg    read_log_msg(logmsg);
19635c4bbdfSmrg    assert(strcmp(logmsg, "(EE) test message\n") == 0);
19735c4bbdfSmrg
19835c4bbdfSmrg    /* long buf is truncated to "....en\n" */
19935c4bbdfSmrg    LogMessageVerbSigSafe(X_ERROR, -1, buf);
20035c4bbdfSmrg    read_log_msg(logmsg);
20135c4bbdfSmrg    assert(strcmp(&logmsg[strlen(logmsg) - 3], "en\n") == 0);
20235c4bbdfSmrg
20335c4bbdfSmrg    /* same thing, this time as string substitution */
20435c4bbdfSmrg    LogMessageVerbSigSafe(X_ERROR, -1, "%s", buf);
20535c4bbdfSmrg    read_log_msg(logmsg);
20635c4bbdfSmrg    assert(strcmp(&logmsg[strlen(logmsg) - 3], "en\n") == 0);
20735c4bbdfSmrg
20835c4bbdfSmrg    /* strings containing placeholders should just work */
20935c4bbdfSmrg    LogMessageVerbSigSafe(X_ERROR, -1, "%s\n", str);
21035c4bbdfSmrg    read_log_msg(logmsg);
21135c4bbdfSmrg    assert(strcmp(logmsg, "(EE) %s %d %u %% %p %i\n") == 0);
21235c4bbdfSmrg
21335c4bbdfSmrg    /* literal % */
21435c4bbdfSmrg    LogMessageVerbSigSafe(X_ERROR, -1, "test %%\n");
21535c4bbdfSmrg    read_log_msg(logmsg);
21635c4bbdfSmrg    assert(strcmp(logmsg, "(EE) test %\n") == 0);
21735c4bbdfSmrg
21835c4bbdfSmrg    /* character */
21935c4bbdfSmrg    LogMessageVerbSigSafe(X_ERROR, -1, "test %c\n", 'a');
22035c4bbdfSmrg    read_log_msg(logmsg);
22135c4bbdfSmrg    assert(strcmp(logmsg, "(EE) test a\n") == 0);
22235c4bbdfSmrg
22335c4bbdfSmrg    /* something unsupported % */
22435c4bbdfSmrg    LogMessageVerbSigSafe(X_ERROR, -1, "test %Q\n");
22535c4bbdfSmrg    read_log_msg(logmsg);
22635c4bbdfSmrg    assert(strstr(logmsg, "BUG") != NULL);
22735c4bbdfSmrg    LogMessageVerbSigSafe(X_ERROR, -1, "\n");
22835c4bbdfSmrg    fseek(f, 0, SEEK_END);
22935c4bbdfSmrg
23035c4bbdfSmrg    /* string substitution */
23135c4bbdfSmrg    LogMessageVerbSigSafe(X_ERROR, -1, "%s\n", "substituted string");
23235c4bbdfSmrg    read_log_msg(logmsg);
23335c4bbdfSmrg    assert(strcmp(logmsg, "(EE) substituted string\n") == 0);
23435c4bbdfSmrg
23535c4bbdfSmrg    /* Invalid format */
23635c4bbdfSmrg    LogMessageVerbSigSafe(X_ERROR, -1, "%4", 4);
23735c4bbdfSmrg    read_log_msg(logmsg);
23835c4bbdfSmrg    assert(strcmp(logmsg, "(EE) ") == 0);
23935c4bbdfSmrg    LogMessageVerbSigSafe(X_ERROR, -1, "\n");
24035c4bbdfSmrg    fseek(f, 0, SEEK_END);
24135c4bbdfSmrg
24235c4bbdfSmrg    /* %hld is bogus */
24335c4bbdfSmrg    LogMessageVerbSigSafe(X_ERROR, -1, "%hld\n", 4);
24435c4bbdfSmrg    read_log_msg(logmsg);
24535c4bbdfSmrg    assert(strstr(logmsg, "BUG") != NULL);
24635c4bbdfSmrg    LogMessageVerbSigSafe(X_ERROR, -1, "\n");
24735c4bbdfSmrg    fseek(f, 0, SEEK_END);
24835c4bbdfSmrg
24935c4bbdfSmrg    /* number substitution */
25035c4bbdfSmrg    ui = 0;
25135c4bbdfSmrg    do {
25235c4bbdfSmrg        char expected[30];
25335c4bbdfSmrg        sprintf(expected, "(EE) %u\n", ui);
25435c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%u\n", ui);
25535c4bbdfSmrg        read_log_msg(logmsg);
25635c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
25735c4bbdfSmrg
25835c4bbdfSmrg        sprintf(expected, "(EE) %x\n", ui);
25935c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%x\n", ui);
26035c4bbdfSmrg        read_log_msg(logmsg);
26135c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
26235c4bbdfSmrg
26335c4bbdfSmrg        if (ui == 0)
26435c4bbdfSmrg            ui = 1;
26535c4bbdfSmrg        else
26635c4bbdfSmrg            ui <<= 1;
26735c4bbdfSmrg    } while(ui);
26835c4bbdfSmrg
26935c4bbdfSmrg    lui = 0;
27035c4bbdfSmrg    do {
27135c4bbdfSmrg        char expected[30];
27235c4bbdfSmrg        sprintf(expected, "(EE) %lu\n", lui);
27335c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%lu\n", lui);
27435c4bbdfSmrg        read_log_msg(logmsg);
27535c4bbdfSmrg
27635c4bbdfSmrg        sprintf(expected, "(EE) %lld\n", (unsigned long long)ui);
27735c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%lld\n", (unsigned long long)ui);
27835c4bbdfSmrg        read_log_msg(logmsg);
27935c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
28035c4bbdfSmrg
28135c4bbdfSmrg        sprintf(expected, "(EE) %lx\n", lui);
28235c4bbdfSmrg        printf("%s\n", expected);
28335c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%lx\n", lui);
28435c4bbdfSmrg        read_log_msg(logmsg);
28535c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
28635c4bbdfSmrg
28735c4bbdfSmrg        sprintf(expected, "(EE) %llx\n", (unsigned long long)ui);
28835c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%llx\n", (unsigned long long)ui);
28935c4bbdfSmrg        read_log_msg(logmsg);
29035c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
29135c4bbdfSmrg
29235c4bbdfSmrg        if (lui == 0)
29335c4bbdfSmrg            lui = 1;
29435c4bbdfSmrg        else
29535c4bbdfSmrg            lui <<= 1;
29635c4bbdfSmrg    } while(lui);
29735c4bbdfSmrg
29835c4bbdfSmrg    /* signed number substitution */
29935c4bbdfSmrg    i = 0;
30035c4bbdfSmrg    do {
30135c4bbdfSmrg        char expected[30];
30235c4bbdfSmrg        sprintf(expected, "(EE) %d\n", i);
30335c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%d\n", i);
30435c4bbdfSmrg        read_log_msg(logmsg);
30535c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
30635c4bbdfSmrg
30735c4bbdfSmrg        sprintf(expected, "(EE) %d\n", i | INT_MIN);
30835c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%d\n", i | INT_MIN);
30935c4bbdfSmrg        read_log_msg(logmsg);
31035c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
31135c4bbdfSmrg
31235c4bbdfSmrg        if (i == 0)
31335c4bbdfSmrg            i = 1;
31435c4bbdfSmrg        else
31535c4bbdfSmrg            i <<= 1;
31635c4bbdfSmrg    } while(i > INT_MIN);
31735c4bbdfSmrg
31835c4bbdfSmrg    li = 0;
31935c4bbdfSmrg    do {
32035c4bbdfSmrg        char expected[30];
32135c4bbdfSmrg        sprintf(expected, "(EE) %ld\n", li);
32235c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%ld\n", li);
32335c4bbdfSmrg        read_log_msg(logmsg);
32435c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
32535c4bbdfSmrg
32635c4bbdfSmrg        sprintf(expected, "(EE) %ld\n", li | LONG_MIN);
32735c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%ld\n", li | LONG_MIN);
32835c4bbdfSmrg        read_log_msg(logmsg);
32935c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
33035c4bbdfSmrg
33135c4bbdfSmrg        sprintf(expected, "(EE) %lld\n", (long long)li);
33235c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%lld\n", (long long)li);
33335c4bbdfSmrg        read_log_msg(logmsg);
33435c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
33535c4bbdfSmrg
33635c4bbdfSmrg        sprintf(expected, "(EE) %lld\n", (long long)(li | LONG_MIN));
33735c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%lld\n", (long long)(li | LONG_MIN));
33835c4bbdfSmrg        read_log_msg(logmsg);
33935c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
34035c4bbdfSmrg
34135c4bbdfSmrg        if (li == 0)
34235c4bbdfSmrg            li = 1;
34335c4bbdfSmrg        else
34435c4bbdfSmrg            li <<= 1;
34535c4bbdfSmrg    } while(li > LONG_MIN);
34635c4bbdfSmrg
34735c4bbdfSmrg
34835c4bbdfSmrg    /* pointer substitution */
34935c4bbdfSmrg    /* we print a null-pointer differently to printf */
35035c4bbdfSmrg    LogMessageVerbSigSafe(X_ERROR, -1, "%p\n", NULL);
35135c4bbdfSmrg    read_log_msg(logmsg);
35235c4bbdfSmrg    assert(strcmp(logmsg, "(EE) 0x0\n") == 0);
35335c4bbdfSmrg
35435c4bbdfSmrg    ptr = 1;
35535c4bbdfSmrg    do {
35635c4bbdfSmrg        char expected[30];
35735c4bbdfSmrg#ifdef __sun /* Solaris doesn't autoadd "0x" to %p format */
35835c4bbdfSmrg        sprintf(expected, "(EE) 0x%p\n", (void*)ptr);
35935c4bbdfSmrg#else
36035c4bbdfSmrg        sprintf(expected, "(EE) %p\n", (void*)ptr);
36135c4bbdfSmrg#endif
36235c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%p\n", (void*)ptr);
36335c4bbdfSmrg        read_log_msg(logmsg);
36435c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
36535c4bbdfSmrg        ptr <<= 1;
36635c4bbdfSmrg    } while(ptr);
36735c4bbdfSmrg
36835c4bbdfSmrg
3691b5d61b8Smrg    for (i = 0; i < ARRAY_SIZE(float_tests); i++) {
37035c4bbdfSmrg        double d = float_tests[i];
37135c4bbdfSmrg        char expected[30];
37235c4bbdfSmrg        sprintf(expected, "(EE) %.2f\n", d);
37335c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%f\n", d);
37435c4bbdfSmrg        read_log_msg(logmsg);
37535c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
37635c4bbdfSmrg
37735c4bbdfSmrg        /* test for length modifiers, we just ignore them atm */
37835c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%.3f\n", d);
37935c4bbdfSmrg        read_log_msg(logmsg);
38035c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
38135c4bbdfSmrg
38235c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%3f\n", d);
38335c4bbdfSmrg        read_log_msg(logmsg);
38435c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
38535c4bbdfSmrg
38635c4bbdfSmrg        LogMessageVerbSigSafe(X_ERROR, -1, "%.0f\n", d);
38735c4bbdfSmrg        read_log_msg(logmsg);
38835c4bbdfSmrg        assert(strcmp(logmsg, expected) == 0);
38935c4bbdfSmrg    }
39035c4bbdfSmrg
39135c4bbdfSmrg
39235c4bbdfSmrg    LogClose(EXIT_NO_ERROR);
39335c4bbdfSmrg    unlink(log_file_path);
39435c4bbdfSmrg
39535c4bbdfSmrg#undef read_log_msg
39635c4bbdfSmrg}
39735c4bbdfSmrg#pragma GCC diagnostic pop /* "-Wformat-security" */
39835c4bbdfSmrg
39935c4bbdfSmrgint
4001b5d61b8Smrgsignal_logging_test(void)
40135c4bbdfSmrg{
40235c4bbdfSmrg    number_formatting();
40335c4bbdfSmrg    logging_format();
40435c4bbdfSmrg
40535c4bbdfSmrg    return 0;
40635c4bbdfSmrg}
407