You've already forked M5Unit-RFID
mirror of
https://github.com/m5stack/M5Unit-RFID.git
synced 2026-05-20 11:28:27 -07:00
185 lines
5.5 KiB
C++
185 lines
5.5 KiB
C++
/*
|
|
* SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
/*
|
|
UnitTest for NFC
|
|
*/
|
|
#include <gtest/gtest.h>
|
|
#include <M5Unified.h>
|
|
#include <nfc/nfc.hpp>
|
|
#include <nfc/ndef/ndef.hpp>
|
|
#include <nfc/ndef/ndef_record.hpp>
|
|
#include <nfc/ndef/ndef_tlv.hpp>
|
|
#include <cstring>
|
|
|
|
using namespace m5::nfc;
|
|
using namespace m5::nfc::ndef;
|
|
|
|
namespace {
|
|
|
|
constexpr char en_data[] = "Hello M5Stack"; // 13
|
|
constexpr char ja_data[] = "こんにちは M5Stack"; // 23
|
|
constexpr char zh_data[] = "你好 M5Stack"; // 14
|
|
|
|
constexpr char en_lang[] = "en";
|
|
constexpr char ja_lang[] = "ja";
|
|
constexpr char zh_lang[] = "zh";
|
|
|
|
constexpr char ftp_data[] = "ftp://anonymous:anonymous@example.com/";
|
|
|
|
} // namespace
|
|
|
|
TEST(NDEF, Record)
|
|
{
|
|
Record r(TNF::Wellknown);
|
|
|
|
EXPECT_EQ(r.tnf(), TNF::Wellknown);
|
|
EXPECT_EQ(r.required(), 3U); // attr + type len + payload len
|
|
EXPECT_FALSE(r.attribute().idLength());
|
|
EXPECT_TRUE(strcmp(r.type(), "") == 0);
|
|
EXPECT_EQ(r.identifierSize(), 0U);
|
|
EXPECT_EQ(r.identifier(), nullptr);
|
|
EXPECT_EQ(r.payloadSize(), 0U);
|
|
EXPECT_EQ(r.payload(), nullptr);
|
|
|
|
// ID
|
|
{
|
|
uint8_t id[7] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
|
|
|
|
r.setIdentifier(id, 7);
|
|
EXPECT_EQ(r.required(), 4U + 7U); // attr + type len + payload len + id len + id[7]
|
|
EXPECT_TRUE(r.attribute().idLength());
|
|
EXPECT_EQ(r.identifierSize(), 7U);
|
|
EXPECT_NE(r.identifier(), nullptr);
|
|
|
|
uint8_t id2{0x52};
|
|
r.setIdentifier(&id2, 1);
|
|
EXPECT_EQ(r.required(), 4U + 1U); // id[1]
|
|
EXPECT_TRUE(r.attribute().idLength());
|
|
EXPECT_EQ(r.identifierSize(), 1U);
|
|
EXPECT_NE(r.identifier(), nullptr);
|
|
|
|
r.clearIdentifier();
|
|
EXPECT_EQ(r.required(), 3U);
|
|
EXPECT_FALSE(r.attribute().idLength());
|
|
EXPECT_EQ(r.identifierSize(), 0U);
|
|
EXPECT_EQ(r.identifier(), nullptr);
|
|
|
|
r.setIdentifier(id, 7);
|
|
EXPECT_EQ(r.required(), 4U + 7U);
|
|
EXPECT_TRUE(r.attribute().idLength());
|
|
EXPECT_EQ(r.identifierSize(), 7U);
|
|
EXPECT_NE(r.identifier(), nullptr);
|
|
}
|
|
|
|
// Payload
|
|
{
|
|
EXPECT_TRUE(strcmp(r.type(), "") == 0);
|
|
|
|
r.setTextPayload(en_data, "en");
|
|
EXPECT_TRUE(strcmp(r.type(), "T") == 0);
|
|
EXPECT_EQ(r.required(), 4U + 1U + 7U + // attr + type len + payload len + id len + type[1] + id[7]
|
|
1U + 2U + 13U); // status + lang[2] + txt[13]
|
|
|
|
r.setURIPayload("https://m5stack.com", URIProtocol::HTTPS);
|
|
EXPECT_TRUE(strcmp(r.type(), "U") == 0);
|
|
|
|
r.setTextPayload(ja_data, "ja");
|
|
EXPECT_TRUE(strcmp(r.type(), "T") == 0);
|
|
EXPECT_EQ(r.required(), 4U + 1U + 7U + //
|
|
1U + 2U + 23U); // status + lang[2] + txt[23]
|
|
|
|
r.setTextPayload(zh_data, "zh");
|
|
EXPECT_TRUE(strcmp(r.type(), "T") == 0);
|
|
EXPECT_EQ(r.required(), 4U + 1U + 7U + //
|
|
1U + 2U + 14U); // status + lang[2] + txt[14]
|
|
}
|
|
|
|
{
|
|
uint8_t buf[256]{};
|
|
auto encoded = r.encode(buf, 256);
|
|
EXPECT_EQ(encoded, 4U + 1U + 7U + //
|
|
1U + 2U + 14U); // status + lang[2] + txt[14]
|
|
Record r2{};
|
|
auto decoded = r2.decode(buf, encoded);
|
|
EXPECT_EQ(encoded, decoded);
|
|
|
|
EXPECT_EQ(r.attribute().value, r2.attribute().value);
|
|
auto tlen = strlen(r.type());
|
|
auto tlen2 = strlen(r2.type());
|
|
EXPECT_EQ(tlen, tlen2);
|
|
EXPECT_TRUE(std::memcmp(r.type(), r2.type(), tlen) == 0);
|
|
|
|
auto ilen = r.identifierSize();
|
|
auto ilen2 = r2.identifierSize();
|
|
EXPECT_EQ(ilen, ilen2);
|
|
EXPECT_TRUE(std::memcmp(r.identifier(), r2.identifier(), ilen) == 0);
|
|
|
|
auto plen = r.payloadSize();
|
|
auto plen2 = r2.payloadSize();
|
|
EXPECT_EQ(plen, plen2);
|
|
EXPECT_TRUE(std::memcmp(r.payload(), r2.payload(), plen) == 0);
|
|
}
|
|
}
|
|
|
|
TEST(NDEF, TLV)
|
|
{
|
|
uint8_t buf[1024]{};
|
|
TLV msg{Tag::Message};
|
|
Record r0{}, r1{}, r2{};
|
|
|
|
{
|
|
EXPECT_EQ(msg.tag(), Tag::Message);
|
|
EXPECT_EQ(msg.records().size(), 0U);
|
|
|
|
// 0
|
|
r0.setTextPayload(en_data, en_lang);
|
|
EXPECT_TRUE(strcmp(r0.type(), "T") == 0);
|
|
EXPECT_EQ(r0.required(), 20);
|
|
EXPECT_TRUE(strcmp(en_data, r0.payloadAsString().c_str()) == 0);
|
|
|
|
msg.push_back(r0);
|
|
EXPECT_EQ(msg.records().size(), 1U);
|
|
|
|
auto encoded = msg.encode(buf, 1024);
|
|
EXPECT_GT(encoded, 0U);
|
|
|
|
// 1
|
|
r1.setTextPayload(zh_data, zh_lang);
|
|
EXPECT_TRUE(strcmp(r1.type(), "T") == 0);
|
|
EXPECT_EQ(r1.required(), 21);
|
|
EXPECT_TRUE(strcmp(zh_data, r1.payloadAsString().c_str()) == 0);
|
|
|
|
msg.push_back(r1);
|
|
EXPECT_EQ(msg.records().size(), 2U);
|
|
|
|
encoded = msg.encode(buf, 1024);
|
|
EXPECT_GT(encoded, 0U);
|
|
|
|
// 2
|
|
r2.setURIPayload(ftp_data, URIProtocol::FTP_AA);
|
|
EXPECT_TRUE(strcmp(r2.type(), "U") == 0);
|
|
EXPECT_EQ(r2.required(), 17);
|
|
EXPECT_TRUE(strcmp(ftp_data, r2.payloadAsString().c_str()) == 0);
|
|
|
|
msg.push_back(r2);
|
|
EXPECT_EQ(msg.records().size(), 3U);
|
|
|
|
encoded = msg.encode(buf, 1024);
|
|
EXPECT_GT(encoded, 0U);
|
|
}
|
|
|
|
{
|
|
auto encoded = msg.encode(buf, 1024);
|
|
TLV msg2{};
|
|
auto decoded = msg2.decode(buf, encoded);
|
|
|
|
EXPECT_EQ(encoded, decoded);
|
|
EXPECT_EQ(msg.tag(), msg2.tag());
|
|
EXPECT_EQ(msg.records().size(), msg2.records().size());
|
|
EXPECT_EQ(msg.records(), msg2.records());
|
|
}
|
|
}
|