summaryrefslogtreecommitdiffstats
path: root/test/test_utils.c
blob: 94fd2e6bb02a38e9bb86e35b017c62286fb246d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <libavutil/common.h>

#include "common/msg.h"
#include "options/m_option.h"
#include "options/path.h"
#include "osdep/subprocess.h"
#include "osdep/terminal.h"
#include "test_utils.h"

#ifdef NDEBUG
static_assert(false, "don't define NDEBUG for tests");
#endif

void assert_int_equal_impl(const char *file, int line, int64_t a, int64_t b)
{
    if (a != b) {
        printf("%s:%d: %"PRId64" != %"PRId64"\n", file, line, a, b);
        fflush(stdout);
        abort();
    }
}

void assert_string_equal_impl(const char *file, int line,
                              const char *a, const char *b)
{
    if (strcmp(a, b) != 0) {
        printf("%s:%d: '%s' != '%s'\n", file, line, a, b);
        fflush(stdout);
        abort();
    }
}

void assert_float_equal_impl(const char *file, int line,
                              double a, double b, double tolerance)
{
    if (fabs(a - b) > tolerance) {
        printf("%s:%d: %f != %f\n", file, line, a, b);
        fflush(stdout);
        abort();
    }
}

FILE *test_open_out(const char *outdir, const char *name)
{
    mp_mkdirp(outdir);
    assert(mp_path_isdir(outdir));
    char *path = mp_tprintf(4096, "%s/%s", outdir, name);
    FILE *f = fopen(path, "wb");
    if (!f) {
        printf("Could not open '%s' for writing: %s\n", path,
               mp_strerror(errno));
        fflush(stdout);
        abort();
    }
    return f;
}

void assert_text_files_equal_impl(const char *file, int line,
                                  const char *refdir, const char *outdir,
                                  const char *ref, const char *new,
                                  const char *err)
{
    char *path_ref = mp_tprintf(4096, "%s/%s", refdir, ref);
    char *path_new = mp_tprintf(4096, "%s/%s", outdir, new);

    struct mp_subprocess_opts opts = {
        .exe = "diff",
        .args = (char*[]){"diff", "-u", "--", path_ref, path_new, 0},
        .fds = { {0, .src_fd = 0}, {1, .src_fd = 1}, {2, .src_fd = 2} },
        .num_fds = 3,
    };

    struct mp_subprocess_result res;
    mp_subprocess2(&opts, &res);

    if (res.error || res.exit_status) {
        if (res.error)
            printf("Note: %s\n", mp_subprocess_err_str(res.error));
        printf("Giving up.\n");
        fflush(stdout);
        abort();
    }
}

static void hexdump(const uint8_t *d, size_t size)
{
    printf("|");
    while (size--) {
        printf(" %02x", d[0]);
        d++;
    }
    printf(" |\n");
}

void assert_memcmp_impl(const char *file, int line,
                        const void *a, const void *b, size_t size)
{
    if (memcmp(a, b, size) == 0)
        return;

    printf("%s:%d: mismatching data:\n", file, line);
    hexdump(a, size);
    hexdump(b, size);
    fflush(stdout);
    abort();
}

/* Stubs: see test_utils.h */
struct mp_log *const mp_null_log;
const char *mp_help_text;

void mp_msg(struct mp_log *log, int lev, const char *format, ...) {};
int mp_msg_find_level(const char *s) {return 0;};
int mp_msg_level(struct mp_log *log) {return 0;};
void mp_msg_set_max_level(struct mp_log *log, int lev) {};
int mp_console_vfprintf(void *wstream, const char *format, va_list args) {return 0;};
int mp_console_write(void *wstream, bstr str) {return 0;};
bool mp_check_console(void *handle) { return false; };
void mp_set_avdict(AVDictionary **dict, char **kv) {};
struct mp_log *mp_log_new(void *talloc_ctx, struct mp_log *parent,
                          const char *name) { return NULL; };