172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file. 472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/js_event_handler_list.h" 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/values.h" 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/js_arg_list.h" 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/js_test_util.h" 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "testing/gmock/include/gmock/gmock.h" 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "testing/gtest/include/gtest/gtest.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace browser_sync { 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace { 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenusing ::testing::StrictMock; 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass JsEventHandlerListTest : public testing::Test {}; 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(JsEventHandlerListTest, Basic) { 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // |backend| must outlive |event_handlers|. 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen StrictMock<MockJsBackend> backend; 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen JsEventHandlerList event_handlers; 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ListValue arg_list1, arg_list2; 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen arg_list1.Append(Value::CreateBooleanValue(false)); 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen arg_list2.Append(Value::CreateIntegerValue(5)); 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen JsArgList args1(arg_list1), args2(arg_list2); 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen StrictMock<MockJsEventHandler> handler1, handler2; 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Once from each call to AddHandler(). 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(backend, SetParentJsEventRouter(&event_handlers)).Times(2); 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Once from the second RemoveHandler(), once from the destructor. 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(backend, RemoveParentJsEventRouter()).Times(2); 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(backend, ProcessMessage("test1", HasArgs(args2), &handler1)); 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(backend, ProcessMessage("test2", HasArgs(args1), &handler2)); 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(handler1, HandleJsEvent("reply1", HasArgs(args2))); 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(handler1, HandleJsEvent("allreply", HasArgs(args1))); 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(handler2, HandleJsEvent("reply2", HasArgs(args1))); 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(handler2, HandleJsEvent("allreply", HasArgs(args1))); 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(handler2, HandleJsEvent("anotherreply2", HasArgs(args2))); 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(handler2, HandleJsEvent("anotherallreply", HasArgs(args2))); 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.SetBackend(&backend); 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.AddHandler(&handler1); 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.AddHandler(&handler2); 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.ProcessMessage("test1", args2, &handler1); 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.RouteJsEvent("reply2", args1, &handler2); 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.RouteJsEvent("reply1", args2, &handler1); 5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.RouteJsEvent("allreply", args1, NULL); 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.RemoveHandler(&handler1); 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.ProcessMessage("test2", args1, &handler2); 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.RouteJsEvent("droppedreply1", args1, &handler1); 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.RouteJsEvent("anotherreply2", args2, &handler2); 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.RouteJsEvent("anotherallreply", args2, NULL); 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.RemoveHandler(&handler2); 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.RouteJsEvent("anotherdroppedreply1", args1, &handler1); 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.RouteJsEvent("anotheranotherreply2", args2, &handler2); 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.RouteJsEvent("droppedallreply", args2, NULL); 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Let destructor of |event_handlers| call RemoveBackend(). 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(JsEventHandlerListTest, QueuedMessages) { 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // |backend| must outlive |event_handlers|. 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen StrictMock<MockJsBackend> backend; 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen JsEventHandlerList event_handlers; 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ListValue arg_list1, arg_list2; 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen arg_list1.Append(Value::CreateBooleanValue(false)); 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen arg_list2.Append(Value::CreateIntegerValue(5)); 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen JsArgList args1(arg_list1), args2(arg_list2); 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen StrictMock<MockJsEventHandler> handler1, handler2; 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Once from the call to SetBackend(). 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(backend, SetParentJsEventRouter(&event_handlers)); 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Once from the first call to RemoveBackend(). 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(backend, RemoveParentJsEventRouter()); 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Once from the call to SetBackend(). 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(backend, ProcessMessage("test1", HasArgs(args2), &handler1)); 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Once from the call to SetBackend(). 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(backend, ProcessMessage("test2", HasArgs(args1), &handler2)); 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.AddHandler(&handler1); 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.AddHandler(&handler2); 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Should queue messages. 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.ProcessMessage("test1", args2, &handler1); 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.ProcessMessage("test2", args1, &handler2); 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Should call the queued messages. 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.SetBackend(&backend); 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.RemoveBackend(); 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Should do nothing. 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen event_handlers.RemoveBackend(); 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} // namespace 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} // namespace browser_sync 115