summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoanna Hulboj <joanna.hulboj@isode.com>2017-03-18 18:52:56 (GMT)
committerJoanna Hulboj <joanna.hulboj@isode.com>2017-03-28 14:19:18 (GMT)
commit0e503ccd97ca5287a14d3147b0deaa99892ccd6f (patch)
tree5500f9f6376f8fa6544fc281ed40ea8b18d7129b /Swiften/Client/UnitTest
parentcc873b3f00db4cd0a778bc2ec04f8748d70a92f9 (diff)
downloadswift-0e503ccd97ca5287a14d3147b0deaa99892ccd6f.zip
swift-0e503ccd97ca5287a14d3147b0deaa99892ccd6f.tar.bz2
Modified XMLBeautifier to handle split payloads
When receiving network data we were processing it in chunks. Sometimes one XML message got split across multiple chunks. XMLBeautifier was stateless and would create a new parser for every single chunk. This was causing multi-chunk messages to be truncated in the beautified output. The change I made in XMLBeautifier allows it to maintain the state. Test-Information: Tested unger Windows 10 and CentOS. Unit tests pass OK. Change-Id: Idad2a8e0248ed3cbe2b47a12718b909e56ac1279
Diffstat (limited to 'Swiften/Client/UnitTest')
-rw-r--r--Swiften/Client/UnitTest/XMLBeautifierTest.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/Swiften/Client/UnitTest/XMLBeautifierTest.cpp b/Swiften/Client/UnitTest/XMLBeautifierTest.cpp
new file mode 100644
index 0000000..0188634
--- /dev/null
+++ b/Swiften/Client/UnitTest/XMLBeautifierTest.cpp
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2010-2017 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include "gtest/gtest.h"
+#include <Swiften/Client/XMLBeautifier.h>
+#include <iostream>
+
+using namespace Swift;
+
+namespace {
+ const static std::string FULL_FORMATTED_OUTPUT("<list>\n <el>aqq</el>\n <el>bzz</el>\n</list>");
+}
+
+TEST(XMLBeautifierTest, testBeautify) {
+ auto beautifier = std::unique_ptr<XMLBeautifier>(new XMLBeautifier(true, false));
+
+ ASSERT_EQ(FULL_FORMATTED_OUTPUT, beautifier->beautify("<list><el>aqq</el><el>bzz</el></list>"));
+ ASSERT_TRUE(beautifier->wasReset());
+ ASSERT_EQ(0, beautifier->getLevel());
+ ASSERT_EQ(FULL_FORMATTED_OUTPUT, beautifier->beautify("<list><el>aqq</el><el>bzz</el></list>"));
+ ASSERT_TRUE(beautifier->wasReset());
+ ASSERT_EQ(0, beautifier->getLevel());
+}
+
+TEST(XMLBeautifierTest, testBeautifyMultipleChunks) {
+ auto beautifier = std::unique_ptr<XMLBeautifier>(new XMLBeautifier(true, false));
+
+ auto result = beautifier->beautify("<list><el>aqq</el>");
+ ASSERT_TRUE(beautifier->wasReset());
+ ASSERT_EQ(1, beautifier->getLevel());
+
+ result += beautifier->beautify("<el>bzz</el></list>");
+ ASSERT_FALSE(beautifier->wasReset());
+ ASSERT_EQ(0, beautifier->getLevel());
+
+ ASSERT_EQ(FULL_FORMATTED_OUTPUT, result);
+}
+
+TEST(XMLBeautifierTest, testBeautifyMultipleChunksMiddleElement) {
+ auto beautifier = std::unique_ptr<XMLBeautifier>(new XMLBeautifier(true, false));
+
+ auto result = beautifier->beautify("<l");
+ ASSERT_TRUE(beautifier->wasReset());
+ ASSERT_EQ(0, beautifier->getLevel());
+
+ result += beautifier->beautify("ist><el>aqq</el><el>bzz</el></list>");
+ ASSERT_FALSE(beautifier->wasReset());
+ ASSERT_EQ(0, beautifier->getLevel());
+
+ ASSERT_EQ(FULL_FORMATTED_OUTPUT, result);
+}
+
+TEST(XMLBeautifierTest, testBeautifyInvalidMultipleChunks) {
+ auto beautifier = std::unique_ptr<XMLBeautifier>(new XMLBeautifier(true, false));
+
+ ASSERT_EQ(std::string("<list>\n <el>aqq"), beautifier->beautify("<list><el>aqq<"));
+ ASSERT_TRUE(beautifier->wasReset());
+ ASSERT_EQ(2, beautifier->getLevel());
+
+ ASSERT_EQ(FULL_FORMATTED_OUTPUT, beautifier->beautify("<list><el>aqq</el><el>bzz</el></list>"));
+ ASSERT_TRUE(beautifier->wasReset());
+ ASSERT_EQ(0, beautifier->getLevel());
+}