transcoding: remove realtime jobs when a client is removed

Also disallow usage of the client after unregister.

bug: 154734285
test: unit testing
Change-Id: Ib5d54a897c7e56d42d27645fa55ab6f21f435b5e
diff --git a/media/libmediatranscoding/tests/TranscodingClientManager_tests.cpp b/media/libmediatranscoding/tests/TranscodingClientManager_tests.cpp
index 6204f47..d9504ca 100644
--- a/media/libmediatranscoding/tests/TranscodingClientManager_tests.cpp
+++ b/media/libmediatranscoding/tests/TranscodingClientManager_tests.cpp
@@ -39,6 +39,7 @@
 using ::aidl::android::media::IMediaTranscodingService;
 using ::aidl::android::media::TranscodingErrorCode;
 using ::aidl::android::media::TranscodingJobParcel;
+using ::aidl::android::media::TranscodingJobPriority;
 using ::aidl::android::media::TranscodingRequestParcel;
 using ::aidl::android::media::TranscodingResultParcel;
 
@@ -51,6 +52,8 @@
 constexpr const char* kClientName = "TestClientName";
 constexpr const char* kClientPackage = "TestClientPackage";
 
+#define JOB(n) (n)
+
 struct TestClientCallback : public BnTranscodingClientCallback {
     TestClientCallback() { ALOGI("TestClientCallback Created"); }
 
@@ -261,7 +264,7 @@
     std::shared_ptr<ITranscodingClient> client;
     status_t err = mClientManager->addClient(nullptr, kClientPid, kClientUid, kClientName,
                                              kClientPackage, &client);
-    EXPECT_EQ(err, BAD_VALUE);
+    EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
 }
 
 TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPid) {
@@ -269,7 +272,7 @@
     std::shared_ptr<ITranscodingClient> client;
     status_t err = mClientManager->addClient(mClientCallback1, kInvalidClientPid, kClientUid,
                                              kClientName, kClientPackage, &client);
-    EXPECT_EQ(err, BAD_VALUE);
+    EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
 }
 
 TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientName) {
@@ -277,7 +280,7 @@
     std::shared_ptr<ITranscodingClient> client;
     status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid,
                                              kInvalidClientName, kClientPackage, &client);
-    EXPECT_EQ(err, BAD_VALUE);
+    EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
 }
 
 TEST_F(TranscodingClientManagerTest, TestAddingWithInvalidClientPackageName) {
@@ -285,7 +288,7 @@
     std::shared_ptr<ITranscodingClient> client;
     status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
                                              kInvalidClientPackage, &client);
-    EXPECT_EQ(err, BAD_VALUE);
+    EXPECT_EQ(err, IMediaTranscodingService::ERROR_ILLEGAL_ARGUMENT);
 }
 
 TEST_F(TranscodingClientManagerTest, TestAddingValidClient) {
@@ -314,7 +317,7 @@
     std::shared_ptr<ITranscodingClient> dupClient;
     err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, "dupClient",
                                     "dupPackage", &dupClient);
-    EXPECT_EQ(err, ALREADY_EXISTS);
+    EXPECT_EQ(err, IMediaTranscodingService::ERROR_ALREADY_EXISTS);
     EXPECT_EQ(dupClient.get(), nullptr);
     EXPECT_EQ(mClientManager->getNumOfClients(), 1);
 
@@ -348,17 +351,17 @@
     bool result;
     EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
     EXPECT_TRUE(result);
-    EXPECT_EQ(job.jobId, 0);
+    EXPECT_EQ(job.jobId, JOB(0));
 
     request.fileName = "test_file_1";
     EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
     EXPECT_TRUE(result);
-    EXPECT_EQ(job.jobId, 1);
+    EXPECT_EQ(job.jobId, JOB(1));
 
     request.fileName = "test_file_2";
     EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
     EXPECT_TRUE(result);
-    EXPECT_EQ(job.jobId, 2);
+    EXPECT_EQ(job.jobId, JOB(2));
 
     // Test submit bad request (no valid fileName) fails.
     TranscodingRequestParcel badRequest;
@@ -367,45 +370,45 @@
     EXPECT_FALSE(result);
 
     // Test get jobs by id.
-    EXPECT_TRUE(mClient1->getJobWithId(2, &job, &result).isOk());
-    EXPECT_EQ(job.jobId, 2);
+    EXPECT_TRUE(mClient1->getJobWithId(JOB(2), &job, &result).isOk());
+    EXPECT_EQ(job.jobId, JOB(2));
     EXPECT_EQ(job.request.fileName, "test_file_2");
     EXPECT_TRUE(result);
 
     // Test get jobs by invalid id fails.
-    EXPECT_TRUE(mClient1->getJobWithId(100, &job, &result).isOk());
+    EXPECT_TRUE(mClient1->getJobWithId(JOB(100), &job, &result).isOk());
     EXPECT_FALSE(result);
 
     // Test cancel non-existent job fail.
-    EXPECT_TRUE(mClient2->cancelJob(100, &result).isOk());
+    EXPECT_TRUE(mClient2->cancelJob(JOB(100), &result).isOk());
     EXPECT_FALSE(result);
 
     // Test cancel valid jobId in arbitrary order.
-    EXPECT_TRUE(mClient1->cancelJob(2, &result).isOk());
+    EXPECT_TRUE(mClient1->cancelJob(JOB(2), &result).isOk());
     EXPECT_TRUE(result);
 
-    EXPECT_TRUE(mClient1->cancelJob(0, &result).isOk());
+    EXPECT_TRUE(mClient1->cancelJob(JOB(0), &result).isOk());
     EXPECT_TRUE(result);
 
-    EXPECT_TRUE(mClient1->cancelJob(1, &result).isOk());
+    EXPECT_TRUE(mClient1->cancelJob(JOB(1), &result).isOk());
     EXPECT_TRUE(result);
 
     // Test cancel job again fails.
-    EXPECT_TRUE(mClient1->cancelJob(1, &result).isOk());
+    EXPECT_TRUE(mClient1->cancelJob(JOB(1), &result).isOk());
     EXPECT_FALSE(result);
 
     // Test get job after cancel fails.
-    EXPECT_TRUE(mClient1->getJobWithId(2, &job, &result).isOk());
+    EXPECT_TRUE(mClient1->getJobWithId(JOB(2), &job, &result).isOk());
     EXPECT_FALSE(result);
 
     // Test jobId independence for each client.
     EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
     EXPECT_TRUE(result);
-    EXPECT_EQ(job.jobId, 0);
+    EXPECT_EQ(job.jobId, JOB(0));
 
     EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
     EXPECT_TRUE(result);
-    EXPECT_EQ(job.jobId, 1);
+    EXPECT_EQ(job.jobId, JOB(1));
 
     unregisterMultipleClients();
 }
@@ -419,25 +422,25 @@
     bool result;
     EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
     EXPECT_TRUE(result);
-    EXPECT_EQ(job.jobId, 0);
+    EXPECT_EQ(job.jobId, JOB(0));
 
     mScheduler->finishLastJob();
     EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Finished(job.jobId));
 
     EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
     EXPECT_TRUE(result);
-    EXPECT_EQ(job.jobId, 1);
+    EXPECT_EQ(job.jobId, JOB(1));
 
     mScheduler->abortLastJob();
     EXPECT_EQ(mClientCallback1->popEvent(), TestClientCallback::Failed(job.jobId));
 
     EXPECT_TRUE(mClient1->submitRequest(request, &job, &result).isOk());
     EXPECT_TRUE(result);
-    EXPECT_EQ(job.jobId, 2);
+    EXPECT_EQ(job.jobId, JOB(2));
 
     EXPECT_TRUE(mClient2->submitRequest(request, &job, &result).isOk());
     EXPECT_TRUE(result);
-    EXPECT_EQ(job.jobId, 0);
+    EXPECT_EQ(job.jobId, JOB(0));
 
     mScheduler->finishLastJob();
     EXPECT_EQ(mClientCallback2->popEvent(), TestClientCallback::Finished(job.jobId));
@@ -445,4 +448,67 @@
     unregisterMultipleClients();
 }
 
+TEST_F(TranscodingClientManagerTest, TestUseAfterUnregister) {
+    // Add a client.
+    std::shared_ptr<ITranscodingClient> client;
+    status_t err = mClientManager->addClient(mClientCallback1, kClientPid, kClientUid, kClientName,
+                                             kClientPackage, &client);
+    EXPECT_EQ(err, OK);
+    EXPECT_NE(client.get(), nullptr);
+
+    // Submit 2 requests, 1 offline and 1 realtime.
+    TranscodingRequestParcel request;
+    TranscodingJobParcel job;
+    bool result;
+
+    request.fileName = "test_file_0";
+    request.priority = TranscodingJobPriority::kUnspecified;
+    EXPECT_TRUE(client->submitRequest(request, &job, &result).isOk() && result);
+    EXPECT_EQ(job.jobId, JOB(0));
+
+    request.fileName = "test_file_1";
+    request.priority = TranscodingJobPriority::kNormal;
+    EXPECT_TRUE(client->submitRequest(request, &job, &result).isOk() && result);
+    EXPECT_EQ(job.jobId, JOB(1));
+
+    // Unregister client, should succeed.
+    Status status = client->unregister();
+    EXPECT_TRUE(status.isOk());
+
+    // Test submit new request after unregister, should fail with ERROR_DISCONNECTED.
+    request.fileName = "test_file_2";
+    request.priority = TranscodingJobPriority::kNormal;
+    status = client->submitRequest(request, &job, &result);
+    EXPECT_FALSE(status.isOk());
+    EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
+
+    // Test cancel jobs after unregister, should fail with ERROR_DISCONNECTED
+    // regardless of realtime or offline job, or whether the jobId is valid.
+    status = client->cancelJob(JOB(0), &result);
+    EXPECT_FALSE(status.isOk());
+    EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
+
+    status = client->cancelJob(JOB(1), &result);
+    EXPECT_FALSE(status.isOk());
+    EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
+
+    status = client->cancelJob(JOB(2), &result);
+    EXPECT_FALSE(status.isOk());
+    EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
+
+    // Test get jobs, should fail with ERROR_DISCONNECTED regardless of realtime
+    // or offline job, or whether the jobId is valid.
+    status = client->getJobWithId(JOB(0), &job, &result);
+    EXPECT_FALSE(status.isOk());
+    EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
+
+    status = client->getJobWithId(JOB(1), &job, &result);
+    EXPECT_FALSE(status.isOk());
+    EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
+
+    status = client->getJobWithId(JOB(2), &job, &result);
+    EXPECT_FALSE(status.isOk());
+    EXPECT_EQ(status.getServiceSpecificError(), IMediaTranscodingService::ERROR_DISCONNECTED);
+}
+
 }  // namespace android