mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-25 00:50:22 +00:00
Meta+Tests: Allow running FLAC spec tests
The FLAC "spec tests", or rather the test suite by xiph that exercises weird FLAC features and edge cases, can be found at https://github.com/ietf-wg-cellar/flac-test-files and is a good challenge for our FLAC decoder to become more spec compliant. Running these tests is similar to LibWasm spec tests, you need to pass INCLUDE_FLAC_SPEC_TESTS to CMake. As of integrating these tests, 23 out of 63 fail. :yakplus:
This commit is contained in:
parent
6587638ffe
commit
c91511b883
Notes:
sideshowbarker
2024-07-17 07:32:40 +09:00
Author: https://github.com/kleinesfilmroellchen Commit: https://github.com/SerenityOS/serenity/commit/c91511b883 Pull-request: https://github.com/SerenityOS/serenity/pull/14684 Reviewed-by: https://github.com/ADKaster Reviewed-by: https://github.com/linusg Reviewed-by: https://github.com/trflynn89
8 changed files with 108 additions and 0 deletions
|
@ -206,6 +206,7 @@ option(BUILD_EVERYTHING "Build all optional components" ON)
|
|||
|
||||
include(utils)
|
||||
include(wasm_spec_tests)
|
||||
include(flac_spec_tests)
|
||||
|
||||
serenity_component(
|
||||
Tests
|
||||
|
|
|
@ -62,6 +62,7 @@ There are some optional features that can be enabled during compilation that are
|
|||
- `ENABLE_JAKT`: builds the `jakt` compiler as a Lagom host tool and enables building applications and libraries that are written in the jakt language.
|
||||
- `JAKT_SOURCE_DIR`: `jakt` developer's local checkout of the jakt programming language for rapid testing. To use a local checkout, set to an absolute path when changing the CMake cache of Lagom. e.g. ``cmake -S Meta/Lagom -B Build/lagom -DENABLE_JAKT=ON -DJAKT_SOURCE_DIR=/home/me/jakt``
|
||||
- `INCLUDE_WASM_SPEC_TESTS`: downloads and includes the WebAssembly spec testsuite tests. In order to use this option, you will need to install `prettier` and `wabt`. wabt version 1.0.23 or higher is required to pre-process the WebAssembly spec testsuite.
|
||||
- `INCLUDE_FLAC_SPEC_TESTS`: downloads and includes the xiph.org FLAC test suite.
|
||||
- `SERENITY_TOOLCHAIN`: Specifies whether to use the established GNU toolchain, or the experimental Clang-based toolchain for building SerenityOS. See the [Clang-based toolchain](#clang-based-toolchain) section below.
|
||||
- `SERENITY_ARCH`: Specifies which architecture to build for. Currently supported options are `i686` and `x86_64`. `x86_64` requires a separate toolchain build from `i686`.
|
||||
- `BUILD_<component>`: builds the specified component, e.g. `BUILD_HEARTS` (note: must be all caps). Check the components.ini file in your build directory for a list of available components. Make sure to run `ninja clean` and `rm -rf Build/i686/Root` after disabling components. These options can be easily configured by using the `ConfigureComponents` utility. See the [Component Configuration](#component-configuration) section below.
|
||||
|
|
|
@ -12,6 +12,7 @@ serenity_option(ENABLE_COMPILETIME_HEADER_CHECK OFF CACHE BOOL "Enable compileti
|
|||
serenity_option(ENABLE_TIME_ZONE_DATABASE_DOWNLOAD ON CACHE BOOL "Enable download of the IANA Time Zone Database at build time")
|
||||
serenity_option(ENABLE_UNICODE_DATABASE_DOWNLOAD ON CACHE BOOL "Enable download of Unicode UCD and CLDR files at build time")
|
||||
serenity_option(INCLUDE_WASM_SPEC_TESTS OFF CACHE BOOL "Download and include the WebAssembly spec testsuite")
|
||||
serenity_option(INCLUDE_FLAC_SPEC_TESTS OFF CACHE BOOL "Download and include the FLAC spec testsuite")
|
||||
|
||||
serenity_option(HACKSTUDIO_BUILD OFF CACHE BOOL "Automatically enabled when building from HackStudio")
|
||||
|
||||
|
|
29
Meta/CMake/flac_spec_tests.cmake
Normal file
29
Meta/CMake/flac_spec_tests.cmake
Normal file
|
@ -0,0 +1,29 @@
|
|||
include(utils)
|
||||
|
||||
if(INCLUDE_FLAC_SPEC_TESTS)
|
||||
if (CMAKE_PROJECT_NAME STREQUAL "SerenityOS")
|
||||
set(SOURCE_DIR "${SerenityOS_SOURCE_DIR}")
|
||||
else()
|
||||
set(SOURCE_DIR "${SERENITY_PROJECT_ROOT}")
|
||||
endif()
|
||||
set(FLAC_SPEC_TEST_GZ_URL https://github.com/ietf-wg-cellar/flac-test-files/archive/refs/heads/main.tar.gz)
|
||||
|
||||
set(FLAC_TEST_PATH ${CMAKE_BINARY_DIR}/Tests/LibAudio/FLAC CACHE PATH "Location of FLAC tests")
|
||||
set(FLAC_SPEC_TEST_GZ_PATH ${FLAC_TEST_PATH}/flac-spec-testsuite.tar.gz)
|
||||
set(FLAC_SPEC_TEST_PATH ${FLAC_TEST_PATH}/SpecTests)
|
||||
|
||||
if(NOT EXISTS ${FLAC_SPEC_TEST_GZ_PATH})
|
||||
message(STATUS "Downloading the IETF CELLAR FLAC testsuite from ${FLAC_SPEC_TEST_GZ_URL}...")
|
||||
download_file(${FLAC_SPEC_TEST_GZ_URL} ${FLAC_SPEC_TEST_GZ_PATH})
|
||||
endif()
|
||||
|
||||
if(EXISTS ${FLAC_SPEC_TEST_GZ_PATH} AND NOT EXISTS ${FLAC_SPEC_TEST_PATH})
|
||||
file(MAKE_DIRECTORY ${FLAC_SPEC_TEST_PATH})
|
||||
message(STATUS "Extracting the FLAC testsuite from ${FLAC_SPEC_TEST_GZ_PATH}...")
|
||||
execute_process(COMMAND "${TAR_TOOL}" -xzf ${FLAC_SPEC_TEST_GZ_PATH} -C ${FLAC_TEST_PATH} RESULT_VARIABLE tar_result)
|
||||
if (NOT tar_result EQUAL 0)
|
||||
message(FATAL_ERROR "Failed to unzip ${FLAC_TEST_PATH} from ${FLAC_SPEC_TEST_GZ_PATH} with status ${tar_result}")
|
||||
endif()
|
||||
file(RENAME "${FLAC_TEST_PATH}/flac-test-files-main/subset" ${FLAC_SPEC_TEST_PATH})
|
||||
endif()
|
||||
endif()
|
|
@ -61,6 +61,7 @@ if (ENABLE_FUZZERS_LIBFUZZER OR ENABLE_FUZZERS_OSSFUZZ)
|
|||
endif()
|
||||
|
||||
include(wasm_spec_tests)
|
||||
include(flac_spec_tests)
|
||||
include(lagom_compile_options)
|
||||
|
||||
include(GNUInstallDirs) # make sure to include before we mess w/RPATH
|
||||
|
@ -643,6 +644,12 @@ if (BUILD_LAGOM)
|
|||
lagom_test(${source} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../../Tests/AK)
|
||||
endforeach()
|
||||
|
||||
# LibAudio
|
||||
file(GLOB LIBAUDIO_TEST_SOURCES CONFIGURE_DEPENDS "../../Tests/LibAudio/*.cpp")
|
||||
foreach(source ${LIBAUDIO_TEST_SOURCES})
|
||||
lagom_test(${source} LIBS LibAudio WORKING_DIRECTORY ${FLAC_TEST_PATH})
|
||||
endforeach()
|
||||
|
||||
# LibCore
|
||||
lagom_test(../../Tests/LibCore/TestLibCoreIODevice.cpp WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../../Tests/LibCore)
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
add_subdirectory(AK)
|
||||
add_subdirectory(Kernel)
|
||||
add_subdirectory(LibAudio)
|
||||
add_subdirectory(LibC)
|
||||
add_subdirectory(LibCompress)
|
||||
add_subdirectory(LibCore)
|
||||
|
|
9
Tests/LibAudio/CMakeLists.txt
Normal file
9
Tests/LibAudio/CMakeLists.txt
Normal file
|
@ -0,0 +1,9 @@
|
|||
set(TEST_SOURCES
|
||||
TestFLACSpec.cpp
|
||||
)
|
||||
|
||||
foreach(source IN LISTS TEST_SOURCES)
|
||||
serenity_test("${source}" LibAudio LIBS LibAudio)
|
||||
endforeach()
|
||||
|
||||
install(DIRECTORY ${FLAC_SPEC_TEST_PATH} DESTINATION usr/Tests/LibAudio)
|
59
Tests/LibAudio/TestFLACSpec.cpp
Normal file
59
Tests/LibAudio/TestFLACSpec.cpp
Normal file
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* Copyright (c) 2022, kleines Filmröllchen <filmroellchen@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <AK/LexicalPath.h>
|
||||
#include <AK/Types.h>
|
||||
#include <LibAudio/FlacLoader.h>
|
||||
#include <LibCore/DirIterator.h>
|
||||
#include <LibCore/Stream.h>
|
||||
#include <LibTest/TestCase.h>
|
||||
|
||||
struct FlacTest : Test::TestCase {
|
||||
FlacTest(LexicalPath path)
|
||||
: Test::TestCase(
|
||||
String::formatted("flac_spec_test_{}", path.basename()), [this]() { run(); }, false)
|
||||
, m_path(std::move(path))
|
||||
{
|
||||
}
|
||||
|
||||
void run() const
|
||||
{
|
||||
auto loader = Audio::FlacLoaderPlugin { m_path.string() };
|
||||
if (auto result = loader.initialize(); result.is_error()) {
|
||||
FAIL(String::formatted("{} (at {})", result.error().description, result.error().index));
|
||||
return;
|
||||
}
|
||||
|
||||
while (true) {
|
||||
auto maybe_samples = loader.get_more_samples(2 * MiB);
|
||||
if (maybe_samples.is_error()) {
|
||||
FAIL(String::formatted("{} (at {})", maybe_samples.error().description, maybe_samples.error().index));
|
||||
return;
|
||||
}
|
||||
if (maybe_samples.value().is_empty())
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
LexicalPath m_path;
|
||||
};
|
||||
|
||||
struct DiscoverFLACTestsHack {
|
||||
DiscoverFLACTestsHack()
|
||||
{
|
||||
// FIXME: Also run (our own) tests in this directory.
|
||||
auto test_iterator = Core::DirIterator { "./SpecTests", Core::DirIterator::Flags::SkipParentAndBaseDir };
|
||||
|
||||
while (test_iterator.has_next()) {
|
||||
auto file = LexicalPath { test_iterator.next_full_path() };
|
||||
if (file.extension() == "flac"sv) {
|
||||
Test::add_test_case_to_suite(make_ref_counted<FlacTest>(move(file)));
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
// Hack taken from TEST_CASE; the above constructor will run as part of global initialization before the tests are actually executed
|
||||
static struct DiscoverFLACTestsHack hack;
|
Loading…
Reference in a new issue