CoreServices / CoreRuntime / LiveSession (conception reprise d'un subagent interrompu, implémentation complétée) : session à 60 Hz avec entrée maintenue, export de l'enregistrement et des empreintes par tick, import par rejeu (sim::rebuild_session) puis poursuite dans le même enregistrement ; bail réversible (--linked, core/attach, core/detach, délai de grâce, code de sortie 3) ; core/shutdown ; jeton en temps constant et contrôle de l'Origin (origines ws:// des clients natifs acceptées, spec mise à jour). Base64 strict corrigé (rejetait des entrées valides). 56 cas de test, ASan vert sur les tests serveur. build.ps1 : -Target accepte a,b.
61 lines
1.7 KiB
C++
61 lines
1.7 KiB
C++
// SPDX-License-Identifier: MPL-2.0
|
|
#include "base64.hpp"
|
|
|
|
#include <doctest/doctest.h>
|
|
|
|
#include <cstddef>
|
|
#include <string>
|
|
#include <string_view>
|
|
#include <vector>
|
|
|
|
using namespace sequa::core::server;
|
|
|
|
namespace {
|
|
|
|
std::vector<std::byte> bytes_of(std::string_view text)
|
|
{
|
|
std::vector<std::byte> bytes;
|
|
for (const char c : text) {
|
|
bytes.push_back(static_cast<std::byte>(c));
|
|
}
|
|
return bytes;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
TEST_CASE("Base64 : vecteurs de la RFC 4648 section 10")
|
|
{
|
|
const std::pair<std::string_view, std::string_view> vectors[] = {
|
|
{"", ""}, {"f", "Zg=="}, {"fo", "Zm8="}, {"foo", "Zm9v"},
|
|
{"foob", "Zm9vYg=="}, {"fooba", "Zm9vYmE="}, {"foobar", "Zm9vYmFy"},
|
|
};
|
|
for (const auto& [plain, encoded] : vectors) {
|
|
CHECK(base64::encode(bytes_of(plain)) == encoded);
|
|
const auto decoded = base64::decode(encoded);
|
|
REQUIRE(decoded.has_value());
|
|
CHECK(*decoded == bytes_of(plain));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("Base64 : decodage strict")
|
|
{
|
|
for (const std::string_view bad : {"Zg", "Zg=", "Z===", "====", "Zm9v!", "Zm=v", "Zh==", "Zm9=", "Zm 9v", "Zm9v\n"}) {
|
|
CAPTURE(bad);
|
|
CHECK_FALSE(base64::decode(bad).has_value());
|
|
}
|
|
}
|
|
|
|
TEST_CASE("Base64 : aller-retour de tous les octets")
|
|
{
|
|
std::vector<std::byte> all;
|
|
for (int i = 0; i < 256; ++i) {
|
|
all.push_back(static_cast<std::byte>(i));
|
|
}
|
|
for (std::size_t length = 0; length <= all.size(); length += 37) {
|
|
const std::vector<std::byte> part(all.begin(), all.begin() + static_cast<std::ptrdiff_t>(length));
|
|
const auto decoded = base64::decode(base64::encode(part));
|
|
REQUIRE(decoded.has_value());
|
|
CHECK(*decoded == part);
|
|
}
|
|
}
|