package org.robolectric;
import org.junit.Test;
import org.robolectric.util.Scheduler;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static org.assertj.core.api.Assertions.assertThat;
public class RuntimeEnvironmentTest {
@Test
public void setMainThread_forCurrentThread() {
RuntimeEnvironment.setMainThread(Thread.currentThread());
assertThat(RuntimeEnvironment.getMainThread()).isSameAs(Thread.currentThread());
}
@Test
public void setMainThread_forNewThread() {
Thread t = new Thread();
RuntimeEnvironment.setMainThread(t);
assertThat(RuntimeEnvironment.getMainThread()).isSameAs(t);
}
@Test
public void isMainThread_forNewThread_withoutSwitch() throws InterruptedException {
final AtomicBoolean res = new AtomicBoolean();
final CountDownLatch finished = new CountDownLatch(1);
Thread t = new Thread() {
@Override
public void run() {
res.set(RuntimeEnvironment.isMainThread());
finished.countDown();
}
};
RuntimeEnvironment.setMainThread(Thread.currentThread());
t.start();
if (!finished.await(1000, MILLISECONDS)) {
throw new InterruptedException("Thread " + t + " didn't finish timely");
}
assertThat(RuntimeEnvironment.isMainThread()).as("testThread").isTrue();
assertThat(res.get()).as("thread t").isFalse();
}
@Test
public void isMainThread_forNewThread_withSwitch() throws InterruptedException {
final AtomicBoolean res = new AtomicBoolean();
final CountDownLatch finished = new CountDownLatch(1);
Thread t = new Thread() {
@Override
public void run() {
res.set(RuntimeEnvironment.isMainThread());
finished.countDown();
}
};
RuntimeEnvironment.setMainThread(t);
t.start();
if (!finished.await(1000, MILLISECONDS)) {
throw new InterruptedException("Thread " + t + " didn't finish timely");
}
assertThat(RuntimeEnvironment.isMainThread()).as("testThread").isFalse();
assertThat(res.get()).as("thread t").isTrue();
}
@Test
public void isMainThread_withArg_forNewThread_withSwitch() throws InterruptedException {
Thread t = new Thread();
RuntimeEnvironment.setMainThread(t);
assertThat(RuntimeEnvironment.isMainThread(t)).isTrue();
}
@Test
public void getSetMasterScheduler() {
Scheduler s = new Scheduler();
RuntimeEnvironment.setMasterScheduler(s);
assertThat(RuntimeEnvironment.getMasterScheduler()).isSameAs(s);
}
}