This documentation concerns all Assistant browser/integration test which use AssistantTestMixin
or any derived class.
All these tests run the real LibAssistant code, and use a FakeS3Server to intercept and replay the communication between LibAssistant and the cloud. This allows these tests to run in the CQ, without requiring any network connectivity.
To add a new integration test, your test fixture must inherit from MixinBasedInProcessBrowserTest
and must contain AssistantTestMixin
as a private variable:
#include "chrome/browser/ui/ash/assistant/assistant_test_mixin.h" #include "chrome/test/base/mixin_based_in_process_browser_test.h" class MyBrowserTest : public MixinBasedInProcessBrowserTest { public: MyBrowserTest() = default; ~MyBrowserTest() override = default; AssistantTestMixin* tester() { return &tester_; } private: AssistantTestMixin tester_{&mixin_host_, this, embedded_test_server(), FakeS3Mode::kReplay}; };
Tests can use API provided by AssistantTextMixin
to interact with the Assistant UI. Look in chrome/browser/ui/ash/assistant/assistant_test_mixin.h
to see all the available methods.
Each test must start by starting the Assistant service and waiting for it to signal it's ready. That is done by calling tester()->StartAssistantAndWaitForReady()
.
IN_PROC_BROWSER_TEST_F(MyBrowserTest, MyVeryFirstTest) { tester()->StartAssistantAndWaitForReady(); // Your test code comes here. }
The fake S3 server can run in 3 different modes, all of which you'll need to use while adding new tests.
You'll start by using the proxy mode while developing a new test; This simply forwards all requests to a real S3 server.
When you‘re ready to commit you’ll switch to record mode in order to record the interaction between LibAssistant and the S3 server.
Afterwards you'll switch to replay mode; In this mode the fake S3 server will replay the recorded interactions. This allows the CQ to run the tests without once requiring network connectivity to contact the real S3 server.
In this mode the fake S3 server works as a simple proxy, forwarding all LibAssistant requests to the real S3 server (and proxying the responses back).
As such, you will have to:
The first part can be achieved by passing |FakeS3Mode::kProxy|
as the final argument to the constructor of the |AssistantTextMixin|
instance in your test fixture.
// in your test fixture private: AssistantTestMixin tester_{&mixin_host_, this, embedded_test_server(), FakeS3Mode::kProxy};
The second part is achieved by running your tests through the wrapper script chromeos/assistant/internal/test_support/run_with_access_token.py
.
Start by opening a terminal in your chromium/src
directory and then:
# First compile the browser_tests target autoninja -C out/Default browser_tests # Then run it (change the --gtest_filter args to the filter you need) chromeos/assistant/internal/test_support/run_with_access_token.py out/Default/browser_tests --gtest_filter="AssistantBrowserTest.*"
Alternatively you can also store the Gaia token you'd like to use in the environmental variable TOKEN
:
export TOKEN="the.gaia.token.string" out/Default/browser_tests --gtest_filter="AssistantBrowserTest.*"
In this mode the fake S3 server will again work as a proxy, but it will also store a recording of all the communications in a file called
chromeos/assistant/internal/test_data/<testfixture_testname>.fake_s3.proto
A separate file is created for each test.
You will need to run once in record mode when your test is ready to be committed.
To do this, use the same steps described above but replace |FakeS3Mode:kProxy|
with |FakeS3Mode::kRecord|
.
Note that these .fake_s3.proto
files will need to be committed before you can commit your changes. See here for more information.
In this mode all S3 requests are handled by replaying the responses stored while running in record mode.
As this no longer contacts the real S3 server it does not need a Gaia token, so you no longer needs to use the run_with_access_token.py
script.
All you need to do is pass |FakeS3Mode::kReplay|
as the final argument to the constructor of the |AssistantTextMixin|
instance in your test fixture.
// in your test fixture private: AssistantTestMixin tester_{&mixin_host_, this, embedded_test_server(), FakeS3Mode::kReplay};
This is the mode the CQ runs in, and as such you must make sure you've enabled this mode before pushing your CL!
When a test is removed you should take care to remove the stale
chromeos/assistant/internal/test_data/<testfixture_testname>.fake_s3.proto
file.
Conversively, when a test is renamed you should remove the old .fake_s3.proto
file and use record mode to generate a new proto file.
Committing the tests has to be done in multiple steps:
chromeos/assistant/internal/test_data
..fake_s3.proto
files from chromeos/assistant/internal/test_data
.