Browse Source

Add testbench for serialization

- Implement simple serialization test for Int
- Implement varint serialization "header"
Alexey Edelev 6 years ago
parent
commit
b1610fc9fb
5 changed files with 119 additions and 5 deletions
  1. 27 3
      src/lib/protobufobject.h
  2. 1 1
      tests/CMakeLists.txt
  3. 51 0
      tests/serializationtest.cpp
  4. 40 0
      tests/serializationtest.h
  5. 0 1
      tests/simpletest.cpp

+ 27 - 3
src/lib/protobufobject.h

@@ -27,11 +27,21 @@
 
 #include <QObject>
 #include <QDebug>
+#include <QMetaObject>
+#include <QMetaProperty>
+#include <QBitArray>
 
 #include <unordered_map>
 
 namespace qtprotobuf {
 
+enum WireTypes {
+    Varint = 0,
+    Fixed64 = 1,
+    LengthDelimited = 2,
+    Fixed32 = 5
+};
+
 template <typename T>
 class ProtobufObject : public QObject
 {
@@ -40,19 +50,33 @@ public:
     {}
 
     QByteArray serialize() {
+        QByteArray result;
         T* instance = dynamic_cast<T*>(this);
         for(auto field : T::propertyOrdering) {
-            qDebug() << "serialize map: " << field.first << " to: " << field.second;
-            qDebug() << "Property: " << field.second << T::staticMetaObject.property(field.second).name();
+            int propertyIndex = field.second;
+            int fieldIndex = field.first;
+            const char* propertyName = T::staticMetaObject.property(propertyIndex).name();
+            switch(T::staticMetaObject.property(propertyIndex).type()) {
+            case QVariant::Int:
+                result.append(serializeInt(instance->property(propertyName).toInt(), fieldIndex));
+                break;
+            }
         }
 
-        return QByteArray();
+        return result;
     }
 
     void deserialize(const QByteArray& array) {
         T* instance = dynamic_cast<T*>(this);
         //TODO
     }
+
+    QByteArray serializeInt(int value, int fieldIndex) {
+        char typeByte = (fieldIndex << 3) | Varint;
+        QByteArray result;
+        result.append(typeByte);
+        return result;
+    }
 };
 
 }

+ 1 - 1
tests/CMakeLists.txt

@@ -26,6 +26,6 @@ include_directories(${GTEST_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SO
 
 file(GLOB HEADERS ${TESTS_OUT_DIR})
 
-add_executable(${testtarget} "main.cpp" "simpletest.cpp" ${MOC_SRCS} ${GENERATED_SOURCES})
+add_executable(${testtarget} "main.cpp" "simpletest.cpp" "serializationtest.cpp" ${MOC_SRCS} ${GENERATED_SOURCES})
 target_link_libraries(${testtarget} ${GTEST_BOTH_LIBRARIES} Qt5::Core)
 add_dependencies(${testtarget} ${testgeneration})

+ 51 - 0
tests/serializationtest.cpp

@@ -0,0 +1,51 @@
+/*
+ * MIT License
+ *
+ * Copyright (c) 2019 Alexey Edelev <semlanik@gmail.com>
+ *
+ * This file is part of qtprotobuf project https://git.semlanik.org/semlanik/qtprotobuf
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this
+ * software and associated documentation files (the "Software"), to deal in the Software
+ * without restriction, including without limitation the rights to use, copy, modify,
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software, and
+ * to permit persons to whom the Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies
+ * or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "serializationtest.h"
+
+#include "simpleintmessage.h"
+
+using namespace qtprotobuf::tests;
+
+SerializationTest::SerializationTest()
+{
+}
+
+TEST_F(SerializationTest, IntMessageSrializeTest)
+{
+    SimpleIntMessage test;
+    test.setTestFieldInt(15);
+    QByteArray result = test.serialize();
+    ASSERT_EQ(result.at(0), 40);
+
+    test.setTestFieldInt(315);
+    result = test.serialize();
+    ASSERT_EQ(result.at(0), 40);
+
+    test.setTestFieldInt(65545);
+    result = test.serialize();
+    ASSERT_EQ(result.at(0), 40);
+}
+

+ 40 - 0
tests/serializationtest.h

@@ -0,0 +1,40 @@
+/*
+ * MIT License
+ *
+ * Copyright (c) 2019 Alexey Edelev <semlanik@gmail.com>
+ *
+ * This file is part of qtprotobuf project https://git.semlanik.org/semlanik/qtprotobuf
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this
+ * software and associated documentation files (the "Software"), to deal in the Software
+ * without restriction, including without limitation the rights to use, copy, modify,
+ * merge, publish, distribute, sublicense, and/or sell copies of the Software, and
+ * to permit persons to whom the Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies
+ * or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#pragma once
+
+#include <gtest/gtest.h>
+
+namespace qtprotobuf {
+namespace tests {
+
+class SerializationTest : public ::testing::Test
+{
+public:
+    SerializationTest();
+};
+
+}
+}

+ 0 - 1
tests/simpletest.cpp

@@ -81,4 +81,3 @@ TEST_F(SimpleTest, SimpleDoubleMessageTest)
     ASSERT_TRUE(test.setProperty(propertyName, QVariant::fromValue(0.55)));
     ASSERT_EQ(test.property(propertyName).toDouble(), 0.55);
 }
-