1. ByteArray 类封装测试
1. 对定长和压缩变长数据进行读写操作
每一个写入、读出函数都是固定的步骤:
- 生成一个随机数组,创建
Bytearray对象(开辟一块动态内存空间) - 依次将数组内容写入内存空间
- 手动将内存指针置为开头
ba->setPosition(0),开始读取。 - 显示一下内存空间开辟的总容量,已经实际使用的空间大小,内存结点个数等信息
test_bytearray.cpp: ```cpp static Logger::ptr g_logger = KIT_LOG_ROOT();
void test() {
define XX(type, len, write_func, read_func, base_len){\
std::vector<type> mv;\for(int i = 0;i < len;++i)\{\mv.push_back(rand());\}\ByteArray::ptr ba(new ByteArray(base_len));\for(auto &x : mv)\{\ba->write_func(x);\}\ba->setPosition(0);\for(size_t i = 0; i < mv.size();++i)\{\type v = ba->read_func();\KIT_ASSERT(v == mv[i]);\}\KIT_ASSERT(ba->getReadSize() == 0);\KIT_LOG_INFO(g_logger) << #write_func "/" #read_func "(" #type ")" << ",len=" << len\<< ",base_len=" << base_len << ",size=" << ba->getSize() << ", node count=" << ba->getNodeSum();\
}
/*固定大小*/XX(int8_t, 100, writeFint8, readFint8, 1);XX(uint8_t, 100, writeFuint8, readFuint8, 1);XX(int16_t, 100, writeFint16, readFint16, 1);XX(uint16_t, 100, writeFuint16, readFuint16, 1);XX(int32_t, 100, writeFint32, readFint32, 1);XX(uint32_t, 100, writeFuint32, readFuint32, 1);XX(int64_t, 100, writeFint64, readFint64, 1);XX(uint64_t, 100, writeFuint64, readFuint64, 1);/*变长大小*/XX(int32_t, 100, writeInt32, readInt32, 1);XX(uint32_t, 100, writeUint32, readUint32, 1);XX(int64_t, 100, writeInt64, readInt64, 1);XX(uint64_t, 100, writeUint64, readUint64, 1);
undef XX
}
int main() { KIT_LOG_INFO(g_logger) << “tesdt begin”;
test();KIT_LOG_INFO(g_logger) << "test end";return 0;
}
<a name="uXjz3"></a>### BUG:跨节点存储时写入和读取不一致现象:改变结点大小base_len = 10,让其能跨节点存储,发生`KIT_ASSERT(v == mv[i]);`断言,说明写入和读取出来的数据不一致。该情况发生在`writeFint64()/readFint64()`两个函数间。<br />间接说明:跨节点写入和读取有问题。<br />- 将写入和读取的数据全部打印一下 `test_bytearray.cpp`:```cppstatic Logger::ptr g_logger = KIT_LOG_ROOT();void test(){#define XX(type, len, write_func, read_func, base_len){\std::vector<type> mv;\std::cout << "写入:";\for(int i = 0;i < len;++i)\{\mv.push_back(rand());\std::cout << mv[i] << " ";\}\std::cout << std::endl << std::endl;\ByteArray::ptr ba(new ByteArray(base_len));\for(size_t i = 0; i < mv.size();++i)\{\ba->write_func(mv[i]);\}\ba->setPosition(0);\std::cout << "读取:";\for(size_t i = 0; i < mv.size();++i)\{\type v = ba->read_func();\std::cout << v << " ";\KIT_ASSERT(v == mv[i]);\}\std::cout << std::endl;\KIT_ASSERT(ba->getReadSize() == 0);\KIT_LOG_INFO(g_logger) << #write_func "/" #read_func "(" #type ")" << ",len=" << len\<< ",base_len=" << base_len << ",capacity=" << ba->getTotalCapacity() << ",used size=" << ba->getSize() << ", node count=" << ba->getNodeSum();\std::cout << std::endl;\}/*固定大小*/XX(int8_t, 100, writeFint8, readFint8, 10);XX(uint8_t, 100, writeFuint8, readFuint8, 10);XX(int16_t, 100, writeFint16, readFint16, 10);XX(uint16_t, 100, writeFuint16, readFuint16, 10);XX(int32_t, 100, writeFint32, readFint32, 10);XX(uint32_t, 100, writeFuint32, readFuint32, 10);XX(int64_t, 100, writeFint64, readFint64, 10);XX(uint64_t, 100, writeFuint64, readFuint64, 10);/*变长大小*/XX(int32_t, 100, writeInt32, readInt32, 10);XX(uint32_t, 100, writeUint32, readUint32, 10);XX(int64_t, 100, writeInt64, readInt64, 10);XX(uint64_t, 100, writeUint64, readUint64, 10);#undef XX}int main(){KIT_LOG_INFO(g_logger) << "test begin";test();KIT_LOG_INFO(g_logger) << "test end";return 0;}
- 不一致数据如下: ```cpp 写入:
- 1635550270 = 0110 0001 0111 1100 1000 0100 0011 1110
- 2069110699 = 0111 1011 0101 0100 0001 1111 1010 1011
读取: 1.1635550270 2.712582607 = 0010 1010 0111 1001 0010 0101 1100 1111
<a name="wid0z"></a>### 更正:能够正常跨节点写入和读取可以看到实际总容量和已经使用的空间大小,有时候不一定是对等的,可能存在一部分的冗余。<br /><br /><a name="bZjgu"></a>## 2. 单独测一下浮点型数据- `test_bytrarray.cpp`:```cppstatic Logger::ptr g_logger = KIT_LOG_ROOT();void test(){#if 1#define XX(type, len, write_func, read_func, base_len){\std::vector<type> mv;\std::cout << "写入:";\for(int i = 0;i < len;++i)\{\mv.push_back((type)(1.2 + rand()));\std::cout << mv[i] << " ";\}\std::cout << std::endl << std::endl;\ByteArray::ptr ba(new ByteArray(base_len));\for(size_t i = 0; i < mv.size();++i)\{\ba->write_func(mv[i]);\}\ba->setPosition(0);\std::cout << "读取:";\for(size_t i = 0; i < mv.size();++i)\{\type v = ba->read_func();\std::cout << v << " ";\KIT_ASSERT(v == mv[i]);\}\std::cout << std::endl;\KIT_ASSERT(ba->getReadSize() == 0);\KIT_LOG_INFO(g_logger) << #write_func "/" #read_func "(" #type ")" << ",len=" << len\<< ",base_len=" << base_len << ",capacity=" << ba->getTotalCapacity() << ",used size=" << ba->getSize() << ", node count=" << ba->getNodeSum();\std::cout << std::endl;\}XX(float, 100, writeFloat, readFloat, 10);XX(double, 100, writeDouble, readDouble, 10);#undef XX}int main(){KIT_LOG_INFO(g_logger) << "test begin";test();KIT_LOG_INFO(g_logger) << "test end";return 0;}
BUG:读写不一致问题
现象:写入、读取的float型数据不一致。writeFloat()/readFloat()函数有问题。

本质上:float就是使用32位型数据存储的,double使用64位型存储。不管写入定长还是变长都应该读写一致。
更正:全部读写都是定长或变长
3. 对定长和变长字符串进行读写
写一个能够生成指定长度的随机字符串函数
static std::string rand_str(uint32_t len){std::string s;s.resize(len);for(int i = 0; i < (int)len;++i){switch (rand() % 3){case 0: s[i] = 'a' + rand() % 26; break;case 1: s[i] = 'A' + rand() % 26; break;case 2: s[i] = '0' + rand() % 9; break;}}return s;}
test_bytearray.cpp: ```cpp void test2() {
define XX(type_len, len, write_func, read_func, base_len){\
std::vector<std::string> mv;\for(int i = 0; i < len;++i)\{\mv.push_back(rand_str(type_len));\}\ByteArray::ptr ba(new ByteArray(base_len));\for(auto &x : mv)\ba->write_func(x);\ba->setPosition(0);\for(int i = 0; i < len;++i)\{\std::string v = ba->read_func();\KIT_ASSERT(v == mv[i]);\}\KIT_LOG_INFO(g_logger) << #write_func "/" #read_func << "(" << type_len * 8 << ")" << ",len=" << len\<< ",base_len=" << base_len << ",capacity=" << ba->getTotalCapacity() << ",used size=" << ba->getSize() << ", node count=" << ba->getNodeSum();\
}
XX(2, 100, writeStringF16, readStringF16, 10);XX(4, 100,writeStringF32, readStringF32, 10);XX(8, 100, writeStringF64, readStringF64, 10);uint64_t t = rand() % 1000; //随机长度为1000 以内的字符串XX(t, 100, writeStringVint, readStringVint, 100);
undef XX
}
int main() { KIT_LOG_INFO(g_logger) << “test begin”;
test2();KIT_LOG_INFO(g_logger) << "test end";return 0;
}
<a name="ZOf4W"></a>## 4. 将内存数据写入文件、从文件读取数据到内存- `test_bytearray.cpp`:读写文件时候加入断言,来判断从文件中读取的数据是否和写入前的数据完全一样```cppvoid test3(){#define XX(type, len, write_func, read_func, base_len){\std::vector<type> mv;\for(int i = 0;i < len;++i)\{\mv.push_back(rand());\}\ByteArray::ptr ba(new ByteArray(base_len));\for(size_t i = 0; i < mv.size();++i)\{\ba->write_func(mv[i]);\}\ba->setPosition(0);\for(size_t i = 0; i < mv.size();++i)\{\type v = ba->read_func();\KIT_ASSERT(v == mv[i]);\}\KIT_ASSERT(ba->getReadSize() == 0);\KIT_LOG_INFO(g_logger) << #write_func "/" #read_func "(" #type ")" << ",len=" << len\<< ",base_len=" << base_len << ",capacity=" << ba->getTotalCapacity() << ",used size=" << ba->getSize() << ", node count=" << ba->getNodeSum();\ba->setPosition(0);\KIT_ASSERT(ba->writeToFile("./tests/temp/" #type "_" #write_func "_" #len ".dat"));\ByteArray::ptr ba2(new ByteArray(base_len * 2));\KIT_ASSERT(ba2->readFromFile("./tests/temp/" #type "_" #write_func "_" #len ".dat"));\ba2->setPosition(0);\KIT_ASSERT(ba->toString() == ba2->toString());\KIT_ASSERT(ba->getPosition() == 0);\KIT_ASSERT(ba2->getPosition() == 0);\}/*固定大小*/XX(int8_t, 100, writeFint8, readFint8, 10);XX(uint8_t, 100, writeFuint8, readFuint8, 10);XX(int16_t, 100, writeFint16, readFint16, 10);XX(uint16_t, 100, writeFuint16, readFuint16, 10);XX(int32_t, 100, writeFint32, readFint32, 10);XX(uint32_t, 100, writeFuint32, readFuint32, 10);XX(int64_t, 100, writeFint64, readFint64, 10);XX(uint64_t, 100, writeFuint64, readFuint64, 10);/*变长大小*/XX(int32_t, 100, writeInt32, readInt32, 10);XX(uint32_t, 100, writeUint32, readUint32, 10);XX(int64_t, 100, writeInt64, readInt64, 10);XX(uint64_t, 100, writeUint64, readUint64, 10);#undef XX}int main(){KIT_LOG_INFO(g_logger) << "test begin";test3();KIT_LOG_INFO(g_logger) << "test end";return 0;}






