1package com.xtremelabs.robolectric.util;
2
3import com.xtremelabs.robolectric.Robolectric;
4import com.xtremelabs.robolectric.WithTestDefaultsRunner;
5import org.junit.Before;
6import org.junit.Test;
7import org.junit.runner.RunWith;
8
9import java.util.concurrent.Callable;
10import java.util.concurrent.Future;
11
12import static org.junit.Assert.assertEquals;
13import static org.junit.Assert.assertFalse;
14import static org.junit.Assert.assertTrue;
15
16@RunWith(WithTestDefaultsRunner.class)
17public class RobolectricBackgroundExecutorServiceTest {
18    private Transcript transcript;
19    private RobolectricBackgroundExecutorService executorService;
20    private Runnable runnable;
21
22    @Before public void setUp() throws Exception {
23        transcript = new Transcript();
24        executorService = new RobolectricBackgroundExecutorService();
25
26        Robolectric.getBackgroundScheduler().pause();
27
28        runnable = new Runnable() {
29            @Override public void run() {
30                transcript.add("background event ran");
31            }
32        };
33    }
34
35    @Test
36    public void execute_shouldRunStuffOnBackgroundThread() throws Exception {
37        executorService.execute(runnable);
38
39        transcript.assertNoEventsSoFar();
40
41        Robolectric.runBackgroundTasks();
42        transcript.assertEventsSoFar("background event ran");
43    }
44
45    @Test
46    public void submitRunnable_shouldRunStuffOnBackgroundThread() throws Exception {
47        Future<String> future = executorService.submit(runnable, "foo");
48
49        transcript.assertNoEventsSoFar();
50        assertFalse(future.isDone());
51
52        Robolectric.runBackgroundTasks();
53        transcript.assertEventsSoFar("background event ran");
54        assertTrue(future.isDone());
55
56        assertEquals("foo", future.get());
57    }
58
59    @Test
60    public void submitCallable_shouldRunStuffOnBackgroundThread() throws Exception {
61        Future<String> future = executorService.submit(new Callable<String>() {
62            @Override public String call() throws Exception {
63                runnable.run();
64                return "foo";
65            }
66        });
67
68        transcript.assertNoEventsSoFar();
69        assertFalse(future.isDone());
70
71        Robolectric.runBackgroundTasks();
72        transcript.assertEventsSoFar("background event ran");
73        assertTrue(future.isDone());
74
75        assertEquals("foo", future.get());
76    }
77}
78