Skip to content

Commit a41ea04

Browse files
committed
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 357a875 commit a41ea04

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
@@ -759,32 +759,32 @@ void tst_Parser::mapsAndArrays()
759759
"{_ 1: [_ " + expected + "], \"Hello\": {_ " + expected + ": (_ )}}");
760760
}
761761

762-
struct Input {
763-
QByteArray data;
764-
int consumed;
765-
};
766-
767762
static const CborParserOperations byteArrayOps = {
768763
/* can_read_bytes = */ [](const CborValue *value, size_t len) {
769-
auto input = static_cast<Input *>(value->parser->data.ctx);
770-
return input->data.size() - input->consumed >= int(len);
764+
auto data = static_cast<QByteArray *>(value->parser->data.ctx);
765+
auto consumed = uintptr_t(value->source.token);
766+
return uintptr_t(data->size()) - consumed >= uintptr_t(len);
771767
},
772768
/* read_bytes = */ [](const CborValue *value, void *dst, size_t offset, size_t len) {
773-
auto input = static_cast<Input *>(value->parser->data.ctx);
774-
return memcpy(dst, input->data.constData() + input->consumed + offset, len);
769+
auto data = static_cast<QByteArray *>(value->parser->data.ctx);
770+
auto consumed = uintptr_t(value->source.token);
771+
return memcpy(dst, data->constData() + consumed + offset, len);
775772
},
776773
/* advance_bytes = */ [](CborValue *value, size_t len) {
777-
auto input = static_cast<Input *>(value->parser->data.ctx);
778-
input->consumed += int(len);
774+
auto consumed = uintptr_t(value->source.token);
775+
consumed += int(len);
776+
value->source.token = (void*)consumed;
779777
},
780778
/* transfer_string = */ [](CborValue *value, const void **userptr, size_t offset, size_t len) {
781779
// ###
782-
auto input = static_cast<Input *>(value->parser->data.ctx);
783-
if (input->data.size() - input->consumed < int(len + offset))
780+
auto data = static_cast<QByteArray *>(value->parser->data.ctx);
781+
auto consumed = uintptr_t(value->source.token);
782+
if (uintptr_t(data->size()) - consumed < uintptr_t(len + offset))
784783
return CborErrorUnexpectedEOF;
785-
input->consumed += int(offset);
786-
*userptr = input->data.constData() + input->consumed;
787-
input->consumed += int(len);
784+
consumed += int(offset);
785+
*userptr = data->constData() + consumed;
786+
consumed += int(len);
787+
value->source.token = (void*)consumed;
788788
return CborNoError;
789789
}
790790
};
@@ -794,11 +794,9 @@ void tst_Parser::readerApi()
794794
QFETCH(QByteArray, data);
795795
QFETCH(QString, expected);
796796

797-
Input input = { data, 0 };
798-
799797
CborParser parser;
800798
CborValue first;
801-
CborError err = cbor_parser_init_reader(&byteArrayOps, &parser, &first, &input);
799+
CborError err = cbor_parser_init_reader(&byteArrayOps, &parser, &first, &data);
802800
QCOMPARE(err, CborNoError);
803801

804802
QString decoded;
@@ -807,7 +805,7 @@ void tst_Parser::readerApi()
807805
QCOMPARE(decoded, expected);
808806

809807
// check we consumed everything
810-
QCOMPARE(input.consumed, data.size());
808+
QCOMPARE(uintptr_t(first.source.token), uintptr_t(data.size()));
811809
}
812810

813811
void tst_Parser::reparse_data()
@@ -822,23 +820,23 @@ void tst_Parser::reparse()
822820
QFETCH(QByteArray, data);
823821
QFETCH(QString, expected);
824822

825-
Input input = { QByteArray(), 0 };
823+
QByteArray buffer;
826824
CborParser parser;
827825
CborValue first;
828-
CborError err = cbor_parser_init_reader(&byteArrayOps, &parser, &first, &input);
826+
CborError err = cbor_parser_init_reader(&byteArrayOps, &parser, &first, &buffer);
829827
QCOMPARE(err, CborErrorUnexpectedEOF);
830828

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

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

@@ -848,7 +846,7 @@ void tst_Parser::reparse()
848846
QCOMPARE(decoded, expected);
849847

850848
// check we consumed everything
851-
QCOMPARE(input.consumed, data.size());
849+
QCOMPARE(uintptr_t(first.source.token), uintptr_t(data.size()));
852850
}
853851

854852
void tst_Parser::chunkedString_data()

0 commit comments

Comments
 (0)