1f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman/*
2f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * Copyright (C) 2017 The Android Open Source Project
3f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman *
4f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * Licensed under the Apache License, Version 2.0 (the "License");
5f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * you may not use this file except in compliance with the License.
6f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * You may obtain a copy of the License at
7f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman *
8f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman *      http://www.apache.org/licenses/LICENSE-2.0
9f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman *
10f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * Unless required by applicable law or agreed to in writing, software
11f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * distributed under the License is distributed on an "AS IS" BASIS,
12f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * See the License for the specific language governing permissions and
14f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman * limitations under the License.
15f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman */
16f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
17f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#define LOG_TAG "mediacas_hidl_hal_test"
18f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
19f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <VtsHalHidlTargetTestBase.h>
20a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang#include <VtsHalHidlTargetTestEnvBase.h>
21f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <android-base/logging.h>
22f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <android/hardware/cas/1.0/ICas.h>
23f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <android/hardware/cas/1.0/ICasListener.h>
24f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <android/hardware/cas/1.0/IDescramblerBase.h>
25f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <android/hardware/cas/1.0/IMediaCasService.h>
260645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#include <android/hardware/cas/1.0/types.h>
270645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#include <android/hardware/cas/native/1.0/IDescrambler.h>
280645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#include <android/hardware/cas/native/1.0/types.h>
29704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang#include <binder/MemoryDealer.h>
30f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <hidl/HidlSupport.h>
31f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#include <hidl/HidlTransportSupport.h>
320645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#include <hidl/Status.h>
33d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang#include <hidlmemory/FrameworkUtils.h>
340645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#include <utils/Condition.h>
350645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#include <utils/Mutex.h>
36f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
37f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#define CLEAR_KEY_SYSTEM_ID 0xF6D8
38f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman#define INVALID_SYSTEM_ID 0
390645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#define WAIT_TIMEOUT 3000000000
400645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
410645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman#define PROVISION_STR                                      \
420645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    "{                                                   " \
430645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    "  \"id\": 21140844,                                 " \
440645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    "  \"name\": \"Test Title\",                         " \
450645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    "  \"lowercase_organization_name\": \"Android\",     " \
460645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    "  \"asset_key\": {                                  " \
470645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    "  \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\"  " \
480645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    "  },                                                " \
490645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    "  \"cas_type\": 1,                                  " \
500645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    "  \"track_types\": [ ]                              " \
510645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    "}                                                   "
52f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
53f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::Condition;
54f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::hardware::cas::V1_0::ICas;
55f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::hardware::cas::V1_0::ICasListener;
56f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::hardware::cas::V1_0::IDescramblerBase;
57d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhangusing android::hardware::cas::V1_0::Status;
580645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanusing android::hardware::cas::native::V1_0::IDescrambler;
590645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanusing android::hardware::cas::native::V1_0::SubSample;
600645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanusing android::hardware::cas::native::V1_0::SharedBuffer;
610645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanusing android::hardware::cas::native::V1_0::DestinationBuffer;
620645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanusing android::hardware::cas::native::V1_0::BufferType;
630645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanusing android::hardware::cas::native::V1_0::ScramblingControl;
64f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::hardware::cas::V1_0::IMediaCasService;
65f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::hardware::cas::V1_0::HidlCasPluginDescriptor;
66d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhangusing android::hardware::fromHeap;
67f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::hardware::hidl_vec;
680645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanusing android::hardware::hidl_string;
69d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhangusing android::hardware::HidlMemory;
70f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::hardware::Return;
71d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhangusing android::hardware::Void;
72704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhangusing android::IMemory;
73704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhangusing android::IMemoryHeap;
74704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhangusing android::MemoryDealer;
75f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::Mutex;
76f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanusing android::sp;
77f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
78f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramannamespace {
79f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
800645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanconst uint8_t kEcmBinaryBuffer[] = {
810645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x00, 0x00, 0x01, 0xf0, 0x00, 0x50, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, 0x00,
820645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x27, 0x10, 0x02, 0x00,
830645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x01, 0x77, 0x01, 0x42, 0x95, 0x6c, 0x0e, 0xe3, 0x91, 0xbc, 0xfd, 0x05, 0xb1, 0x60, 0x4f,
840645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x17, 0x82, 0xa4, 0x86, 0x9b, 0x23, 0x56, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
850645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x27, 0x10, 0x02, 0x00, 0x01, 0x77, 0x01, 0x42, 0x95, 0x6c, 0xd7, 0x43, 0x62, 0xf8, 0x1c,
860645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x62, 0x19, 0x05, 0xc7, 0x3a, 0x42, 0xcd, 0xfd, 0xd9, 0x13, 0x48,
870645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman};
880645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
890645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanconst SubSample kSubSamples[] = {{162, 0}, {0, 184}, {0, 184}};
900645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
910645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanconst uint8_t kInBinaryBuffer[] = {
920645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x00, 0x00, 0x00, 0x01, 0x09, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0xc0, 0x1e, 0xdb, 0x01,
930645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x40, 0x16, 0xec, 0x04, 0x40, 0x00, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x0f, 0x03, 0xc5, 0x8b,
940645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0xb8, 0x00, 0x00, 0x00, 0x01, 0x68, 0xca, 0x8c, 0xb2, 0x00, 0x00, 0x01, 0x06, 0x05, 0xff, 0xff,
950645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x70, 0xdc, 0x45, 0xe9, 0xbd, 0xe6, 0xd9, 0x48, 0xb7, 0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee,
960645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0xef, 0x78, 0x32, 0x36, 0x34, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x31, 0x34, 0x32,
970645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x20, 0x2d, 0x20, 0x48, 0x2e, 0x32, 0x36, 0x34, 0x2f, 0x4d, 0x50, 0x45, 0x47, 0x2d, 0x34, 0x20,
980645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x41, 0x56, 0x43, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x20, 0x2d, 0x20, 0x43, 0x6f, 0x70, 0x79,
990645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x6c, 0x65, 0x66, 0x74, 0x20, 0x32, 0x30, 0x30, 0x33, 0x2d, 0x32, 0x30, 0x31, 0x34, 0x20, 0x2d,
1000645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x69, 0x64, 0x65,
1010645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x6f, 0x6c, 0x61, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x78, 0x32, 0x36, 0x34, 0x2e, 0x68, 0x74,
1020645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x6d, 0x6c, 0x6e, 0x45, 0x21, 0x82, 0x38, 0xf0, 0x9d, 0x7d, 0x96, 0xe6, 0x94, 0xae, 0xe2, 0x87,
1030645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x8f, 0x04, 0x49, 0xe5, 0xf6, 0x8c, 0x8b, 0x9a, 0x10, 0x18, 0xba, 0x94, 0xe9, 0x22, 0x31, 0x04,
1040645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x7e, 0x60, 0x5b, 0xc4, 0x24, 0x00, 0x90, 0x62, 0x0d, 0xdc, 0x85, 0x74, 0x75, 0x78, 0xd0, 0x14,
1050645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x08, 0xcb, 0x02, 0x1d, 0x7d, 0x9d, 0x34, 0xe8, 0x81, 0xb9, 0xf7, 0x09, 0x28, 0x79, 0x29, 0x8d,
1060645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0xe3, 0x14, 0xed, 0x5f, 0xca, 0xaf, 0xf4, 0x1c, 0x49, 0x15, 0xe1, 0x80, 0x29, 0x61, 0x76, 0x80,
1070645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x43, 0xf8, 0x58, 0x53, 0x40, 0xd7, 0x31, 0x6d, 0x61, 0x81, 0x41, 0xe9, 0x77, 0x9f, 0x9c, 0xe1,
1080645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x6d, 0xf2, 0xee, 0xd9, 0xc8, 0x67, 0xd2, 0x5f, 0x48, 0x73, 0xe3, 0x5c, 0xcd, 0xa7, 0x45, 0x58,
1090645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0xbb, 0xdd, 0x28, 0x1d, 0x68, 0xfc, 0xb4, 0xc6, 0xf6, 0x92, 0xf6, 0x30, 0x03, 0xaa, 0xe4, 0x32,
1100645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0xf6, 0x34, 0x51, 0x4b, 0x0f, 0x8c, 0xf9, 0xac, 0x98, 0x22, 0xfb, 0x49, 0xc8, 0xbf, 0xca, 0x8c,
1110645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x80, 0x86, 0x5d, 0xd7, 0xa4, 0x52, 0xb1, 0xd9, 0xa6, 0x04, 0x4e, 0xb3, 0x2d, 0x1f, 0xb8, 0x35,
1120645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0xcc, 0x45, 0x6d, 0x9c, 0x20, 0xa7, 0xa4, 0x34, 0x59, 0x72, 0xe3, 0xae, 0xba, 0x49, 0xde, 0xd1,
1130645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0xaa, 0xee, 0x3d, 0x77, 0xfc, 0x5d, 0xc6, 0x1f, 0x9d, 0xac, 0xc2, 0x15, 0x66, 0xb8, 0xe1, 0x54,
1140645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x4e, 0x74, 0x93, 0xdb, 0x9a, 0x24, 0x15, 0x6e, 0x20, 0xa3, 0x67, 0x3e, 0x5a, 0x24, 0x41, 0x5e,
1150645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0xb0, 0xe6, 0x35, 0x87, 0x1b, 0xc8, 0x7a, 0xf9, 0x77, 0x65, 0xe0, 0x01, 0xf2, 0x4c, 0xe4, 0x2b,
1160645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0xa9, 0x64, 0x96, 0x96, 0x0b, 0x46, 0xca, 0xea, 0x79, 0x0e, 0x78, 0xa3, 0x5f, 0x43, 0xfc, 0x47,
1170645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x6a, 0x12, 0xfa, 0xc4, 0x33, 0x0e, 0x88, 0x1c, 0x19, 0x3a, 0x00, 0xc3, 0x4e, 0xb5, 0xd8, 0xfa,
1180645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x8e, 0xf1, 0xbc, 0x3d, 0xb2, 0x7e, 0x50, 0x8d, 0x67, 0xc3, 0x6b, 0xed, 0xe2, 0xea, 0xa6, 0x1f,
1190645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x25, 0x24, 0x7c, 0x94, 0x74, 0x50, 0x49, 0xe3, 0xc6, 0x58, 0x2e, 0xfd, 0x28, 0xb4, 0xc6, 0x73,
1200645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0xb1, 0x53, 0x74, 0x27, 0x94, 0x5c, 0xdf, 0x69, 0xb7, 0xa1, 0xd7, 0xf5, 0xd3, 0x8a, 0x2c, 0x2d,
1210645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0xb4, 0x5e, 0x8a, 0x16, 0x14, 0x54, 0x64, 0x6e, 0x00, 0x6b, 0x11, 0x59, 0x8a, 0x63, 0x38, 0x80,
1220645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x76, 0xc3, 0xd5, 0x59, 0xf7, 0x3f, 0xd2, 0xfa, 0xa5, 0xca, 0x82, 0xff, 0x4a, 0x62, 0xf0, 0xe3,
1230645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x42, 0xf9, 0x3b, 0x38, 0x27, 0x8a, 0x89, 0xaa, 0x50, 0x55, 0x4b, 0x29, 0xf1, 0x46, 0x7c, 0x75,
1240645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0xef, 0x65, 0xaf, 0x9b, 0x0d, 0x6d, 0xda, 0x25, 0x94, 0x14, 0xc1, 0x1b, 0xf0, 0xc5, 0x4c, 0x24,
1250645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x0e, 0x65,
1260645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman};
1270645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
1280645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanconst uint8_t kOutRefBinaryBuffer[] = {
1290645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x00, 0x00, 0x00, 0x01, 0x09, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0xc0, 0x1e, 0xdb, 0x01,
1300645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x40, 0x16, 0xec, 0x04, 0x40, 0x00, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x0f, 0x03, 0xc5, 0x8b,
1310645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0xb8, 0x00, 0x00, 0x00, 0x01, 0x68, 0xca, 0x8c, 0xb2, 0x00, 0x00, 0x01, 0x06, 0x05, 0xff, 0xff,
1320645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x70, 0xdc, 0x45, 0xe9, 0xbd, 0xe6, 0xd9, 0x48, 0xb7, 0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee,
1330645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0xef, 0x78, 0x32, 0x36, 0x34, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x31, 0x34, 0x32,
1340645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x20, 0x2d, 0x20, 0x48, 0x2e, 0x32, 0x36, 0x34, 0x2f, 0x4d, 0x50, 0x45, 0x47, 0x2d, 0x34, 0x20,
1350645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x41, 0x56, 0x43, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x20, 0x2d, 0x20, 0x43, 0x6f, 0x70, 0x79,
1360645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x6c, 0x65, 0x66, 0x74, 0x20, 0x32, 0x30, 0x30, 0x33, 0x2d, 0x32, 0x30, 0x31, 0x34, 0x20, 0x2d,
1370645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x69, 0x64, 0x65,
1380645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x6f, 0x6c, 0x61, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x78, 0x32, 0x36, 0x34, 0x2e, 0x68, 0x74,
1390645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x6d, 0x6c, 0x20, 0x2d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x20, 0x63, 0x61,
1400645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x62, 0x61, 0x63, 0x3d, 0x30, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x32, 0x20, 0x64, 0x65, 0x62, 0x6c,
1410645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x6f, 0x63, 0x6b, 0x3d, 0x31, 0x3a, 0x30, 0x3a, 0x30, 0x20, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73,
1420645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x65, 0x3d, 0x30, 0x78, 0x31, 0x3a, 0x30, 0x78, 0x31, 0x31, 0x31, 0x20, 0x6d, 0x65, 0x3d, 0x68,
1430645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x6d, 0x65, 0x3d, 0x37, 0x20, 0x70, 0x73, 0x79, 0x3d, 0x31,
1440645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x20, 0x70, 0x73, 0x79, 0x5f, 0x72, 0x64, 0x3d, 0x31, 0x2e, 0x30, 0x30, 0x3a, 0x30, 0x2e, 0x30,
1450645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x30, 0x20, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x66, 0x3d, 0x31, 0x20, 0x6d, 0x65,
1460645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x31, 0x36, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x61,
1470645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x5f, 0x6d, 0x65, 0x3d, 0x31, 0x20, 0x74, 0x72, 0x65, 0x6c, 0x6c, 0x69, 0x73, 0x3d, 0x31, 0x20,
1480645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x38, 0x78, 0x38, 0x64, 0x63, 0x74, 0x3d, 0x30, 0x20, 0x63, 0x71, 0x6d, 0x3d, 0x30, 0x20, 0x64,
1490645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x65, 0x61, 0x64, 0x7a, 0x6f, 0x6e, 0x65, 0x3d, 0x32, 0x31, 0x2c, 0x31, 0x31, 0x20, 0x66, 0x61,
1500645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x73, 0x74, 0x5f, 0x70, 0x73, 0x6b, 0x69, 0x70, 0x3d, 0x31, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d,
1510645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x61, 0x5f, 0x71, 0x70, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x2d, 0x32, 0x20, 0x74,
1520645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3d, 0x36, 0x30, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x61, 0x68,
1530645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x65, 0x61, 0x64, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3d, 0x35, 0x20, 0x73, 0x6c,
1540645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x69, 0x63, 0x65, 0x64, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3d, 0x30, 0x20, 0x6e,
1550645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x72, 0x3d, 0x30, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x3d, 0x31, 0x20, 0x69,
1560645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x6e, 0x74, 0x65, 0x72, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x3d, 0x30, 0x20, 0x62, 0x6c, 0x75, 0x72,
1570645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x61, 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x3d, 0x30, 0x20, 0x63, 0x6f, 0x6e, 0x73,
1580645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x74, 0x72, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x3d, 0x30, 0x20,
1590645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x62, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x3d, 0x30, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74,
1600645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x70, 0x3d, 0x30, 0x20, 0x6b, 0x65, 0x79, 0x69, 0x6e, 0x74, 0x3d, 0x32, 0x35, 0x30, 0x20, 0x6b,
1610645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x65, 0x79, 0x69, 0x6e, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x3d, 0x32, 0x35, 0x20, 0x73, 0x63, 0x65,
1620645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    0x6e, 0x65,
1630645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman};
1640645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
1650645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanclass MediaCasListener : public ICasListener {
1660645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman   public:
1670645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    virtual Return<void> onEvent(int32_t event, int32_t arg,
1680645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman                                 const hidl_vec<uint8_t>& data) override {
1690645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        android::Mutex::Autolock autoLock(mMsgLock);
1700645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        mEvent = event;
1710645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        mEventArg = arg;
1720645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        mEventData = data;
1730645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
1740645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        mEventReceived = true;
1750645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        mMsgCondition.signal();
1760645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        return Void();
1770645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    }
1780645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
1790645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    void testEventEcho(sp<ICas>& mediaCas, int32_t& event, int32_t& eventArg,
1800645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman                       hidl_vec<uint8_t>& eventData);
1810645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
1820645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman   private:
1830645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    int32_t mEvent = -1;
1840645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    int32_t mEventArg = -1;
1850645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    bool mEventReceived = false;
1860645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidl_vec<uint8_t> mEventData;
1870645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    android::Mutex mMsgLock;
1880645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    android::Condition mMsgCondition;
1890645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman};
1900645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
1910645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaramanvoid MediaCasListener::testEventEcho(sp<ICas>& mediaCas, int32_t& event, int32_t& eventArg,
1920645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman                                     hidl_vec<uint8_t>& eventData) {
1930645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    mEventReceived = false;
1940645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    auto returnStatus = mediaCas->sendEvent(event, eventArg, eventData);
1950645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
1960645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
1970645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
1980645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    android::Mutex::Autolock autoLock(mMsgLock);
1990645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    while (!mEventReceived) {
2000645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        if (-ETIMEDOUT == mMsgCondition.waitRelative(mMsgLock, WAIT_TIMEOUT)) {
2010645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman            EXPECT_TRUE(false) << "event not received within timeout";
2020645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman            return;
2030645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        }
2040645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    }
2050645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
2060645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(mEvent, event);
2070645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(mEventArg, eventArg);
2080645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(mEventData == eventData);
2090645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman}
2100645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
211a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang// Test environment for Cas HIDL HAL.
212a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhangclass CasHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
213a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang   public:
214a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang    // get the test environment singleton
215a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang    static CasHidlEnvironment* Instance() {
216a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang        static CasHidlEnvironment* instance = new CasHidlEnvironment;
217a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang        return instance;
218a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang    }
219a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang
220a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang    virtual void registerTestServices() override { registerTestService<IMediaCasService>(); }
221a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang};
222a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang
223f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanclass MediaCasHidlTest : public ::testing::VtsHalHidlTargetTestBase {
224f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman   public:
225f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    virtual void SetUp() override {
226a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang        mService = ::testing::VtsHalHidlTargetTestBase::getService<IMediaCasService>(
227a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang            CasHidlEnvironment::Instance()->getServiceName<IMediaCasService>());
228f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman        ASSERT_NE(mService, nullptr);
229f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    }
230f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
231f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    sp<IMediaCasService> mService;
232f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
233f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman   protected:
234f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    static void description(const std::string& description) {
235f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman        RecordProperty("description", description);
236f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    }
2370645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
2380645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    sp<ICas> mMediaCas;
2390645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    sp<IDescramblerBase> mDescramblerBase;
2400645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    sp<MediaCasListener> mCasListener;
24195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    typedef struct _OobInputTestParams {
24295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        const SubSample* subSamples;
24395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        uint32_t numSubSamples;
24495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        size_t imemSizeActual;
24595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        uint64_t imemOffset;
24695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        uint64_t imemSize;
24795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        uint64_t srcOffset;
24895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        uint64_t dstOffset;
24995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    } OobInputTestParams;
2500645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
2510645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    ::testing::AssertionResult createCasPlugin(int32_t caSystemId);
2520645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    ::testing::AssertionResult openCasSession(std::vector<uint8_t>* sessionId);
25395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    ::testing::AssertionResult descrambleTestInputBuffer(
25495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            const sp<IDescrambler>& descrambler,
25595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            Status* descrambleStatus,
25695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            sp<IMemory>* hidlInMemory);
25795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    ::testing::AssertionResult descrambleTestOobInput(
25895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            const sp<IDescrambler>& descrambler,
25995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            Status* descrambleStatus,
26095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            const OobInputTestParams& params);
261f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman};
262f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
2630645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman::testing::AssertionResult MediaCasHidlTest::createCasPlugin(int32_t caSystemId) {
2640645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    auto status = mService->isSystemIdSupported(caSystemId);
2650645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    if (!status.isOk() || !status) {
2660645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        return ::testing::AssertionFailure();
2670645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    }
2680645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    status = mService->isDescramblerSupported(caSystemId);
2690645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    if (!status.isOk() || !status) {
2700645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        return ::testing::AssertionFailure();
2710645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    }
272f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
2730645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    mCasListener = new MediaCasListener();
2740645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    auto pluginStatus = mService->createPlugin(caSystemId, mCasListener);
2750645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    if (!pluginStatus.isOk()) {
2760645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        return ::testing::AssertionFailure();
277f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    }
2780645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    mMediaCas = pluginStatus;
2790645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    if (mMediaCas == nullptr) {
2800645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        return ::testing::AssertionFailure();
2810645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    }
2820645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
2830645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    auto descramblerStatus = mService->createDescrambler(caSystemId);
2840645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    if (!descramblerStatus.isOk()) {
2850645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        return ::testing::AssertionFailure();
2860645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    }
2870645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    mDescramblerBase = descramblerStatus;
2880645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    return ::testing::AssertionResult(mDescramblerBase != nullptr);
2890645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman}
2900645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
2910645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman::testing::AssertionResult MediaCasHidlTest::openCasSession(std::vector<uint8_t>* sessionId) {
2920645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    Status sessionStatus;
2930645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    auto returnVoid = mMediaCas->openSession([&](Status status, const hidl_vec<uint8_t>& id) {
2940645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        sessionStatus = status;
2950645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        *sessionId = id;
2960645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    });
2970645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    return ::testing::AssertionResult(returnVoid.isOk() && (Status::OK == sessionStatus));
2980645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman}
2990645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
3000645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman::testing::AssertionResult MediaCasHidlTest::descrambleTestInputBuffer(
301704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    const sp<IDescrambler>& descrambler, Status* descrambleStatus, sp<IMemory>* inMemory) {
3020645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidl_vec<SubSample> hidlSubSamples;
3030645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidlSubSamples.setToExternal(const_cast<SubSample*>(kSubSamples),
3040645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman                                 (sizeof(kSubSamples) / sizeof(SubSample)), false /*own*/);
305704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang
306704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    sp<MemoryDealer> dealer = new MemoryDealer(sizeof(kInBinaryBuffer), "vts-cas");
307704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    if (nullptr == dealer.get()) {
308704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang        ALOGE("couldn't get MemoryDealer!");
3090645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        return ::testing::AssertionFailure();
3100645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    }
3110645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
312704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    sp<IMemory> mem = dealer->allocate(sizeof(kInBinaryBuffer));
313704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    if (nullptr == mem.get()) {
314704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang        ALOGE("couldn't allocate IMemory!");
3150645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        return ::testing::AssertionFailure();
3160645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    }
317704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    *inMemory = mem;
318704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang
319d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang    // build HidlMemory from memory heap
320704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    ssize_t offset;
321704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    size_t size;
322704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
323704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    if (nullptr == heap.get()) {
324704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang        ALOGE("couldn't get memory heap!");
325704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang        return ::testing::AssertionFailure();
326704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    }
327704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang
328704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    uint8_t* ipBuffer = static_cast<uint8_t*>(static_cast<void*>(mem->pointer()));
3290645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    memcpy(ipBuffer, kInBinaryBuffer, sizeof(kInBinaryBuffer));
3300645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
331d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang    // hidlMemory is not to be passed out of scope!
332d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang    sp<HidlMemory> hidlMemory = fromHeap(heap);
333d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang
3340645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    SharedBuffer srcBuffer = {
335d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang            .heapBase = *hidlMemory,
336704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang            .offset = (uint64_t) offset,
337704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang            .size = (uint64_t) size
338704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    };
3390645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
3400645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    DestinationBuffer dstBuffer;
3410645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    dstBuffer.type = BufferType::SHARED_MEMORY;
3420645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    dstBuffer.nonsecureMemory = srcBuffer;
3430645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
3440645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    uint32_t outBytes;
3450645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidl_string detailedError;
3460645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    auto returnVoid = descrambler->descramble(
3470645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        ScramblingControl::EVENKEY /*2*/, hidlSubSamples, srcBuffer, 0, dstBuffer, 0,
3480645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        [&](Status status, uint32_t bytesWritten, const hidl_string& detailedErr) {
3490645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman            *descrambleStatus = status;
3500645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman            outBytes = bytesWritten;
3510645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman            detailedError = detailedErr;
3520645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        });
3530645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    if (!returnVoid.isOk() || *descrambleStatus != Status::OK) {
3540645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        ALOGI("descramble failed, trans=%s, status=%d, outBytes=%u, error=%s",
3550645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman              returnVoid.description().c_str(), *descrambleStatus, outBytes, detailedError.c_str());
3560645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    }
3570645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    return ::testing::AssertionResult(returnVoid.isOk());
3580645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman}
359f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
36095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang::testing::AssertionResult MediaCasHidlTest::descrambleTestOobInput(
36195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        const sp<IDescrambler>& descrambler,
36295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        Status* descrambleStatus,
36395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        const OobInputTestParams& params) {
36495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    hidl_vec<SubSample> hidlSubSamples;
36595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    hidlSubSamples.setToExternal(
36695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            const_cast<SubSample*>(params.subSamples), params.numSubSamples, false /*own*/);
36795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
36895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    sp<MemoryDealer> dealer = new MemoryDealer(params.imemSizeActual, "vts-cas");
36995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    if (nullptr == dealer.get()) {
37095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        ALOGE("couldn't get MemoryDealer!");
37195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        return ::testing::AssertionFailure();
37295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    }
37395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
37495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    sp<IMemory> mem = dealer->allocate(params.imemSizeActual);
37595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    if (nullptr == mem.get()) {
37695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        ALOGE("couldn't allocate IMemory!");
37795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        return ::testing::AssertionFailure();
37895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    }
37995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
380d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang    // build HidlMemory from memory heap
38195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    ssize_t offset;
38295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    size_t size;
38395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
38495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    if (nullptr == heap.get()) {
38595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        ALOGE("couldn't get memory heap!");
38695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        return ::testing::AssertionFailure();
38795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    }
38895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
389d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang    // hidlMemory is not to be passed out of scope!
390d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang    sp<HidlMemory> hidlMemory = fromHeap(heap);
39195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
39295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    SharedBuffer srcBuffer = {
393d2eb83e66825ad50bcaa2fd99f0b4735686f3833Chong Zhang            .heapBase = *hidlMemory,
39495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            .offset = (uint64_t) offset + params.imemOffset,
39595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            .size = (uint64_t) params.imemSize,
39695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    };
39795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
39895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    DestinationBuffer dstBuffer;
39995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    dstBuffer.type = BufferType::SHARED_MEMORY;
40095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    dstBuffer.nonsecureMemory = srcBuffer;
40195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
40295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    uint32_t outBytes;
40395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    hidl_string detailedError;
40495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    auto returnVoid = descrambler->descramble(
40595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        ScramblingControl::EVENKEY /*2*/, hidlSubSamples,
40695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        srcBuffer,
40795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        params.srcOffset,
40895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        dstBuffer,
40995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        params.dstOffset,
41095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        [&](Status status, uint32_t bytesWritten, const hidl_string& detailedErr) {
41195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            *descrambleStatus = status;
41295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            outBytes = bytesWritten;
41395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            detailedError = detailedErr;
41495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        });
41595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    if (!returnVoid.isOk() || *descrambleStatus != Status::OK) {
41695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        ALOGI("descramble failed, trans=%s, status=%d, outBytes=%u, error=%s",
41795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang              returnVoid.description().c_str(), *descrambleStatus, outBytes, detailedError.c_str());
41895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    }
41995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    return ::testing::AssertionResult(returnVoid.isOk());
42095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang}
42195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
422f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh SivaramanTEST_F(MediaCasHidlTest, EnumeratePlugins) {
423f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    description("Test enumerate plugins");
424f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    hidl_vec<HidlCasPluginDescriptor> descriptors;
425f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    EXPECT_TRUE(mService
426f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman                    ->enumeratePlugins([&descriptors](
427f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman                        hidl_vec<HidlCasPluginDescriptor> const& desc) { descriptors = desc; })
428f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman                    .isOk());
429f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
430f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    if (descriptors.size() == 0) {
431f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman        ALOGW("[   WARN   ] enumeratePlugins list empty");
432f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman        return;
433f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    }
434f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
435f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    sp<MediaCasListener> casListener = new MediaCasListener();
436f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    for (size_t i = 0; i < descriptors.size(); i++) {
437f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman        int32_t caSystemId = descriptors[i].caSystemId;
438f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
4390645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        ASSERT_TRUE(createCasPlugin(caSystemId));
440f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    }
441f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman}
442f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
443f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh SivaramanTEST_F(MediaCasHidlTest, TestInvalidSystemIdFails) {
444f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    description("Test failure for invalid system ID");
445f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    sp<MediaCasListener> casListener = new MediaCasListener();
446f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
447f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    ASSERT_FALSE(mService->isSystemIdSupported(INVALID_SYSTEM_ID));
448f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    ASSERT_FALSE(mService->isDescramblerSupported(INVALID_SYSTEM_ID));
449f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
4500645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    auto pluginStatus = mService->createPlugin(INVALID_SYSTEM_ID, casListener);
4510645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    ASSERT_TRUE(pluginStatus.isOk());
4520645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    sp<ICas> mediaCas = pluginStatus;
453f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    EXPECT_EQ(mediaCas, nullptr);
454f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
4550645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    auto descramblerStatus = mService->createDescrambler(INVALID_SYSTEM_ID);
4560645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    ASSERT_TRUE(descramblerStatus.isOk());
4570645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    sp<IDescramblerBase> descramblerBase = descramblerStatus;
458f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    EXPECT_EQ(descramblerBase, nullptr);
459f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman}
460f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
461f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh SivaramanTEST_F(MediaCasHidlTest, TestClearKeyPluginInstalled) {
462f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    description("Test if ClearKey plugin is installed");
463f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    hidl_vec<HidlCasPluginDescriptor> descriptors;
464f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    EXPECT_TRUE(mService
465f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman                    ->enumeratePlugins([&descriptors](
4660645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman                        hidl_vec<HidlCasPluginDescriptor> const& desc) { descriptors = desc; })
467f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman                    .isOk());
468f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
469f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    if (descriptors.size() == 0) {
470f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman        ALOGW("[   WARN   ] enumeratePlugins list empty");
471f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    }
472f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
473f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    for (size_t i = 0; i < descriptors.size(); i++) {
474f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman        int32_t caSystemId = descriptors[i].caSystemId;
475f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman        if (CLEAR_KEY_SYSTEM_ID == caSystemId) {
476f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman            return;
477f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman        }
478f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    }
479f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
480f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    ASSERT_TRUE(false) << "ClearKey plugin not installed";
481f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman}
482f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
4830645aec1de74259ad37093d356f20c08497a9e6aSuresh SivaramanTEST_F(MediaCasHidlTest, TestClearKeyApis) {
4840645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    description("Test that valid call sequences succeed");
4850645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
4860645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID));
4870645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
4880645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    auto returnStatus = mMediaCas->provision(hidl_string(PROVISION_STR));
4890645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
4900645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
4910645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
4920645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidl_vec<uint8_t> hidlPvtData;
4930645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidlPvtData.resize(256);
4940645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mMediaCas->setPrivateData(hidlPvtData);
4950645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
4960645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
4970645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
4980645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    std::vector<uint8_t> sessionId;
4990645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    ASSERT_TRUE(openCasSession(&sessionId));
5000645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mMediaCas->setSessionPrivateData(sessionId, hidlPvtData);
5010645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
5020645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
5030645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5040645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    std::vector<uint8_t> streamSessionId;
5050645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    ASSERT_TRUE(openCasSession(&streamSessionId));
5060645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mMediaCas->setSessionPrivateData(streamSessionId, hidlPvtData);
5070645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
5080645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
5090645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5100645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mDescramblerBase->setMediaCasSession(sessionId);
5110645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
5120645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
5130645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5140645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mDescramblerBase->setMediaCasSession(streamSessionId);
5150645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
5160645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
5170645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5180645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidl_vec<uint8_t> hidlNullPtr;
5190645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidlNullPtr.setToExternal(static_cast<uint8_t*>(nullptr), 0);
5200645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mMediaCas->refreshEntitlements(3, hidlNullPtr);
5210645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
5220645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
5230645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5240645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    uint8_t refreshData[] = {0, 1, 2, 3};
5250645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidl_vec<uint8_t> hidlRefreshData;
5260645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidlRefreshData.setToExternal(static_cast<uint8_t*>(refreshData), sizeof(refreshData));
5270645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mMediaCas->refreshEntitlements(10, hidlRefreshData);
5280645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
5290645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
5300645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5310645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    int32_t eventID = 1;
5320645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    int32_t eventArg = 2;
5330645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    mCasListener->testEventEcho(mMediaCas, eventID, eventArg, hidlNullPtr);
5340645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5350645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    eventID = 3;
5360645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    eventArg = 4;
5370645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    uint8_t eventData[] = {'e', 'v', 'e', 'n', 't', 'd', 'a', 't', 'a'};
5380645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidl_vec<uint8_t> hidlEventData;
5390645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidlEventData.setToExternal(static_cast<uint8_t*>(eventData), sizeof(eventData));
5400645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    mCasListener->testEventEcho(mMediaCas, eventID, eventArg, hidlEventData);
5410645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5420645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    uint8_t clearKeyEmmData[] = {'c', 'l', 'e', 'a', 'r', 'k', 'e', 'y', 'e', 'm', 'm'};
5430645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidl_vec<uint8_t> hidlClearKeyEmm;
5440645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidlClearKeyEmm.setToExternal(static_cast<uint8_t*>(clearKeyEmmData), sizeof(clearKeyEmmData));
5450645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mMediaCas->processEmm(hidlClearKeyEmm);
5460645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
5470645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
5480645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5490645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidl_vec<uint8_t> hidlEcm;
5500645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidlEcm.setToExternal(const_cast<uint8_t*>(kEcmBinaryBuffer), sizeof(kEcmBinaryBuffer));
5510645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mMediaCas->processEcm(sessionId, hidlEcm);
5520645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
5530645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
5540645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mMediaCas->processEcm(streamSessionId, hidlEcm);
5550645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
5560645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
5570645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5586d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman    EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("video/avc"));
5596d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman
5600645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    sp<IDescrambler> descrambler;
5610645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    descrambler = IDescrambler::castFrom(mDescramblerBase);
5620645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    ASSERT_NE(descrambler, nullptr);
5630645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5640645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    Status descrambleStatus = Status::OK;
565704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    sp<IMemory> dataMemory;
5660645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
567704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory));
5680645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, descrambleStatus);
5690645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
570704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    ASSERT_NE(nullptr, dataMemory.get());
571704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    uint8_t* opBuffer = static_cast<uint8_t*>(static_cast<void*>(dataMemory->pointer()));
5720645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5730645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    int compareResult =
5740645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman        memcmp(static_cast<const void*>(opBuffer), static_cast<const void*>(kOutRefBinaryBuffer),
5750645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman               sizeof(kOutRefBinaryBuffer));
5760645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(0, compareResult);
5776d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman
5786d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman    returnStatus = mDescramblerBase->release();
5796d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
5806d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
5816d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman
5826d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman    returnStatus = mMediaCas->release();
5836d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
5846d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
5850645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman}
5860645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5870645aec1de74259ad37093d356f20c08497a9e6aSuresh SivaramanTEST_F(MediaCasHidlTest, TestClearKeySessionClosedAfterRelease) {
5880645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    description("Test that all sessions are closed after a MediaCas object is released");
5890645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5900645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID));
5910645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5920645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    auto returnStatus = mMediaCas->provision(hidl_string(PROVISION_STR));
5930645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
5940645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
5950645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
5960645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    std::vector<uint8_t> sessionId;
5970645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    ASSERT_TRUE(openCasSession(&sessionId));
5980645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    std::vector<uint8_t> streamSessionId;
5990645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    ASSERT_TRUE(openCasSession(&streamSessionId));
6000645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6010645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mMediaCas->release();
6020645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
6030645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
6040645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6050645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mDescramblerBase->setMediaCasSession(sessionId);
6060645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
6070645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus);
6080645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6090645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mDescramblerBase->setMediaCasSession(streamSessionId);
6100645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
6110645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus);
6120645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman}
6130645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6140645aec1de74259ad37093d356f20c08497a9e6aSuresh SivaramanTEST_F(MediaCasHidlTest, TestClearKeyErrors) {
6150645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    description("Test that invalid call sequences fail with expected error codes");
6160645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6170645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID));
6180645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6190645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    /*
6200645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman     * Test MediaCas error codes
6210645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman     */
6220645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    // Provision should fail with an invalid asset string
6230645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    auto returnStatus = mMediaCas->provision(hidl_string("invalid asset string"));
6240645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
6250645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::ERROR_CAS_NO_LICENSE, returnStatus);
6260645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6270645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    // Open a session, then close it so that it should become invalid
6280645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    std::vector<uint8_t> invalidSessionId;
6290645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    ASSERT_TRUE(openCasSession(&invalidSessionId));
6300645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mMediaCas->closeSession(invalidSessionId);
6310645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
6320645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
6330645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6340645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    // processEcm should fail with an invalid session id
6350645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidl_vec<uint8_t> hidlEcm;
6360645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidlEcm.setToExternal(const_cast<uint8_t*>(kEcmBinaryBuffer), sizeof(kEcmBinaryBuffer));
6370645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mMediaCas->processEcm(invalidSessionId, hidlEcm);
6380645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
6390645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus);
6400645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6410645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    std::vector<uint8_t> sessionId;
6420645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    ASSERT_TRUE(openCasSession(&sessionId));
6430645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6440645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    // processEcm should fail without provisioning
6450645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidlEcm.setToExternal(const_cast<uint8_t*>(kEcmBinaryBuffer), sizeof(kEcmBinaryBuffer));
6460645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mMediaCas->processEcm(sessionId, hidlEcm);
6470645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
6480645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::ERROR_CAS_NOT_PROVISIONED, returnStatus);
6490645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6500645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mMediaCas->provision(hidl_string(PROVISION_STR));
6510645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
6520645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
6530645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6540645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    // processEcm should fail with ecm buffer that's too short
6550645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidlEcm.setToExternal(const_cast<uint8_t*>(kEcmBinaryBuffer), 8);
6560645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mMediaCas->processEcm(sessionId, hidlEcm);
6570645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
6580645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::BAD_VALUE, returnStatus);
6590645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6600645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    // processEcm should fail with ecm with bad descriptor count
6610645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    uint8_t badDescriptor[sizeof(kEcmBinaryBuffer)];
6620645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    memcpy(badDescriptor, kEcmBinaryBuffer, sizeof(kEcmBinaryBuffer));
6630645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    badDescriptor[17] = 0x03;  // change the descriptor count field to 3 (invalid)
6640645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    hidlEcm.setToExternal(static_cast<uint8_t*>(badDescriptor), sizeof(badDescriptor));
6650645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mMediaCas->processEcm(sessionId, hidlEcm);
6660645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
6670645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::ERROR_CAS_UNKNOWN, returnStatus);
6680645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6690645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    /*
6700645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman     * Test MediaDescrambler error codes
6710645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman     */
6720645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    // setMediaCasSession should fail with an invalid session id
6730645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mDescramblerBase->setMediaCasSession(invalidSessionId);
6740645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
6750645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, returnStatus);
6760645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6770645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    // descramble should fail without a valid session
6780645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    sp<IDescrambler> descrambler;
6790645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    descrambler = IDescrambler::castFrom(mDescramblerBase);
6800645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    ASSERT_NE(descrambler, nullptr);
6810645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6820645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    Status descrambleStatus = Status::OK;
683704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    sp<IMemory> dataMemory;
6840645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
685704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory));
6860645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED, descrambleStatus);
6870645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
6880645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    // Now set a valid session, should still fail because no valid ecm is processed
6890645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    returnStatus = mDescramblerBase->setMediaCasSession(sessionId);
6900645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_TRUE(returnStatus.isOk());
6910645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::OK, returnStatus);
6920645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
693704d5861a70cfe8c386980b5ea4649024db3f658Chong Zhang    ASSERT_TRUE(descrambleTestInputBuffer(descrambler, &descrambleStatus, &dataMemory));
6940645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman    EXPECT_EQ(Status::ERROR_CAS_DECRYPT, descrambleStatus);
6956d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman
6966d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman    // Verify that requiresSecureDecoderComponent handles empty mime
6976d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman    EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent(""));
6986d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman
6996d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman    // Verify that requiresSecureDecoderComponent handles invalid mime
7006d176aa77d6ad36174de843f9de4e979807566ceSuresh Sivaraman    EXPECT_FALSE(mDescramblerBase->requiresSecureDecoderComponent("bad"));
7010645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman}
7020645aec1de74259ad37093d356f20c08497a9e6aSuresh Sivaraman
70395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong ZhangTEST_F(MediaCasHidlTest, TestClearKeyOobFails) {
70495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    description("Test that oob descramble request fails with expected error");
70595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
70695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID));
70795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
70895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    auto returnStatus = mMediaCas->provision(hidl_string(PROVISION_STR));
70995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_TRUE(returnStatus.isOk());
71095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_EQ(Status::OK, returnStatus);
71195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
71295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    std::vector<uint8_t> sessionId;
71395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    ASSERT_TRUE(openCasSession(&sessionId));
71495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
71595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    returnStatus = mDescramblerBase->setMediaCasSession(sessionId);
71695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_TRUE(returnStatus.isOk());
71795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_EQ(Status::OK, returnStatus);
71895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
71995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    hidl_vec<uint8_t> hidlEcm;
72095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    hidlEcm.setToExternal(const_cast<uint8_t*>(kEcmBinaryBuffer), sizeof(kEcmBinaryBuffer));
72195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    returnStatus = mMediaCas->processEcm(sessionId, hidlEcm);
72295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_TRUE(returnStatus.isOk());
72395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_EQ(Status::OK, returnStatus);
72495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
72595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    sp<IDescrambler> descrambler = IDescrambler::castFrom(mDescramblerBase);
72695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    ASSERT_NE(nullptr, descrambler.get());
72795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
72895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    Status descrambleStatus = Status::OK;
72995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
73095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    // test invalid src buffer offset
73195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    ASSERT_TRUE(descrambleTestOobInput(
73295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            descrambler,
73395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            &descrambleStatus,
73495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            {
73595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .subSamples     = kSubSamples,
73695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .numSubSamples  = sizeof(kSubSamples)/sizeof(SubSample),
73795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemSizeActual = sizeof(kInBinaryBuffer),
73895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemOffset     = 0xcccccc,
73995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemSize       = sizeof(kInBinaryBuffer),
74095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .srcOffset      = 0,
74195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .dstOffset      = 0
74295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            }));
74395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_EQ(Status::BAD_VALUE, descrambleStatus);
74495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
74595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    // test invalid src buffer size
74695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    ASSERT_TRUE(descrambleTestOobInput(
74795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            descrambler,
74895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            &descrambleStatus,
74995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            {
75095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .subSamples     = kSubSamples,
75195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .numSubSamples  = sizeof(kSubSamples)/sizeof(SubSample),
75295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemSizeActual = sizeof(kInBinaryBuffer),
75395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemOffset     = 0,
75495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemSize       = 0xcccccc,
75595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .srcOffset      = 0,
75695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .dstOffset      = 0
75795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            }));
75895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_EQ(Status::BAD_VALUE, descrambleStatus);
75995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
76095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    // test invalid src buffer size
76195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    ASSERT_TRUE(descrambleTestOobInput(
76295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            descrambler,
76395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            &descrambleStatus,
76495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            {
76595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .subSamples     = kSubSamples,
76695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .numSubSamples  = sizeof(kSubSamples)/sizeof(SubSample),
76795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemSizeActual = sizeof(kInBinaryBuffer),
76895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemOffset     = 1,
76995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemSize       = (uint64_t)-1,
77095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .srcOffset      = 0,
77195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .dstOffset      = 0
77295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            }));
77395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_EQ(Status::BAD_VALUE, descrambleStatus);
77495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
77595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    // test invalid srcOffset
77695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    ASSERT_TRUE(descrambleTestOobInput(
77795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            descrambler,
77895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            &descrambleStatus,
77995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            {
78095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .subSamples     = kSubSamples,
78195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .numSubSamples  = sizeof(kSubSamples)/sizeof(SubSample),
78295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemSizeActual = sizeof(kInBinaryBuffer),
78395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemOffset     = 0,
78495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemSize       = sizeof(kInBinaryBuffer),
78595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .srcOffset      = 0xcccccc,
78695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .dstOffset      = 0
78795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            }));
78895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_EQ(Status::BAD_VALUE, descrambleStatus);
78995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
79095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    // test invalid dstOffset
79195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    ASSERT_TRUE(descrambleTestOobInput(
79295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            descrambler,
79395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            &descrambleStatus,
79495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            {
79595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .subSamples     = kSubSamples,
79695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .numSubSamples  = sizeof(kSubSamples)/sizeof(SubSample),
79795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemSizeActual = sizeof(kInBinaryBuffer),
79895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemOffset     = 0,
79995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemSize       = sizeof(kInBinaryBuffer),
80095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .srcOffset      = 0,
80195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .dstOffset      = 0xcccccc
80295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            }));
80395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_EQ(Status::BAD_VALUE, descrambleStatus);
80495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
80595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    // test detection of oob subsample sizes
80695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    const SubSample invalidSubSamples1[] =
80795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        {{162, 0}, {0, 184}, {0, 0xdddddd}};
80895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
80995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    ASSERT_TRUE(descrambleTestOobInput(
81095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            descrambler,
81195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            &descrambleStatus,
81295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            {
81395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .subSamples     = invalidSubSamples1,
81495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .numSubSamples  = sizeof(invalidSubSamples1)/sizeof(SubSample),
81595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemSizeActual = sizeof(kInBinaryBuffer),
81695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemOffset     = 0,
81795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemSize       = sizeof(kInBinaryBuffer),
81895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .srcOffset      = 0,
81995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .dstOffset      = 0
82095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            }));
82195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_EQ(Status::BAD_VALUE, descrambleStatus);
82295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
82395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    // test detection of overflowing subsample sizes
82495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    const SubSample invalidSubSamples2[] =
82595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang        {{162, 0}, {0, 184}, {2, (uint32_t)-1}};
82695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
82795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    ASSERT_TRUE(descrambleTestOobInput(
82895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            descrambler,
82995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            &descrambleStatus,
83095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            {
83195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .subSamples     = invalidSubSamples2,
83295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .numSubSamples  = sizeof(invalidSubSamples2)/sizeof(SubSample),
83395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemSizeActual = sizeof(kInBinaryBuffer),
83495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemOffset     = 0,
83595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .imemSize       = sizeof(kInBinaryBuffer),
83695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .srcOffset      = 0,
83795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang                .dstOffset      = 0
83895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang            }));
83995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_EQ(Status::BAD_VALUE, descrambleStatus);
84095cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
84195cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    returnStatus = mDescramblerBase->release();
84295cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_TRUE(returnStatus.isOk());
84395cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_EQ(Status::OK, returnStatus);
84495cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
84595cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    returnStatus = mMediaCas->release();
84695cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_TRUE(returnStatus.isOk());
84795cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang    EXPECT_EQ(Status::OK, returnStatus);
84895cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang}
84995cc5af781a0b92f8acc3aae6ba58e5bb0a91c63Chong Zhang
850f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman}  // anonymous namespace
851f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman
852f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaramanint main(int argc, char** argv) {
853a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang    ::testing::AddGlobalTestEnvironment(CasHidlEnvironment::Instance());
854f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    ::testing::InitGoogleTest(&argc, argv);
855a5e6707e9c601f5deae0d8bac74ef7d3efeb88d2Zhuoyao Zhang    CasHidlEnvironment::Instance()->init(&argc, argv);
856f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    int status = RUN_ALL_TESTS();
857f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    LOG(INFO) << "Test result = " << status;
858f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman    return status;
859f1fbb442dcddafefc06e507812f243b0b7a7f3f8Suresh Sivaraman}
860