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