blob: a19cd141b6fbcfb078777a91a9654f7cbee96409 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "src/traced/probes/android_game_intervention_list/android_game_intervention_list_data_source.h"
#include <stdio.h>
#include <string>
#include <vector>
#include "perfetto/ext/base/pipe.h"
#include "perfetto/protozero/scattered_heap_buffer.h"
#include "perfetto/tracing/core/data_source_config.h"
#include "protos/perfetto/config/android/android_game_intervention_list_config.gen.h"
#include "protos/perfetto/trace/android/android_game_intervention_list.gen.h"
#include "protos/perfetto/trace/android/android_game_intervention_list.pbzero.h"
#include "src/tracing/core/trace_writer_for_testing.h"
#include "test/gtest_and_gmock.h"
namespace perfetto {
namespace {
class TestAndroidGameInterventionDataSource
: public AndroidGameInterventionListDataSource {
public:
TestAndroidGameInterventionDataSource(
const DataSourceConfig& ds_config,
TracingSessionID session_id,
std::unique_ptr<TraceWriter> trace_writer)
: AndroidGameInterventionListDataSource(ds_config,
session_id,
std::move(trace_writer)) {}
};
class AndroidGameInterventionListDataSourceTest : public ::testing::Test {
protected:
AndroidGameInterventionListDataSourceTest() {}
void CreateInstance(const DataSourceConfig& config) {
auto writer =
std::unique_ptr<TraceWriterForTesting>(new TraceWriterForTesting());
trace_writer_ = writer.get();
data_source_.reset(new TestAndroidGameInterventionDataSource(
config, /* id */ 0, std::move(writer)));
}
std::unique_ptr<TestAndroidGameInterventionDataSource> data_source_;
TraceWriterForTesting* trace_writer_;
};
TEST_F(AndroidGameInterventionListDataSourceTest, NonEmptyNameFilter) {
static constexpr char kValidInterventionLines[] =
"com.test.one\t1234\t0\t"
"1\tangle=1,scaling=1.0,fps=0\t"
"2\tangle=0,scaling=1.0,fps=60\n"
"com.test.two\t1235\t1\t"
"1\tangle=0,scaling=1.0,fps=0\t"
"3\tangle=1,scaling=0.6,fps=45\n"
"com.test.three\t1236\t2\t"
"1\tangle=1,scaling=1.0,fps=0\t"
"3\tangle=1,scaling=0.85,fps=30\t"
"2\tangle=0,scaling=0.75,fps=120\n";
CreateInstance(DataSourceConfig());
auto pipe = base::Pipe::Create();
PERFETTO_CHECK(write(pipe.wr.get(), kValidInterventionLines,
sizeof(kValidInterventionLines) - 1) ==
sizeof(kValidInterventionLines) - 1);
pipe.wr.reset();
auto file_stream = base::ScopedFstream(fdopen(pipe.rd.get(), "r"));
pipe.rd.release();
protozero::HeapBuffered<protos::pbzero::AndroidGameInterventionList>
android_game_intervention_list;
std::vector<std::string> name_filter = {"com.test.one", "com.test.three"};
ASSERT_TRUE(data_source_->ParseAndroidGameInterventionListStream(
android_game_intervention_list.get(), file_stream, name_filter));
protos::gen::AndroidGameInterventionList parsed;
parsed.ParseFromString(android_game_intervention_list.SerializeAsString());
EXPECT_FALSE(parsed.read_error());
EXPECT_FALSE(parsed.parse_error());
EXPECT_EQ(parsed.game_packages_size(), 2);
EXPECT_EQ(parsed.game_packages()[0].name(), "com.test.one");
EXPECT_EQ(parsed.game_packages()[0].uid(), 1234ul);
EXPECT_EQ(parsed.game_packages()[0].current_mode(), 0u);
EXPECT_EQ(parsed.game_packages()[0].game_mode_info_size(), 2);
EXPECT_EQ(parsed.game_packages()[0].game_mode_info()[0].mode(), 1u);
EXPECT_EQ(parsed.game_packages()[0].game_mode_info()[0].use_angle(), true);
EXPECT_EQ(
parsed.game_packages()[0].game_mode_info()[0].resolution_downscale(),
1.0f);
EXPECT_EQ(parsed.game_packages()[0].game_mode_info()[0].fps(), 0.0f);
EXPECT_EQ(parsed.game_packages()[0].game_mode_info()[1].mode(), 2u);
EXPECT_EQ(parsed.game_packages()[0].game_mode_info()[1].use_angle(), false);
EXPECT_EQ(
parsed.game_packages()[0].game_mode_info()[1].resolution_downscale(),
1.0f);
EXPECT_EQ(parsed.game_packages()[0].game_mode_info()[1].fps(), 60.0f);
EXPECT_EQ(parsed.game_packages()[1].name(), "com.test.three");
EXPECT_EQ(parsed.game_packages()[1].uid(), 1236ul);
EXPECT_EQ(parsed.game_packages()[1].current_mode(), 2u);
EXPECT_EQ(parsed.game_packages()[1].game_mode_info_size(), 3);
EXPECT_EQ(parsed.game_packages()[1].game_mode_info()[0].mode(), 1u);
EXPECT_EQ(parsed.game_packages()[1].game_mode_info()[0].use_angle(), true);
EXPECT_EQ(
parsed.game_packages()[1].game_mode_info()[0].resolution_downscale(),
1.0f);
EXPECT_EQ(parsed.game_packages()[1].game_mode_info()[0].fps(), 0.0f);
EXPECT_EQ(parsed.game_packages()[1].game_mode_info()[1].mode(), 3u);
EXPECT_EQ(parsed.game_packages()[1].game_mode_info()[1].use_angle(), true);
EXPECT_EQ(
parsed.game_packages()[1].game_mode_info()[1].resolution_downscale(),
0.85f);
EXPECT_EQ(parsed.game_packages()[1].game_mode_info()[1].fps(), 30.0f);
EXPECT_EQ(parsed.game_packages()[1].game_mode_info()[2].mode(), 2u);
EXPECT_EQ(parsed.game_packages()[1].game_mode_info()[2].use_angle(), false);
EXPECT_EQ(
parsed.game_packages()[1].game_mode_info()[2].resolution_downscale(),
0.75f);
EXPECT_EQ(parsed.game_packages()[1].game_mode_info()[2].fps(), 120.0f);
}
} // namespace
} // namespace perfetto