blob: a9352b47503cff0deb7084fa6b6a74eb80fb9f0c [file] [log] [blame]
// Copyright 2019 The Fuchsia 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 "src/ui/a11y/lib/view/view_manager.h"
#include <fuchsia/accessibility/cpp/fidl.h>
#include <fuchsia/sys/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/fdio/fd.h>
#include <lib/gtest/test_loop_fixture.h>
#include <lib/sys/cpp/testing/component_context_provider.h>
#include <lib/vfs/cpp/pseudo_dir.h>
#include <lib/zx/event.h>
#include <vector>
#include <gtest/gtest.h>
#include "src/lib/syslog/cpp/logger.h"
#include "src/ui/a11y/lib/semantics/tests/mocks/mock_semantic_provider.h"
//#include "src/ui/a11y/lib/semantics/tests/semantic_tree_parser.h"
#include "src/ui/a11y/lib/util/util.h"
namespace accessibility_test {
using fuchsia::accessibility::semantics::Attributes;
using fuchsia::accessibility::semantics::Node;
using fuchsia::accessibility::semantics::NodePtr;
using fuchsia::accessibility::semantics::Role;
using fuchsia::accessibility::semantics::SemanticsManager;
class MockSemanticTreeServiceFactory : public a11y::SemanticTreeServiceFactory {
public:
std::unique_ptr<a11y::SemanticTreeService> NewService(
zx_koid_t koid, fuchsia::accessibility::semantics::SemanticListenerPtr semantic_listener,
vfs::PseudoDir* debug_dir,
a11y::SemanticTreeService::CloseChannelCallback close_channel_callback) override {
auto service = a11y::SemanticTreeServiceFactory::NewService(
koid, std::move(semantic_listener), debug_dir, std::move(close_channel_callback));
service_ = service.get();
return service;
}
a11y::SemanticTreeService* service() { return service_; }
private:
a11y::SemanticTreeService* service_ = nullptr;
};
class ViewManagerTest : public gtest::TestLoopFixture {
public:
ViewManagerTest()
: factory_(std::make_unique<MockSemanticTreeServiceFactory>()),
factory_ptr_(factory_.get()),
view_manager_(std::move(factory_), debug_dir()) {
syslog::InitLogger();
}
vfs::PseudoDir* debug_dir() { return context_provider_.context()->outgoing()->debug_dir(); }
sys::testing::ComponentContextProvider context_provider_;
std::unique_ptr<MockSemanticTreeServiceFactory> factory_;
MockSemanticTreeServiceFactory* factory_ptr_;
a11y::ViewManager view_manager_;
};
TEST_F(ViewManagerTest, ProviderGetsNotifiedOfSemanticsEnabled) {
// Enable Semantics Manager.
view_manager_.SetSemanticsEnabled(true);
MockSemanticProvider semantic_provider(&view_manager_);
// Upon initialization, MockSemanticProvider calls RegisterViewForSemantics().
// Ensure that it called the factory to instantiate a new service.
EXPECT_TRUE(factory_ptr_->service());
RunLoopUntilIdle();
EXPECT_TRUE(semantic_provider.GetSemanticsEnabled());
// Disable Semantics Manager.
view_manager_.SetSemanticsEnabled(false);
RunLoopUntilIdle();
// Semantics Listener should get notified about Semantics manager disable.
EXPECT_FALSE(semantic_provider.GetSemanticsEnabled());
}
TEST_F(ViewManagerTest, GetsTreeByKoid) {
view_manager_.SetSemanticsEnabled(true);
MockSemanticProvider semantic_provider(&view_manager_);
RunLoopUntilIdle();
const auto tree_weak_ptr =
view_manager_.GetTreeByKoid(a11y::GetKoid(semantic_provider.view_ref()));
EXPECT_TRUE(tree_weak_ptr);
EXPECT_EQ(tree_weak_ptr->Size(), 0u);
}
TEST_F(ViewManagerTest, ClosesChannel) {
view_manager_.SetSemanticsEnabled(true);
MockSemanticProvider semantic_provider(&view_manager_);
RunLoopUntilIdle();
const auto tree_weak_ptr =
view_manager_.GetTreeByKoid(a11y::GetKoid(semantic_provider.view_ref()));
EXPECT_TRUE(tree_weak_ptr);
EXPECT_EQ(tree_weak_ptr->Size(), 0u);
// Forces the client to disconnect.
semantic_provider.SendEventPairSignal();
RunLoopUntilIdle();
const auto invalid_tree_weak_ptr =
view_manager_.GetTreeByKoid(a11y::GetKoid(semantic_provider.view_ref()));
EXPECT_FALSE(invalid_tree_weak_ptr);
}
// Tests that log file is removed when semantic tree service entry is removed from semantics
// manager.
TEST_F(ViewManagerTest, LogFileRemoved) {
view_manager_.SetSemanticsEnabled(true);
MockSemanticProvider semantic_provider(&view_manager_);
RunLoopUntilIdle();
const auto tree_weak_ptr =
view_manager_.GetTreeByKoid(a11y::GetKoid(semantic_provider.view_ref()));
std::string debug_file = std::to_string(a11y::GetKoid(semantic_provider.view_ref()));
{
vfs::internal::Node* node;
EXPECT_EQ(ZX_OK, debug_dir()->Lookup(debug_file, &node));
}
// Forces the client to disconnect.
semantic_provider.SendEventPairSignal();
RunLoopUntilIdle();
// Check Log File is removed.
{
vfs::internal::Node* node;
EXPECT_EQ(ZX_ERR_NOT_FOUND, debug_dir()->Lookup(debug_file, &node));
}
}
} // namespace accessibility_test