Просмотр исходного кода

Bug fix in type casting unsigned 64bit values. Extended varint unittest.

Bart Hertog 6 лет назад
Родитель
Сommit
95f33d1b09
2 измененных файлов с 41 добавлено и 18 удалено
  1. 1 1
      src/Field.h
  2. 40 17
      test/test_FieldVarInt.cpp

+ 1 - 1
src/Field.h

@@ -232,7 +232,7 @@ namespace EmbeddedProto
         // Loop until the end of the encoded varint or until there is nomore data in the buffer.
         for(uint8_t i = 0; (i < N_BYTES_IN_VARINT) && result; ++i) 
         {
-          temp_value |= (byte & ~VARINT_MSB_BYTE) << (i * VARINT_SHIFT_N_BITS);
+          temp_value |= static_cast<VARINT_TYPE>(byte & (~VARINT_MSB_BYTE)) << (i * VARINT_SHIFT_N_BITS);
           if(byte & VARINT_MSB_BYTE) 
           {
             // Continue

+ 40 - 17
test/test_FieldVarInt.cpp

@@ -190,14 +190,10 @@ namespace test_EmbeddedAMS_FieldVarInt
     EXPECT_CALL(buffer, push(0x10)).Times(1).WillOnce(Return(true));
     EXPECT_CALL(buffer, push(0x80)).Times(9).WillRepeatedly(Return(true));
     EXPECT_CALL(buffer, push(0x01)).Times(1).WillOnce(Return(true));
-    EXPECT_EQ(EmbeddedProto::Field::Result::OK, b.serialize(buffer));
-
 
+    EXPECT_EQ(EmbeddedProto::Field::Result::OK, b.serialize(buffer));
     EXPECT_EQ(EmbeddedProto::Field::Result::OK, c.serialize(buffer));
-
     EXPECT_EQ(EmbeddedProto::Field::Result::OK, d.serialize(buffer));
-
-
   }
 
 
@@ -219,23 +215,50 @@ namespace test_EmbeddedAMS_FieldVarInt
     EXPECT_EQ(EmbeddedProto::Field::Result::OK, c.deserialize(buffer));
     EXPECT_EQ(EmbeddedProto::Field::Result::OK, d.deserialize(buffer));
 
-
-    EXPECT_EQ(1U, a.get());
+    EXPECT_EQ(1, a.get());
     EXPECT_EQ(1, b.get());
-    EXPECT_EQ(1.0, c.get());
+    EXPECT_EQ(1U, c.get());
     EXPECT_EQ(1U, d.get());    
+  }
 
+  TEST_F(FieldVarIntTest, deserialize_max)
+  {
+    InSequence s;
 
-    /* 
-      0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-      0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-      0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 
+    Mocks::MessageBufferMock buffer;
 
-      0x25, 0x01, 0x00, 0x00, 0x00, 
-      0x2D, 0x01, 0x00, 0x00, 0x00, 
-      0x35, 0x00, 0x00, 0x80, 0x3F 
-    */
-  }
+    EXPECT_CALL(buffer, pop(_)).Times(4).WillRepeatedly(DoAll(SetArgReferee<0>(0xFF), Return(true)));
+    EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(0x07), Return(true)));
+
+    EXPECT_EQ(EmbeddedProto::Field::Result::OK, a.deserialize(buffer));
+
+    EXPECT_CALL(buffer, pop(_)).Times(8).WillRepeatedly(DoAll(SetArgReferee<0>(0xFF), Return(true)));
+    EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(0x7F), Return(true)));
+    
+    EXPECT_EQ(EmbeddedProto::Field::Result::OK, b.deserialize(buffer));
+
+    EXPECT_CALL(buffer, pop(_)).Times(4).WillRepeatedly(DoAll(SetArgReferee<0>(0xFF), Return(true)));
+    EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(0x0F), Return(true)));
+    
+    EXPECT_EQ(EmbeddedProto::Field::Result::OK, c.deserialize(buffer));
 
+    EXPECT_CALL(buffer, pop(_)).Times(9).WillRepeatedly(DoAll(SetArgReferee<0>(0xFF), Return(true)));
+    EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(0x01), Return(true)));
+
+    EXPECT_EQ(EmbeddedProto::Field::Result::OK, d.deserialize(buffer));
+
+
+    EXPECT_EQ(std::numeric_limits<int32_t>::max(), a.get());
+    EXPECT_EQ(std::numeric_limits<int64_t>::max(), b.get());
+    EXPECT_EQ(std::numeric_limits<uint32_t>::max(), c.get());
+    EXPECT_EQ(std::numeric_limits<uint64_t>::max(), d.get());    
+
+/*
+    0xFF, 0xFF, 0xFF, 0xFF, 0x07, 
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 
+    0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01
+*/
+  }
 
 } // End of namespace test_EmbeddedAMS_Fields