blob: ea95170993049af1a8f7ebe15dffef76dfab4375 [file] [log] [blame]
/*
* Copyright (C) 2024 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 <cstdint>
#include <string>
#include "src/base/test/status_matchers.h"
#include "src/trace_redaction/collect_timeline_events.h"
#include "src/trace_redaction/find_package_uid.h"
#include "src/trace_redaction/trace_redaction_framework.h"
#include "src/trace_redaction/trace_redaction_integration_fixture.h"
#include "src/trace_redaction/trace_redactor.h"
#include "test/gtest_and_gmock.h"
namespace perfetto::trace_redaction {
namespace {
// Every thread in the package stars before the trace and ends after the
// trace, allowing any time to be used for the query. This time is the
// start time of a slice in the trace.
constexpr uint64_t kTime = 6702094223167642;
} // namespace
class ProcessThreadTimelineIntegrationTest
: public testing::Test,
protected TraceRedactionIntegrationFixure {
protected:
void SetUp() override {
context()->package_name = "com.Unity.com.unity.multiplayer.samples.coop";
trace_redactor()->emplace_collect<FindPackageUid>();
trace_redactor()->emplace_collect<CollectTimelineEvents>();
ASSERT_OK(Redact());
}
};
TEST_F(ProcessThreadTimelineIntegrationTest, PackageThreadsAreConnected) {
// select * from thread where upid in (
// select upid from process where uid in (
// select uid from package_list where
// package_name='com.Unity.com.unity.multiplayer.samples.coop'))
auto threads = {
7105, 7111, 7112, 7113, 7114, 7115, 7116, 7117, 7118, 7119, 7120,
7124, 7125, 7127, 7129, 7130, 7131, 7132, 7133, 7134, 7135, 7136,
7137, 7139, 7141, 7142, 7143, 7144, 7145, 7146, 7147, 7148, 7149,
7150, 7151, 7152, 7153, 7154, 7155, 7156, 7157, 7158, 7159, 7160,
7161, 7162, 7163, 7164, 7165, 7166, 7167, 7171, 7172, 7174, 7178,
7180, 7184, 7200, 7945, 7946, 7947, 7948, 7950, 7969,
};
for (auto pid : threads) {
// Use EXPECT instead of ASSERT to test all values.
EXPECT_TRUE(context()->timeline->PidConnectsToUid(kTime, pid,
*context()->package_uid));
}
}
TEST_F(ProcessThreadTimelineIntegrationTest, MainThreadIsConnected) {
// select * from process where uid in (
// select uid from package_list where
// package_name='com.Unity.com.unity.multiplayer.samples.coop')
ASSERT_TRUE(context()->timeline->PidConnectsToUid(kTime, 7105,
*context()->package_uid));
}
TEST_F(ProcessThreadTimelineIntegrationTest,
DoesNotConnectDisconnectedMainThread) {
// /vendor/bin/hw/android.hardware.audio.service
//
// select * from thread where upid in (
// select upid from process where pid=1104)
//
// The audio server, like the targe threads, have no start or end time, so
// using the "whatever" time is okay. Because the audio service is not
// directly or indirectly connected to the target package, no thread should
// test as connected.
auto threads = {
1104, 1135, 1142, 1169, 1176, 1602, 1609, 1610,
1617, 1689, 1690, 1692, 2190, 29650, 23020,
};
for (auto pid : threads) {
// Use EXPECT instead of ASSERT to test all values.
EXPECT_FALSE(context()->timeline->PidConnectsToUid(
kTime, pid, *context()->package_uid));
}
}
} // namespace perfetto::trace_redaction