/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.tradefed.device; import com.android.ddmlib.IDevice; import com.android.tradefed.util.IRunUtil; import junit.framework.TestCase; import org.easymock.EasyMock; /** * Unit tests for {@link ReconnectingRecovery}. */ public class ReconnectingRecoveryTest extends TestCase { private static final String SERIAL = "serial"; private IDevice mMockDevice; private IDeviceStateMonitor mMockMonitor; private IRunUtil mMockRunUtil; private ReconnectingRecovery mRecovery; @Override protected void setUp() throws Exception { super.setUp(); mMockRunUtil = EasyMock.createMock(IRunUtil.class); mRecovery = new ReconnectingRecovery() { @Override protected IRunUtil getRunUtil() { return mMockRunUtil; } }; mMockMonitor = EasyMock.createMock(IDeviceStateMonitor.class); EasyMock.expect(mMockMonitor.getSerialNumber()).andStubReturn(SERIAL); mMockDevice = EasyMock.createMock(IDevice.class); } /** * Test {@link * com.android.tradefed.device.ReconnectingRecovery#recoverDevice()} * when device is actually recoverable upon the first attempt. */ public final void testRecoverDevice_successOnFirstTry() throws DeviceNotAvailableException { expectInitialDisconnectConnectAttempt(); EasyMock.expect(mMockMonitor.waitForDeviceOnline()).andReturn(mMockDevice); EasyMock.expect(mMockMonitor.waitForDeviceShell(EasyMock.anyLong())).andReturn(true); EasyMock.expect(mMockMonitor.waitForDeviceAvailable()).andReturn(mMockDevice); replayMocks(); mRecovery.recoverDevice(mMockMonitor, false); verifyMocks(); } /** * Test * {@link com.android.tradefed.device.ReconnectingRecovery#recoverDevice()} * when device is actually recoverable, but not on the first attempt. */ public final void testRecoverDevice_successRetrying() throws DeviceNotAvailableException { expectInitialDisconnectConnectAttempt(); // fail 1st attempt EasyMock.expect(mMockMonitor.waitForDeviceOnline()).andReturn(null); // then it should retry at least once EasyMock.expect(mMockRunUtil.runTimedCmd(EasyMock.anyLong(), connectCommand())).andReturn( null); EasyMock.expect(mMockMonitor.waitForDeviceOnline()).andReturn(mMockDevice); EasyMock.expect(mMockMonitor.waitForDeviceShell(EasyMock.anyLong())).andReturn(true); EasyMock.expect(mMockMonitor.waitForDeviceAvailable()).andReturn(mMockDevice); replayMocks(); mRecovery.recoverDevice(mMockMonitor, false); verifyMocks(); } /** * Test {@link * com.android.tradefed.device.ReconnectingRecovery#recoverDevice()} * when device is actually irrecoverable. */ public final void testRecoverDevice_failure() throws DeviceNotAvailableException { expectInitialDisconnectConnectAttempt(); EasyMock.expect(mMockMonitor.waitForDeviceOnline()).andStubReturn(null); EasyMock.expect(mMockRunUtil.runTimedCmd(EasyMock.anyLong(), connectCommand())) .andStubReturn(null); EasyMock.expect(mMockMonitor.waitForDeviceShell(EasyMock.anyLong())).andReturn(true); EasyMock.expect(mMockMonitor.waitForDeviceAvailable()).andReturn(null); replayMocks(); try { mRecovery.recoverDevice(mMockMonitor, false); fail("DeviceUnresponsiveException not thrown"); } catch (DeviceUnresponsiveException e) { assertTrue(true); } verifyMocks(); } private void expectInitialDisconnectConnectAttempt() { EasyMock.expect(mMockRunUtil.runTimedCmd(EasyMock.anyLong(), disconnectCommand())) .andStubReturn(null); EasyMock.expect(mMockRunUtil.runTimedCmd(EasyMock.anyLong(), connectCommand())) .andStubReturn(null); } public final void testRecoverDeviceBootloader_notImplemented() throws DeviceNotAvailableException { replayMocks(); try { mRecovery.recoverDeviceBootloader(mMockMonitor); fail("should have thrown an UnsupportedOperationException"); } catch (java.lang.UnsupportedOperationException e) { // expected } verifyMocks(); } private String[] disconnectCommand() { return new String[] { EasyMock.eq("adb"), EasyMock.eq("disconnect"), EasyMock.eq(SERIAL) }; } private String[] connectCommand() { return new String[] { EasyMock.eq("adb"), EasyMock.eq("connect"), EasyMock.eq(SERIAL) }; } /** * Verify all the mock objects */ private void verifyMocks() { EasyMock.verify(mMockRunUtil, mMockMonitor, mMockDevice); } /** * Switch all the mock objects to replay mode */ private void replayMocks() { EasyMock.replay(mMockRunUtil, mMockMonitor, mMockDevice); } }