Bug fix: CDataStream::GetAndClear() when nReadPos > 0
Changed CDataStream::GetAndClear() to use the most obvious get get and clear instead of a tricky swap(). Added a unit test for CDataStream insert/erase/GetAndClear. Note: GetAndClear() is not performance critical, it is used only by the send-a-message-to-the-network code. Bug was not noticed before now because the send-a-message code never erased from the stream.
This commit is contained in:
parent
cd1fc2434c
commit
d5d1425657
2 changed files with 50 additions and 2 deletions
|
@ -1104,8 +1104,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetAndClear(CSerializeData &data) {
|
void GetAndClear(CSerializeData &data) {
|
||||||
vch.swap(data);
|
data.insert(data.end(), begin(), end());
|
||||||
CSerializeData().swap(vch);
|
clear();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -102,4 +102,52 @@ BOOST_AUTO_TEST_CASE(noncanonical)
|
||||||
BOOST_CHECK_EXCEPTION(ReadCompactSize(ss), std::ios_base::failure, isCanonicalException);
|
BOOST_CHECK_EXCEPTION(ReadCompactSize(ss), std::ios_base::failure, isCanonicalException);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(insert_delete)
|
||||||
|
{
|
||||||
|
// Test inserting/deleting bytes.
|
||||||
|
CDataStream ss(SER_DISK, 0);
|
||||||
|
BOOST_CHECK_EQUAL(ss.size(), 0);
|
||||||
|
|
||||||
|
ss.write("\x00\x01\x02\xff", 4);
|
||||||
|
BOOST_CHECK_EQUAL(ss.size(), 4);
|
||||||
|
|
||||||
|
char c = (char)11;
|
||||||
|
|
||||||
|
// Inserting at beginning/end/middle:
|
||||||
|
ss.insert(ss.begin(), c);
|
||||||
|
BOOST_CHECK_EQUAL(ss.size(), 5);
|
||||||
|
BOOST_CHECK_EQUAL(ss[0], c);
|
||||||
|
BOOST_CHECK_EQUAL(ss[1], 0);
|
||||||
|
|
||||||
|
ss.insert(ss.end(), c);
|
||||||
|
BOOST_CHECK_EQUAL(ss.size(), 6);
|
||||||
|
BOOST_CHECK_EQUAL(ss[4], (char)0xff);
|
||||||
|
BOOST_CHECK_EQUAL(ss[5], c);
|
||||||
|
|
||||||
|
ss.insert(ss.begin()+2, c);
|
||||||
|
BOOST_CHECK_EQUAL(ss.size(), 7);
|
||||||
|
BOOST_CHECK_EQUAL(ss[2], c);
|
||||||
|
|
||||||
|
// Delete at beginning/end/middle
|
||||||
|
ss.erase(ss.begin());
|
||||||
|
BOOST_CHECK_EQUAL(ss.size(), 6);
|
||||||
|
BOOST_CHECK_EQUAL(ss[0], 0);
|
||||||
|
|
||||||
|
ss.erase(ss.begin()+ss.size()-1);
|
||||||
|
BOOST_CHECK_EQUAL(ss.size(), 5);
|
||||||
|
BOOST_CHECK_EQUAL(ss[4], (char)0xff);
|
||||||
|
|
||||||
|
ss.erase(ss.begin()+1);
|
||||||
|
BOOST_CHECK_EQUAL(ss.size(), 4);
|
||||||
|
BOOST_CHECK_EQUAL(ss[0], 0);
|
||||||
|
BOOST_CHECK_EQUAL(ss[1], 1);
|
||||||
|
BOOST_CHECK_EQUAL(ss[2], 2);
|
||||||
|
BOOST_CHECK_EQUAL(ss[3], (char)0xff);
|
||||||
|
|
||||||
|
// Make sure GetAndClear does the right thing:
|
||||||
|
CSerializeData d;
|
||||||
|
ss.GetAndClear(d);
|
||||||
|
BOOST_CHECK_EQUAL(ss.size(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
Loading…
Reference in a new issue