1e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung/*
2e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung * Copyright (C) 2015 The Android Open Source Project
3e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung *
4e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung * Licensed under the Apache License, Version 2.0 (the "License");
5e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung * you may not use this file except in compliance with the License.
6e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung * You may obtain a copy of the License at
7e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung *
8e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung *      http://www.apache.org/licenses/LICENSE-2.0
9e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung *
10e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung * Unless required by applicable law or agreed to in writing, software
11e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung * distributed under the License is distributed on an "AS IS" BASIS,
12e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung * See the License for the specific language governing permissions and
14e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung * limitations under the License.
15e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung */
16e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung
17e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoungpackage com.android.support.car.apitest;
18e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung
19e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoungimport android.os.Looper;
20e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoungimport android.support.car.Car;
21ed493f7ffcfaf46819913825a4edddde7736b429Jason Tholstrupimport android.support.car.CarConnectionCallback;
22e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoungimport android.test.AndroidTestCase;
23e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung
24e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoungimport java.util.concurrent.Semaphore;
25e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoungimport java.util.concurrent.TimeUnit;
26e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung
27e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoungpublic class CarApiTestBase extends AndroidTestCase {
28e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung    protected static final long DEFAULT_WAIT_TIMEOUT_MS = 1000;
29e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung
30e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung    private Car mCar;
31e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung
32ed493f7ffcfaf46819913825a4edddde7736b429Jason Tholstrup    private final DefaultCarConnectionCallback mConnectionCallbacks =
33ed493f7ffcfaf46819913825a4edddde7736b429Jason Tholstrup            new DefaultCarConnectionCallback();
34e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung
35e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung    protected void assertMainThread() {
36e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung        assertTrue(Looper.getMainLooper().isCurrentThread());
37e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung    }
38e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung
39e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung    @Override
40e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung    protected void setUp() throws Exception {
41e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung        super.setUp();
429aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup        mCar = Car.createCar(getContext(), mConnectionCallbacks);
43e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung        mCar.connect();
449aaf8b91bdef693f555632c9ca491423e457efa1Jason Tholstrup        mConnectionCallbacks.waitForConnection(DEFAULT_WAIT_TIMEOUT_MS);
45e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung    }
46e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung
47e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung    @Override
48e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung    protected void tearDown() throws Exception {
49e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung        super.tearDown();
50e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung        mCar.disconnect();
51e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung    }
52e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung
53e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung    protected synchronized Car getCar() {
54e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung        return mCar;
55e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung    }
56e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung
57ed493f7ffcfaf46819913825a4edddde7736b429Jason Tholstrup    protected class DefaultCarConnectionCallback extends CarConnectionCallback {
58e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung        private final Semaphore mConnectionWait = new Semaphore(0);
59e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung
60e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung        public void waitForConnection(long timeoutMs) throws InterruptedException {
61e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung            mConnectionWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS);
62e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung        }
63e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung        @Override
64ed493f7ffcfaf46819913825a4edddde7736b429Jason Tholstrup        public void onDisconnected(Car car) {
65e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung            assertMainThread();
66e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung        }
67e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung
68e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung        @Override
69ed493f7ffcfaf46819913825a4edddde7736b429Jason Tholstrup        public void onConnected(Car car) {
70e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung            assertMainThread();
71e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung            mConnectionWait.release();
72e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung        }
73e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung    }
74e4c90c4a615a4d5411a0cc49b75e002a305c858fkeunyoung}
75