1 /* 2 * Copyright (C) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef OHOS_TEST_SERVICE_SKELETON_H 17 #define OHOS_TEST_SERVICE_SKELETON_H 18 19 #include <map> 20 #include "ipc_debug.h" 21 #include "iremote_broker.h" 22 #include "iremote_stub.h" 23 #include "iremote_proxy.h" 24 #include "foo_service.h" 25 #include "ipc_file_descriptor.h" 26 #include "log_tags.h" 27 28 namespace OHOS { 29 30 class ITestService : public IRemoteBroker { 31 public: 32 enum { 33 TRANS_ID_SYNC_TRANSACTION = 1, 34 TRANS_ID_ASYNC_TRANSACTION = 2, 35 TRANS_ID_PING_SERVICE = 3, 36 TRANS_ID_GET_FOO_SERVICE = 4, 37 TRANS_ID_TRANSACT_FILE_DESC = 5, 38 TRANS_ID_STRING_TRANSACTION = 6, 39 TRANS_ID_ZTRACE_TRANSACTION = 7, 40 TRANS_ID_LOOP_TRANSACTION = 8, 41 TRANS_ID_DUMP_SERVICE = 9, 42 TRANS_ID_RAWDATA_TRANSACTION = 10, 43 TRANS_ID_RAWDATA_REPLY = 11, 44 TRANS_ID_CALLING_UID_PID = 12, 45 TRANS_ID_FLUSH_ASYNC_CALLS = 13, 46 TRANS_ID_MULTIPLE_PROCESSES = 14, 47 TRANS_ID_ASHMEM = 15, 48 TRANS_ID_ASYNC_DUMP_SERVICE = 16, 49 TRANS_ID_NESTING_SEND = 17, 50 TRANS_ID_ACCESS_TOKENID = 18, 51 TRANS_MESSAGE_PARCEL_ADDPED = 19, 52 TRANS_MESSAGE_PARCEL_ADDPED_WITH_OBJECT = 20, 53 TRANS_ID_ACCESS_TOKENID_64 = 21, 54 TRANS_ENABLE_SERIAL_INVOKE_FLAG = 22, 55 TRANS_ID_REGISTER_REMOTE_STUB_OBJECT = 23, 56 TRANS_ID_UNREGISTER_REMOTE_STUB_OBJECT = 24, 57 TRANS_ID_QUERY_REMOTE_PROXY_OBJECT = 25, 58 }; 59 public: 60 virtual int TestSyncTransaction(int data, int &reply, int delayTime = 0) = 0; 61 virtual int TestAsyncTransaction(int data, int timeout = 0) = 0; 62 virtual int TestAsyncCallbackTrans(int data, int &reply, int timeout = 0) = 0; 63 virtual int TestGetFileDescriptor() = 0; 64 virtual int TestPingService(const std::u16string &serviceName) = 0; 65 virtual int TestStringTransaction(const std::string &data) = 0; 66 virtual int TestZtraceTransaction(std::string &send, std::string &reply, int len) = 0; 67 virtual void TestDumpService() = 0; 68 virtual int TestRawDataTransaction(int length, int &reply) = 0; 69 virtual int TestRawDataReply(int length) = 0; 70 virtual sptr<IFoo> TestGetFooService() = 0; 71 virtual int TestCallingUidPid() = 0; 72 virtual int TestFlushAsyncCalls(int count, int length) = 0; 73 virtual int TestMultipleProcesses(int data, int &rep, int delayTime) = 0; 74 virtual std::u16string TestAshmem(sptr<Ashmem> ashmem, int32_t contentSize) = 0; 75 virtual void TestAsyncDumpService() = 0; 76 virtual int TestNestingSend(int sendCode, int &replyCode) = 0; 77 virtual int TestAccessTokenID(int32_t ftoken_expected) = 0; 78 virtual int TestAccessTokenID64(uint64_t token_expected, uint64_t ftoken_expected) = 0; 79 virtual int TestMessageParcelAppend(MessageParcel &dst, MessageParcel &src) = 0; 80 virtual int TestMessageParcelAppendWithIpc(MessageParcel &dst, MessageParcel &src, 81 MessageParcel &reply, bool withObject) = 0; 82 virtual int TestEnableSerialInvokeFlag() = 0; 83 84 virtual int TestRegisterRemoteStub(const char *descriptor, const sptr<IRemoteObject> object) = 0; 85 virtual int TestUnRegisterRemoteStub(const char *descriptor) = 0; 86 virtual sptr<IRemoteObject> TestQueryRemoteProxy(const char *descriptor) = 0; 87 virtual int TestSendTooManyRequest(int data, int &reply) = 0; 88 virtual int TestMultiThreadSendRequest(int data, int &reply) = 0; 89 90 public: 91 DECLARE_INTERFACE_DESCRIPTOR(u"test.ipc.ITestService"); 92 }; 93 94 class TestServiceStub : public IRemoteStub<ITestService> { 95 public: 96 TestServiceStub(bool serialInvokeFlag = false); 97 int OnRemoteRequest(uint32_t code, 98 MessageParcel &data, MessageParcel &reply, MessageOption &option) override; 99 bool serialInvokeFlag_ = { false }; 100 private: 101 static constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_ID_TEST, "TestServiceStub" }; 102 int32_t TransferRawData(MessageParcel &data, MessageParcel &reply); 103 int32_t ReplyRawData(MessageParcel &data, MessageParcel &reply); 104 int32_t TransferToNextProcess(MessageParcel &data, MessageParcel &reply); 105 int32_t ReadAshmem(MessageParcel &data, MessageParcel &reply); 106 int32_t ServerSyncTransaction(MessageParcel &data, MessageParcel &reply); 107 int32_t ServerAsyncTransaction(MessageParcel &data, MessageParcel &reply); 108 int32_t ServerPingService(MessageParcel &data, MessageParcel &reply); 109 int32_t ServerGetFooService(MessageParcel &data, MessageParcel &reply); 110 int32_t ServerTransactFileDesc(MessageParcel &data, MessageParcel &reply); 111 int32_t ServerStringTransaction(MessageParcel &data, MessageParcel &reply); 112 int32_t ServerZtraceTransaction(MessageParcel &data, MessageParcel &reply); 113 int32_t ServerCallingUidAndPid(MessageParcel &data, MessageParcel &reply); 114 int32_t ServerNestingSend(MessageParcel &data, MessageParcel &reply); 115 int32_t ServerAccessTokenId(MessageParcel &data, MessageParcel &reply); 116 int32_t ServerAccessTokenId64(MessageParcel &data, MessageParcel &reply); 117 int32_t ServerMessageParcelAddped(MessageParcel &data, MessageParcel &reply); 118 int32_t ServerMessageParcelAddpedWithObject(MessageParcel &data, MessageParcel &reply); 119 int32_t ServerEnableSerialInvokeFlag(MessageParcel &data, MessageParcel &reply); 120 int32_t RegisterRemoteStub(MessageParcel &data, MessageParcel &reply); 121 int32_t UnRegisterRemoteStub(MessageParcel &data, MessageParcel &reply); 122 int32_t QueryRemoteProxy(MessageParcel &data, MessageParcel &reply); 123 int32_t ServerFlushAsyncCalls(MessageParcel &data, MessageParcel &reply); 124 void InitMessageProcessMap(); 125 126 using TestServiceStubFunc = int32_t(TestServiceStub::*)(MessageParcel &data, MessageParcel &reply); 127 std::map<uint32_t, TestServiceStubFunc> funcMap_; 128 }; 129 130 class TestServiceProxy : public IRemoteProxy<ITestService> { 131 public: 132 explicit TestServiceProxy(const sptr<IRemoteObject> &impl); 133 ~TestServiceProxy() = default; 134 int TestSyncTransaction(int data, int &reply, int delayTime = 0) override; 135 int TestAsyncTransaction(int data, int timeout = 0) override; 136 int TestAsyncCallbackTrans(int data, int &reply, int timeout = 0) override; 137 int TestPingService(const std::u16string &serviceName) override; 138 int TestGetFileDescriptor() override; 139 int TestStringTransaction(const std::string &data) override; 140 int TestZtraceTransaction(std::string &send, std::string &reply, int len) override; 141 void TestDumpService() override; 142 int TestRawDataTransaction(int length, int &reply) override; 143 int TestRawDataReply(int length) override; 144 sptr<IFoo> TestGetFooService() override; 145 int TestCallingUidPid() override; 146 int TestFlushAsyncCalls(int count, int length) override; 147 int TestMultipleProcesses(int data, int &rep, int delayTime) override; 148 std::u16string TestAshmem(sptr<Ashmem> ashmem, int32_t contentSize) override; 149 void TestAsyncDumpService() override; 150 int TestNestingSend(int sendCode, int &replyCode) override; 151 int TestAccessTokenID(int32_t ftoken_expected) override; 152 int TestAccessTokenID64(uint64_t token_expected, uint64_t ftoken_expected) override; 153 int TestMessageParcelAppend(MessageParcel &dst, MessageParcel &src) override; 154 int TestMessageParcelAppendWithIpc(MessageParcel &dst, MessageParcel &src, 155 MessageParcel &reply, bool withObject) override; 156 int TestEnableSerialInvokeFlag() override; 157 158 int TestRegisterRemoteStub(const char *descriptor, const sptr<IRemoteObject> object) override; 159 int TestUnRegisterRemoteStub(const char *descriptor) override; 160 sptr<IRemoteObject> TestQueryRemoteProxy(const char *descriptor) override; 161 int TestSendTooManyRequest(int data, int &reply) override; 162 int TestMultiThreadSendRequest(int data, int &reply) override; 163 164 private: 165 static inline BrokerDelegator<TestServiceProxy> delegator_; 166 bool CheckTokenSelf(uint64_t token, uint64_t tokenSelf, uint64_t ftoken, uint64_t ftoken_expected); 167 bool CheckSetFirstToken(uint64_t ftoken_expected); 168 bool CheckSetSelfToken(uint64_t token_expected); 169 static constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_ID_TEST, "TestServiceProxy" }; 170 }; 171 172 class TestDeathRecipient : public IRemoteObject::DeathRecipient { 173 public: 174 virtual void OnRemoteDied(const wptr<IRemoteObject> &remote); 175 TestDeathRecipient(); 176 virtual ~TestDeathRecipient(); 177 static bool GotDeathRecipient(); 178 static bool gotDeathRecipient_; 179 private: 180 static constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_ID_TEST, "TestDeathRecipient" }; 181 }; 182 183 } // namespace OHOS 184 #endif // OHOS_TEST_SERVICE_SKELETON_H 185