10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file. 40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/sync_file_system/drive_backend/callback_helper.h" 60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/message_loop/message_loop.h" 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/run_loop.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/thread_task_runner_handle.h" 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/threading/thread.h" 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace sync_file_system { 140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace drive_backend { 150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace { 170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SimpleCallback(bool* called, int) { 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(called); 200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(*called); 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch *called = true; 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid CallbackWithPassed(bool* called, scoped_ptr<int>) { 250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(called); 260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(*called); 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch *called = true; 280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid VerifyCalledOnTaskRunner(base::TaskRunner* task_runner, 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool* called) { 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(called); 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(task_runner); 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(task_runner->RunsTasksOnCurrentThread()); 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(*called); 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu *called = true; 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST(DriveBackendCallbackHelperTest, BasicTest) { 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::MessageLoop message_loop; 440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool called = false; 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RelayCallbackToCurrentThread( 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FROM_HERE, 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Bind(&SimpleCallback, &called)).Run(0); 490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(called); 500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::RunLoop().RunUntilIdle(); 510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(called); 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch called = false; 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RelayCallbackToCurrentThread( 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FROM_HERE, 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Bind(&CallbackWithPassed, &called)) 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch .Run(scoped_ptr<int>(new int)); 580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(called); 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::RunLoop().RunUntilIdle(); 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(called); 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST(DriveBackendCallbackHelperTest, RunOnOtherThreadTest) { 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::MessageLoop message_loop; 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Thread thread("WorkerThread"); 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu thread.Start(); 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner = 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::ThreadTaskRunnerHandle::Get(); 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_refptr<base::SequencedTaskRunner> worker_task_runner = 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu thread.message_loop_proxy(); 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool called = false; 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::RunLoop run_loop; 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu worker_task_runner->PostTask( 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FROM_HERE, 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RelayCallbackToTaskRunner( 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui_task_runner.get(), 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FROM_HERE, 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&VerifyCalledOnTaskRunner, ui_task_runner, &called))); 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu worker_task_runner->PostTask( 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FROM_HERE, 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RelayCallbackToTaskRunner( 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui_task_runner.get(), FROM_HERE, run_loop.QuitClosure())); 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu run_loop.Run(); 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(called); 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu thread.Stop(); 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST(DriveBackendCallbackHelperTest, PassNullFunctionTest) { 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::MessageLoop message_loop; 94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Closure closure = RelayCallbackToCurrentThread( 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FROM_HERE, 96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Closure()); 97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(closure.is_null()); 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace drive_backend 1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace sync_file_system 102