blob: 6b8602ffdc1516b7e266e98e20a22912a6185001 [file]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromeos/components/mahi/content_extraction_service.h"
#include <memory>
#include <string>
#include "base/functional/bind.h"
#include "base/memory/weak_ptr.h"
#include "base/test/task_environment.h"
#include "chromeos/components/mahi/public/mojom/content_extraction.mojom.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/accessibility/test_ax_tree_update.h"
namespace mahi {
class ContentExtractionServiceTestBase : public testing::Test {
public:
void OnContentExtracted(const std::u16string& expected_contents,
mojom::ExtractionResponsePtr response) {
EXPECT_EQ(expected_contents, response->contents);
EXPECT_EQ(mojom::ResponseStatus::kSuccess, response->status);
}
void OnGetContentSize(int expected_size,
mojom::ContentSizeResponsePtr response) {
EXPECT_EQ(expected_size, response->word_count);
EXPECT_EQ(mojom::ResponseStatus::kSuccess, response->status);
}
void TestContentExtraction(const std::string& tree_structure,
const std::u16string& expected_contents,
int expected_size) {
mojom::ExtractionRequestPtr request = mojom::ExtractionRequest::New();
ui::TestAXTreeUpdate update(tree_structure);
request->snapshot = update;
mojom::ExtractionMethodsPtr extraction_methods =
mojom::ExtractionMethods::New();
extraction_methods->use_algorithm = true;
extraction_methods->use_screen2x = false;
request->extraction_methods = std::move(extraction_methods);
service_->ExtractContent(
request->Clone(),
base::BindOnce(&ContentExtractionServiceTestBase::OnContentExtracted,
weak_factory_.GetWeakPtr(),
std::move(expected_contents)));
service_->GetContentSize(
std::move(request),
base::BindOnce(&ContentExtractionServiceTestBase::OnGetContentSize,
weak_factory_.GetWeakPtr(), expected_size));
}
protected:
void SetUp() override {
service_ = std::make_unique<ContentExtractionService>(
factory_remote_.BindNewPipeAndPassReceiver());
}
mojo::Remote<mojom::ContentExtractionServiceFactory> factory_remote_;
std::unique_ptr<ContentExtractionService> service_;
base::test::TaskEnvironment task_environment_{
base::test::TaskEnvironment::MainThreadType::DEFAULT,
base::test::TaskEnvironment::ThreadPoolExecutionMode::QUEUED};
int receiver_count_;
base::WeakPtrFactory<ContentExtractionServiceTestBase> weak_factory_{this};
};
TEST_F(ContentExtractionServiceTestBase, BindContentExtractionService) {
mojo::Remote<mojom::ContentExtractionService> service_remote;
service_->BindContentExtractionService(
service_remote.BindNewPipeAndPassReceiver());
EXPECT_TRUE(service_remote.is_bound());
}
struct TestCase {
const char* test_name;
std::string tree_structure;
std::u16string expected_contents;
int expected_size;
};
class ContentExtractionServiceTest
: public ContentExtractionServiceTestBase,
public ::testing::WithParamInterface<TestCase> {
public:
static std::string ParamInfoToString(
::testing::TestParamInfo<TestCase> param_info) {
return param_info.param.test_name;
}
};
// Each test case of the object below is used by the parameterized test.
// A dividing line is included between test cases for better readability.
// Note: `ui::TestAXTreeUpdate` does not allow whitespace within property
// values, so "-" is used instead.
const TestCase kTreeExtractionTestCases[] = {
{
"simple_page",
R"HTML(
++1 kRootWebArea name="document"
++++2 kMain
++++++3 kParagraph
++++++++4 kStaticText name="some-text"
)HTML",
u"some-text",
2,
},
/* ----------------------- */
{
"simple_page_with_heading",
R"HTML(
++1 kRootWebArea name="document"
++++2 kMain
++++++3 kHeading name="header"
++++++++7 kStaticText name="heading-1"
++++++4 kParagraph
++++++++8 kStaticText name="some-text"
++++++5 kParagraph
++++++++9 kStaticText name="some-other-text"
++++++6 kGenericContainer
++++++++10 kHeading name="header"
++++++++++11 kStaticText name="heading-2"
)HTML",
u"heading-1\n\nsome-text\n\nsome-other-text\n\nheading-2",
9,
},
/* ----------------------- */
{
"simple_page_with_article",
R"HTML(
++1 kRootWebArea name="document"
++++2 kMain
++++++3 kParagraph
++++++++6 kStaticText name="some-text"
++++++4 kArticle
++++++++7 kParagraph
++++++++++9 kStaticText name="article-text"
++++++5 kArticle
++++++++8 kParagraph
++++++++++10 kStaticText name="some-other-text"
)HTML",
u"some-text\n\narticle-text\n\nsome-other-text",
7,
},
/* ----------------------- */
{
"simple_page_with_article_hierarchy",
R"HTML(
++1 kRootWebArea name="document"
++++2 kMain
++++++3 kArticle
++++++++6 kParagraph
++++++++++9 kStaticText name="article-text"
++++++4 kParagraph
++++++++7 kStaticText name="some-text"
++++++5 kArticle
++++++++8 kParagraph
++++++++++10 kStaticText name="some-other-text"
)HTML",
u"article-text\n\nsome-text\n\nsome-other-text",
7,
},
/* ----------------------- */
{
"simple_page_unsupported_roles",
R"HTML(
++1 kRootWebArea name="document"
++++2 kGenericContainer
++++++3 kMain
++++++++4 kBanner
++++++++++10 kStaticText name="banner"
++++++++5 kNavigation
++++++++++11 kStaticText name="navigation"
++++++++6 kImage
++++++++7 kButton
++++++++++12 kStaticText name="button"
++++++++8 kContentInfo
++++++++++13 kStaticText name="content-info"
++++++++9 kFooter
++++++++++14 kStaticText name="footer"
)HTML",
u"",
0,
},
/* ----------------------- */
};
TEST_P(ContentExtractionServiceTest, ContentExtraction) {
TestCase param = GetParam();
TestContentExtraction(param.tree_structure, param.expected_contents,
param.expected_size);
}
INSTANTIATE_TEST_SUITE_P(/* prefix */,
ContentExtractionServiceTest,
::testing::ValuesIn(kTreeExtractionTestCases),
ContentExtractionServiceTest::ParamInfoToString);
} // namespace mahi