// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_SPEECH_SPEECH_RECOGNITION_TEST_HELPER_H_
#define CHROME_BROWSER_SPEECH_SPEECH_RECOGNITION_TEST_HELPER_H_
#include <memory>
#include <string>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/speech/fake_speech_recognition_service.h"
class KeyedService;
class Profile;
namespace content {
class BrowserContext;
class FakeSpeechRecognitionManager;
} // namespace content
namespace speech {
class FakeSpeechRecognizer;
enum class SpeechRecognitionType;
} // namespace speech
// This class provides on-device and network speech recognition test
// infrastructure. Test classes can use this one to easily interact with
// speech recognizers. For example:
//
// SpeechRecognitionTestHelper* test_helper_ = ...;
// SpeechRecognizer* recognizer->Start();
// test_helper_->WaitForRecognitionStarted();
// ... Continue with test ...
//
// For examples, please see SpeechRecognitionPrivateBaseTest or
// DictationBaseTest.
class SpeechRecognitionTestHelper
: public speech::FakeSpeechRecognitionService::Observer {
public:
explicit SpeechRecognitionTestHelper(
speech::SpeechRecognitionType type,
media::mojom::RecognizerClientType client_type);
~SpeechRecognitionTestHelper() override;
SpeechRecognitionTestHelper(const SpeechRecognitionTestHelper&) = delete;
SpeechRecognitionTestHelper& operator=(const SpeechRecognitionTestHelper&) =
delete;
// Sets up either on-device or network speech recognition.
void SetUp(Profile* profile);
// Waits for the speech recognition service to start.
void WaitForRecognitionStarted();
// Waits for the speech recognition service to stop.
void WaitForRecognitionStopped();
// Sends an interim (non-finalized) fake speech result and waits for tasks to
// finish.
void SendInterimResultAndWait(const std::string& transcript);
// Sends a final fake speech result and waits for tasks to finish.
void SendFinalResultAndWait(const std::string& transcript);
// Sends a fake speech recognition error and waits for tasks to finish.
void SendErrorAndWait();
// Returns a list of features that should be enabled.
std::vector<base::test::FeatureRef> GetEnabledFeatures();
// Returns a list of features that should be disabled.
std::vector<base::test::FeatureRef> GetDisabledFeatures();
// FakeSpeechRecognitionService::Observer
void OnRecognizerBound(
speech::FakeSpeechRecognizer* bound_recognizer) override;
private:
// Methods for setup.
void SetUpNetworkRecognition();
void SetUpOnDeviceRecognition(Profile* profile);
std::unique_ptr<KeyedService> CreateTestOnDeviceSpeechRecognitionService(
content::BrowserContext* context);
// Sends a fake speech result and waits for tasks to finish.
void SendFakeSpeechResultAndWait(const std::string& transcript,
bool is_final);
// Represents the feature under test, we use this to identify the correct
// FakeSpeechRecognizer when it becomes bound.
media::mojom::RecognizerClientType feature_under_test_;
speech::SpeechRecognitionType type_;
// For network recognition.
std::unique_ptr<content::FakeSpeechRecognitionManager>
fake_speech_recognition_manager_;
// For on-device recognition. KeyedService owned by the test profile.
raw_ptr<speech::FakeSpeechRecognitionService, DanglingUntriaged>
fake_service_;
// For on-device recognition, this is the fakeSpeechRecognizer passed to the
// fake service, used for checking session status and assertions.
base::WeakPtr<speech::FakeSpeechRecognizer> fake_recognizer_;
};
#endif // CHROME_BROWSER_SPEECH_SPEECH_RECOGNITION_TEST_HELPER_H_