157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin/* 257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin * Copyright (C) 2015 The Android Open Source Project 357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin * 457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin * Licensed under the Apache License, Version 2.0 (the "License"); 557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin * you may not use this file except in compliance with the License. 657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin * You may obtain a copy of the License at 757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin * 857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin * http://www.apache.org/licenses/LICENSE-2.0 957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin * 1057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin * Unless required by applicable law or agreed to in writing, software 1157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin * distributed under the License is distributed on an "AS IS" BASIS, 1257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin * See the License for the specific language governing permissions and 1457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin * limitations under the License. 1557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin */ 1657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 1757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin#include "aidl_test_client_nullables.h" 1857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 1957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin#include <utils/String16.h> 2057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 2157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin#include <iostream> 2257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin#include <memory> 2357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin#include <string> 2457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin#include <vector> 2557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 2657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin// libutils: 2757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinusing android::sp; 2857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinusing android::String16; 2957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 3057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin// libbinder: 3157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinusing android::binder::Status; 3257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 3357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin// generated 3457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinusing android::aidl::tests::ITestService; 3557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinusing android::aidl::tests::SimpleParcelable; 3657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 3757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinusing std::string; 3857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinusing std::unique_ptr; 3957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinusing std::vector; 4057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinusing std::cout; 4157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinusing std::cerr; 4257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinusing std::endl; 4357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 4457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinnamespace android { 4557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinnamespace aidl { 4657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinnamespace tests { 4757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinnamespace client { 4857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 4957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinnamespace { 5057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlintemplate<typename T> 5157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinbool ValuesEqual(const unique_ptr<T>& in, const unique_ptr<T>& out) { 5257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return *in == *out; 5357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin} 5457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 5557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlintemplate<> 5657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinbool ValuesEqual<vector<unique_ptr<String16>>>( 5757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const unique_ptr<vector<unique_ptr<String16>>>& in, 5857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const unique_ptr<vector<unique_ptr<String16>>>& out) { 5957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!in) { 6057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return !out; 6157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 6257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 6357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!out) { 6457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return false; 6557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 6657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 6757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (in->size() != out->size()) { 6857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return false; 6957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 7057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 7157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin for (size_t i = 0; i < in->size(); i++) { 7257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const unique_ptr<String16>& a = (*in)[i]; 7357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const unique_ptr<String16>& b = (*out)[i]; 7457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 7557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!(a || b)) { 7657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin continue; 7757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 7857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 7957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!(a && b)) { 8057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return false; 8157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 8257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 8357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (*a != *b) { 8457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return false; 8557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 8657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 8757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 8857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return true; 8957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin} 9057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 9157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlintemplate<typename T> 92f05cc26630828c848e46ea0e584dbdd2541ea723Chih-Hung Hsiehbool ConfirmNullableType(const sp<ITestService>& s, const string& type_name, 9357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<T> in, 9457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Status(ITestService::*func)(const unique_ptr<T>&, 9557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<T>*)) { 9657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin cout << "... Confirming nullables for " << type_name << " ..." << endl; 9757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Status status; 9857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<T> out; 9957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 10057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin status = (*s.*func)(in, &out); 10157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 10257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!status.isOk()) { 10357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin cerr << "Could not repeat nullable " << type_name << "." << endl; 10457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return false; 10557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 10657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 10757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!out) { 10857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin cerr << "Got back null when repeating " << type_name << "." << endl; 10957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return false; 11057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 11157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 11257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!ValuesEqual(in, out)) { 11357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin cerr << "Got back a non-matching value when repeating " << type_name 11457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin << "." << endl; 11557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return false; 11657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 11757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 11857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin in.reset(); 11957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin status = (*s.*func)(in, &out); 12057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 12157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!status.isOk()) { 12257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin cerr << "Could not repeat null as " << type_name << "." << endl; 12357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return false; 12457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 12557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 12657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (out) { 12757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin cerr << "Got back a value when sent null for " << type_name << "." 12857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin << endl; 12957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return false; 13057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 13157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 13257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return true; 13357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin} 13457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 13533375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wileybool CheckAppropriateIBinderHandling(const sp<ITestService>& s) { 13633375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley 13733375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley Status status; 13833375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley sp<IBinder> binder = new BBinder(); 13933375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley sp<IBinder> null_binder = nullptr; 14033375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley unique_ptr<vector<sp<IBinder>>> list_with_nulls( 14133375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley new vector<sp<IBinder>>{binder, null_binder}); 14233375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley unique_ptr<vector<sp<IBinder>>> list_without_nulls( 14333375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley new vector<sp<IBinder>>{binder, binder}); 14433375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley 14533375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley // Methods without @nullable throw up when given null binders 14633375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley if (s->TakesAnIBinder(null_binder).exceptionCode() != 14733375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley binder::Status::EX_NULL_POINTER) { 14833375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley cerr << "Did not receive expected null exception on line: " 14933375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley << __LINE__ << endl; 15033375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley return false; 15133375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley } 15233375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley if (s->TakesAnIBinderList(*list_with_nulls).exceptionCode() != 15333375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley binder::Status::EX_NULL_POINTER) { 15433375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley cerr << "Did not receive expected null exception on line: " 15533375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley << __LINE__ << endl; 15633375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley return false; 15733375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley } 15833375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley 15933375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley // But those same methods are fine with valid binders 16033375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley if (!s->TakesAnIBinder(binder).isOk()) { 16133375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley cerr << "Received unexpected exception on line " 16233375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley << __LINE__ << endl; 16333375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley return false; 16433375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley } 16533375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley if (!s->TakesAnIBinderList(*list_without_nulls).isOk()) { 16633375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley cerr << "Received unexpected exception on line " 16733375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley << __LINE__ << endl; 16833375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley return false; 16933375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley } 17033375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley 17133375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley // And methods with @nullable don't care. 17233375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley if (!s->TakesANullableIBinder(null_binder).isOk()) { 17333375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley cerr << "Received unexpected exception on line " 17433375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley << __LINE__ << endl; 17533375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley return false; 17633375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley } 17733375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley if (!s->TakesANullableIBinder(binder).isOk()) { 17833375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley cerr << "Received unexpected exception on line " 17933375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley << __LINE__ << endl; 18033375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley return false; 18133375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley } 18233375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley if (!s->TakesANullableIBinderList(list_with_nulls).isOk()) { 18333375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley cerr << "Received unexpected exception on line " 18433375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley << __LINE__ << endl; 18533375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley return false; 18633375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley } 18733375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley if (!s->TakesANullableIBinderList(list_without_nulls).isOk()) { 18833375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley cerr << "Received unexpected exception on line " 18933375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley << __LINE__ << endl; 19033375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley return false; 19133375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley } 19233375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley 19333375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley return true; 19433375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley} 19533375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley 196513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wileybool CheckAppropriateIInterfaceHandling(const sp<ITestService>& s) { 197513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley 198513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley sp<INamedCallback> callback; 199513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley if (!s->GetCallback(false, &callback).isOk()) { 200513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley cerr << "Received unexpected exception on line " 201513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley << __LINE__ << endl; 202513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley return false; 203513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley } 204513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley if (callback.get() == nullptr) { 205513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley cerr << "Expected to receive a non-null binder on line: " 206513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley << __LINE__ << endl; 207513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley return false; 208513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley } 209513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley if (!s->GetCallback(true, &callback).isOk()) { 210513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley cerr << "Received unexpected exception on line " 211513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley << __LINE__ << endl; 212513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley return false; 213513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley } 214513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley if (callback.get() != nullptr) { 215513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley cerr << "Expected to receive a null binder on line: " 216513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley << __LINE__ << endl; 217513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley return false; 218513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley } 219513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley return true; 220513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley} 221513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley 22257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin} // namespace 22357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 22457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinbool ConfirmNullables(const sp<ITestService>& s) { 22557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Status status; 22657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin cout << "Confirming passing and returning nullable values works." << endl; 22757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 22857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!ConfirmNullableType(s, "integer array", 22957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<vector<int32_t>>( 23057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin new vector<int32_t>({1,2,3})), 23157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin &ITestService::RepeatNullableIntArray)) { 23257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return false; 23357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 23457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 23557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!ConfirmNullableType(s, "string", 23657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<String16>(new String16("Blooob")), 23757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin &ITestService::RepeatNullableString)) { 23857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return false; 23957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 24057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 24157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<vector<unique_ptr<String16>>> test_string_array( 24257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin new vector<unique_ptr<String16>>()); 24357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin test_string_array->push_back(unique_ptr<String16>(new String16("Wat"))); 24457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin test_string_array->push_back(unique_ptr<String16>( 24557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin new String16("Blooob"))); 24657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin test_string_array->push_back(unique_ptr<String16>(new String16("Wat"))); 24757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin test_string_array->push_back(unique_ptr<String16>(nullptr)); 24857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin test_string_array->push_back(unique_ptr<String16>(new String16("YEAH"))); 24957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin test_string_array->push_back(unique_ptr<String16>( 25057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin new String16("OKAAAAY"))); 25157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 25257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!ConfirmNullableType(s, "string array", std::move(test_string_array), 25357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin &ITestService::RepeatNullableStringList)) { 25457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return false; 25557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 25657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 25757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!ConfirmNullableType(s, "parcelable", 25857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<SimpleParcelable>( 25957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin new SimpleParcelable("Booya", 42)), 26057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin &ITestService::RepeatNullableParcelable)) { 26157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return false; 26257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 26357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 26433375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley if (!CheckAppropriateIBinderHandling(s)) { 26533375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley cerr << "Handled null IBinders poorly." << endl; 26633375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley return false; 26733375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley } 26833375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley 269513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley if (!CheckAppropriateIInterfaceHandling(s)) { 270513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley cerr << "Handled nullable IInterface instances poorly." << endl; 271513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley return false; 272513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley } 273513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley 27457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return true; 27557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin} 27657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 27757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin} // namespace client 27857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin} // namespace tests 27957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin} // namespace aidl 28057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin} // namespace android 281