sfizz/tests/MessagingT.cpp
Paul Fd 1e771a45e7 Reenable and fix tests
- Add ASAN workflows
- Remove flag messages from configure; these are misleading as they exclude `COMPILE_OPTIONS`
- Fix non-working tests
- Fix WavPack file loading on Windows
- Fix ASAN traps in LoFi code due to a SIMD `loadu` call in HIIR resamplers
- Add tests for st_audiofile
-
2023-08-07 22:48:42 +02:00

127 lines
4.8 KiB
C++

// SPDX-License-Identifier: BSD-2-Clause
// This code is part of the sfizz library and is licensed under a BSD 2-clause
// license. You should have receive a LICENSE.md file along with the code.
// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz
#include "sfizz/Messaging.h"
#include "catch2/catch.hpp"
#include <absl/types/span.h>
#include <cstring>
TEST_CASE("[Messaging] OSC message creation")
{
// http://opensoundcontrol.org/spec-1_0-examples
{
const char* path = "/oscillator/4/frequency";
const char* sig = "f";
sfizz_arg_t args[1];
args[0].f = 440.0f;
const uint8_t expected[] = {
0x2f, /* / */ 0x6f, /* o */ 0x73, /* s */ 0x63, /* c */
0x69, /* i */ 0x6c, /* l */ 0x6c, /* l */ 0x61, /* a */
0x74, /* t */ 0x6f, /* o */ 0x72, /* r */ 0x2f, /* / */
0x34, /* 4 */ 0x2f, /* / */ 0x66, /* f */ 0x72, /* r */
0x65, /* e */ 0x71, /* q */ 0x75, /* u */ 0x65, /* e */
0x6e, /* n */ 0x63, /* c */ 0x79, /* y */ 0x00,
0x2c, /* , */ 0x66, /* f */ 0x00, 0x00,
0x43, 0xdc, 0x00, 0x00,
};
uint32_t size = sfizz_prepare_message(nullptr, 0, path, sig, args);
REQUIRE(size == sizeof(expected));
uint8_t actual[sizeof(expected)];
size = sfizz_prepare_message(actual, sizeof(actual), path, sig, args);
REQUIRE(size == sizeof(expected));
REQUIRE(absl::MakeSpan(actual) == absl::MakeSpan(expected));
const char* path2;
const char* sig2;
const sfizz_arg_t* args2;
uint8_t buffer[256];
REQUIRE(sfizz_extract_message(actual, sizeof(actual), buffer, sizeof(buffer), &path2, &sig2, &args2) > 0);
REQUIRE(!strcmp(path, path2));
REQUIRE(!strcmp(sig, sig2));
REQUIRE(args2[0].f == 440.0f);
}
{
const char* path = "/foo";
const char* sig = "iisff";
sfizz_arg_t args[5];
args[0].i = 1000;
args[1].i = -1;
args[2].s = "hello";
args[3].f = 1.234f;
args[4].f = 5.678f;
const uint8_t expected[] = {
0x2f, /* / */ 0x66, /* f */ 0x6f, /* o */ 0x6f, /* o */
0x00, 0x00, 0x00, 0x00,
0x2c, /* , */ 0x69, /* i */ 0x69, /* i */ 0x73, /* s */
0x66, /* f */ 0x66, /* f */ 0x00, 0x00,
0x00, 0x00, 0x03, 0xe8,
0xff, 0xff, 0xff, 0xff,
0x68, 0x65, 0x6c, 0x6c,
0x6f, 0x00, 0x00, 0x00,
0x3f, 0x9d, 0xf3, 0xb6,
0x40, 0xb5, 0xb2, 0x2d,
};
uint32_t size = sfizz_prepare_message(nullptr, 0, path, sig, args);
REQUIRE(size == sizeof(expected));
uint8_t actual[sizeof(expected)];
size = sfizz_prepare_message(actual, sizeof(actual), path, sig, args);
REQUIRE(size == sizeof(expected));
REQUIRE(absl::MakeSpan(actual) == absl::MakeSpan(expected));
const char* path2;
const char* sig2;
const sfizz_arg_t* args2;
uint8_t buffer[256];
REQUIRE(sfizz_extract_message(actual, sizeof(actual), buffer, sizeof(buffer), &path2, &sig2, &args2) > 0);
REQUIRE(!strcmp(path, path2));
REQUIRE(!strcmp(sig, sig2));
REQUIRE(args2[0].i == 1000);
REQUIRE(args2[1].i == -1);
REQUIRE(!strcmp(args2[2].s, "hello"));
REQUIRE(args2[3].f == 1.234f);
REQUIRE(args2[4].f == 5.678f);
}
}
TEST_CASE("[Messaging] Type-safe client API")
{
sfz::Client client(nullptr);
static const int32_t i = 777;
static const int64_t h = 0x100000000LL;
static const float f = 3.14f;
static const double d = 6.28;
static const uint8_t m[4] = {0x90, 0x40, 0xFF};
static const sfizz_blob_t b { reinterpret_cast<const uint8_t*>("MyBinaryString"), 14 };
static const char s[] = "Hello, World!";
client.setReceiveCallback(+[](void*, int, const char* path, const char* sig, const sfizz_arg_t* args) {
REQUIRE(!strcmp(path, "/test"));
REQUIRE(!strcmp(sig, "imhfdsbTFNI"));
unsigned index = 0;
REQUIRE(args[index++].i == i);
REQUIRE(!memcmp(args[index++].m, m, 4));
REQUIRE(args[index++].h == h);
REQUIRE(args[index++].f == f);
REQUIRE(args[index++].d == d);
REQUIRE(!strcmp(args[index++].s, s));
#if !defined(__SANITIZE_ADDRESS__)
REQUIRE(args[index ].b->data == b.data);
REQUIRE(args[index++].b->size == b.size);
#endif
});
client.receive<'i', 'm', 'h', 'f', 'd', 's', 'b', 'T', 'F', 'N', 'I'>(
0, "/test", i, m, h, f, d, s, &b, {}, {}, {}, {});
}