Janis Danisevskis | 5c6af75 | 2019-03-21 13:45:02 -0700 | [diff] [blame] | 1 | /* |
| 2 | ** |
| 3 | ** Copyright 2019, The Android Open Source Project |
| 4 | ** |
| 5 | ** Licensed under the Apache License, Version 2.0 (the "License"); |
| 6 | ** you may not use this file except in compliance with the License. |
| 7 | ** You may obtain a copy of the License at |
| 8 | ** |
| 9 | ** http://www.apache.org/licenses/LICENSE-2.0 |
| 10 | ** |
| 11 | ** Unless required by applicable law or agreed to in writing, software |
| 12 | ** distributed under the License is distributed on an "AS IS" BASIS, |
| 13 | ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 14 | ** See the License for the specific language governing permissions and |
| 15 | ** limitations under the License. |
| 16 | */ |
| 17 | |
Janis Danisevskis | 2437fde | 2021-03-08 11:30:11 -0800 | [diff] [blame^] | 18 | #include <aidl/android/security/apc/BnConfirmationCallback.h> |
| 19 | #include <aidl/android/security/apc/IProtectedConfirmation.h> |
| 20 | #include <android/binder_manager.h> |
| 21 | #include <android/binder_process.h> |
Janis Danisevskis | 5c6af75 | 2019-03-21 13:45:02 -0700 | [diff] [blame] | 22 | |
| 23 | #include <gtest/gtest.h> |
| 24 | |
| 25 | #include <chrono> |
| 26 | #include <future> |
| 27 | #include <tuple> |
| 28 | #include <vector> |
| 29 | |
Janis Danisevskis | 5c6af75 | 2019-03-21 13:45:02 -0700 | [diff] [blame] | 30 | using namespace std::literals::chrono_literals; |
Janis Danisevskis | 2437fde | 2021-03-08 11:30:11 -0800 | [diff] [blame^] | 31 | namespace apc = ::aidl::android::security::apc; |
Janis Danisevskis | 5c6af75 | 2019-03-21 13:45:02 -0700 | [diff] [blame] | 32 | |
| 33 | class ConfirmationListener |
Janis Danisevskis | 2437fde | 2021-03-08 11:30:11 -0800 | [diff] [blame^] | 34 | : public apc::BnConfirmationCallback, |
| 35 | public std::promise<std::tuple<apc::ResponseCode, std::optional<std::vector<uint8_t>>>> { |
Janis Danisevskis | 5c6af75 | 2019-03-21 13:45:02 -0700 | [diff] [blame] | 36 | public: |
| 37 | ConfirmationListener() {} |
| 38 | |
Janis Danisevskis | 2437fde | 2021-03-08 11:30:11 -0800 | [diff] [blame^] | 39 | virtual ::ndk::ScopedAStatus |
| 40 | onCompleted(::aidl::android::security::apc::ResponseCode result, |
| 41 | const std::optional<std::vector<uint8_t>>& dataConfirmed) override { |
| 42 | this->set_value({result, dataConfirmed}); |
| 43 | return ::ndk::ScopedAStatus::ok(); |
| 44 | }; |
Janis Danisevskis | 5c6af75 | 2019-03-21 13:45:02 -0700 | [diff] [blame] | 45 | }; |
| 46 | |
| 47 | TEST(ConfirmationInvocationTest, InvokeAndCancel) { |
Janis Danisevskis | 2437fde | 2021-03-08 11:30:11 -0800 | [diff] [blame^] | 48 | ABinderProcess_startThreadPool(); |
Janis Danisevskis | 5c6af75 | 2019-03-21 13:45:02 -0700 | [diff] [blame] | 49 | |
Janis Danisevskis | 2437fde | 2021-03-08 11:30:11 -0800 | [diff] [blame^] | 50 | ::ndk::SpAIBinder apcBinder(AServiceManager_getService("android.security.apc")); |
| 51 | auto apcService = apc::IProtectedConfirmation::fromBinder(apcBinder); |
| 52 | ASSERT_TRUE(apcService); |
Janis Danisevskis | 5c6af75 | 2019-03-21 13:45:02 -0700 | [diff] [blame] | 53 | |
Janis Danisevskis | 2437fde | 2021-03-08 11:30:11 -0800 | [diff] [blame^] | 54 | std::string promptText("Just a little test!"); |
| 55 | std::string locale("en"); |
Janis Danisevskis | 5c6af75 | 2019-03-21 13:45:02 -0700 | [diff] [blame] | 56 | std::vector<uint8_t> extraData{0xaa, 0xff, 0x00, 0x55}; |
| 57 | |
Janis Danisevskis | 2437fde | 2021-03-08 11:30:11 -0800 | [diff] [blame^] | 58 | auto listener = std::make_shared<ConfirmationListener>(); |
Janis Danisevskis | 5c6af75 | 2019-03-21 13:45:02 -0700 | [diff] [blame] | 59 | |
| 60 | auto future = listener->get_future(); |
Janis Danisevskis | 5c6af75 | 2019-03-21 13:45:02 -0700 | [diff] [blame] | 61 | |
Janis Danisevskis | 2437fde | 2021-03-08 11:30:11 -0800 | [diff] [blame^] | 62 | auto rc = apcService->presentPrompt(listener, promptText, extraData, locale, 0); |
| 63 | |
| 64 | ASSERT_TRUE(rc.isOk()); |
Janis Danisevskis | 5c6af75 | 2019-03-21 13:45:02 -0700 | [diff] [blame] | 65 | |
| 66 | auto fstatus = future.wait_for(2s); |
| 67 | EXPECT_EQ(fstatus, std::future_status::timeout); |
| 68 | |
Janis Danisevskis | 2437fde | 2021-03-08 11:30:11 -0800 | [diff] [blame^] | 69 | rc = apcService->cancelPrompt(listener); |
| 70 | ASSERT_TRUE(rc.isOk()); |
Janis Danisevskis | 5c6af75 | 2019-03-21 13:45:02 -0700 | [diff] [blame] | 71 | |
| 72 | future.wait(); |
Janis Danisevskis | 2437fde | 2021-03-08 11:30:11 -0800 | [diff] [blame^] | 73 | auto [responseCode, dataThatWasConfirmed] = future.get(); |
Janis Danisevskis | 5c6af75 | 2019-03-21 13:45:02 -0700 | [diff] [blame] | 74 | |
Janis Danisevskis | 2437fde | 2021-03-08 11:30:11 -0800 | [diff] [blame^] | 75 | ASSERT_EQ(responseCode, apc::ResponseCode::ABORTED); |
Janis Danisevskis | 5c6af75 | 2019-03-21 13:45:02 -0700 | [diff] [blame] | 76 | } |