package org.robolectric.shadows;
import android.content.Context;
import android.os.PowerManager;
import android.os.WorkSource;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.TestRunners;
import org.robolectric.annotation.Config;
import static android.os.Build.VERSION_CODES.KITKAT_WATCH;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
import static org.assertj.core.api.Assertions.assertThat;
import static org.robolectric.Shadows.shadowOf;
@RunWith(TestRunners.MultiApiSelfTest.class)
public class ShadowPowerManagerTest {
private PowerManager powerManager;
private ShadowPowerManager shadowPowerManager;
@Before
public void before() {
powerManager = (PowerManager) RuntimeEnvironment.application.getSystemService(Context.POWER_SERVICE);
shadowPowerManager = shadowOf(powerManager);
}
@Test
public void acquire_shouldAcquireAndReleaseReferenceCountedLock() throws Exception {
PowerManager.WakeLock lock = powerManager.newWakeLock(0, "TAG");
assertThat(lock.isHeld()).isFalse();
lock.acquire();
assertThat(lock.isHeld()).isTrue();
lock.acquire();
assertThat(lock.isHeld()).isTrue();
lock.release();
assertThat(lock.isHeld()).isTrue();
lock.release();
assertThat(lock.isHeld()).isFalse();
}
@Test
@Config(minSdk = LOLLIPOP)
public void isWakeLockLevelSupported() {
assertThat(powerManager.isWakeLockLevelSupported(PowerManager.PARTIAL_WAKE_LOCK)).isFalse();
shadowPowerManager.setIsWakeLockLevelSupported(PowerManager.PARTIAL_WAKE_LOCK, true);
assertThat(powerManager.isWakeLockLevelSupported(PowerManager.PARTIAL_WAKE_LOCK)).isTrue();
shadowPowerManager.setIsWakeLockLevelSupported(PowerManager.PARTIAL_WAKE_LOCK, false);
assertThat(powerManager.isWakeLockLevelSupported(PowerManager.PARTIAL_WAKE_LOCK)).isFalse();
}
@Test
public void acquire_shouldLogLatestWakeLock() throws Exception {
ShadowPowerManager.reset();
assertThat(ShadowPowerManager.getLatestWakeLock()).isNull();
PowerManager.WakeLock lock = powerManager.newWakeLock(0, "TAG");
lock.acquire();
assertThat(ShadowPowerManager.getLatestWakeLock()).isNotNull();
assertThat(ShadowPowerManager.getLatestWakeLock()).isSameAs(lock);
assertThat(lock.isHeld()).isTrue();
lock.release();
assertThat(ShadowPowerManager.getLatestWakeLock()).isNotNull();
assertThat(ShadowPowerManager.getLatestWakeLock()).isSameAs(lock);
assertThat(lock.isHeld()).isFalse();
ShadowPowerManager.reset();
assertThat(ShadowPowerManager.getLatestWakeLock()).isNull();
}
@Test
public void newWakeLock_shouldCreateWakeLock() throws Exception {
assertThat(powerManager.newWakeLock(0, "TAG")).isNotNull();
}
@Test
public void newWakeLock_shouldAcquireAndReleaseNonReferenceCountedLock() throws Exception {
PowerManager.WakeLock lock = powerManager.newWakeLock(0, "TAG");
lock.setReferenceCounted(false);
assertThat(lock.isHeld()).isFalse();
lock.acquire();
assertThat(lock.isHeld()).isTrue();
lock.acquire();
assertThat(lock.isHeld()).isTrue();
lock.release();
assertThat(lock.isHeld()).isFalse();
}
@Test(expected = RuntimeException.class)
public void newWakeLock_shouldThrowRuntimeExceptionIfLockIsUnderlocked() throws Exception {
PowerManager.WakeLock lock = powerManager.newWakeLock(0, "TAG");
lock.release();
}
@Test
public void isScreenOn_shouldGetAndSet() {
assertThat(powerManager.isScreenOn()).isTrue();
shadowPowerManager.setIsScreenOn(false);
assertThat(powerManager.isScreenOn()).isFalse();
}
@Test
public void isReferenceCounted_shouldGetAndSet() throws Exception {
PowerManager.WakeLock lock = powerManager.newWakeLock(0, "TAG");
ShadowPowerManager.ShadowWakeLock shadowLock = shadowOf(lock);
assertThat(shadowLock.isReferenceCounted()).isTrue();
lock.setReferenceCounted(false);
assertThat(shadowLock.isReferenceCounted()).isFalse();
lock.setReferenceCounted(true);
assertThat(shadowLock.isReferenceCounted()).isTrue();
}
@Test
@Config(minSdk = LOLLIPOP)
public void isInteractive_shouldGetAndSet() {
shadowPowerManager.setIsInteractive(true);
assertThat(powerManager.isInteractive()).isTrue();
shadowPowerManager.setIsInteractive(false);
assertThat(powerManager.isInteractive()).isFalse();
}
@Test
@Config(minSdk = KITKAT_WATCH)
public void isPowerSaveMode_shouldGetAndSet() {
assertThat(powerManager.isPowerSaveMode()).isFalse();
shadowPowerManager.setIsPowerSaveMode(true);
assertThat(powerManager.isPowerSaveMode()).isTrue();
}
@Test
public void workSource_shouldGetAndSet() throws Exception {
PowerManager.WakeLock lock = powerManager.newWakeLock(0, "TAG");
ShadowPowerManager.ShadowWakeLock shadowLock = shadowOf(lock);
WorkSource workSource = new WorkSource();
assertThat(shadowLock.getWorkSource()).isNull();
lock.setWorkSource(workSource);
assertThat(shadowLock.getWorkSource()).isEqualTo(workSource);
}
}