Index: chrome/test/chromedriver/devtools_client_impl_unittest.cc |
diff --git a/chrome/test/chromedriver/devtools_client_impl_unittest.cc b/chrome/test/chromedriver/devtools_client_impl_unittest.cc |
index faa1a9710f4115bd8ba8c38530a9c9839188f2a0..9f37bcbee0e25c565bcc165a82044f32ee20a0be 100644 |
--- a/chrome/test/chromedriver/devtools_client_impl_unittest.cc |
+++ b/chrome/test/chromedriver/devtools_client_impl_unittest.cc |
@@ -320,8 +320,8 @@ bool ReturnEventThenResponse( |
*type = internal::kCommandResponseMessageType; |
command_response->id = expected_id; |
base::DictionaryValue params; |
- params.SetInteger("key", 2); |
- command_response->result.reset(params.DeepCopy()); |
+ command_response->result.reset(new base::DictionaryValue()); |
+ command_response->result->SetInteger("key", 2); |
} |
*first = false; |
return true; |
@@ -340,6 +340,40 @@ bool ReturnEvent( |
return true; |
} |
+bool ReturnOutOfOrderResponses( |
+ int* recurse_count, |
+ DevToolsClient* client, |
+ const std::string& message, |
+ int expected_id, |
+ internal::InspectorMessageType* type, |
+ internal::InspectorEvent* event, |
+ internal::InspectorCommandResponse* command_response) { |
+ int key = 0; |
+ base::DictionaryValue params; |
+ params.SetInteger("param", 1); |
+ switch ((*recurse_count)++) { |
+ case 0: |
+ client->SendCommand("method", params); |
+ *type = internal::kEventMessageType; |
+ event->method = "method"; |
+ event->params.reset(new base::DictionaryValue()); |
+ event->params->SetInteger("key", 1); |
+ return true; |
+ case 1: |
+ command_response->id = expected_id - 1; |
+ key = 2; |
+ break; |
+ case 2: |
+ command_response->id = expected_id; |
+ key = 3; |
+ break; |
+ } |
+ *type = internal::kCommandResponseMessageType; |
+ command_response->result.reset(new base::DictionaryValue()); |
+ command_response->result->SetInteger("key", key); |
+ return true; |
+} |
+ |
bool ReturnError( |
const std::string& message, |
int expected_id, |
@@ -512,3 +546,20 @@ TEST(DevToolsClientImpl, WaitForNextEventError) { |
Status status = client.HandleEventsUntil(base::Bind(&AlwaysTrue)); |
ASSERT_EQ(kUnknownError, status.code()); |
} |
+ |
+TEST(DevToolsClientImpl, NestedCommandsWithOutOfOrderResults) { |
+ SyncWebSocketFactory factory = |
+ base::Bind(&CreateMockSyncWebSocket<MockSyncWebSocket>); |
+ int recurse_count = 0; |
+ DevToolsClientImpl client(factory, "http://url"); |
+ client.SetParserFuncForTesting( |
+ base::Bind(&ReturnOutOfOrderResponses, &recurse_count, &client)); |
+ base::DictionaryValue params; |
+ params.SetInteger("param", 1); |
+ scoped_ptr<base::DictionaryValue> result; |
+ ASSERT_TRUE(client.SendCommandAndGetResult("method", params, &result).IsOk()); |
+ ASSERT_TRUE(result); |
+ int key; |
+ ASSERT_TRUE(result->GetInteger("key", &key)); |
+ ASSERT_EQ(2, key); |
+} |