0
0
mirror of https://github.com/mpv-player/mpv.git synced 2024-09-19 19:42:24 +02:00
mpv/test/test_utils.c
Kacper Michajłow 734846c123 test_utils: don't use subprocess for diffing test results
Helps with testing during cross-compilation and avoids external
dependency.

Output maybe is not that nice, but this output in our tests is not
useful anyway. We know if it changes it is beacuse one of the dependency
version changed.
2024-06-03 19:18:06 +02:00

154 lines
4.0 KiB
C

#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[4096];
char path_new[4096];
snprintf(path_ref, sizeof(path_ref), "%s/%s", refdir, ref);
snprintf(path_new, sizeof(path_new), "%s/%s", outdir, new);
bool ok = false;
FILE *fref = fopen(path_ref, "r");
FILE *fnew = fopen(path_new, "r");
if (!fref || !fnew) {
printf("Error: Could not open files %s or %s\n", path_ref, path_new);
goto done;
}
char ref_line[4096];
char new_line[4096];
int line_num = 0;
while (fgets(ref_line, sizeof(ref_line), fref))
{
line_num++;
if (!fgets(new_line, sizeof(new_line), fnew)) {
printf("Extra line %d in reference file: %s", line_num, ref_line);
goto done;
}
if (strcmp(ref_line, new_line)) {
printf("Difference found at line %d:\n", line_num);
printf("Reference: %s", ref_line);
printf("New file: %s", new_line);
goto done;
}
}
if (fgets(new_line, sizeof(new_line), fnew)) {
printf("Extra line %d in new file: %s", line_num, new_line);
goto done;
}
ok = true;
done:
if (fref)
fclose(fref);
if (fnew)
fclose(fnew);
if (!ok) {
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; };