155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz/*
255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * Copyright (C) 2017 The Android Open Source Project
355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz *
455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * Licensed under the Apache License, Version 2.0 (the "License");
555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * you may not use this file except in compliance with the License.
655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * You may obtain a copy of the License at
755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz *
855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz *      http://www.apache.org/licenses/LICENSE-2.0
955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz *
1055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * Unless required by applicable law or agreed to in writing, software
1155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * distributed under the License is distributed on an "AS IS" BASIS,
1255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * See the License for the specific language governing permissions and
1455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz * limitations under the License.
1555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz */
1655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
1755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzpackage com.android.frameworks.coretests.binderproxycountingtestapp;
1855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
1955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.app.Service;
2055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.content.BroadcastReceiver;
2155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.content.ComponentName;
2255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.content.Context;
2355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.content.Intent;
2455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.content.IntentFilter;
2555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.content.ServiceConnection;
2655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.os.IBinder;
2755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.os.RemoteException;
2855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport android.util.Log;
2955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
3055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport com.android.frameworks.coretests.aidl.IBinderProxyCountingService;
3155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport com.android.frameworks.coretests.aidl.IBpcTestAppCmdService;
3255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport com.android.frameworks.coretests.aidl.ITestRemoteCallback;
3355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
3455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport java.util.ArrayList;
3555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport java.util.concurrent.CountDownLatch;
3655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzimport java.util.concurrent.TimeUnit;
3755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
3855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanzpublic class BpcTestAppCmdService extends Service {
3955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz    private static final String TAG = BpcTestAppCmdService.class.getSimpleName();
4055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
4155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz    private static final String TEST_SERVICE_PKG =
4255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            "com.android.frameworks.coretests.binderproxycountingtestservice";
4355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz    private static final String TEST_SERVICE_CLASS =
4455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            TEST_SERVICE_PKG + ".BinderProxyCountingService";
4555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz    private static final int BIND_SERVICE_TIMEOUT_SEC = 5;
4655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
4755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz    private static ServiceConnection mServiceConnection;
4855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz    private static IBinderProxyCountingService mBpcService;
4955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
5055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz    private IBpcTestAppCmdService.Stub mBinder = new IBpcTestAppCmdService.Stub() {
5155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
5255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        private ArrayList<BroadcastReceiver> mBrList = new ArrayList();
5355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        private ArrayList<ITestRemoteCallback> mTrcList = new ArrayList();
5455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
5555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        @Override
5655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        public void createSystemBinders(int count) {
5755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            int i = 0;
5855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            while (i++ < count) {
5955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                BroadcastReceiver br = new BroadcastReceiver() {
6055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    @Override
6155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    public void onReceive(Context context, Intent intent) {
6255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
6355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    }
6455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                };
6555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                IntentFilter filt = new IntentFilter(Intent.ACTION_POWER_DISCONNECTED);
6655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                synchronized (mBrList) {
6755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    mBrList.add(br);
6855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                }
6955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                registerReceiver(br, filt);
7055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            }
7155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        }
7255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
7355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        @Override
7455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        public void releaseSystemBinders(int count) {
7555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            int i = 0;
7655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            while (i++ < count) {
7755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                BroadcastReceiver br;
7855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                synchronized (mBrList) {
7955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    br = mBrList.remove(0);
8055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                }
8155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                unregisterReceiver(br);
8255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            }
8355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        }
8455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
8555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        @Override
8655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        public void createTestBinders(int count) {
8755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            int i = 0;
8855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            while (i++ < count) {
8955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                ITestRemoteCallback cb = new ITestRemoteCallback.Stub() {};
9055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                synchronized (mTrcList) {
9155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    mTrcList.add(cb);
9255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                }
9355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                try {
9455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    mBpcService.registerCallback(cb);
9555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                } catch (RemoteException e) {
9655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    Log.e(TAG, "RemoteException caught! " + e);
9755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                }
9855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            }
9955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        }
10055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
10155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        @Override
10255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        public void releaseTestBinders(int count) {
10355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            int i = 0;
10455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            while (i++ < count) {
10555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
10655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                ITestRemoteCallback cb;
10755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                synchronized (mTrcList) {
10855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    cb = mTrcList.remove(0);
10955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                }
11055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                try {
11155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    mBpcService.unregisterCallback(cb);
11255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                } catch (RemoteException e) {
11355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    Log.e(TAG, "RemoteException caught! " + e);
11455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                }
11555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            }
11655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        }
11755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
11855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        @Override
11955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        public void releaseAllBinders() {
12055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            synchronized (mBrList) {
12155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                while (mBrList.size() > 0) {
12255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    unregisterReceiver(mBrList.remove(0));
12355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                }
12455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            }
12555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            synchronized (mTrcList) {
12655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                while (mTrcList.size() > 0) {
12755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    try {
12855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                        mBpcService.unregisterCallback(mTrcList.remove(0));
12955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    } catch (RemoteException e) {
13055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                        Log.e(TAG, "RemoteException caught! " + e);
13155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    }
13255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                }
13355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            }
13455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        }
13555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
13655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        @Override
13755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        public String bindToTestService() {
13855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            try {
13955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                final CountDownLatch bindLatch = new CountDownLatch(1);
14055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                mServiceConnection = new ServiceConnection() {
14155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    @Override
14255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    public void onServiceConnected(ComponentName name, IBinder service) {
14355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                        Log.i(TAG, "Service connected");
14455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                        mBpcService = IBinderProxyCountingService.Stub.asInterface(service);
14555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                        bindLatch.countDown();
14655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    }
14755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
14855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    @Override
14955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    public void onServiceDisconnected(ComponentName name) {
15055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                        Log.i(TAG, "Service disconnected");
15155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    }
15255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                };
15355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                final Intent intent = new Intent()
15455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                        .setComponent(new ComponentName(TEST_SERVICE_PKG, TEST_SERVICE_CLASS));
15555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                bindService(intent, mServiceConnection,
15655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                        Context.BIND_AUTO_CREATE
15755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                                | Context.BIND_ALLOW_OOM_MANAGEMENT
15855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                                | Context.BIND_NOT_FOREGROUND);
15955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                if (!bindLatch.await(BIND_SERVICE_TIMEOUT_SEC, TimeUnit.SECONDS)) {
16055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                    throw new RuntimeException("Failed to bind to " + TEST_SERVICE_CLASS);
16155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                }
16255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            } catch (Exception e) {
16355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                unbindFromTestService();
16455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                Log.e(TAG, e.toString());
16555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                return e.toString();
16655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            }
16755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            return null;
16855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        }
16955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
17055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        @Override
17155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        public void unbindFromTestService() {
17255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            if (mBpcService != null) {
17355182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz                unbindService(mServiceConnection);
17455182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz            }
17555182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        }
17655182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz    };
17755182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz
17855182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz    @Override
17955182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz    public IBinder onBind(Intent intent) {
18055182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz        return mBinder;
18155182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz    }
18255182464fb9f6536ee500eac02a031e7b7226fc4Michael Wachenschwanz}