Chromium Code Reviews| Index: ash/mus/shelf_delegate_mus_unittest.cc | 
| diff --git a/ash/mus/shelf_delegate_mus_unittest.cc b/ash/mus/shelf_delegate_mus_unittest.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..db84a45491aa9e3a5920cd250ddb3dc5d9653ee3 | 
| --- /dev/null | 
| +++ b/ash/mus/shelf_delegate_mus_unittest.cc | 
| @@ -0,0 +1,132 @@ | 
| +// Copyright 2016 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include <memory> | 
| + | 
| +#include "base/bind.h" | 
| +#include "base/command_line.h" | 
| +#include "base/run_loop.h" | 
| +#include "components/mus/public/interfaces/window_server_test.mojom.h" | 
| +#include "mash/shelf/public/interfaces/shelf.mojom.h" | 
| +#include "mojo/public/cpp/bindings/associated_binding.h" | 
| +#include "services/shell/public/cpp/shell_test.h" | 
| + | 
| +namespace { | 
| + | 
| +class TestShelfObserver : public mash::shelf::mojom::ShelfObserver { | 
| + public: | 
| + explicit TestShelfObserver(mash::shelf::mojom::ShelfControllerPtr* shelf) | 
| + : observer_binding_(this) { | 
| + mash::shelf::mojom::ShelfObserverAssociatedPtrInfo ptr_info; | 
| + observer_binding_.Bind(&ptr_info, shelf->associated_group()); | 
| + (*shelf)->AddObserver(std::move(ptr_info)); | 
| + } | 
| + | 
| + ~TestShelfObserver() override {} | 
| + | 
| + mash::shelf::mojom::Alignment alignment() const { return alignment_; } | 
| + mash::shelf::mojom::AutoHideBehavior auto_hide() const { return auto_hide_; } | 
| + | 
| + void WaitForIncomingMethodCalls(size_t expected_calls) { | 
| + DCHECK_EQ(0u, expected_calls_); | 
| + expected_calls_ = expected_calls; | 
| + DCHECK(!run_loop_ || !run_loop_->running()); | 
| + run_loop_.reset(new base::RunLoop()); | 
| + run_loop_->Run(); | 
| + } | 
| + | 
| + private: | 
| + void OnMethodCall() { | 
| + DCHECK_LT(0u, expected_calls_); | 
| + DCHECK(run_loop_->running()); | 
| + expected_calls_--; | 
| + if (expected_calls_ == 0u) | 
| + run_loop_->Quit(); | 
| + } | 
| + | 
| + // mash::shelf::mojom::ShelfObserver: | 
| + void OnAlignmentChanged(mash::shelf::mojom::Alignment alignment) override { | 
| + alignment_ = alignment; | 
| + OnMethodCall(); | 
| + } | 
| + void OnAutoHideBehaviorChanged( | 
| + mash::shelf::mojom::AutoHideBehavior auto_hide) override { | 
| + auto_hide_ = auto_hide; | 
| + OnMethodCall(); | 
| + } | 
| + | 
| + mojo::AssociatedBinding<mash::shelf::mojom::ShelfObserver> observer_binding_; | 
| + | 
| + mash::shelf::mojom::Alignment alignment_ = | 
| + mash::shelf::mojom::Alignment::BOTTOM; | 
| + mash::shelf::mojom::AutoHideBehavior auto_hide_ = | 
| + mash::shelf::mojom::AutoHideBehavior::NEVER; | 
| + | 
| + size_t expected_calls_ = 0u; | 
| + std::unique_ptr<base::RunLoop> run_loop_; | 
| + | 
| + DISALLOW_COPY_AND_ASSIGN(TestShelfObserver); | 
| +}; | 
| + | 
| +} // namespace | 
| + | 
| +namespace ash { | 
| +namespace sysui { | 
| + | 
| +void RunCallback(bool* success, const base::Closure& callback, bool result) { | 
| + *success = result; | 
| + callback.Run(); | 
| +} | 
| + | 
| +class ShelfDelegateMusTest : public shell::test::ShellTest { | 
| + public: | 
| + ShelfDelegateMusTest() : ShellTest("exe:mash_unittests") {} | 
| + ~ShelfDelegateMusTest() override {} | 
| + | 
| + private: | 
| + void SetUp() override { | 
| + base::CommandLine::ForCurrentProcess()->AppendSwitch("use-test-config"); | 
| + ShellTest::SetUp(); | 
| + } | 
| + | 
| + DISALLOW_COPY_AND_ASSIGN(ShelfDelegateMusTest); | 
| +}; | 
| + | 
| +TEST_F(ShelfDelegateMusTest, AshSysUIHasDrawnWindow) { | 
| + // mash_session embeds ash_sysui, which paints the shelf. | 
| + connector()->Connect("mojo:mash_session"); | 
| + mus::mojom::WindowServerTestPtr test_interface; | 
| + connector()->ConnectToInterface("mojo:mus", &test_interface); | 
| + base::RunLoop run_loop; | 
| + bool success = false; | 
| 
 
sky
2016/05/13 19:35:18
nit: success -> drawn?
 
msw
2016/05/13 19:44:51
Done.
 
 | 
| + test_interface->EnsureClientHasDrawnWindow( | 
| + "mojo:ash_sysui", | 
| + base::Bind(&RunCallback, &success, run_loop.QuitClosure())); | 
| + run_loop.Run(); | 
| + EXPECT_TRUE(success); | 
| +} | 
| + | 
| +TEST_F(ShelfDelegateMusTest, ShelfControllerAndObserverBasic) { | 
| + connector()->Connect("mojo:mash_session"); | 
| + mash::shelf::mojom::ShelfControllerPtr shelf_controller; | 
| + connector()->ConnectToInterface("mojo:ash_sysui", &shelf_controller); | 
| + | 
| + // Adding the observer should fire state initialization function calls. | 
| + TestShelfObserver observer(&shelf_controller); | 
| + observer.WaitForIncomingMethodCalls(2u); | 
| + EXPECT_EQ(mash::shelf::mojom::Alignment::BOTTOM, observer.alignment()); | 
| + EXPECT_EQ(mash::shelf::mojom::AutoHideBehavior::NEVER, observer.auto_hide()); | 
| + | 
| + shelf_controller->SetAlignment(mash::shelf::mojom::Alignment::LEFT); | 
| + observer.WaitForIncomingMethodCalls(1u); | 
| + EXPECT_EQ(mash::shelf::mojom::Alignment::LEFT, observer.alignment()); | 
| + | 
| + shelf_controller->SetAutoHideBehavior( | 
| + mash::shelf::mojom::AutoHideBehavior::ALWAYS); | 
| + observer.WaitForIncomingMethodCalls(1u); | 
| + EXPECT_EQ(mash::shelf::mojom::AutoHideBehavior::ALWAYS, observer.auto_hide()); | 
| +} | 
| + | 
| +} // namespace sysui | 
| +} // namespace ash |