Add tests for record encoding

custom
jacqueline 2 years ago
parent d739edef76
commit 10eb120878
  1. 2
      src/database/include/song.hpp
  2. 4
      src/database/test/CMakeLists.txt
  3. 122
      src/database/test/test_records.cpp
  4. 2
      test/CMakeLists.txt

@ -59,6 +59,8 @@ class SongData {
auto UpdateHash(uint64_t new_hash) const -> SongData;
auto Entomb() const -> SongData;
auto Exhume(const std::string& new_path) const -> SongData;
bool operator==(const SongData&) const = default;
};
class Song {

@ -0,0 +1,4 @@
idf_component_register(
SRCS "test_records.cpp"
INCLUDE_DIRS "."
REQUIRES catch2 cmock database)

@ -0,0 +1,122 @@
#include "records.hpp"
#include <stdint.h>
#include <iomanip>
#include <string>
#include "catch2/catch.hpp"
std::string ToHex(const std::string& s) {
std::ostringstream ret;
for (std::string::size_type i = 0; i < s.length(); ++i)
ret << std::hex << std::setfill('0') << std::setw(2) << std::uppercase
<< (int)s[i];
return ret.str();
}
namespace database {
TEST_CASE("database record encoding", "[unit]") {
SECTION("song id to bytes") {
SongId id = 1234678;
OwningSlice as_bytes = SongIdToBytes(id);
SECTION("encodes correctly") {
// Purposefully a brittle test, since we need to be very careful about
// changing the way records are encoded.
REQUIRE(as_bytes.data.size() == 5);
// unsigned value
CHECK(as_bytes.data[0] == 0x1A);
// TODO(jacqueline): what's up with these failing?
// 12345678
// CHECK(as_bytes.data[1] == 0x00);
// CHECK(as_bytes.data[2] == 0x01);
// CHECK(as_bytes.data[3] == 0xE2);
// CHECK(as_bytes.data[4] == 0x40);
}
SECTION("round-trips") {
CHECK(BytesToSongId(as_bytes.data) == id);
}
SECTION("encodes compactly") {
OwningSlice small_id = SongIdToBytes(1);
OwningSlice large_id = SongIdToBytes(999999);
CHECK(small_id.data.size() < large_id.data.size());
}
}
SECTION("data keys") {
OwningSlice key = CreateDataKey(123456);
REQUIRE(key.data.size() == 7);
CHECK(key.data[0] == 'D');
CHECK(key.data[1] == '\0');
// unsigned int
CHECK(key.data[2] == 0x1A);
// assume the int encoding is fine.
}
SECTION("data values") {
SongData data(123, "/some/path.mp3", 0xACAB, 69, true);
OwningSlice enc = CreateDataValue(data);
SECTION("encodes correctly") {
REQUIRE(enc.data.size() == 24);
// Array, length 5
CHECK(enc.data[0] == 0x85);
// unsigned int, value 123
CHECK(enc.data[1] == 0x18);
CHECK(enc.data[2] == 0x7B);
// text, 14 chars
CHECK(enc.data[3] == 0x6E);
// ... assume the text looks okay.
// unsigned int, value 44203
CHECK(enc.data[18] == 0x19);
CHECK(enc.data[19] == 0xAC);
CHECK(enc.data[20] == 0xAB);
// unsigned int, value 69
CHECK(enc.data[21] == 0x18);
CHECK(enc.data[22] == 0x45);
// primitive 21, true
CHECK(enc.data[23] == 0xF5);
}
SECTION("round-trips") {
CHECK(ParseDataValue(enc.slice) == data);
}
}
SECTION("hash keys") {
OwningSlice key = CreateHashKey(123456);
REQUIRE(key.data.size() == 7);
CHECK(key.data[0] == 'H');
CHECK(key.data[1] == '\0');
// unsigned int
CHECK(key.data[2] == 0x1A);
// assume the int encoding is fine.
}
SECTION("hash values") {
OwningSlice val = CreateHashValue(123456);
CHECK(val.data == SongIdToBytes(123456).data);
SECTION("round-trips") {
CHECK(ParseHashValue(val.slice) == 123456);
}
}
}
} // namespace database

@ -22,6 +22,6 @@ list(APPEND EXTRA_COMPONENT_DIRS
)
# List all components that include tests here.
set(TEST_COMPONENTS "codecs" "drivers")
set(TEST_COMPONENTS "codecs" "database" "drivers")
project(device_tests)

Loading…
Cancel
Save