1546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan/* 2546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan * Copyright (C) 2015 The Android Open Source Project 3546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan * 4546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan * Licensed under the Apache License, Version 2.0 (the "License"); 5546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan * you may not use this file except in compliance with the License. 6546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan * You may obtain a copy of the License at 7546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan * 8546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan * http://www.apache.org/licenses/LICENSE-2.0 9546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan * 10546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan * Unless required by applicable law or agreed to in writing, software 11546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan * distributed under the License is distributed on an "AS IS" BASIS, 12546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan * See the License for the specific language governing permissions and 14546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan * limitations under the License. 15546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan */ 16546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan 17546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan#include "aidl_test_client_parcelables.h" 18546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan 19546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan#include <iostream> 20546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan#include <vector> 21546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan 22546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan// libutils: 23546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tanusing android::sp; 24546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan 25546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan// libbinder: 26546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tanusing android::binder::Status; 27546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan 28546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan// generated 29546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tanusing android::aidl::tests::ITestService; 30546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tanusing android::aidl::tests::SimpleParcelable; 3188c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tanusing android::os::PersistableBundle; 32546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan 33546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tanusing std::cout; 34546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tanusing std::endl; 35546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tanusing std::vector; 36546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan 37546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tannamespace android { 38546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tannamespace aidl { 39546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tannamespace tests { 40546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tannamespace client { 41546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan 4288c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tanbool ConfirmSimpleParcelables(const sp<ITestService>& s) { 4388c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan cout << "Confirming passing and returning SimpleParcelable objects works." 4488c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan << endl; 45546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan 46546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan SimpleParcelable input("Booya", 42); 47546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan SimpleParcelable out_param, returned; 4888c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan Status status = s->RepeatSimpleParcelable(input, &out_param, &returned); 49546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan if (!status.isOk()) { 50546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan cout << "Binder call failed." << endl; 51546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan return false; 52546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan } 53546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan if (input != out_param || input != returned) { 5488c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan cout << "Failed to repeat SimpleParcelable objects." << endl; 55546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan return false; 56546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan } 57546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan 5888c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan cout << "Attempting to reverse an array of SimpleParcelable objects." << endl; 59546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan const vector<SimpleParcelable> original{SimpleParcelable("first", 0), 60546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan SimpleParcelable("second", 1), 61546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan SimpleParcelable("third", 2)}; 62546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan vector<SimpleParcelable> repeated; 63546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan vector<SimpleParcelable> reversed; 6488c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan status = s->ReverseSimpleParcelables(original, &repeated, &reversed); 65546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan if (!status.isOk()) { 66546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan cout << "Binder call failed." << endl; 67546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan return false; 68546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan } 69546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan std::reverse(reversed.begin(), reversed.end()); 70546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan if (repeated != original || reversed != original) { 7188c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan cout << "Failed to reverse an array of SimpleParcelable objects." << endl; 7288c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan return false; 7388c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan } 7488c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan 7588c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan return true; 7688c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan} 7788c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan 7888c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tanbool ConfirmPersistableBundles(const sp<ITestService>& s) { 7988c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan cout << "Confirming passing and returning PersistableBundle objects works." 8088c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan << endl; 8188c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan 8288c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan PersistableBundle empty_bundle, returned; 8388c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan Status status = s->RepeatPersistableBundle(empty_bundle, &returned); 8488c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan if (!status.isOk()) { 8588c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan cout << "Binder call failed for empty PersistableBundle." << endl; 8688c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan return false; 8788c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan } 8888c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan if (empty_bundle != returned) { 8988c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan cout << "Failed to repeat empty PersistableBundle." << endl; 9088c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan return false; 9188c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan } 9288c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan 9388c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan PersistableBundle non_empty_bundle; 9488c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan non_empty_bundle.putBoolean(String16("test_bool"), false); 9588c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan non_empty_bundle.putInt(String16("test_int"), 33); 9688c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan non_empty_bundle.putLong(String16("test_long"), 34359738368l); 9788c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan non_empty_bundle.putDouble(String16("test_double"), 1.1); 9888c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan non_empty_bundle.putString(String16("test_string"), String16("Woot!")); 9988c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan non_empty_bundle.putBooleanVector(String16("test_bool_vector"), 10088c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan {true, false, true}); 10188c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan non_empty_bundle.putIntVector(String16("test_int_vector"), {33, 44, 55, 142}); 10288c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan non_empty_bundle.putLongVector(String16("test_long_vector"), 10388c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan {34l, 8371l, 34359738375l}); 10488c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan non_empty_bundle.putDoubleVector(String16("test_double_vector"), {2.2, 5.4}); 10588c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan non_empty_bundle.putStringVector(String16("test_string_vector"), 10688c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan {String16("hello"), String16("world!")}); 10788c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan PersistableBundle nested_bundle; 10888c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan nested_bundle.putInt(String16("test_nested_int"), 345); 10988c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan non_empty_bundle.putPersistableBundle(String16("test_persistable_bundle"), 11088c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan nested_bundle); 11188c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan 11288c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan status = s->RepeatPersistableBundle(non_empty_bundle, &returned); 11388c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan if (!status.isOk()) { 11488c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan cout << "Binder call failed. " << endl; 11588c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan return false; 11688c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan } 11788c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan if (non_empty_bundle != returned) { 11888c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan cout << "Failed to repeat PersistableBundle object." << endl; 11988c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan return false; 12088c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan } 12188c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan 12288c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan cout << "Attempting to reverse an array of PersistableBundle objects." 12388c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan << endl; 12488c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan PersistableBundle first; 12588c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan PersistableBundle second; 12688c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan PersistableBundle third; 12788c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan first.putInt(String16("test_int"), 1231); 12888c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan second.putLong(String16("test_long"), 222222l); 12988c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan third.putDouble(String16("test_double"), 10.8); 13088c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan const vector<PersistableBundle> original{first, second, third}; 13188c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan 13288c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan vector<PersistableBundle> repeated; 13388c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan vector<PersistableBundle> reversed; 13488c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan status = s->ReversePersistableBundles(original, &repeated, &reversed); 13588c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan if (!status.isOk()) { 13688c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan cout << "Binder call failed." << endl; 13788c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan return false; 13888c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan } 13988c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan std::reverse(reversed.begin(), reversed.end()); 14088c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan if (repeated != original || reversed != original) { 14188c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan cout << "Failed to reverse an array of PersistableBundle objects." << endl; 142546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan return false; 143546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan } 144546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan 145546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan return true; 146546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan} 147546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan 148546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan} // namespace client 149546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan} // namespace tests 150546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan} // namespace aidl 151546d27d8776c91d0769202b82d9d81405e8ab5d7Samuel Tan} // namespace android 152