[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [dferry] tests/serialization: Add tests for copied Reader and Writer instances.
From: Andreas Hartmetz <ahartmetz () gmail ! com>
Date: 2016-10-12 0:57:08
Message-ID: E1bu7r2-0007PZ-3v () code ! kde ! org
[Download RAW message or body]
Git commit 18136f5a5150aecd731e8a4edb25723241a18a6d by Andreas Hartmetz.
Committed on 12/10/2016 at 00:53.
Pushed by ahartmetz into branch 'master'.
Add tests for copied Reader and Writer instances.
No bugs found! (The tests work, I've injected an error to check)
Supporting changes:
- Extract the code to check things after a roundtrip
- Decrease the lowest dataIncrement value from 1 to 0. Seems like a
good idea to include this corner case in all the tests.
M +101 -21 tests/serialization/tst_arguments.cpp
http://commits.kde.org/dferry/18136f5a5150aecd731e8a4edb25723241a18a6d
diff --git a/tests/serialization/tst_arguments.cpp b/tests/serialization/tst_arguments.cpp
index cd22da4..5dc354c 100644
--- a/tests/serialization/tst_arguments.cpp
+++ b/tests/serialization/tst_arguments.cpp
@@ -394,7 +394,33 @@ static void defaultReadToWrite(Arguments::Reader *reader, Arguments::Writer *wri
}
}
-static void doRoundtripForReal(const Arguments &original, uint32 dataIncrement, bool debugPrint)
+static void verifyAfterRoundtrip(const Arguments &original, const Arguments::Reader &originalReader,
+ const Arguments ©, const Arguments::Writer ©Writer,
+ bool debugPrint)
+{
+ TEST(originalReader.state() == Arguments::Finished);
+ TEST(copyWriter.state() == Arguments::Finished);
+ cstring originalSignature = original.signature();
+ cstring copySignature = copy.signature();
+ if (originalSignature.length) {
+ TEST(Arguments::isSignatureValid(copySignature));
+ TEST(stringsEqual(originalSignature, copySignature));
+ } else {
+ TEST(copySignature.length == 0);
+ }
+
+ chunk originalData = original.data();
+
+ chunk copyData = copy.data();
+ TEST(originalData.length == copyData.length);
+ if (debugPrint && !chunksEqual(originalData, copyData)) {
+ printChunk(originalData);
+ printChunk(copyData);
+ }
+ TEST(chunksEqual(originalData, copyData));
+}
+
+static void doRoundtripWithShortReads(const Arguments &original, uint32 dataIncrement, bool debugPrint)
{
Arguments::Reader reader(original);
Arguments::Writer writer;
@@ -440,31 +466,85 @@ static void doRoundtripForReal(const Arguments &original, uint32 dataIncrement,
}
Arguments copy = writer.finish();
- TEST(reader.state() == Arguments::Finished);
- TEST(writer.state() == Arguments::Finished);
- cstring originalSignature = original.signature();
- cstring copySignature = copy.signature();
- if (originalSignature.length) {
- TEST(Arguments::isSignatureValid(copySignature));
- TEST(stringsEqual(originalSignature, copySignature));
- } else {
- TEST(copySignature.length == 0);
+ verifyAfterRoundtrip(original, reader, copy, writer, debugPrint);
+ if (shortData.ptr) {
+ free(shortData.ptr);
}
+}
- // TODO when it's wired up between Reader and Arguments: chunk originalData = arg.data();
- chunk originalData = original.data();
+static void doRoundtripWithReaderCopy(const Arguments &original, uint32 dataIncrement, bool debugPrint)
+{
+ Arguments::Reader *reader = new Arguments::Reader(original);
+ Arguments::Writer writer;
- chunk copyData = copy.data();
- TEST(originalData.length == copyData.length);
- if (debugPrint && !chunksEqual(originalData, copyData)) {
- printChunk(originalData);
- printChunk(copyData);
+ bool isDone = false;
+ uint32 emptyNesting = 0;
+ uint32 i = 0;
+
+ while (!isDone) {
+ TEST(writer.state() != Arguments::InvalidData);
+ if (i++ == dataIncrement) {
+ Arguments::Reader *copy = new Arguments::Reader(*reader);
+ delete reader;
+ reader = copy;
+ }
+ if (debugPrint) {
+ std::cout << "Reader state: " << reader->stateString().ptr << '\n';
+ }
+ switch(reader->state()) {
+ case Arguments::Finished:
+ isDone = true;
+ break;
+ default:
+ defaultReadToWrite(reader, &writer, &emptyNesting);
+ break;
+ }
}
- TEST(chunksEqual(originalData, copyData));
- if (shortData.ptr) {
- free(shortData.ptr);
+ Arguments copy = writer.finish();
+ verifyAfterRoundtrip(original, *reader, copy, writer, debugPrint);
+ delete reader;
+}
+
+static void doRoundtripWithWriterCopy(const Arguments &original, uint32 dataIncrement, bool debugPrint)
+{
+ Arguments::Reader reader(original);
+ Arguments::Writer *writer = new Arguments::Writer;
+
+ bool isDone = false;
+ uint32 emptyNesting = 0;
+ uint32 i = 0;
+
+ while (!isDone) {
+ TEST(writer->state() != Arguments::InvalidData);
+ if (i++ == dataIncrement) {
+ Arguments::Writer *copy = new Arguments::Writer(*writer);
+ delete writer;
+ writer = copy;
+ }
+ if (debugPrint) {
+ std::cout << "Reader state: " << reader.stateString().ptr << '\n';
+ }
+ switch(reader.state()) {
+ case Arguments::Finished:
+ isDone = true;
+ break;
+ default:
+ defaultReadToWrite(&reader, writer, &emptyNesting);
+ break;
+ }
}
+
+ Arguments copy = writer->finish();
+ verifyAfterRoundtrip(original, reader, copy, *writer, debugPrint);
+ delete writer;
+}
+
+static void doRoundtripForReal(const Arguments &original, uint32 dataIncrement, bool debugPrint)
+{
+ doRoundtripWithShortReads(original, dataIncrement, debugPrint);
+ doRoundtripWithReaderCopy(original, dataIncrement, debugPrint);
+ doRoundtripWithWriterCopy(original, dataIncrement, debugPrint);
}
// not returning by value to avoid the move constructor or assignment operator -
@@ -539,7 +619,7 @@ static void doRoundtripWithCopyAssignEtc(const Arguments &arg_in, uint32 dataInc
static void doRoundtrip(const Arguments &arg, bool debugPrint = false)
{
const uint32 maxIncrement = arg.data().length;
- for (uint32 i = 1; i <= maxIncrement; i++) {
+ for (uint32 i = 0; i <= maxIncrement; i++) {
doRoundtripWithCopyAssignEtc(arg, i, debugPrint);
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic