1 /* 2 * Copyright (C) 2018 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 android.binder.cts; 18 19 import android.os.Binder; 20 import android.os.IBinder; 21 import android.os.ParcelFileDescriptor; 22 import android.os.RemoteException; 23 import java.io.FileDescriptor; 24 import java.io.IOException; 25 import java.io.PrintWriter; 26 import java.util.concurrent.CountDownLatch; 27 import test_package.Bar; 28 import test_package.Baz; 29 import test_package.Foo; 30 import test_package.GenericBar; 31 import test_package.ICompatTest; 32 import test_package.IEmpty; 33 import test_package.ITest; 34 import test_package.RegularPolygon; 35 import test_package.ExtendableParcelable; 36 import test_package.MyExt; 37 import test_package.SimpleUnion; 38 39 public class TestImpl extends ITest.Stub { 40 @Override dump(FileDescriptor fd, PrintWriter pw, String[] args)41 protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 42 for (String arg : args) { 43 pw.print(arg); 44 } 45 } 46 47 @Override GetName()48 public String GetName() { 49 return "JAVA"; 50 } 51 52 @Override TestVoidReturn()53 public void TestVoidReturn() {} 54 55 @Override TestOneway()56 public void TestOneway() throws RemoteException { 57 throw new RemoteException("Oneway call errors should be ignored"); 58 } 59 60 @Override GiveMeMyCallingPid()61 public int GiveMeMyCallingPid() { 62 return Binder.getCallingPid(); 63 } 64 65 @Override GiveMeMyCallingUid()66 public int GiveMeMyCallingUid() { 67 return Binder.getCallingUid(); 68 } 69 70 private CountDownLatch mCachedLatch = new CountDownLatch(1); 71 private int mCachedPid = -1; 72 private int mCachedUid = -1; 73 waitForCachedOnewayInfo()74 private void waitForCachedOnewayInfo() { 75 try { 76 mCachedLatch.await(); 77 } catch (InterruptedException e) { 78 // This thread is never expected to be interrupted during this test. This will be 79 // converted to a RemoteException on the other side and cause the test to fail. 80 81 throw new RuntimeException(e.toString()); 82 } 83 } 84 85 @Override CacheCallingInfoFromOneway()86 public void CacheCallingInfoFromOneway() { 87 mCachedPid = Binder.getCallingPid(); 88 mCachedUid = Binder.getCallingUid(); 89 mCachedLatch.countDown(); 90 } 91 92 @Override GiveMeMyCallingPidFromOneway()93 public int GiveMeMyCallingPidFromOneway() { 94 waitForCachedOnewayInfo(); 95 return mCachedPid; 96 } 97 98 @Override GiveMeMyCallingUidFromOneway()99 public int GiveMeMyCallingUidFromOneway() { 100 waitForCachedOnewayInfo(); 101 return mCachedUid; 102 } 103 104 @Override RepeatInt(int in_value)105 public int RepeatInt(int in_value) { 106 return in_value; 107 } 108 109 @Override RepeatLong(long in_value)110 public long RepeatLong(long in_value) { 111 return in_value; 112 } 113 114 @Override RepeatFloat(float in_value)115 public float RepeatFloat(float in_value) { 116 return in_value; 117 } 118 119 @Override RepeatDouble(double in_value)120 public double RepeatDouble(double in_value) { 121 return in_value; 122 } 123 124 @Override RepeatBoolean(boolean in_value)125 public boolean RepeatBoolean(boolean in_value) { 126 return in_value; 127 } 128 129 @Override RepeatChar(char in_value)130 public char RepeatChar(char in_value) { 131 return in_value; 132 } 133 134 @Override RepeatByte(byte in_value)135 public byte RepeatByte(byte in_value) { 136 return in_value; 137 } 138 139 @Override RepeatByteEnum(byte in_value)140 public byte RepeatByteEnum(byte in_value) { 141 return in_value; 142 } 143 144 @Override RepeatIntEnum(int in_value)145 public int RepeatIntEnum(int in_value) { 146 return in_value; 147 } 148 149 @Override RepeatLongEnum(long in_value)150 public long RepeatLongEnum(long in_value) { 151 return in_value; 152 } 153 154 @Override RepeatBinder(IBinder in_value)155 public IBinder RepeatBinder(IBinder in_value) { 156 return in_value; 157 } 158 159 @Override RepeatNullableBinder(IBinder in_value)160 public IBinder RepeatNullableBinder(IBinder in_value) { 161 return in_value; 162 } 163 164 @Override RepeatInterface(IEmpty in_value)165 public IEmpty RepeatInterface(IEmpty in_value) { 166 return in_value; 167 } 168 169 @Override RepeatNullableInterface(IEmpty in_value)170 public IEmpty RepeatNullableInterface(IEmpty in_value) { 171 return in_value; 172 } 173 174 @Override RepeatFd(ParcelFileDescriptor in_value)175 public ParcelFileDescriptor RepeatFd(ParcelFileDescriptor in_value) { 176 return in_value; 177 } 178 179 @Override RepeatNullableFd(ParcelFileDescriptor in_value)180 public ParcelFileDescriptor RepeatNullableFd(ParcelFileDescriptor in_value) { 181 return in_value; 182 } 183 184 @Override RepeatString(String in_value)185 public String RepeatString(String in_value) { 186 return in_value; 187 } 188 189 @Override RepeatNullableString(String in_value)190 public String RepeatNullableString(String in_value) { 191 return in_value; 192 } 193 194 @Override RepeatPolygon(RegularPolygon in_value)195 public RegularPolygon RepeatPolygon(RegularPolygon in_value) { 196 return in_value; 197 } 198 199 @Override RepeatNullablePolygon(RegularPolygon in_value)200 public RegularPolygon RepeatNullablePolygon(RegularPolygon in_value) { 201 return in_value; 202 } 203 204 @Override RenamePolygon(RegularPolygon value, String name)205 public void RenamePolygon(RegularPolygon value, String name) { 206 value.name = name; 207 } 208 209 @Override RepeatBooleanArray(boolean[] in_value, boolean[] repeated)210 public boolean[] RepeatBooleanArray(boolean[] in_value, boolean[] repeated) { 211 System.arraycopy(in_value, 0, repeated, 0, in_value.length); 212 return in_value; 213 } 214 215 @Override RepeatByteArray(byte[] in_value, byte[] repeated)216 public byte[] RepeatByteArray(byte[] in_value, byte[] repeated) { 217 System.arraycopy(in_value, 0, repeated, 0, in_value.length); 218 return in_value; 219 } 220 221 @Override RepeatCharArray(char[] in_value, char[] repeated)222 public char[] RepeatCharArray(char[] in_value, char[] repeated) { 223 System.arraycopy(in_value, 0, repeated, 0, in_value.length); 224 return in_value; 225 } 226 227 @Override RepeatIntArray(int[] in_value, int[] repeated)228 public int[] RepeatIntArray(int[] in_value, int[] repeated) { 229 System.arraycopy(in_value, 0, repeated, 0, in_value.length); 230 return in_value; 231 } 232 233 @Override RepeatLongArray(long[] in_value, long[] repeated)234 public long[] RepeatLongArray(long[] in_value, long[] repeated) { 235 System.arraycopy(in_value, 0, repeated, 0, in_value.length); 236 return in_value; 237 } 238 239 @Override RepeatFloatArray(float[] in_value, float[] repeated)240 public float[] RepeatFloatArray(float[] in_value, float[] repeated) { 241 System.arraycopy(in_value, 0, repeated, 0, in_value.length); 242 return in_value; 243 } 244 245 @Override RepeatDoubleArray(double[] in_value, double[] repeated)246 public double[] RepeatDoubleArray(double[] in_value, double[] repeated) { 247 System.arraycopy(in_value, 0, repeated, 0, in_value.length); 248 return in_value; 249 } 250 251 @Override RepeatByteEnumArray(byte[] in_value, byte[] repeated)252 public byte[] RepeatByteEnumArray(byte[] in_value, byte[] repeated) { 253 System.arraycopy(in_value, 0, repeated, 0, in_value.length); 254 return in_value; 255 } 256 257 @Override RepeatIntEnumArray(int[] in_value, int[] repeated)258 public int[] RepeatIntEnumArray(int[] in_value, int[] repeated) { 259 System.arraycopy(in_value, 0, repeated, 0, in_value.length); 260 return in_value; 261 } 262 263 @Override RepeatLongEnumArray(long[] in_value, long[] repeated)264 public long[] RepeatLongEnumArray(long[] in_value, long[] repeated) { 265 System.arraycopy(in_value, 0, repeated, 0, in_value.length); 266 return in_value; 267 } 268 269 @Override RepeatStringArray(String[] in_value, String[] repeated)270 public String[] RepeatStringArray(String[] in_value, String[] repeated) { 271 System.arraycopy(in_value, 0, repeated, 0, in_value.length); 272 return in_value; 273 } 274 275 @Override RepeatRegularPolygonArray(RegularPolygon[] in_value, RegularPolygon[] repeated)276 public RegularPolygon[] RepeatRegularPolygonArray(RegularPolygon[] in_value, RegularPolygon[] repeated) { 277 System.arraycopy(in_value, 0, repeated, 0, in_value.length); 278 return in_value; 279 } 280 281 @Override RepeatFdArray(ParcelFileDescriptor[] in_value, ParcelFileDescriptor[] repeated)282 public ParcelFileDescriptor[] RepeatFdArray(ParcelFileDescriptor[] in_value, ParcelFileDescriptor[] repeated) { 283 ParcelFileDescriptor[] out = new ParcelFileDescriptor[in_value.length]; 284 for (int i = 0; i < in_value.length; i++) { 285 try { 286 repeated[i] = in_value[i].dup(); 287 out[i] = in_value[i].dup(); 288 } catch (IOException e) { 289 e.printStackTrace(); 290 } 291 } 292 return out; 293 } 294 295 @Override RepeatBinderArray(IBinder[] in_value, IBinder[] repeated)296 public IBinder[] RepeatBinderArray(IBinder[] in_value, IBinder[] repeated) { 297 System.arraycopy(in_value, 0, repeated, 0, in_value.length); 298 return in_value; 299 } 300 301 @Override RepeatInterfaceArray(IEmpty[] in_value, IEmpty[] repeated)302 public IEmpty[] RepeatInterfaceArray(IEmpty[] in_value, IEmpty[] repeated) { 303 System.arraycopy(in_value, 0, repeated, 0, in_value.length); 304 return in_value; 305 } 306 Repeat2StringList(java.util.List<String> in_value, java.util.List<String> repeated)307 public java.util.List<String> Repeat2StringList(java.util.List<String> in_value, java.util.List<String> repeated) { 308 repeated.addAll(in_value); 309 repeated.addAll(in_value); 310 return repeated; 311 } 312 313 @Override Repeat2RegularPolygonList(java.util.List<RegularPolygon> in_value, java.util.List<RegularPolygon> repeated)314 public java.util.List<RegularPolygon> Repeat2RegularPolygonList(java.util.List<RegularPolygon> in_value, java.util.List<RegularPolygon> repeated) { 315 repeated.addAll(in_value); 316 repeated.addAll(in_value); 317 return repeated; 318 } 319 320 @Override RepeatNullableBooleanArray(boolean[] in_value)321 public boolean[] RepeatNullableBooleanArray(boolean[] in_value) { 322 return in_value; 323 } 324 325 @Override RepeatNullableByteArray(byte[] in_value)326 public byte[] RepeatNullableByteArray(byte[] in_value) { 327 return in_value; 328 } 329 330 @Override RepeatNullableCharArray(char[] in_value)331 public char[] RepeatNullableCharArray(char[] in_value) { 332 return in_value; 333 } 334 335 @Override RepeatNullableIntArray(int[] in_value)336 public int[] RepeatNullableIntArray(int[] in_value) { 337 return in_value; 338 } 339 340 @Override RepeatNullableLongArray(long[] in_value)341 public long[] RepeatNullableLongArray(long[] in_value) { 342 return in_value; 343 } 344 345 @Override RepeatNullableFloatArray(float[] in_value)346 public float[] RepeatNullableFloatArray(float[] in_value) { 347 return in_value; 348 } 349 350 @Override RepeatNullableDoubleArray(double[] in_value)351 public double[] RepeatNullableDoubleArray(double[] in_value) { 352 return in_value; 353 } 354 355 @Override RepeatNullableByteEnumArray(byte[] in_value)356 public byte[] RepeatNullableByteEnumArray(byte[] in_value) { 357 return in_value; 358 } 359 360 @Override RepeatNullableIntEnumArray(int[] in_value)361 public int[] RepeatNullableIntEnumArray(int[] in_value) { 362 return in_value; 363 } 364 365 @Override RepeatNullableLongEnumArray(long[] in_value)366 public long[] RepeatNullableLongEnumArray(long[] in_value) { 367 return in_value; 368 } 369 370 @Override RepeatNullableStringArray(String[] in_value)371 public String[] RepeatNullableStringArray(String[] in_value) { 372 return in_value; 373 } 374 375 @Override RepeatNullableBinderArray(IBinder[] in_value)376 public IBinder[] RepeatNullableBinderArray(IBinder[] in_value) { 377 return in_value; 378 } 379 380 @Override RepeatNullableInterfaceArray(IEmpty[] in_value)381 public IEmpty[] RepeatNullableInterfaceArray(IEmpty[] in_value) { 382 return in_value; 383 } 384 385 @Override DoubleRepeatNullableStringArray(String[] in_value, String[] repeated)386 public String[] DoubleRepeatNullableStringArray(String[] in_value, String[] repeated) { 387 if (in_value == null) { 388 return null; // can't do anything to repeated 389 } 390 391 System.arraycopy(in_value, 0, repeated, 0, in_value.length); 392 return in_value; 393 } 394 395 @Override repeatFoo(Foo inFoo)396 public Foo repeatFoo(Foo inFoo) { 397 return inFoo; 398 } 399 400 @Override renameFoo(Foo foo, String name)401 public void renameFoo(Foo foo, String name) { 402 foo.a = name; 403 } 404 405 @Override renameBar(Foo foo, String name)406 public void renameBar(Foo foo, String name) { 407 if (foo.d == null) { 408 foo.d = new Bar(); 409 } 410 foo.d.a = name; 411 } 412 413 @Override getF(Foo foo)414 public int getF(Foo foo) { 415 return foo.f; 416 } 417 418 @Override repeatGenericBar(GenericBar<Integer> bar)419 public GenericBar<Integer> repeatGenericBar(GenericBar<Integer> bar) { 420 return bar; 421 } 422 423 @Override RepeatExtendableParcelable(ExtendableParcelable in, ExtendableParcelable out)424 public void RepeatExtendableParcelable(ExtendableParcelable in, ExtendableParcelable out) { 425 RepeatExtendableParcelableWithoutExtension(in, out); 426 MyExt ext = in.ext.getParcelable(MyExt.class); 427 MyExt ext2 = new MyExt(); 428 ext2.a = ext.a; 429 ext2.b = ext.b; 430 out.ext.setParcelable(ext2); 431 } 432 433 @Override RepeatExtendableParcelableWithoutExtension(ExtendableParcelable in, ExtendableParcelable out)434 public void RepeatExtendableParcelableWithoutExtension(ExtendableParcelable in, ExtendableParcelable out) { 435 out.a = in.a; 436 out.b = in.b; 437 out.c = in.c; 438 } 439 RepeatSimpleUnion(SimpleUnion in_u)440 public SimpleUnion RepeatSimpleUnion(SimpleUnion in_u) { 441 return in_u; 442 } 443 444 private static class CompatTest extends ICompatTest.Stub { 445 @Override getInterfaceVersion()446 public int getInterfaceVersion() { return CompatTest.VERSION; } 447 448 @Override getInterfaceHash()449 public String getInterfaceHash() { return CompatTest.HASH; } 450 451 @Override repeatBaz(Baz inBaz)452 public Baz repeatBaz(Baz inBaz) { 453 return inBaz; 454 } 455 456 @Override RepeatStringNullableLater(String in_value)457 public String RepeatStringNullableLater(String in_value) { 458 return in_value; 459 } 460 461 @Override NewMethodThatReturns10()462 public int NewMethodThatReturns10() { 463 return 10; 464 } 465 } 466 467 @Override getICompatTest()468 public IBinder getICompatTest() { 469 return new CompatTest(); 470 } 471 472 @Override getLegacyBinderTest()473 public IBinder getLegacyBinderTest() { 474 return new ILegacyBinder.Stub(); 475 } 476 } 477