Skip to content

Commit 15483a6

Browse files
committed
WSHUB-458: reader unit tests: Simplify the example reader
We simplify this reader in two ways: 1. we remove the `consumed` member of `struct Input`, and instead use the `CborValue`'s `source.token` member, which we treat as an unsigned integer offset into our `QByteArray`. 2. we replace the reader-specific `struct Input` with the `QByteArray` it was wrapping, since that's the only thing now contained in our `struct Input`. If a `CborValue` gets cloned, the pointer referred to by `source.token` similarly gets cloned, thus when we advance the pointer on the clone, it leaves the original alone, so computing the length of unknown-length entities in the CBOR document can be done safely.
1 parent d352a9a commit 15483a6

File tree

1 file changed

+24
-26
lines changed

1 file changed

+24
-26
lines changed

tests/parser/tst_parser.cpp

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -757,32 +757,32 @@ void tst_Parser::mapsAndArrays()
757757
"{_ 1: [_ " + expected + "], \"Hello\": {_ " + expected + ": (_ )}}");
758758
}
759759

760-
struct Input {
761-
QByteArray data;
762-
int consumed;
763-
};
764-
765760
static const CborParserOperations byteArrayOps = {
766761
/* can_read_bytes = */ [](const CborValue *value, size_t len) {
767-
auto input = static_cast<Input *>(value->parser->data.ctx);
768-
return input->data.size() - input->consumed >= int(len);
762+
auto data = static_cast<QByteArray *>(value->parser->data.ctx);
763+
auto consumed = uintptr_t(value->source.token);
764+
return uintptr_t(data->size()) - consumed >= uintptr_t(len);
769765
},
770766
/* read_bytes = */ [](const CborValue *value, void *dst, size_t offset, size_t len) {
771-
auto input = static_cast<Input *>(value->parser->data.ctx);
772-
return memcpy(dst, input->data.constData() + input->consumed + offset, len);
767+
auto data = static_cast<QByteArray *>(value->parser->data.ctx);
768+
auto consumed = uintptr_t(value->source.token);
769+
return memcpy(dst, data->constData() + consumed + offset, len);
773770
},
774771
/* advance_bytes = */ [](CborValue *value, size_t len) {
775-
auto input = static_cast<Input *>(value->parser->data.ctx);
776-
input->consumed += int(len);
772+
auto consumed = uintptr_t(value->source.token);
773+
consumed += int(len);
774+
value->source.token = (void*)consumed;
777775
},
778776
/* transfer_string = */ [](CborValue *value, const void **userptr, size_t offset, size_t len) {
779777
// ###
780-
auto input = static_cast<Input *>(value->parser->data.ctx);
781-
if (input->data.size() - input->consumed < int(len + offset))
778+
auto data = static_cast<QByteArray *>(value->parser->data.ctx);
779+
auto consumed = uintptr_t(value->source.token);
780+
if (uintptr_t(data->size()) - consumed < uintptr_t(len + offset))
782781
return CborErrorUnexpectedEOF;
783-
input->consumed += int(offset);
784-
*userptr = input->data.constData() + input->consumed;
785-
input->consumed += int(len);
782+
consumed += int(offset);
783+
*userptr = data->constData() + consumed;
784+
consumed += int(len);
785+
value->source.token = (void*)consumed;
786786
return CborNoError;
787787
}
788788
};
@@ -792,11 +792,9 @@ void tst_Parser::readerApi()
792792
QFETCH(QByteArray, data);
793793
QFETCH(QString, expected);
794794

795-
Input input = { data, 0 };
796-
797795
CborParser parser;
798796
CborValue first;
799-
CborError err = cbor_parser_init_reader(&byteArrayOps, &parser, &first, &input);
797+
CborError err = cbor_parser_init_reader(&byteArrayOps, &parser, &first, &data);
800798
QCOMPARE(err, CborNoError);
801799

802800
QString decoded;
@@ -805,7 +803,7 @@ void tst_Parser::readerApi()
805803
QCOMPARE(decoded, expected);
806804

807805
// check we consumed everything
808-
QCOMPARE(input.consumed, data.size());
806+
QCOMPARE(uintptr_t(first.source.token), uintptr_t(data.size()));
809807
}
810808

811809
void tst_Parser::reparse_data()
@@ -820,23 +818,23 @@ void tst_Parser::reparse()
820818
QFETCH(QByteArray, data);
821819
QFETCH(QString, expected);
822820

823-
Input input = { QByteArray(), 0 };
821+
QByteArray buffer;
824822
CborParser parser;
825823
CborValue first;
826-
CborError err = cbor_parser_init_reader(&byteArrayOps, &parser, &first, &input);
824+
CborError err = cbor_parser_init_reader(&byteArrayOps, &parser, &first, &buffer);
827825
QCOMPARE(err, CborErrorUnexpectedEOF);
828826

829827
for (int i = 0; i < data.size(); ++i) {
830-
input.data = data.left(i);
828+
buffer = data.left(i);
831829
err = cbor_value_reparse(&first);
832830
if (err != CborErrorUnexpectedEOF)
833831
qDebug() << "At" << i;
834832
QCOMPARE(err, CborErrorUnexpectedEOF);
835-
QCOMPARE(input.consumed, 0);
833+
QCOMPARE(uintptr_t(first.source.token), 0U);
836834
}
837835

838836
// now it should work
839-
input.data = data;
837+
buffer = data;
840838
err = cbor_value_reparse(&first);
841839
QCOMPARE(err, CborNoError);
842840

@@ -846,7 +844,7 @@ void tst_Parser::reparse()
846844
QCOMPARE(decoded, expected);
847845

848846
// check we consumed everything
849-
QCOMPARE(input.consumed, data.size());
847+
QCOMPARE(uintptr_t(first.source.token), uintptr_t(data.size()));
850848
}
851849

852850
void tst_Parser::chunkedString_data()

0 commit comments

Comments
 (0)