Home | History | Annotate | Download | only in hidl_test_java
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.commands.hidl_test_java;
     18 
     19 import android.hardware.tests.baz.V1_0.IBase;
     20 import android.hardware.tests.baz.V1_0.IBaz;
     21 import android.hardware.tests.baz.V1_0.IQuux;
     22 import android.hardware.tests.baz.V1_0.IBaz.NestedStruct;
     23 import android.hardware.tests.baz.V1_0.IBazCallback;
     24 import android.os.HwBinder;
     25 import android.os.RemoteException;
     26 import android.os.HidlSupport;
     27 import android.util.Log;
     28 
     29 import java.util.ArrayList;
     30 import java.util.Arrays;
     31 
     32 public final class HidlTestJava {
     33     private static final String TAG = "HidlTestJava";
     34 
     35     public static void main(String[] args) {
     36         int exitCode = 1;
     37         try {
     38             exitCode = new HidlTestJava().run(args);
     39         } catch (Exception e) {
     40             e.printStackTrace();
     41             Log.e(TAG, "Error ", e);
     42         }
     43         System.exit(exitCode);
     44     }
     45 
     46     public int run(String[] args) throws RemoteException {
     47         if (args[0].equals("-c")) {
     48             client();
     49         } else if (args[0].equals("-s")) {
     50             server();
     51         } else {
     52             Log.e(TAG, "Usage: HidlTestJava  -c(lient) | -s(erver)");
     53             System.err.printf("Usage: HidlTestJava  -c(lient) | -s(erver)\n");
     54             return 1;
     55         }
     56 
     57         return 0;
     58     }
     59 
     60     final class HidlDeathRecipient implements HwBinder.DeathRecipient {
     61         final Object mLock = new Object();
     62         boolean mCalled = false;
     63         long mCookie = 0;
     64 
     65         @Override
     66         public void serviceDied(long cookie) {
     67             synchronized (mLock) {
     68                 mCalled = true;
     69                 mCookie = cookie;
     70                 mLock.notify();
     71             }
     72         }
     73 
     74         public boolean cookieMatches(long cookie) {
     75             synchronized (mLock) {
     76                 return mCookie == cookie;
     77             }
     78         }
     79 
     80         public boolean waitUntilServiceDied(long timeoutMillis) {
     81             synchronized(mLock) {
     82                 while (!mCalled) {
     83                     try {
     84                         mLock.wait(timeoutMillis);
     85                     } catch (InterruptedException e) {
     86                         continue; // Spin for another loop
     87                     }
     88                     break; // got notified or timeout hit
     89                 }
     90                 return mCalled;
     91             }
     92         }
     93     };
     94 
     95     private void ExpectTrue(boolean x) {
     96         if (x) {
     97             return;
     98         }
     99 
    100         throw new RuntimeException();
    101     }
    102 
    103     private void ExpectFalse(boolean x) {
    104         ExpectTrue(!x);
    105     }
    106 
    107     private void Expect(String result, String s) {
    108         if (result.equals(s)) {
    109             return;
    110         }
    111 
    112         System.err.printf("Expected '%s', got '%s'\n", s, result);
    113         Log.e(TAG, "Expected '" + s + "', got '" + result + "'");
    114         throw new RuntimeException();
    115     }
    116 
    117     class BazCallback extends IBazCallback.Stub {
    118         private boolean mCalled;
    119 
    120         public BazCallback() {
    121             mCalled = false;
    122         }
    123 
    124         boolean wasCalled() {
    125             return mCalled;
    126         }
    127 
    128         public void heyItsMe(IBazCallback cb) throws RemoteException {
    129             mCalled = true;
    130 
    131             cb.heyItsMe(null);
    132         }
    133 
    134         public void hey() {
    135             mCalled = true;
    136         }
    137     }
    138 
    139     private String numberToEnglish(int x) {
    140         final String[] kDigits = {
    141             "zero",
    142             "one",
    143             "two",
    144             "three",
    145             "four",
    146             "five",
    147             "six",
    148             "seven",
    149             "eight",
    150             "nine",
    151         };
    152 
    153         if (x < 0) {
    154             return "negative " + numberToEnglish(-x);
    155         }
    156 
    157         if (x < 10) {
    158             return kDigits[x];
    159         }
    160 
    161         if (x <= 15) {
    162             final String[] kSpecialTens = {
    163                 "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
    164             };
    165 
    166             return kSpecialTens[x - 10];
    167         }
    168 
    169         if (x < 20) {
    170             return kDigits[x % 10] + "teen";
    171         }
    172 
    173         if (x < 100) {
    174             final String[] kDecades = {
    175                 "twenty", "thirty", "forty", "fifty", "sixty", "seventy",
    176                 "eighty", "ninety",
    177             };
    178 
    179             return kDecades[x / 10 - 2] + kDigits[x % 10];
    180         }
    181 
    182         return "positively huge!";
    183     }
    184 
    185     private void ExpectDeepEq(Object l, Object r) {
    186         ExpectTrue(HidlSupport.deepEquals(l, r));
    187         ExpectTrue(HidlSupport.deepHashCode(l) == HidlSupport.deepHashCode(r));
    188     }
    189 
    190     private void ExpectDeepNe(Object l, Object r) {
    191         ExpectTrue(!HidlSupport.deepEquals(l, r));
    192     }
    193 
    194     private void client() throws RemoteException {
    195 
    196         ExpectDeepEq(null, null);
    197         ExpectDeepNe(null, new String());
    198         ExpectDeepNe(new String(), null);
    199         ExpectDeepEq(new String(), new String());
    200         ExpectDeepEq("hey", "hey");
    201 
    202         ExpectDeepEq(new int[]{1,2}, new int[]{1,2});
    203         ExpectDeepNe(new int[]{1,2}, new int[]{1,3});
    204         ExpectDeepNe(new int[]{1,2}, new int[]{1,2,3});
    205         ExpectDeepEq(new int[][]{{1,2},{3,4}}, new int[][]{{1,2},{3,4}});
    206         ExpectDeepNe(new int[][]{{1,2},{3,4}}, new int[][]{{1,2},{3,5}});
    207         ExpectDeepNe(new int[][]{{1,2},{3,4}}, new int[][]{{1,2,3},{4,5,6}});
    208         ExpectDeepNe(new int[][]{{1,2},{3,4}}, new int[][]{{1,2},{3,4,5}});
    209 
    210         ExpectDeepEq(new Integer[]{1,2}, new Integer[]{1,2});
    211         ExpectDeepNe(new Integer[]{1,2}, new Integer[]{1,3});
    212         ExpectDeepNe(new Integer[]{1,2}, new Integer[]{1,2,3});
    213         ExpectDeepEq(new Integer[][]{{1,2},{3,4}}, new Integer[][]{{1,2},{3,4}});
    214         ExpectDeepNe(new Integer[][]{{1,2},{3,4}}, new Integer[][]{{1,2},{3,5}});
    215         ExpectDeepNe(new Integer[][]{{1,2},{3,4}}, new Integer[][]{{1,2,3},{4,5,6}});
    216         ExpectDeepNe(new Integer[][]{{1,2},{3,4}}, new Integer[][]{{1,2},{3,4,5}});
    217 
    218         ExpectDeepEq(new ArrayList(Arrays.asList(1, 2)),
    219                      new ArrayList(Arrays.asList(1, 2)));
    220         ExpectDeepNe(new ArrayList(Arrays.asList(1, 2)),
    221                      new ArrayList(Arrays.asList(1, 2, 3)));
    222 
    223         ExpectDeepEq(new ArrayList(Arrays.asList(new int[]{1,2}, new int[]{3,4})),
    224                      new ArrayList(Arrays.asList(new int[]{1,2}, new int[]{3,4})));
    225         ExpectDeepNe(new ArrayList(Arrays.asList(new int[]{1,2}, new int[]{3,4})),
    226                      new ArrayList(Arrays.asList(new int[]{1,2}, new int[]{3,5})));
    227 
    228         ExpectDeepEq(new ArrayList(Arrays.asList(new Integer[]{1,2}, new Integer[]{3,4})),
    229                      new ArrayList(Arrays.asList(new Integer[]{1,2}, new Integer[]{3,4})));
    230         ExpectDeepNe(new ArrayList(Arrays.asList(new Integer[]{1,2}, new Integer[]{3,4})),
    231                      new ArrayList(Arrays.asList(new Integer[]{1,2}, new Integer[]{3,5})));
    232 
    233         ExpectDeepEq(new ArrayList[]{new ArrayList(Arrays.asList(1,2)),
    234                                      new ArrayList(Arrays.asList(3,4))},
    235                      new ArrayList[]{new ArrayList(Arrays.asList(1,2)),
    236                                      new ArrayList(Arrays.asList(3,4))});
    237 
    238 
    239         {
    240             // Test access through base interface binder.
    241             IBase baseProxy = IBase.getService("baz");
    242             baseProxy.someBaseMethod();
    243 
    244             IBaz bazProxy = IBaz.castFrom(baseProxy);
    245             ExpectTrue(bazProxy != null);
    246 
    247             // IQuux is completely unrelated to IBase/IBaz, so the following
    248             // should fail, i.e. return null.
    249             IQuux quuxProxy = IQuux.castFrom(baseProxy);
    250             ExpectTrue(quuxProxy == null);
    251         }
    252 
    253         IBaz proxy = IBaz.getService("baz");
    254         proxy.someBaseMethod();
    255 
    256         {
    257             Expect(proxy.interfaceDescriptor(), IBaz.kInterfaceName);
    258         }
    259 
    260         {
    261             IBase.Foo foo = new IBase.Foo();
    262             foo.x = 1;
    263 
    264             for (int i = 0; i < 5; ++i) {
    265                 IBase.Foo.Bar bar = new IBase.Foo.Bar();
    266                 bar.z = 1.0f + (float)i * 0.01f;
    267                 bar.s = "Hello, world " + i;
    268                 foo.aaa.add(bar);
    269             }
    270 
    271             foo.y.z = 3.14f;
    272             foo.y.s = "Lorem ipsum...";
    273 
    274             IBase.Foo result = proxy.someOtherBaseMethod(foo);
    275             ExpectTrue(result.equals(foo));
    276         }
    277 
    278         {
    279             IBase.Foo[] inputArray = new IBase.Foo[2];
    280 
    281             IBase.Foo foo = new IBase.Foo();
    282             foo.x = 1;
    283 
    284             for (int i = 0; i < 5; ++i) {
    285                 IBase.Foo.Bar bar = new IBase.Foo.Bar();
    286                 bar.z = 1.0f + (float)i * 0.01f;
    287                 bar.s = "Hello, world " + i;
    288                 foo.aaa.add(bar);
    289             }
    290 
    291             foo.y.z = 3.14f;
    292             foo.y.s = "Lorem ipsum...";
    293 
    294             inputArray[0] = foo;
    295 
    296             foo = new IBase.Foo();
    297             foo.x = 2;
    298 
    299             for (int i = 0; i < 3; ++i) {
    300                 IBase.Foo.Bar bar = new IBase.Foo.Bar();
    301                 bar.z = 2.0f - (float)i * 0.01f;
    302                 bar.s = "Lorem ipsum " + i;
    303                 foo.aaa.add(bar);
    304             }
    305 
    306             foo.y.z = 1.1414f;
    307             foo.y.s = "Et tu brute?";
    308 
    309             inputArray[1] = foo;
    310 
    311             IBase.Foo[] expectedOutputArray = new IBase.Foo[2];
    312             expectedOutputArray[0] = inputArray[1];
    313             expectedOutputArray[1] = inputArray[0];
    314 
    315             IBase.Foo[] outputArray = proxy.someMethodWithFooArrays(inputArray);
    316 
    317             ExpectTrue(java.util.Objects.deepEquals(outputArray, expectedOutputArray));
    318         }
    319 
    320         {
    321             ArrayList<IBase.Foo> inputVec = new ArrayList<IBase.Foo>();
    322 
    323             IBase.Foo foo = new IBase.Foo();
    324             foo.x = 1;
    325 
    326             for (int i = 0; i < 5; ++i) {
    327                 IBase.Foo.Bar bar = new IBase.Foo.Bar();
    328                 bar.z = 1.0f + (float)i * 0.01f;
    329                 bar.s = "Hello, world " + i;
    330                 foo.aaa.add(bar);
    331             }
    332 
    333             foo.y.z = 3.14f;
    334             foo.y.s = "Lorem ipsum...";
    335 
    336             inputVec.add(foo);
    337 
    338             foo = new IBase.Foo();
    339             foo.x = 2;
    340 
    341             for (int i = 0; i < 3; ++i) {
    342                 IBase.Foo.Bar bar = new IBase.Foo.Bar();
    343                 bar.z = 2.0f - (float)i * 0.01f;
    344                 bar.s = "Lorem ipsum " + i;
    345                 foo.aaa.add(bar);
    346             }
    347 
    348             foo.y.z = 1.1414f;
    349             foo.y.s = "Et tu brute?";
    350 
    351             inputVec.add(foo);
    352 
    353             ArrayList<IBase.Foo> expectedOutputVec = new ArrayList<IBase.Foo>();
    354             expectedOutputVec.add(inputVec.get(1));
    355             expectedOutputVec.add(inputVec.get(0));
    356 
    357             ArrayList<IBase.Foo> outputVec =
    358                 proxy.someMethodWithFooVectors(inputVec);
    359 
    360             ExpectTrue(java.util.Objects.deepEquals(outputVec, expectedOutputVec));
    361         }
    362 
    363         {
    364             IBase.VectorOfArray in = new IBase.VectorOfArray();
    365 
    366             int k = 0;
    367             for (int i = 0; i < 3; ++i) {
    368                 byte[] mac = new byte[6];
    369                 for (int j = 0; j < 6; ++j, ++k) {
    370                     mac[j] = (byte)k;
    371                 }
    372 
    373                 in.addresses.add(mac);
    374             }
    375 
    376             IBase.VectorOfArray expectedOut = new IBase.VectorOfArray();
    377             int n = in.addresses.size();
    378 
    379             for (int i = 0; i < n; ++i) {
    380                 expectedOut.addresses.add(in.addresses.get(n - 1 - i));
    381             }
    382 
    383             IBase.VectorOfArray out = proxy.someMethodWithVectorOfArray(in);
    384             ExpectTrue(out.equals(expectedOut));
    385         }
    386 
    387         {
    388             ArrayList<byte[]> in = new ArrayList<byte[]>();
    389 
    390             int k = 0;
    391             for (int i = 0; i < 3; ++i) {
    392                 byte[] mac = new byte[6];
    393                 for (int j = 0; j < 6; ++j, ++k) {
    394                     mac[j] = (byte)k;
    395                 }
    396 
    397                 in.add(mac);
    398             }
    399 
    400             ArrayList<byte[]> expectedOut = new ArrayList<byte[]>();
    401 
    402             int n = in.size();
    403             for (int i = 0; i < n; ++i) {
    404                 expectedOut.add(in.get(n - 1 - i));
    405             }
    406 
    407             ArrayList<byte[]> out = proxy.someMethodTakingAVectorOfArray(in);
    408 
    409             ExpectTrue(out.size() == expectedOut.size());
    410             for  (int i = 0; i < n; ++i) {
    411                 ExpectTrue(java.util.Objects.deepEquals(out.get(i), expectedOut.get(i)));
    412             }
    413         }
    414 
    415         {
    416             IBase.StringMatrix5x3 in = new IBase.StringMatrix5x3();
    417             IBase.StringMatrix3x5 expectedOut = new IBase.StringMatrix3x5();
    418 
    419             for (int i = 0; i < 5; ++i) {
    420                 for (int j = 0; j < 3; ++j) {
    421                     in.s[i][j] = numberToEnglish(3 * i + j + 1);
    422                     expectedOut.s[j][i] = in.s[i][j];
    423                 }
    424             }
    425 
    426             IBase.StringMatrix3x5 out = proxy.transpose(in);
    427 
    428             // [[1 2 3] [4 5 6] [7 8 9] [10 11 12] [13 14 15]]^T
    429             // = [[1 4 7 10 13] [2 5 8 11 14] [3 6 9 12 15]]
    430             ExpectTrue(out.equals(expectedOut));
    431         }
    432 
    433         {
    434             String[][] in = new String[5][3];
    435             String[][] expectedOut = new String[3][5];
    436             for (int i = 0; i < 5; ++i) {
    437                 for (int j = 0; j < 3; ++j) {
    438                     in[i][j] = numberToEnglish(3 * i + j + 1);
    439                     expectedOut[j][i] = in[i][j];
    440                 }
    441             }
    442 
    443             String[][] out = proxy.transpose2(in);
    444 
    445             // [[1 2 3] [4 5 6] [7 8 9] [10 11 12] [13 14 15]]^T
    446             // = [[1 4 7 10 13] [2 5 8 11 14] [3 6 9 12 15]]
    447             ExpectTrue(java.util.Arrays.deepEquals(out, expectedOut));
    448         }
    449 
    450         ExpectTrue(proxy.someBoolMethod(true) == false);
    451 
    452         {
    453             boolean[] someBoolArray = new boolean[3];
    454             someBoolArray[0] = true;
    455             someBoolArray[1] = false;
    456             someBoolArray[2] = true;
    457 
    458             boolean[] resultArray = proxy.someBoolArrayMethod(someBoolArray);
    459             ExpectTrue(resultArray[0] == false);
    460             ExpectTrue(resultArray[1] == true);
    461             ExpectTrue(resultArray[2] == false);
    462 
    463             ArrayList<Boolean> someBoolVec = new ArrayList<Boolean>();
    464             someBoolVec.add(true);
    465             someBoolVec.add(false);
    466             someBoolVec.add(true);
    467 
    468             ArrayList<Boolean> resultVec = proxy.someBoolVectorMethod(someBoolVec);
    469             ExpectTrue(resultVec.get(0) == false);
    470             ExpectTrue(resultVec.get(1) == true);
    471             ExpectTrue(resultVec.get(2) == false);
    472         }
    473 
    474         proxy.doThis(1.0f);
    475 
    476         ExpectTrue(proxy.doThatAndReturnSomething(1) == 666);
    477         ExpectTrue(proxy.doQuiteABit(1, 2L, 3.0f, 4.0) == 666.5);
    478 
    479         {
    480             int[] paramArray = new int[15];
    481             int[] expectedOutArray = new int[32];
    482             ArrayList<Integer> paramVec = new ArrayList<Integer>();
    483             ArrayList<Integer> expectedOutVec = new ArrayList<Integer>();
    484 
    485             for (int i = 0; i < paramArray.length; ++i) {
    486                 paramArray[i] = i;
    487                 paramVec.add(i);
    488 
    489                 expectedOutArray[i] = 2 * i;
    490                 expectedOutArray[15 + i] = i;
    491 
    492                 expectedOutVec.add(2 * i);
    493             }
    494 
    495             expectedOutArray[30] = 1;
    496             expectedOutArray[31] = 2;
    497 
    498 
    499             int[] outArray = proxy.doSomethingElse(paramArray);
    500             ExpectTrue(java.util.Objects.deepEquals(outArray, expectedOutArray));
    501 
    502             ArrayList<Integer> outVec = proxy.mapThisVector(paramVec);
    503             java.util.Objects.equals(outVec, expectedOutVec);
    504 
    505         }
    506 
    507         Expect(proxy.doStuffAndReturnAString(), "Hello, world!");
    508 
    509         BazCallback cb = new BazCallback();
    510         ExpectTrue(!cb.wasCalled());
    511         proxy.callMe(cb);
    512         ExpectTrue(cb.wasCalled());
    513 
    514         ExpectTrue(proxy.useAnEnum(IBaz.SomeEnum.goober) == -64);
    515 
    516         {
    517             String[] stringArray = new String[3];
    518             stringArray[0] = "one";
    519             stringArray[1] = "two";
    520             stringArray[2] = "three";
    521 
    522             String[] expectedOutArray = new String[2];
    523             expectedOutArray[0] = "Hello";
    524             expectedOutArray[1] = "World";
    525 
    526             String[] outArray = proxy.haveSomeStrings(stringArray);
    527             ExpectTrue(java.util.Arrays.deepEquals(outArray, expectedOutArray));
    528 
    529             ArrayList<String> stringVec = new ArrayList<String>();
    530             stringVec.add("one");
    531             stringVec.add("two");
    532             stringVec.add("three");
    533 
    534             ArrayList<String> expectedOutVec = new ArrayList<String>();
    535             expectedOutVec.add("Hello");
    536             expectedOutVec.add("World");
    537 
    538             ExpectTrue(expectedOutVec.equals(proxy.haveAStringVec(stringVec)));
    539         }
    540 
    541         proxy.returnABunchOfStrings(
    542                 new IBaz.returnABunchOfStringsCallback() {
    543                     @Override
    544                     public void onValues(String a, String b, String c) {
    545                         Expect(a, "Eins");
    546                         Expect(b, "Zwei");
    547                         Expect(c, "Drei");
    548                     }
    549                 });
    550 
    551         proxy.returnABunchOfStrings((a,b,c) -> Expect(a + b + c, "EinsZweiDrei"));
    552 
    553         proxy.callMeLater(new BazCallback());
    554         System.gc();
    555         proxy.iAmFreeNow();
    556 
    557         {
    558             IBaz.T t1 = new IBaz.T();
    559             IBaz.T t2 = new IBaz.T();
    560             for (int i = 0; i < 5; i++) {
    561                 for (int j = 0; j < 3; j++) {
    562                     t1.matrix5x3[i][j] = t2.matrix5x3[i][j] = (i + 1) * (j + 1);
    563                 }
    564             }
    565             ExpectTrue(t1.equals(t2));
    566             ExpectTrue(t1.hashCode() == t2.hashCode());
    567             t2.matrix5x3[4][2] = -60;
    568             ExpectTrue(!t1.equals(t2));
    569         }
    570 
    571         ArrayList<NestedStruct> structs = proxy.getNestedStructs();
    572         ExpectTrue(structs.size() == 5);
    573         ExpectTrue(structs.get(1).matrices.size() == 6);
    574 
    575         {
    576             IBaz.Everything e = new IBaz.Everything();
    577             Expect(e.toString(),
    578                 "{.number = 0, .anotherNumber = 0, .s = , " +
    579                 ".vs = [], .multidimArray = [[null, null], [null, null]], " +
    580                 ".sArray = [null, null, null], .anotherStruct = {.first = , .last = }, .bf = }");
    581             e.s = "string!";
    582             e.number = 127;
    583             e.anotherNumber = 100;
    584             e.vs.addAll(Arrays.asList("One", "Two", "Three"));
    585             for (int i = 0; i < e.multidimArray.length; i++)
    586                 for (int j = 0; j < e.multidimArray[i].length; j++)
    587                     e.multidimArray[i][j] = Integer.toString(i) + Integer.toString(j);
    588             e.bf = IBaz.BitField.VALL;
    589             e.anotherStruct.first = "James";
    590             e.anotherStruct.last = "Bond";
    591             Expect(e.toString(),
    592                 "{.number = 127, .anotherNumber = 100, .s = string!, " +
    593                 ".vs = [One, Two, Three], .multidimArray = [[00, 01], [10, 11]], " +
    594                 ".sArray = [null, null, null], .anotherStruct = {.first = James, .last = Bond}, " +
    595                 ".bf = V0 | V1 | V2 | V3 | VALL}");
    596             Expect(IBaz.BitField.toString(IBaz.BitField.VALL), "VALL");
    597             Expect(IBaz.BitField.toString((byte)(IBaz.BitField.V0 | IBaz.BitField.V2)), "0x5");
    598             Expect(IBaz.BitField.dumpBitfield(IBaz.BitField.VALL), "V0 | V1 | V2 | V3 | VALL");
    599             Expect(IBaz.BitField.dumpBitfield((byte)(IBaz.BitField.V1 | IBaz.BitField.V3 | 0xF0)),
    600                 "V1 | V3 | 0xf0");
    601 
    602             Expect(proxy.toString(), IBaz.kInterfaceName + "@Proxy");
    603         }
    604 
    605         {
    606             // Ensure that native parcel is cleared even if the corresponding
    607             // Java object isn't GC'd.
    608             ArrayList<Integer> data4K = new ArrayList<>(1024);
    609             for (int i = 0; i < 1024; i++) {
    610                 data4K.add(i);
    611             }
    612 
    613             for (int i = 0; i < 1024; i++) {
    614                 // If they are not properly cleaned up, these calls will put 4MB of data in
    615                 // kernel binder buffer, and will fail.
    616                 try {
    617                     proxy.mapThisVector(data4K);
    618                 } catch (RemoteException ex) {
    619                     throw new RuntimeException("Failed at call #" + Integer.toString(i), ex);
    620                 }
    621             }
    622         }
    623 
    624         // --- DEATH RECIPIENT TESTING ---
    625         // This must always be done last, since it will kill the native server process
    626         HidlDeathRecipient recipient1 = new HidlDeathRecipient();
    627         HidlDeathRecipient recipient2 = new HidlDeathRecipient();
    628 
    629         final int cookie1 = 0x1481;
    630         final int cookie2 = 0x1482;
    631         ExpectTrue(proxy.linkToDeath(recipient1, cookie1));
    632         ExpectTrue(proxy.linkToDeath(recipient2, cookie2));
    633         ExpectTrue(proxy.unlinkToDeath(recipient2));
    634         try {
    635             proxy.dieNow();
    636         } catch (RemoteException e) {
    637             // Expected
    638         }
    639         ExpectTrue(recipient1.waitUntilServiceDied(2000 /*timeoutMillis*/));
    640         ExpectTrue(!recipient2.waitUntilServiceDied(2000 /*timeoutMillis*/));
    641         ExpectTrue(recipient1.cookieMatches(cookie1));
    642         Log.d(TAG, "OK, exiting");
    643 
    644     }
    645 
    646     class Baz extends IBaz.Stub {
    647         // from IBase
    648         public void someBaseMethod() {
    649             Log.d(TAG, "Baz someBaseMethod");
    650         }
    651 
    652         public IBase.Foo someOtherBaseMethod(IBase.Foo foo) {
    653             Log.d(TAG, "Baz someOtherBaseMethod " + foo.toString());
    654             return foo;
    655         }
    656 
    657         public IBase.Foo[] someMethodWithFooArrays(IBase.Foo[] fooInput) {
    658             Log.d(TAG, "Baz someMethodWithFooArrays " + fooInput.toString());
    659 
    660             IBase.Foo[] fooOutput = new IBase.Foo[2];
    661             fooOutput[0] = fooInput[1];
    662             fooOutput[1] = fooInput[0];
    663 
    664             return fooOutput;
    665         }
    666 
    667         public ArrayList<IBase.Foo> someMethodWithFooVectors(
    668                 ArrayList<IBase.Foo> fooInput) {
    669             Log.d(TAG, "Baz someMethodWithFooVectors " + fooInput.toString());
    670 
    671             ArrayList<IBase.Foo> fooOutput = new ArrayList<IBase.Foo>();
    672             fooOutput.add(fooInput.get(1));
    673             fooOutput.add(fooInput.get(0));
    674 
    675             return fooOutput;
    676         }
    677 
    678         public IBase.VectorOfArray someMethodWithVectorOfArray(
    679                 IBase.VectorOfArray in) {
    680             Log.d(TAG, "Baz someMethodWithVectorOfArray " + in.toString());
    681 
    682             IBase.VectorOfArray out = new IBase.VectorOfArray();
    683             int n = in.addresses.size();
    684             for (int i = 0; i < n; ++i) {
    685                 out.addresses.add(in.addresses.get(n - i - 1));
    686             }
    687 
    688             return out;
    689         }
    690 
    691         public ArrayList<byte[/* 6 */]> someMethodTakingAVectorOfArray(
    692                 ArrayList<byte[/* 6 */]> in) {
    693             Log.d(TAG, "Baz someMethodTakingAVectorOfArray");
    694 
    695             int n = in.size();
    696             ArrayList<byte[]> out = new ArrayList<byte[]>();
    697             for (int i = 0; i < n; ++i) {
    698                 out.add(in.get(n - i - 1));
    699             }
    700 
    701             return out;
    702         }
    703 
    704         public IBase.StringMatrix3x5 transpose(IBase.StringMatrix5x3 in) {
    705             Log.d(TAG, "Baz transpose " + in.toString());
    706 
    707             IBase.StringMatrix3x5 out = new IBase.StringMatrix3x5();
    708             for (int i = 0; i < 3; ++i) {
    709                 for (int j = 0; j < 5; ++j) {
    710                     out.s[i][j] = in.s[j][i];
    711                 }
    712             }
    713 
    714             return out;
    715         }
    716 
    717         public String[][] transpose2(String[][] in) {
    718             Log.d(TAG, "Baz transpose2 " + in.toString());
    719 
    720             String[][] out = new String[3][5];
    721             for (int i = 0; i < 3; ++i) {
    722                 for (int j = 0; j < 5; ++j) {
    723                     out[i][j] = in[j][i];
    724                 }
    725             }
    726 
    727             return out;
    728         }
    729 
    730         public boolean someBoolMethod(boolean x) {
    731             Log.d(TAG, "Baz someBoolMethod(" + x + ")");
    732 
    733             return !x;
    734         }
    735 
    736         public boolean[] someBoolArrayMethod(boolean[] x) {
    737             Log.d(TAG, "Baz someBoolArrayMethod("
    738                     + x.toString() + ")");
    739 
    740             boolean[] out = new boolean[4];
    741             out[0] = !x[0];
    742             out[1] = !x[1];
    743             out[2] = !x[2];
    744             out[3] = true;
    745 
    746             return out;
    747         }
    748 
    749         public ArrayList<Boolean> someBoolVectorMethod(ArrayList<Boolean> x) {
    750             Log.d(TAG, "Baz someBoolVectorMethod(" + x.toString() + ")");
    751 
    752             ArrayList<Boolean> out = new ArrayList<Boolean>();
    753             for (int i = 0; i < x.size(); ++i) {
    754                 out.add(!x.get(i));
    755             }
    756 
    757             return out;
    758         }
    759 
    760         public void doThis(float param) {
    761             Log.d(TAG, "Baz doThis " + param);
    762         }
    763 
    764         public int doThatAndReturnSomething(long param) {
    765             Log.d(TAG, "Baz doThatAndReturnSomething " + param);
    766             return 666;
    767         }
    768 
    769         public double doQuiteABit(int a, long b, float c, double d) {
    770             Log.d(TAG, "Baz doQuiteABit " + a + ", " + b + ", " + c + ", " + d);
    771             return 666.5;
    772         }
    773 
    774         public int[] doSomethingElse(int[] param) {
    775             Log.d(TAG, "Baz doSomethingElse " + param.toString());
    776 
    777             int[] something = new int[32];
    778             for (int i = 0; i < 15; ++i) {
    779                 something[i] = 2 * param[i];
    780                 something[15 + i] = param[i];
    781             }
    782             something[30] = 1;
    783             something[31] = 2;
    784 
    785             return something;
    786         }
    787 
    788         public String doStuffAndReturnAString() {
    789             Log.d(TAG, "doStuffAndReturnAString");
    790             return "Hello, world!";
    791         }
    792 
    793         public ArrayList<Integer> mapThisVector(ArrayList<Integer> param) {
    794             Log.d(TAG, "mapThisVector " + param.toString());
    795 
    796             ArrayList<Integer> out = new ArrayList<Integer>();
    797 
    798             for (int i = 0; i < param.size(); ++i) {
    799                 out.add(2 * param.get(i));
    800             }
    801 
    802             return out;
    803         }
    804 
    805         public void takeAMask(byte bf, byte first, IBase.MyMask second, byte third,
    806                 takeAMaskCallback cb) {
    807             cb.onValues(bf, (byte)(bf | first),
    808                     (byte)(second.value & bf), (byte)((bf | bf) & third));
    809         }
    810 
    811         public byte returnABitField() {
    812             return 0;
    813         }
    814 
    815         public int size(int size) {
    816             return size;
    817         }
    818 
    819         @Override
    820         public ArrayList<NestedStruct> getNestedStructs() throws RemoteException {
    821             return new ArrayList<>();
    822         }
    823 
    824         class BazCallback extends IBazCallback.Stub {
    825             public void heyItsMe(IBazCallback cb) {
    826                 Log.d(TAG, "SERVER: heyItsMe");
    827             }
    828 
    829             public void hey() {
    830                 Log.d(TAG, "SERVER: hey");
    831             }
    832         }
    833 
    834         public void callMe(IBazCallback cb) throws RemoteException {
    835             Log.d(TAG, "callMe");
    836             cb.heyItsMe(new BazCallback());
    837         }
    838 
    839         private IBazCallback mStoredCallback;
    840         public void callMeLater(IBazCallback cb) {
    841             mStoredCallback = cb;
    842         }
    843 
    844         public void iAmFreeNow() throws RemoteException {
    845             if (mStoredCallback != null) {
    846                 mStoredCallback.hey();
    847             }
    848         }
    849 
    850         public void dieNow() {
    851             // Not tested in Java
    852         }
    853 
    854         public byte useAnEnum(byte zzz) {
    855             Log.d(TAG, "useAnEnum " + zzz);
    856             return SomeEnum.quux;
    857         }
    858 
    859         public String[] haveSomeStrings(String[] array) {
    860             Log.d(TAG, "haveSomeStrings ["
    861                         + "\"" + array[0] + "\", "
    862                         + "\"" + array[1] + "\", "
    863                         + "\"" + array[2] + "\"]");
    864 
    865             String[] result = new String[2];
    866             result[0] = "Hello";
    867             result[1] = "World";
    868 
    869             return result;
    870         }
    871 
    872         public ArrayList<String> haveAStringVec(ArrayList<String> vector) {
    873             Log.d(TAG, "haveAStringVec ["
    874                         + "\"" + vector.get(0) + "\", "
    875                         + "\"" + vector.get(1) + "\", "
    876                         + "\"" + vector.get(2) + "\"]");
    877 
    878             ArrayList<String> result = new ArrayList<String>();
    879             result.add("Hello");
    880             result.add("World");
    881 
    882             return result;
    883         }
    884 
    885         public void returnABunchOfStrings(returnABunchOfStringsCallback cb) {
    886             cb.onValues("Eins", "Zwei", "Drei");
    887         }
    888     }
    889 
    890     private void server() throws RemoteException {
    891         Baz baz = new Baz();
    892         baz.registerAsService("baz");
    893 
    894         try {
    895             Thread.sleep(20000);
    896         } catch (InterruptedException e) {
    897         }
    898     }
    899 }
    900