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