Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Migrate ExoPlayerTest to Robolectric.
So far this wasn't possible because Robolectric's Looper and MessageQueue implementations have multiple shortcomings: 1. The message loop of new HandlerThreads is an not an actual loop and scheduled messages are executed on the thread the message is enqueued (not the handler thread). 2. The scheduler used to replace the message queue is synchronizing all its methods. Thus, when a test attempts to add messages to a Handler from two different threads, it may easily run into a deadlock. 3. The scheduler doesn't correctly emulate the order of messages as they would be in an actual MessageQueue: a. If the message is enqueued on the handler thread, it gets executed immediately (and not after all other messages at the same time). b. The list of messages is always re-sorted by time, meaning that the order of execution for messages at the same time is indeterminate. 4. Robolectric's SystemClock implementation returns the current scheduler time of the main UI thread. So, unless this scheduler is used to add messages in the future, the SystemClock time never advances. This CL adds two helper classes which extend and replace Robolectric's ShadowLooper and ShadowMessageQueue. 1. We intercept messages being enqueued or deleted in the message queue. Thus Robolectric's faulty scheduler gets never used. Instead, we keep a blocking priority queue of messages, sorted first by execution time and then by FIFO order to correctly emulate the real MessageQueue. 2. We also keep a list of deleted messages to know which messages to ignore when they come up in the looper. 3. When a new Looper is started, we override the dummy loop to an actual eternal while loop which waits for new messages, checks if they haven't been deleted, and runs the messages (similar to what Robolectric's MessageQueue would have done at this point). Because we don't actually use the main UI thread in our tests, we can't rely on the SystemClock to progress in any sensible manner. To overcome this issue, we can use the auto-advancing FakeClock also used for the simulation tests. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=182912510
- Loading branch information