blob: bab1a88f09079ad832840205386a0fbfa30bf2ea [file] [log] [blame]
Hongguang600a6ae2021-07-08 18:51:51 -07001/*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include <gtest/gtest.h>
20#include <log/log.h>
21#include <utils/Condition.h>
22#include <utils/Mutex.h>
23#include <fstream>
24#include <iostream>
25#include <map>
26
27#include <android/hardware/cas/1.0/types.h>
28#include <android/hardware/cas/1.2/ICas.h>
29#include <android/hardware/cas/1.2/ICasListener.h>
30#include <android/hardware/cas/1.2/IMediaCasService.h>
31#include <android/hardware/cas/1.2/types.h>
32
Yixiao Luoe8730a72023-02-01 18:39:51 -080033#include <aidl/android/hardware/cas/BnCasListener.h>
34#include <aidl/android/hardware/cas/ICas.h>
35#include <aidl/android/hardware/cas/IMediaCasService.h>
36#include <aidl/android/hardware/cas/ScramblingMode.h>
37#include <aidl/android/hardware/cas/SessionIntent.h>
Hongguang600a6ae2021-07-08 18:51:51 -070038#include <aidl/android/hardware/tv/tuner/IDescrambler.h>
39#include <aidl/android/hardware/tv/tuner/IDvr.h>
40#include <aidl/android/hardware/tv/tuner/IDvrCallback.h>
41#include <aidl/android/hardware/tv/tuner/ITuner.h>
42
Yixiao Luoe8730a72023-02-01 18:39:51 -080043using ::aidl::android::hardware::cas::BnCasListener;
Hongguang600a6ae2021-07-08 18:51:51 -070044using android::Condition;
45using android::Mutex;
46using android::sp;
47using android::hardware::hidl_string;
48using android::hardware::hidl_vec;
49using android::hardware::Return;
50using android::hardware::Void;
Hongguang600a6ae2021-07-08 18:51:51 -070051using android::hardware::cas::V1_2::Status;
52using android::hardware::cas::V1_2::StatusEvent;
Yixiao Luoe8730a72023-02-01 18:39:51 -080053using ICasAidl = ::aidl::android::hardware::cas::ICas;
54using ICasHidl = android::hardware::cas::V1_2::ICas;
55using ICasListenerHidl = android::hardware::cas::V1_2::ICasListener;
56using IMediaCasServiceAidl = ::aidl::android::hardware::cas::IMediaCasService;
57using IMediaCasServiceHidl = android::hardware::cas::V1_2::IMediaCasService;
58using ScramblingModeAidl = ::aidl::android::hardware::cas::ScramblingMode;
59using ScramblingModeHidl = android::hardware::cas::V1_2::ScramblingMode;
60using SessionIntentAidl = ::aidl::android::hardware::cas::SessionIntent;
61using SessionIntentHidl = android::hardware::cas::V1_2::SessionIntent;
Hongguang600a6ae2021-07-08 18:51:51 -070062
Yixiao Luoe8730a72023-02-01 18:39:51 -080063using ::ndk::ScopedAStatus;
Hongguang600a6ae2021-07-08 18:51:51 -070064using ::testing::AssertionResult;
65
66using namespace aidl::android::hardware::tv::tuner;
67
Yixiao Luoe8730a72023-02-01 18:39:51 -080068const std::string MEDIA_CAS_AIDL_SERVICE_NAME = "android.hardware.cas.IMediaCasService/default";
69
70class MediaCasListener : public ICasListenerHidl, public BnCasListener {
Hongguang600a6ae2021-07-08 18:51:51 -070071 public:
72 virtual Return<void> onEvent(int32_t /*event*/, int32_t /*arg*/,
73 const hidl_vec<uint8_t>& /*data*/) override {
74 return Void();
75 }
76
77 virtual Return<void> onSessionEvent(const hidl_vec<uint8_t>& /*sessionId*/, int32_t /*event*/,
78 int32_t /*arg*/,
79 const hidl_vec<uint8_t>& /*data*/) override {
80 return Void();
81 }
82
83 virtual Return<void> onStatusUpdate(StatusEvent /*event*/, int32_t /*arg*/) override {
84 return Void();
85 }
Yixiao Luoe8730a72023-02-01 18:39:51 -080086
87 ScopedAStatus onEvent(int32_t /*in_event*/, int32_t /*in_arg*/,
88 const std::vector<uint8_t>& /*in_data*/) override {
89 return ScopedAStatus::ok();
90 }
91
92 ScopedAStatus onSessionEvent(const std::vector<uint8_t>& /*in_sessionId*/, int32_t /*in_event*/,
93 int32_t /*in_arg*/,
94 const std::vector<uint8_t>& /*in_data*/) override {
95 return ScopedAStatus::ok();
96 }
97
98 ScopedAStatus onStatusUpdate(::aidl::android::hardware::cas::StatusEvent /*in_event*/,
99 int32_t /*in_number*/) override {
100 return ScopedAStatus::ok();
101 }
Hongguang600a6ae2021-07-08 18:51:51 -0700102};
103
104class DescramblerTests {
105 public:
106 void setService(std::shared_ptr<ITuner> tuner) { mService = tuner; }
Yixiao Luoe8730a72023-02-01 18:39:51 -0800107 void setCasServiceHidl(sp<IMediaCasServiceHidl> casService) {
108 mMediaCasServiceHidl = casService;
109 }
110 void setCasServiceAidl(std::shared_ptr<IMediaCasServiceAidl> casService) {
111 mMediaCasServiceAidl = casService;
112 }
Hongguang600a6ae2021-07-08 18:51:51 -0700113
114 AssertionResult setKeyToken(std::vector<uint8_t>& token);
115 AssertionResult openDescrambler(int32_t demuxId);
116 AssertionResult addPid(DemuxPid pid, std::shared_ptr<IFilter> optionalSourceFilter);
117 AssertionResult removePid(DemuxPid pid, std::shared_ptr<IFilter> optionalSourceFilter);
118 AssertionResult closeDescrambler();
119 AssertionResult getKeyToken(int32_t caSystemId, std::string& provisonStr,
120 std::vector<uint8_t>& hidlPvtData, std::vector<uint8_t>& token);
121 AssertionResult getDemuxPidFromFilterSettings(DemuxFilterType type,
122 const DemuxFilterSettings& settings,
123 DemuxPid& pid);
124
125 protected:
126 static AssertionResult failure() { return ::testing::AssertionFailure(); }
127
128 static AssertionResult success() { return ::testing::AssertionSuccess(); }
129
130 std::shared_ptr<ITuner> mService;
131 std::shared_ptr<IDescrambler> mDescrambler;
Yixiao Luoe8730a72023-02-01 18:39:51 -0800132 std::shared_ptr<ICasAidl> mCasAidl;
133 android::sp<ICasHidl> mCasHidl;
134 std::shared_ptr<IMediaCasServiceAidl> mMediaCasServiceAidl;
135 android::sp<IMediaCasServiceHidl> mMediaCasServiceHidl;
136 std::shared_ptr<MediaCasListener> mCasListener;
Hongguang600a6ae2021-07-08 18:51:51 -0700137
138 private:
Yixiao Luoe8730a72023-02-01 18:39:51 -0800139 AssertionResult openCasSession(std::vector<uint8_t>& sessionId, std::vector<uint8_t>& pvtData);
Hongguang600a6ae2021-07-08 18:51:51 -0700140 AssertionResult createCasPlugin(int32_t caSystemId);
141};