Commit 0b2e2a2d authored by Ajanthan Asogamoorthy's avatar Ajanthan Asogamoorthy Committed by Facebook GitHub Bot

-update-app-bytes-written-correctly

Summary: AppBytesWitten was no longer updated correctly for AsyncSSLSocket, fix this.

Reviewed By: bschlinker

Differential Revision: D22847139

fbshipit-source-id: 8cabb9883e5ad64c49a283a0d83b8087def4d5ae
parent 2ee7489b
...@@ -1672,6 +1672,7 @@ AsyncSocket::WriteResult AsyncSSLSocket::performWrite( ...@@ -1672,6 +1672,7 @@ AsyncSocket::WriteResult AsyncSSLSocket::performWrite(
} }
totalWritten += bytes; totalWritten += bytes;
appBytesWritten_ += bytes;
if (bytes == (ssize_t)len) { if (bytes == (ssize_t)len) {
// The full iovec is written. // The full iovec is written.
......
...@@ -76,10 +76,6 @@ class MockAsyncSSLSocket : public AsyncSSLSocket { ...@@ -76,10 +76,6 @@ class MockAsyncSSLSocket : public AsyncSSLSocket {
return performWrite(vec, count, flags, countWritten, partialWritten); return performWrite(vec, count, flags, countWritten, partialWritten);
} }
void setAppBytesWritten(size_t n) {
appBytesWritten_ = n;
}
// public wrapper for protected member // public wrapper for protected member
folly::Optional<size_t> getCurrBytesToFinalByte() const { folly::Optional<size_t> getCurrBytesToFinalByte() const {
return currBytesToFinalByte_; return currBytesToFinalByte_;
...@@ -128,6 +124,75 @@ class AsyncSSLSocketWriteTest : public testing::Test { ...@@ -128,6 +124,75 @@ class AsyncSSLSocketWriteTest : public testing::Test {
char source_[26 * 500]; char source_[26 * 500];
}; };
TEST_F(AsyncSSLSocketWriteTest, CompleteSSLWriteUpdatesAppBytesWritten) {
int n = 1;
auto vec = makeVec({1500});
uint32_t countWritten = 0;
uint32_t partialWritten = 0;
// full write
EXPECT_CALL(*(sock_.get()), sslWriteImpl(_, _, 1500))
.WillOnce(Invoke([=](SSL* ssl, const void* buf, int m) {
BIO* b = SSL_get_wbio(ssl);
auto result = AsyncSSLSocket::bioWrite(b, (const char*)buf, m);
return result;
}));
EXPECT_CALL(
*(sock_.get()), sendSocketMessage(_, _, MSG_DONTWAIT | MSG_NOSIGNAL))
.WillOnce(Return(ByMove(AsyncSocket::WriteResult(1500))));
sock_->testPerformWrite(
vec.get(), n, WriteFlags::NONE, &countWritten, &partialWritten);
Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(sock_->getAppBytesWritten(), 1500);
}
TEST_F(AsyncSSLSocketWriteTest, NoSSLWriteUpdatesAppBytesWritten) {
int n = 1;
auto vec = makeVec({1500});
uint32_t countWritten = 0;
uint32_t partialWritten = 0;
// want write
EXPECT_CALL(*(sock_.get()), sslWriteImpl(_, _, 1500))
.WillOnce(Invoke([=](SSL* ssl, const void* buf, int m) {
BIO* b = SSL_get_wbio(ssl);
auto result = AsyncSSLSocket::bioWrite(b, (const char*)buf, m);
return result;
}));
EXPECT_CALL(
*(sock_.get()), sendSocketMessage(_, _, MSG_DONTWAIT | MSG_NOSIGNAL))
.WillOnce(Return(ByMove(AsyncSocket::WriteResult(0))));
EXPECT_CALL(*(sock_.get()), sslGetErrorImpl(_, _))
.WillOnce(Return(SSL_ERROR_WANT_WRITE));
sock_->testPerformWrite(
vec.get(), n, WriteFlags::NONE, &countWritten, &partialWritten);
Mock::VerifyAndClearExpectations(sock_.get());
// We got SSL_WANT_WRITE so should be 0
EXPECT_EQ(sock_->getAppBytesWritten(), 0);
}
TEST_F(AsyncSSLSocketWriteTest, PartialSSLWriteUpdatesAppBytesWritten) {
int n = 1;
auto vec = makeVec({1500});
uint32_t countWritten = 0;
uint32_t partialWritten = 0;
// partial write
EXPECT_CALL(*(sock_.get()), sslWriteImpl(_, _, 1500))
.WillOnce(Invoke([=](SSL* ssl, const void* buf, int m) {
BIO* b = SSL_get_wbio(ssl);
auto result = AsyncSSLSocket::bioWrite(b, (const char*)buf, m);
return result;
}));
EXPECT_CALL(
*(sock_.get()), sendSocketMessage(_, _, MSG_DONTWAIT | MSG_NOSIGNAL))
.WillOnce(Return(ByMove(AsyncSocket::WriteResult(500))));
sock_->testPerformWrite(
vec.get(), n, WriteFlags::NONE, &countWritten, &partialWritten);
Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(sock_->getAppBytesWritten(), 500);
}
// SSL_ERROR_WANT_WRITE occurs on first write // SSL_ERROR_WANT_WRITE occurs on first write
TEST_F(AsyncSSLSocketWriteTest, SslErrorWantWrite) { TEST_F(AsyncSSLSocketWriteTest, SslErrorWantWrite) {
int n = 1; int n = 1;
...@@ -165,6 +230,7 @@ TEST_F(AsyncSSLSocketWriteTest, SslErrorWantWrite) { ...@@ -165,6 +230,7 @@ TEST_F(AsyncSSLSocketWriteTest, SslErrorWantWrite) {
Mock::VerifyAndClearExpectations(sock_.get()); Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(countWritten, 0); EXPECT_EQ(countWritten, 0);
EXPECT_EQ(partialWritten, 0); EXPECT_EQ(partialWritten, 0);
EXPECT_EQ(sock_->getAppBytesWritten(), 0);
// second time we try to write, same buffer should be passed in // second time we try to write, same buffer should be passed in
EXPECT_CALL(*(sock_.get()), sslWriteImpl(_, _, 1500)) EXPECT_CALL(*(sock_.get()), sslWriteImpl(_, _, 1500))
...@@ -184,6 +250,7 @@ TEST_F(AsyncSSLSocketWriteTest, SslErrorWantWrite) { ...@@ -184,6 +250,7 @@ TEST_F(AsyncSSLSocketWriteTest, SslErrorWantWrite) {
Mock::VerifyAndClearExpectations(sock_.get()); Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(countWritten, n); EXPECT_EQ(countWritten, n);
EXPECT_EQ(partialWritten, 0); EXPECT_EQ(partialWritten, 0);
EXPECT_EQ(sock_->getAppBytesWritten(), 1500);
} }
// The entire vec fits in one packet // The entire vec fits in one packet
...@@ -211,6 +278,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing1) { ...@@ -211,6 +278,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing1) {
Mock::VerifyAndClearExpectations(sock_.get()); Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(countWritten, n); EXPECT_EQ(countWritten, n);
EXPECT_EQ(partialWritten, 0); EXPECT_EQ(partialWritten, 0);
EXPECT_EQ(sock_->getAppBytesWritten(), 9);
} }
// First packet is full, second two go in one packet // First packet is full, second two go in one packet
...@@ -250,6 +318,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing2) { ...@@ -250,6 +318,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing2) {
Mock::VerifyAndClearExpectations(sock_.get()); Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(countWritten, n); EXPECT_EQ(countWritten, n);
EXPECT_EQ(partialWritten, 0); EXPECT_EQ(partialWritten, 0);
EXPECT_EQ(sock_->getAppBytesWritten(), 1506);
} }
// Two exactly full packets (coalesce ends midway through second chunk) // Two exactly full packets (coalesce ends midway through second chunk)
...@@ -271,6 +340,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing3) { ...@@ -271,6 +340,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing3) {
Mock::VerifyAndClearExpectations(sock_.get()); Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(countWritten, n); EXPECT_EQ(countWritten, n);
EXPECT_EQ(partialWritten, 0); EXPECT_EQ(partialWritten, 0);
EXPECT_EQ(sock_->getAppBytesWritten(), 3000);
} }
// Partial write success midway through a coalesced vec // Partial write success midway through a coalesced vec
...@@ -298,6 +368,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing4) { ...@@ -298,6 +368,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing4) {
Mock::VerifyAndClearExpectations(sock_.get()); Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(countWritten, 3); EXPECT_EQ(countWritten, 3);
EXPECT_EQ(partialWritten, 100); EXPECT_EQ(partialWritten, 100);
EXPECT_EQ(sock_->getAppBytesWritten(), 1000);
consumeVec(vec.get(), countWritten, partialWritten); consumeVec(vec.get(), countWritten, partialWritten);
InSequence s2; InSequence s2;
...@@ -321,6 +392,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing4) { ...@@ -321,6 +392,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing4) {
Mock::VerifyAndClearExpectations(sock_.get()); Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(countWritten, 2); EXPECT_EQ(countWritten, 2);
EXPECT_EQ(partialWritten, 0); EXPECT_EQ(partialWritten, 0);
EXPECT_EQ(sock_->getAppBytesWritten(), 1500);
} }
// coalesce ends exactly on a buffer boundary // coalesce ends exactly on a buffer boundary
...@@ -359,6 +431,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing5) { ...@@ -359,6 +431,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing5) {
Mock::VerifyAndClearExpectations(sock_.get()); Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(countWritten, 3); EXPECT_EQ(countWritten, 3);
EXPECT_EQ(partialWritten, 0); EXPECT_EQ(partialWritten, 0);
EXPECT_EQ(sock_->getAppBytesWritten(), 2000);
} }
// partial write midway through first chunk // partial write midway through first chunk
...@@ -387,6 +460,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing6) { ...@@ -387,6 +460,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing6) {
Mock::VerifyAndClearExpectations(sock_.get()); Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(countWritten, 0); EXPECT_EQ(countWritten, 0);
EXPECT_EQ(partialWritten, 700); EXPECT_EQ(partialWritten, 700);
EXPECT_EQ(sock_->getAppBytesWritten(), 700);
consumeVec(vec.get(), countWritten, partialWritten); consumeVec(vec.get(), countWritten, partialWritten);
InSequence s2; InSequence s2;
...@@ -410,6 +484,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing6) { ...@@ -410,6 +484,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescing6) {
Mock::VerifyAndClearExpectations(sock_.get()); Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(countWritten, 2); EXPECT_EQ(countWritten, 2);
EXPECT_EQ(partialWritten, 0); EXPECT_EQ(partialWritten, 0);
EXPECT_EQ(sock_->getAppBytesWritten(), 1500);
} }
// Repeat coalescing2 with WriteFlags::EOR // Repeat coalescing2 with WriteFlags::EOR
...@@ -456,6 +531,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescingWithEoRTracking1) { ...@@ -456,6 +531,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescingWithEoRTracking1) {
vec.get(), n, WriteFlags::EOR, &countWritten, &partialWritten); vec.get(), n, WriteFlags::EOR, &countWritten, &partialWritten);
EXPECT_EQ(countWritten, n); EXPECT_EQ(countWritten, n);
EXPECT_EQ(partialWritten, 0); EXPECT_EQ(partialWritten, 0);
EXPECT_EQ(sock_->getAppBytesWritten(), 1506);
} }
// coalescing with left over at the last chunk // coalescing with left over at the last chunk
...@@ -501,6 +577,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescingWithEoRTracking2) { ...@@ -501,6 +577,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescingWithEoRTracking2) {
vec.get(), n, WriteFlags::EOR, &countWritten, &partialWritten); vec.get(), n, WriteFlags::EOR, &countWritten, &partialWritten);
EXPECT_EQ(countWritten, n); EXPECT_EQ(countWritten, n);
EXPECT_EQ(partialWritten, 0); EXPECT_EQ(partialWritten, 0);
EXPECT_EQ(sock_->getAppBytesWritten(), 1800);
} }
// WriteFlags::EOR set // WriteFlags::EOR set
...@@ -535,6 +612,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescingWithEoRTracking3) { ...@@ -535,6 +612,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescingWithEoRTracking3) {
Mock::VerifyAndClearExpectations(sock_.get()); Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(countWritten, 0); EXPECT_EQ(countWritten, 0);
EXPECT_EQ(partialWritten, 1000); EXPECT_EQ(partialWritten, 1000);
EXPECT_EQ(sock_->getAppBytesWritten(), 1000);
consumeVec(vec.get(), countWritten, partialWritten); consumeVec(vec.get(), countWritten, partialWritten);
EXPECT_CALL(*(sock_.get()), sslWriteImpl(_, _, 600)) EXPECT_CALL(*(sock_.get()), sslWriteImpl(_, _, 600))
...@@ -559,6 +637,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescingWithEoRTracking3) { ...@@ -559,6 +637,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescingWithEoRTracking3) {
Mock::VerifyAndClearExpectations(sock_.get()); Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(countWritten, n); EXPECT_EQ(countWritten, n);
EXPECT_EQ(partialWritten, 0); EXPECT_EQ(partialWritten, 0);
EXPECT_EQ(sock_->getAppBytesWritten(), 1600);
} }
// WriteFlags::EOR set // WriteFlags::EOR set
...@@ -601,6 +680,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescingWithEoRTrackingErrorWantWrite) { ...@@ -601,6 +680,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescingWithEoRTrackingErrorWantWrite) {
Mock::VerifyAndClearExpectations(sock_.get()); Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(countWritten, 0); EXPECT_EQ(countWritten, 0);
EXPECT_EQ(partialWritten, 0); EXPECT_EQ(partialWritten, 0);
EXPECT_EQ(sock_->getAppBytesWritten(), 0);
// second time we try to write, no error // second time we try to write, no error
// EOR should still be set // EOR should still be set
...@@ -622,6 +702,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescingWithEoRTrackingErrorWantWrite) { ...@@ -622,6 +702,7 @@ TEST_F(AsyncSSLSocketWriteTest, WriteCoalescingWithEoRTrackingErrorWantWrite) {
Mock::VerifyAndClearExpectations(sock_.get()); Mock::VerifyAndClearExpectations(sock_.get());
EXPECT_EQ(countWritten, n); EXPECT_EQ(countWritten, n);
EXPECT_EQ(partialWritten, 0); EXPECT_EQ(partialWritten, 0);
EXPECT_EQ(sock_->getAppBytesWritten(), 1500);
} }
} // namespace folly } // namespace folly
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment