Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(916)

Unified Diff: net/socket/websocket_endpoint_lock_manager_unittest.cc

Issue 835623003: Add a delay when unlocking WebSocket endpoints. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Document WebSocketEndpointLockManager Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/socket/websocket_endpoint_lock_manager_unittest.cc
diff --git a/net/socket/websocket_endpoint_lock_manager_unittest.cc b/net/socket/websocket_endpoint_lock_manager_unittest.cc
index 1626aa9020185e7e71929910e89d658c8718a73a..2974b5a3d50ad5622aea77359036fd40359fe810 100644
--- a/net/socket/websocket_endpoint_lock_manager_unittest.cc
+++ b/net/socket/websocket_endpoint_lock_manager_unittest.cc
@@ -4,6 +4,9 @@
#include "net/socket/websocket_endpoint_lock_manager.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "base/time/time.h"
#include "net/base/net_errors.h"
#include "net/socket/next_proto.h"
#include "net/socket/socket_test_util.h"
@@ -94,6 +97,8 @@ class WebSocketEndpointLockManagerTest : public ::testing::Test {
WebSocketEndpointLockManagerTest()
: instance_(WebSocketEndpointLockManager::GetInstance()) {}
~WebSocketEndpointLockManagerTest() override {
+ // Permit any pending asynchronous unlock operations to complete.
+ RunUntilIdle();
// If this check fails then subsequent tests may fail.
CHECK(instance_->IsEmpty());
}
@@ -109,10 +114,14 @@ class WebSocketEndpointLockManagerTest : public ::testing::Test {
void UnlockDummyEndpoint(int times) {
for (int i = 0; i < times; ++i) {
instance()->UnlockEndpoint(DummyEndpoint());
+ RunUntilIdle();
}
}
+ static void RunUntilIdle() { base::RunLoop().RunUntilIdle(); }
+
WebSocketEndpointLockManager* const instance_;
+ ScopedWebSocketEndpointZeroUnlockDelay zero_unlock_delay_;
};
TEST_F(WebSocketEndpointLockManagerTest, GetInstanceWorks) {
@@ -131,6 +140,7 @@ TEST_F(WebSocketEndpointLockManagerTest, LockEndpointReturnsOkOnce) {
TEST_F(WebSocketEndpointLockManagerTest, GotEndpointLockNotCalledOnOk) {
FakeWaiter waiter;
EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiter));
+ RunUntilIdle();
EXPECT_FALSE(waiter.called());
UnlockDummyEndpoint(1);
@@ -141,6 +151,7 @@ TEST_F(WebSocketEndpointLockManagerTest, GotEndpointLockNotCalledImmediately) {
EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0]));
EXPECT_EQ(ERR_IO_PENDING,
instance()->LockEndpoint(DummyEndpoint(), &waiters[1]));
+ RunUntilIdle();
EXPECT_FALSE(waiters[1].called());
UnlockDummyEndpoint(2);
@@ -152,6 +163,7 @@ TEST_F(WebSocketEndpointLockManagerTest, GotEndpointLockCalledWhenUnlocked) {
EXPECT_EQ(ERR_IO_PENDING,
instance()->LockEndpoint(DummyEndpoint(), &waiters[1]));
instance()->UnlockEndpoint(DummyEndpoint());
+ RunUntilIdle();
EXPECT_TRUE(waiters[1].called());
UnlockDummyEndpoint(1);
@@ -169,6 +181,7 @@ TEST_F(WebSocketEndpointLockManagerTest,
}
instance()->UnlockEndpoint(DummyEndpoint());
+ RunUntilIdle();
FakeWaiter second_lock_holder;
EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &second_lock_holder));
@@ -185,6 +198,7 @@ TEST_F(WebSocketEndpointLockManagerTest, RememberSocketWorks) {
instance()->RememberSocket(&dummy_socket, DummyEndpoint());
instance()->UnlockSocket(&dummy_socket);
+ RunUntilIdle();
EXPECT_TRUE(waiters[1].called());
UnlockDummyEndpoint(1);
@@ -199,6 +213,7 @@ TEST_F(WebSocketEndpointLockManagerTest, SocketAssociationForgottenOnUnlock) {
EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiter));
instance()->RememberSocket(&dummy_socket, DummyEndpoint());
instance()->UnlockEndpoint(DummyEndpoint());
+ RunUntilIdle();
EXPECT_TRUE(instance()->IsEmpty());
}
@@ -213,12 +228,70 @@ TEST_F(WebSocketEndpointLockManagerTest, NextWaiterCanCallRememberSocketAgain) {
instance()->RememberSocket(&dummy_sockets[0], DummyEndpoint());
instance()->UnlockEndpoint(DummyEndpoint());
+ RunUntilIdle();
EXPECT_TRUE(waiters[1].called());
instance()->RememberSocket(&dummy_sockets[1], DummyEndpoint());
UnlockDummyEndpoint(1);
}
+// Calling UnlockSocket() after UnlockEndpoint() does nothing.
+TEST_F(WebSocketEndpointLockManagerTest,
+ UnlockSocketAfterUnlockEndpointDoesNothing) {
+ FakeWaiter waiters[3];
+ FakeStreamSocket dummy_socket;
+
+ EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0]));
+ EXPECT_EQ(ERR_IO_PENDING,
+ instance()->LockEndpoint(DummyEndpoint(), &waiters[1]));
+ EXPECT_EQ(ERR_IO_PENDING,
+ instance()->LockEndpoint(DummyEndpoint(), &waiters[2]));
+ instance()->RememberSocket(&dummy_socket, DummyEndpoint());
+ instance()->UnlockEndpoint(DummyEndpoint());
+ instance()->UnlockSocket(&dummy_socket);
+ RunUntilIdle();
+ EXPECT_TRUE(waiters[1].called());
+ EXPECT_FALSE(waiters[2].called());
+
+ UnlockDummyEndpoint(2);
+}
+
+// UnlockEndpoint() should always be asynchronous.
+TEST_F(WebSocketEndpointLockManagerTest, UnlockEndpointIsAsynchronous) {
+ FakeWaiter waiters[2];
+ EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0]));
+ EXPECT_EQ(ERR_IO_PENDING,
+ instance()->LockEndpoint(DummyEndpoint(), &waiters[1]));
+
+ instance()->UnlockEndpoint(DummyEndpoint());
+ EXPECT_FALSE(waiters[1].called());
+ RunUntilIdle();
+ EXPECT_TRUE(waiters[1].called());
+
+ UnlockDummyEndpoint(1);
+}
+
+// UnlockEndpoint() should normally have a delay.
+TEST_F(WebSocketEndpointLockManagerTest, UnlockEndpointIsDelayed) {
+ const base::TimeDelta one_millisecond = base::TimeDelta::FromMilliseconds(1);
+ instance()->SetUnlockDelayForTesting(one_millisecond);
+ FakeWaiter waiters[2];
+ EXPECT_EQ(OK, instance()->LockEndpoint(DummyEndpoint(), &waiters[0]));
+ EXPECT_EQ(ERR_IO_PENDING,
+ instance()->LockEndpoint(DummyEndpoint(), &waiters[1]));
+
+ instance()->UnlockEndpoint(DummyEndpoint());
+ RunUntilIdle();
+ EXPECT_FALSE(waiters[1].called());
+ base::RunLoop run_loop;
+ base::MessageLoop::current()->PostDelayedTask(
+ FROM_HERE, run_loop.QuitClosure(), one_millisecond);
+ run_loop.Run();
+ EXPECT_TRUE(waiters[1].called());
+ instance()->SetUnlockDelayForTesting(base::TimeDelta());
+ UnlockDummyEndpoint(1);
+}
+
} // namespace
} // namespace net
« no previous file with comments | « net/socket/websocket_endpoint_lock_manager.cc ('k') | net/socket/websocket_transport_client_socket_pool_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698