| /* |
| * Copyright (C) 2019 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. |
| */ |
| |
| // Unit Test for MediaTranscodingService. |
| |
| //#define LOG_NDEBUG 0 |
| #define LOG_TAG "MediaTranscodingServiceSimulatedTest" |
| |
| #include <aidl/android/media/BnTranscodingClientCallback.h> |
| #include <aidl/android/media/IMediaTranscodingService.h> |
| #include <aidl/android/media/ITranscodingClient.h> |
| #include <aidl/android/media/ITranscodingClientCallback.h> |
| #include <aidl/android/media/TranscodingRequestParcel.h> |
| #include <aidl/android/media/TranscodingSessionParcel.h> |
| #include <aidl/android/media/TranscodingSessionPriority.h> |
| #include <android-base/logging.h> |
| #include <android/binder_manager.h> |
| #include <android/binder_process.h> |
| #include <binder/PermissionController.h> |
| #include <cutils/multiuser.h> |
| #include <gtest/gtest.h> |
| #include <utils/Log.h> |
| |
| #include <iostream> |
| #include <list> |
| #include <unordered_set> |
| |
| #include "MediaTranscodingServiceTestHelper.h" |
| #include "SimulatedTranscoder.h" |
| |
| namespace android { |
| |
| namespace media { |
| |
| // Note that -1 is valid and means using calling pid/uid for the service. But only privilege caller |
| // could use them. This test is not a privilege caller. |
| constexpr int32_t kInvalidClientPid = -5; |
| constexpr int32_t kInvalidClientUid = -10; |
| constexpr const char* kInvalidClientName = ""; |
| constexpr const char* kInvalidClientOpPackageName = ""; |
| |
| constexpr int64_t kPaddingUs = 1000000; |
| constexpr int64_t kSessionWithPaddingUs = SimulatedTranscoder::kSessionDurationUs + kPaddingUs; |
| constexpr int64_t kWatchdogTimeoutUs = 3000000; |
| // Pacer settings used for simulated tests. Listed here for reference. |
| constexpr int32_t kSimulatedPacerBurstThresholdMs = 500; |
| //constexpr int32_t kSimulatedPacerBurstCountQuota = 10; |
| //constexpr int32_t kSimulatedPacerBurstTimeQuotaSec = 3; |
| |
| constexpr const char* kClientOpPackageName = "TestClientPackage"; |
| |
| class MediaTranscodingServiceSimulatedTest : public MediaTranscodingServiceTestBase { |
| public: |
| MediaTranscodingServiceSimulatedTest() { ALOGI("MediaTranscodingServiceResourceTest created"); } |
| |
| virtual ~MediaTranscodingServiceSimulatedTest() { |
| ALOGI("MediaTranscodingServiceResourceTest destroyed"); |
| } |
| |
| void testPacerHelper(int numSubmits, int sessionDurationMs, int expectedSuccess) { |
| // Idle to clear out burst history. |
| usleep(kSimulatedPacerBurstThresholdMs * 2 * 1000); |
| for (int i = 0; i < numSubmits; i++) { |
| EXPECT_TRUE(mClient3->submit(i, "test_source_file_0", "test_destination_file_0", |
| TranscodingSessionPriority::kNormal, -1 /*bitrateBps*/, |
| -1 /*overridePid*/, -1 /*overrideUid*/, |
| sessionDurationMs)); |
| } |
| for (int i = 0; i < expectedSuccess; i++) { |
| EXPECT_EQ(mClient3->pop(kPaddingUs), EventTracker::Start(CLIENT(3), i)); |
| EXPECT_EQ(mClient3->pop(kSessionWithPaddingUs), EventTracker::Finished(CLIENT(3), i)); |
| } |
| for (int i = expectedSuccess; i < numSubmits; i++) { |
| EXPECT_EQ(mClient3->pop(kPaddingUs), EventTracker::Failed(CLIENT(3), i)); |
| EXPECT_EQ(mClient3->getLastError(), TranscodingErrorCode::kDroppedByService); |
| } |
| } |
| }; |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestRegisterNullClient) { |
| std::shared_ptr<ITranscodingClient> client; |
| |
| // Register the client with null callback. |
| Status status = mService->registerClient(nullptr, kClientName, kClientOpPackageName, &client); |
| EXPECT_FALSE(status.isOk()); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestRegisterClientWithInvalidClientName) { |
| std::shared_ptr<ITranscodingClient> client; |
| |
| // Register the client with the service. |
| Status status = mService->registerClient(mClient1, kInvalidClientName, |
| kInvalidClientOpPackageName, &client); |
| EXPECT_FALSE(status.isOk()); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestRegisterClientWithInvalidClientPackageName) { |
| std::shared_ptr<ITranscodingClient> client; |
| |
| // Register the client with the service. |
| Status status = |
| mService->registerClient(mClient1, kClientName, kInvalidClientOpPackageName, &client); |
| EXPECT_FALSE(status.isOk()); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestRegisterOneClient) { |
| std::shared_ptr<ITranscodingClient> client; |
| |
| Status status = mService->registerClient(mClient1, kClientName, kClientOpPackageName, &client); |
| EXPECT_TRUE(status.isOk()); |
| |
| // Validate the client. |
| EXPECT_TRUE(client != nullptr); |
| |
| // Check the number of Clients. |
| int32_t numOfClients; |
| status = mService->getNumOfClients(&numOfClients); |
| EXPECT_TRUE(status.isOk()); |
| EXPECT_GE(numOfClients, 1); |
| |
| // Unregister the client. |
| status = client->unregister(); |
| EXPECT_TRUE(status.isOk()); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestRegisterClientTwice) { |
| std::shared_ptr<ITranscodingClient> client; |
| |
| Status status = mService->registerClient(mClient1, kClientName, kClientOpPackageName, &client); |
| EXPECT_TRUE(status.isOk()); |
| |
| // Validate the client. |
| EXPECT_TRUE(client != nullptr); |
| |
| // Register the client again and expects failure. |
| std::shared_ptr<ITranscodingClient> client1; |
| status = mService->registerClient(mClient1, kClientName, kClientOpPackageName, &client1); |
| EXPECT_FALSE(status.isOk()); |
| |
| // Unregister the client. |
| status = client->unregister(); |
| EXPECT_TRUE(status.isOk()); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestRegisterMultipleClients) { |
| registerMultipleClients(); |
| unregisterMultipleClients(); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestSessionIdIndependence) { |
| registerMultipleClients(); |
| |
| // Submit 2 requests on client1 first. |
| EXPECT_TRUE(mClient1->submit(0, "test_source_file", "test_destination_file")); |
| EXPECT_TRUE(mClient1->submit(1, "test_source_file", "test_destination_file")); |
| |
| // Submit 2 requests on client2, sessionId should be independent for each client. |
| EXPECT_TRUE(mClient2->submit(0, "test_source_file", "test_destination_file")); |
| EXPECT_TRUE(mClient2->submit(1, "test_source_file", "test_destination_file")); |
| |
| // Cancel all sessions. |
| EXPECT_TRUE(mClient1->cancel(0)); |
| EXPECT_TRUE(mClient1->cancel(1)); |
| EXPECT_TRUE(mClient2->cancel(0)); |
| EXPECT_TRUE(mClient2->cancel(1)); |
| |
| unregisterMultipleClients(); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestSubmitCancelSessions) { |
| registerMultipleClients(); |
| |
| // Test sessionId assignment. |
| EXPECT_TRUE(mClient1->submit(0, "test_source_file_0", "test_destination_file")); |
| EXPECT_TRUE(mClient1->submit(1, "test_source_file_1", "test_destination_file")); |
| EXPECT_TRUE(mClient1->submit(2, "test_source_file_2", "test_destination_file")); |
| |
| // Test submit bad request (no valid sourceFilePath) fails. |
| EXPECT_TRUE(mClient1->submit<fail>(0, "", "")); |
| |
| // Test submit bad request (no valid sourceFilePath) fails. |
| EXPECT_TRUE(mClient1->submit<fail>(0, "src", "dst", TranscodingSessionPriority::kNormal, |
| 1000000, kInvalidClientPid, kInvalidClientUid)); |
| |
| // Test cancel non-existent session fails. |
| EXPECT_TRUE(mClient1->cancel<fail>(100)); |
| |
| // Session 0 should start immediately and finish in 2 seconds, followed by Session 1 start. |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 0)); |
| EXPECT_EQ(mClient1->pop(kSessionWithPaddingUs), EventTracker::Finished(CLIENT(1), 0)); |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 1)); |
| |
| // Test cancel valid sessionId in random order. |
| // Test cancel finished session fails. |
| EXPECT_TRUE(mClient1->cancel(2)); |
| EXPECT_TRUE(mClient1->cancel<fail>(0)); |
| EXPECT_TRUE(mClient1->cancel(1)); |
| |
| // Test cancel session again fails. |
| EXPECT_TRUE(mClient1->cancel<fail>(1)); |
| |
| // Test no more events arriving after cancel. |
| EXPECT_EQ(mClient1->pop(kSessionWithPaddingUs), EventTracker::NoEvent); |
| |
| unregisterMultipleClients(); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestGetSessions) { |
| registerMultipleClients(); |
| |
| // Submit 3 requests. |
| EXPECT_TRUE(mClient1->submit(0, "test_source_file_0", "test_destination_file_0")); |
| EXPECT_TRUE(mClient1->submit(1, "test_source_file_1", "test_destination_file_1")); |
| EXPECT_TRUE(mClient1->submit(2, "test_source_file_2", "test_destination_file_2")); |
| |
| // Test get sessions by id. |
| EXPECT_TRUE(mClient1->getSession(2, "test_source_file_2", "test_destination_file_2")); |
| EXPECT_TRUE(mClient1->getSession(1, "test_source_file_1", "test_destination_file_1")); |
| EXPECT_TRUE(mClient1->getSession(0, "test_source_file_0", "test_destination_file_0")); |
| |
| // Test get session by invalid id fails. |
| EXPECT_TRUE(mClient1->getSession<fail>(100, "", "")); |
| EXPECT_TRUE(mClient1->getSession<fail>(-1, "", "")); |
| |
| // Test get session after cancel fails. |
| EXPECT_TRUE(mClient1->cancel(2)); |
| EXPECT_TRUE(mClient1->getSession<fail>(2, "", "")); |
| |
| // Session 0 should start immediately and finish in 2 seconds, followed by Session 1 start. |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 0)); |
| EXPECT_EQ(mClient1->pop(kSessionWithPaddingUs), EventTracker::Finished(CLIENT(1), 0)); |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 1)); |
| |
| // Test get session after finish fails. |
| EXPECT_TRUE(mClient1->getSession<fail>(0, "", "")); |
| |
| // Test get the remaining session 1. |
| EXPECT_TRUE(mClient1->getSession(1, "test_source_file_1", "test_destination_file_1")); |
| |
| // Cancel remaining session 1. |
| EXPECT_TRUE(mClient1->cancel(1)); |
| |
| unregisterMultipleClients(); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestAddGetClientUids) { |
| registerMultipleClients(); |
| |
| std::vector<int32_t> clientUids; |
| TranscodingRequestParcel request; |
| TranscodingSessionParcel session; |
| uid_t ownUid = ::getuid(); |
| |
| // Submit one real-time session. |
| EXPECT_TRUE(mClient1->submit(0, "test_source_file_0", "test_destination_file")); |
| |
| // Should have mClientUid in client uid list. |
| EXPECT_TRUE(mClient1->getClientUids(0, &clientUids)); |
| EXPECT_EQ(clientUids.size(), 1u); |
| EXPECT_EQ(clientUids[0], (int32_t)mClient1->mClientUid); |
| |
| // Adding invalid client uid should fail. |
| EXPECT_TRUE(mClient1->addClientUid<fail>(0, kInvalidClientUid)); |
| |
| // Adding mClientUid again should fail. |
| EXPECT_TRUE(mClient1->addClientUid<fail>(0, mClient1->mClientUid)); |
| |
| // Submit one offline session. |
| EXPECT_TRUE(mClient1->submit(1, "test_source_file_1", "test_destination_file_1", |
| TranscodingSessionPriority::kUnspecified)); |
| |
| // Should not have any uids in client uid list. |
| EXPECT_TRUE(mClient1->getClientUids(1, &clientUids)); |
| EXPECT_EQ(clientUids.size(), 0u); |
| |
| // Add own uid (with IMediaTranscodingService::USE_CALLING_UID), should succeed. |
| EXPECT_TRUE(mClient1->addClientUid(1, IMediaTranscodingService::USE_CALLING_UID)); |
| EXPECT_TRUE(mClient1->getClientUids(1, &clientUids)); |
| EXPECT_EQ(clientUids.size(), 1u); |
| EXPECT_EQ(clientUids[0], (int32_t)ownUid); |
| |
| // Adding mClientUid should succeed. |
| EXPECT_TRUE(mClient1->addClientUid(1, mClient1->mClientUid)); |
| EXPECT_TRUE(mClient1->getClientUids(1, &clientUids)); |
| std::unordered_set<uid_t> uidSet; |
| uidSet.insert(clientUids.begin(), clientUids.end()); |
| EXPECT_EQ(uidSet.size(), 2u); |
| EXPECT_EQ(uidSet.count(ownUid), 1u); |
| EXPECT_EQ(uidSet.count(mClient1->mClientUid), 1u); |
| |
| unregisterMultipleClients(); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestSubmitCancelWithOfflineSessions) { |
| registerMultipleClients(); |
| |
| // Submit some offline sessions first. |
| EXPECT_TRUE(mClient1->submit(0, "test_source_file_0", "test_destination_file_0", |
| TranscodingSessionPriority::kUnspecified)); |
| EXPECT_TRUE(mClient1->submit(1, "test_source_file_1", "test_destination_file_1", |
| TranscodingSessionPriority::kUnspecified)); |
| |
| // Session 0 should start immediately. |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 0)); |
| |
| // Submit more real-time sessions. |
| EXPECT_TRUE(mClient1->submit(2, "test_source_file_2", "test_destination_file_2")); |
| EXPECT_TRUE(mClient1->submit(3, "test_source_file_3", "test_destination_file_3")); |
| |
| // Session 0 should pause immediately and session 2 should start. |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Pause(CLIENT(1), 0)); |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 2)); |
| |
| // Session 2 should finish in 2 seconds and session 3 should start. |
| EXPECT_EQ(mClient1->pop(kSessionWithPaddingUs), EventTracker::Finished(CLIENT(1), 2)); |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 3)); |
| |
| // Cancel session 3 now |
| EXPECT_TRUE(mClient1->cancel(3)); |
| |
| // Session 0 should resume and finish in 2 seconds, followed by session 1 start. |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Resume(CLIENT(1), 0)); |
| EXPECT_EQ(mClient1->pop(kSessionWithPaddingUs), EventTracker::Finished(CLIENT(1), 0)); |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 1)); |
| |
| // Cancel remaining session 1. |
| EXPECT_TRUE(mClient1->cancel(1)); |
| |
| unregisterMultipleClients(); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestClientUseAfterUnregister) { |
| std::shared_ptr<ITranscodingClient> client; |
| |
| // Register a client, then unregister. |
| Status status = mService->registerClient(mClient1, kClientName, kClientOpPackageName, &client); |
| EXPECT_TRUE(status.isOk()); |
| |
| status = client->unregister(); |
| EXPECT_TRUE(status.isOk()); |
| |
| // Test various operations on the client, should fail with ERROR_DISCONNECTED. |
| TranscodingSessionParcel session; |
| bool result; |
| status = client->getSessionWithId(0, &session, &result); |
| EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED); |
| |
| status = client->cancelSession(0, &result); |
| EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED); |
| |
| TranscodingRequestParcel request; |
| status = client->submitRequest(request, &session, &result); |
| EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestTranscodingUidPolicy) { |
| ALOGD("TestTranscodingUidPolicy starting..."); |
| |
| EXPECT_TRUE(ShellHelper::RunCmd("input keyevent KEYCODE_WAKEUP")); |
| EXPECT_TRUE(ShellHelper::RunCmd("wm dismiss-keyguard")); |
| EXPECT_TRUE(ShellHelper::Stop(kClientPackageA)); |
| EXPECT_TRUE(ShellHelper::Stop(kClientPackageB)); |
| EXPECT_TRUE(ShellHelper::Stop(kClientPackageC)); |
| |
| registerMultipleClients(); |
| |
| ALOGD("Moving app A to top..."); |
| EXPECT_TRUE(ShellHelper::Start(kClientPackageA, kTestActivityName)); |
| |
| // Submit 3 requests. |
| ALOGD("Submitting session to client1 (app A) ..."); |
| EXPECT_TRUE(mClient1->submit(0, "test_source_file_0", "test_destination_file_0")); |
| EXPECT_TRUE(mClient1->submit(1, "test_source_file_1", "test_destination_file_1")); |
| EXPECT_TRUE(mClient1->submit(2, "test_source_file_2", "test_destination_file_2")); |
| |
| // Session 0 should start immediately. |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 0)); |
| |
| ALOGD("Moving app B to top..."); |
| EXPECT_TRUE(ShellHelper::Start(kClientPackageB, kTestActivityName)); |
| |
| // Session 0 should continue and finish in 2 seconds, then session 1 should start. |
| EXPECT_EQ(mClient1->pop(kSessionWithPaddingUs), EventTracker::Finished(CLIENT(1), 0)); |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 1)); |
| |
| ALOGD("Submitting session to client2 (app B) ..."); |
| EXPECT_TRUE(mClient2->submit(0, "test_source_file_0", "test_destination_file_0")); |
| |
| // Client1's session should pause, client2's session should start. |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Pause(CLIENT(1), 1)); |
| EXPECT_EQ(mClient2->pop(kPaddingUs), EventTracker::Start(CLIENT(2), 0)); |
| |
| ALOGD("Moving app A back to top..."); |
| EXPECT_TRUE(ShellHelper::Start(kClientPackageA, kTestActivityName)); |
| |
| // Client2's session should pause, client1's session 1 should resume. |
| EXPECT_EQ(mClient2->pop(kPaddingUs), EventTracker::Pause(CLIENT(2), 0)); |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Resume(CLIENT(1), 1)); |
| |
| // Client2's session 1 should finish in 2 seconds, then its session 2 should start. |
| EXPECT_EQ(mClient1->pop(kSessionWithPaddingUs), EventTracker::Finished(CLIENT(1), 1)); |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 2)); |
| |
| // After client2's sessions finish, client1's session should resume. |
| EXPECT_EQ(mClient1->pop(kSessionWithPaddingUs), EventTracker::Finished(CLIENT(1), 2)); |
| EXPECT_EQ(mClient2->pop(kPaddingUs), EventTracker::Resume(CLIENT(2), 0)); |
| |
| unregisterMultipleClients(); |
| |
| EXPECT_TRUE(ShellHelper::Stop(kClientPackageA)); |
| EXPECT_TRUE(ShellHelper::Stop(kClientPackageB)); |
| EXPECT_TRUE(ShellHelper::Stop(kClientPackageC)); |
| |
| ALOGD("TestTranscodingUidPolicy finished."); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestTranscodingUidPolicyWithMultipleClientUids) { |
| ALOGD("TestTranscodingUidPolicyWithMultipleClientUids starting..."); |
| |
| EXPECT_TRUE(ShellHelper::RunCmd("input keyevent KEYCODE_WAKEUP")); |
| EXPECT_TRUE(ShellHelper::RunCmd("wm dismiss-keyguard")); |
| EXPECT_TRUE(ShellHelper::Stop(kClientPackageA)); |
| EXPECT_TRUE(ShellHelper::Stop(kClientPackageB)); |
| EXPECT_TRUE(ShellHelper::Stop(kClientPackageC)); |
| |
| registerMultipleClients(); |
| |
| ALOGD("Moving app A to top..."); |
| EXPECT_TRUE(ShellHelper::Start(kClientPackageA, kTestActivityName)); |
| |
| // Submit 3 requests. |
| ALOGD("Submitting session to client1 (app A)..."); |
| EXPECT_TRUE(mClient1->submit(0, "test_source_file_0", "test_destination_file_0")); |
| EXPECT_TRUE(mClient1->submit(1, "test_source_file_1", "test_destination_file_1")); |
| EXPECT_TRUE(mClient1->submit(2, "test_source_file_2", "test_destination_file_2")); |
| |
| // mClient1's Session 0 should start immediately. |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 0)); |
| |
| // Add client2 (app B)'s uid to mClient1's session 1. |
| EXPECT_TRUE(mClient1->addClientUid(1, mClient2->mClientUid)); |
| |
| ALOGD("Moving app B to top..."); |
| EXPECT_TRUE(ShellHelper::Start(kClientPackageB, kTestActivityName)); |
| |
| // mClient1's session 0 should pause, session 1 should start. |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Pause(CLIENT(1), 0)); |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 1)); |
| |
| ALOGD("Moving app A back to top..."); |
| EXPECT_TRUE(ShellHelper::Start(kClientPackageA, kTestActivityName)); |
| EXPECT_EQ(mClient1->pop(kSessionWithPaddingUs), EventTracker::Finished(CLIENT(1), 1)); |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Resume(CLIENT(1), 0)); |
| |
| unregisterMultipleClients(); |
| |
| EXPECT_TRUE(ShellHelper::Stop(kClientPackageA)); |
| EXPECT_TRUE(ShellHelper::Stop(kClientPackageB)); |
| EXPECT_TRUE(ShellHelper::Stop(kClientPackageC)); |
| |
| ALOGD("TestTranscodingUidPolicyWithMultipleClientUids finished."); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestTranscodingThermalPolicy) { |
| ALOGD("TestTranscodingThermalPolicy starting..."); |
| |
| registerMultipleClients(); |
| |
| // Submit request, should start immediately. |
| EXPECT_TRUE(mClient1->submit(0, "test_source_file_0", "test_destination_file_0")); |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 0)); |
| |
| // Now, simulate thermal status change by adb cmd. The status code is as defined in |
| // frameworks/native/include/android/thermal.h. |
| // ATHERMAL_STATUS_SEVERE(3): should start throttling. |
| EXPECT_TRUE(ShellHelper::RunCmd("cmd thermalservice override-status 3")); |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Pause(CLIENT(1), 0)); |
| |
| // ATHERMAL_STATUS_CRITICAL(4): shouldn't start throttling again (already started). |
| EXPECT_TRUE(ShellHelper::RunCmd("cmd thermalservice override-status 4")); |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::NoEvent); |
| |
| // ATHERMAL_STATUS_MODERATE(2): should stop throttling. |
| EXPECT_TRUE(ShellHelper::RunCmd("cmd thermalservice override-status 2")); |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Resume(CLIENT(1), 0)); |
| |
| // ATHERMAL_STATUS_LIGHT(1): shouldn't stop throttling again (already stopped). |
| EXPECT_TRUE(ShellHelper::RunCmd("cmd thermalservice override-status 1")); |
| EXPECT_EQ(mClient1->pop(kSessionWithPaddingUs), EventTracker::Finished(CLIENT(1), 0)); |
| |
| unregisterMultipleClients(); |
| |
| ALOGD("TestTranscodingThermalPolicy finished."); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestTranscodingWatchdog) { |
| ALOGD("TestTranscodingWatchdog starting..."); |
| |
| registerMultipleClients(); |
| |
| // SimulatedTranscoder itself does not send heartbeat. Its sessions last 1sec |
| // by default, so timeout will not happen normally. |
| // Here we run a session of 4000ms with TranscodingTestConfig. This will trigger |
| // a watchdog timeout on server side. We use it to check that error code is correct. |
| EXPECT_TRUE(mClient1->submit( |
| 0, "test_source_file_0", "test_destination_file_0", TranscodingSessionPriority::kNormal, |
| -1 /*bitrateBps*/, -1 /*overridePid*/, -1 /*overrideUid*/, 4000 /*sessionDurationMs*/)); |
| EXPECT_EQ(mClient1->pop(100000), EventTracker::Start(CLIENT(1), 0)); |
| EXPECT_EQ(mClient1->pop(kWatchdogTimeoutUs - 100000), EventTracker::NoEvent); |
| EXPECT_EQ(mClient1->pop(200000), EventTracker::Failed(CLIENT(1), 0)); |
| EXPECT_EQ(mClient1->getLastError(), TranscodingErrorCode::kWatchdogTimeout); |
| |
| // After the timeout, submit another request and check it's finished. |
| EXPECT_TRUE(mClient1->submit(1, "test_source_file_1", "test_destination_file_1")); |
| EXPECT_EQ(mClient1->pop(kPaddingUs), EventTracker::Start(CLIENT(1), 1)); |
| EXPECT_EQ(mClient1->pop(kSessionWithPaddingUs), EventTracker::Finished(CLIENT(1), 1)); |
| |
| unregisterMultipleClients(); |
| |
| ALOGD("TestTranscodingWatchdog finished."); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestTranscodingPacerOverCountQuotaOnly) { |
| ALOGD("TestTranscodingPacerOverCountQuotaOnly starting..."); |
| |
| registerMultipleClients(); |
| testPacerHelper(12 /*numSubmits*/, 100 /*sessionDurationMs*/, 12 /*expectedSuccess*/); |
| unregisterMultipleClients(); |
| |
| ALOGD("TestTranscodingPacerOverCountQuotaOnly finished."); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestTranscodingPacerOverTimeQuotaOnly) { |
| ALOGD("TestTranscodingPacerOverTimeQuotaOnly starting..."); |
| |
| registerMultipleClients(); |
| testPacerHelper(5 /*numSubmits*/, 1000 /*sessionDurationMs*/, 5 /*expectedSuccess*/); |
| unregisterMultipleClients(); |
| |
| ALOGD("TestTranscodingPacerOverTimeQuotaOnly finished."); |
| } |
| |
| TEST_F(MediaTranscodingServiceSimulatedTest, TestTranscodingPacerOverQuota) { |
| ALOGD("TestTranscodingPacerOverQuota starting..."); |
| |
| registerMultipleClients(); |
| testPacerHelper(12 /*numSubmits*/, 400 /*sessionDurationMs*/, 10 /*expectedSuccess*/); |
| unregisterMultipleClients(); |
| |
| // Idle to clear out burst history. Since we expect it to actually fail, wait for cooldown. |
| ALOGD("TestTranscodingPacerOverQuota finished."); |
| } |
| |
| } // namespace media |
| } // namespace android |