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