Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 78baad2a authored by Yu-Ting Tseng's avatar Yu-Ting Tseng
Browse files

Add native tests for ActivityManager APIs.

Flag: EXEMPT TEST_ONLY
Bug: 440134516
Change-Id: Ia42969e06bd4f648e5ae2123e0d3403d54eb062d
parent b67c3b1f
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -27,10 +27,12 @@ cc_test {
        "libandroid",
        "libbinder",
        "libbinder_ndk",
        "libactivitymanager_aidl",
    ],

    static_libs: [
        "libbase",
        "libgmock",
        "libgtest",
    ],
    stl: "c++_shared",
+58 −0
Original line number Diff line number Diff line
@@ -18,10 +18,17 @@

#include <android-base/logging.h>
#include <android/activity_manager.h>
#include <android/app/BnProcessObserver.h>
#include <android/app/RunningAppProcessInfo.h>
#include <binder/ActivityManager.h>
#include <binder/PermissionController.h>
#include <binder/ProcessState.h>
#include <gtest/gtest.h>

#include <vector>

#include "gmock/gmock.h"

constexpr const char* kTestPackage = "com.android.tests.UidImportanceHelper";
constexpr const char* kTestActivity = "com.android.tests.UidImportanceHelper.MainActivity";
constexpr int64_t kEventTimeoutUs = 500000;
@@ -137,3 +144,54 @@ TEST_F(ActivityManagerNativeTest, testUidImportance) {
    AActivityManager_removeUidImportanceListener(mUidObserver);
    mUidObserver = nullptr;
}

TEST_F(ActivityManagerNativeTest, testGetRunningAppProcesses) {
    EXPECT_TRUE(ShellHelper::Start(kTestPackage, kTestActivity));
    waitForImportance(AACTIVITYMANAGER_IMPORTANCE_FOREGROUND, kEventTimeoutUs);
    android::ActivityManager am;
    std::vector<android::app::RunningAppProcessInfo> infos;
    am.getRunningAppProcesses(&infos);

    android::status_t status = am.getRunningAppProcesses(&infos);
    EXPECT_EQ(status, android::OK) << "Unexpected error from am.getRunningAppProcesses: "
                                   << android::statusToString(status);
    for (const auto& info : infos) {
        LOG(INFO) << "Process name: " << info.processName;
    }
    EXPECT_TRUE(std::any_of(infos.cbegin(), infos.cend(),
                            [](const auto& info) { return info.processName == kTestPackage; }));
}

class MockProcessObserver : public android::app::BnProcessObserver {
public:
    MOCK_METHOD(android::binder::Status, onProcessStarted,
                (int32_t pid, int32_t processUid, int32_t packageUid,
                 const std::string& packageName, const std::string& processName),
                (override));
    MOCK_METHOD(android::binder::Status, onForegroundActivitiesChanged,
                (int32_t /*pid*/, int32_t /*uid*/, bool /*foregroundActivities*/), (override));
    MOCK_METHOD(android::binder::Status, onForegroundServicesChanged,
                (int32_t /*pid*/, int32_t /*uid*/, int32_t /*serviceTypes*/), (override));
    MOCK_METHOD(android::binder::Status, onProcessDied, (int32_t pid, int32_t uid), (override));
};

TEST_F(ActivityManagerNativeTest, testProcessObserver) {
    uid_t testAppUid;
    EXPECT_TRUE(getUidForPackage(kTestPackage, testAppUid));

    android::sp<testing::NiceMock<MockProcessObserver>> mock_process_observer =
            new testing::NiceMock<MockProcessObserver>();
    android::ActivityManager am;
    am.registerProcessObserver(mock_process_observer);
    EXPECT_TRUE(ShellHelper::Start(kTestPackage, kTestActivity));
    waitForImportance(AACTIVITYMANAGER_IMPORTANCE_FOREGROUND, kEventTimeoutUs);
    std::vector<android::app::RunningAppProcessInfo> infos;
    am.getRunningAppProcesses(&infos);
    auto it = std::find_if(infos.cbegin(), infos.cend(),
                           [](const auto& info) { return info.processName == kTestPackage; });
    EXPECT_NE(it, infos.cend());
    int pid = it->pid;
    EXPECT_TRUE(ShellHelper::Stop(kTestPackage));
    EXPECT_CALL(*mock_process_observer, onProcessDied(pid, testAppUid));
    am.unregisterProcessObserver(mock_process_observer);
}