package org.robolectric.shadows; import android.os.Environment; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.TestRunners; import org.robolectric.annotation.Config; import java.io.File; import static android.os.Build.VERSION_CODES.LOLLIPOP; import static android.os.Build.VERSION_CODES.M; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @RunWith(TestRunners.MultiApiSelfTest.class) public class ShadowEnvironmentTest { @After public void tearDown() throws Exception { ShadowEnvironment.setExternalStorageState(Environment.MEDIA_REMOVED); } @Test public void getExternalStorageState_shouldReturnStorageState() { assertThat(Environment.getExternalStorageState()).isEqualTo(Environment.MEDIA_REMOVED); ShadowEnvironment.setExternalStorageState(Environment.MEDIA_MOUNTED); assertThat(Environment.getExternalStorageState()).isEqualTo(Environment.MEDIA_MOUNTED); } @Test public void getExternalStorageDirectory_shouldReturnDirectory() { assertThat(Environment.getExternalStorageDirectory().exists()).isTrue(); } @Test public void getExternalStoragePublicDirectory_shouldReturnDirectory() { final File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); assertThat(path.exists()).isTrue(); assertThat(path).isEqualTo(new File(ShadowEnvironment.EXTERNAL_FILES_DIR.toFile(), Environment.DIRECTORY_MOVIES)); } @Test public void getExternalStoragePublicDirectory_shouldReturnSameDirectory() { File path1 = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); File path2 = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); assertThat(path1).isEqualTo(path2); } @Test @Config(minSdk = M) public void isExternalStorageRemovable_primaryShouldReturnSavedValue() { assertThat(Environment.isExternalStorageRemovable()).isFalse(); ShadowEnvironment.setExternalStorageRemovable(Environment.getExternalStorageDirectory(), true); assertThat(Environment.isExternalStorageRemovable()).isTrue(); } @Test @Config(minSdk = LOLLIPOP) public void isExternalStorageRemovable_shouldReturnSavedValue() { final File file = new File("/mnt/media/file"); assertThat(Environment.isExternalStorageRemovable(file)).isFalse(); ShadowEnvironment.setExternalStorageRemovable(file, true); assertThat(Environment.isExternalStorageRemovable(file)).isTrue(); } @Test @Config(minSdk = LOLLIPOP) public void isExternalStorageEmulated_shouldReturnSavedValue() { final File file = new File("/mnt/media/file"); assertThat(Environment.isExternalStorageEmulated(file)).isFalse(); ShadowEnvironment.setExternalStorageEmulated(file, true); assertThat(Environment.isExternalStorageEmulated(file)).isTrue(); } @Test @Config(minSdk = LOLLIPOP) public void storageIsLazy() { assertNull(ShadowEnvironment.EXTERNAL_CACHE_DIR); assertNull(ShadowEnvironment.EXTERNAL_FILES_DIR); Environment.getExternalStorageDirectory(); Environment.getExternalStoragePublicDirectory(null); assertNotNull(ShadowEnvironment.EXTERNAL_CACHE_DIR); assertNotNull(ShadowEnvironment.EXTERNAL_FILES_DIR); } @Test @Config(minSdk = LOLLIPOP) public void reset_shouldClearRemovableFiles() { final File file = new File("foo"); ShadowEnvironment.setExternalStorageRemovable(file, true); assertThat(Environment.isExternalStorageRemovable(file)).isTrue(); ShadowEnvironment.reset(); assertThat(Environment.isExternalStorageRemovable(file)).isFalse(); } @Test @Config(minSdk = LOLLIPOP) public void reset_shouldClearEmulatedFiles() { final File file = new File("foo"); ShadowEnvironment.setExternalStorageEmulated(file, true); assertThat(Environment.isExternalStorageEmulated(file)).isTrue(); ShadowEnvironment.reset(); assertThat(Environment.isExternalStorageEmulated(file)).isFalse(); } @Test public void reset_shouldCleanupTempDirectories() { Environment.getExternalStorageDirectory(); Environment.getExternalStoragePublicDirectory(null); File c = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); ShadowEnvironment.reset(); // only c should actually be deleted assertNull(ShadowEnvironment.EXTERNAL_CACHE_DIR); assertNull(ShadowEnvironment.EXTERNAL_FILES_DIR); assertThat(c).doesNotExist(); } @Test public void isExternalStorageEmulatedNoArg_shouldReturnSavedValue() { ShadowEnvironment.setIsExternalStorageEmulated(true); assertThat(Environment.isExternalStorageEmulated()).isTrue(); ShadowEnvironment.reset(); assertThat(Environment.isExternalStorageEmulated()).isFalse(); } }