--- /dev/null
+/*
+ * This is an example test project created in Eclipse to test NotePad which is a sample
+ * project located in AndroidSDK/samples/android-11/NotePad
+ * Just click on File --> New --> Project --> Android Project --> Create Project from existing source and
+ * select NotePad.
+ *
+ * Then you can run these test cases either on the emulator or on device. You right click
+ * the test project and select Run As --> Run As Android JUnit Test
+ *
+ * @author Renas Reda, renas.reda@jayway.com
+ *
+ */
+
+package org.openintents.filemanager.test;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Random;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.net.Uri;
+import android.os.Environment;
+import android.preference.PreferenceManager;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.Smoke;
+
+import com.jayway.android.robotium.solo.Solo;
+
+public class TestFileManagerActivity extends InstrumentationTestCase {
+
+ private static final String TAG = "TestFileManagerActivity";
+
+ private Solo solo;
+ private Activity activity;
+ private Random random = new Random();
+ private Intent intent;
+ private String sdcardPath;
+
+ public TestFileManagerActivity() {
+ super();
+ }
+
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ sdcardPath = Environment.getExternalStorageDirectory().getAbsolutePath()+'/';
+
+ // need to do this before creating activity
+ cleanDirectory(new File(sdcardPath + "oi-filemanager-tests"));
+ createDirectory(sdcardPath + "oi-filemanager-tests");
+
+ intent = new Intent();
+ intent.setAction("android.intent.action.MAIN");
+ intent.setClassName("org.openintents.filemanager",
+ "org.openintents.filemanager.FileManagerActivity");
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ activity = getInstrumentation().startActivitySync(intent);
+
+ this.solo = new Solo(getInstrumentation(), activity);
+ }
+
+ protected void tearDown() throws Exception {
+ try {
+ this.solo.finishOpenedActivities();
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ super.tearDown();
+ cleanDirectory(new File(sdcardPath + "oi-filemanager-tests"));
+ }
+
+ private String getAppString(int resId) {
+ return activity.getString(resId);
+ }
+
+ @Smoke
+ public void test000Eula() {
+ String accept = getAppString(org.openintents.distribution.R.string.oi_distribution_eula_accept);
+ String cancel = getAppString(org.openintents.distribution.R.string.oi_distribution_eula_refuse);
+ boolean existsAccept = solo.searchButton(accept);
+ boolean existsCancel = solo.searchButton(cancel);
+
+ if (existsAccept && existsCancel) {
+ solo.clickOnButton(accept);
+ }
+ }
+
+ @Smoke
+ public void test001RecentChanges() {
+ String recentChanges = getAppString(org.openintents.distribution.R.string.oi_distribution_newversion_recent_changes);
+ String cont = getAppString(org.openintents.distribution.R.string.oi_distribution_newversion_continue);
+ while(solo.scrollUp());
+ boolean existsRecentChanges = solo.searchText(recentChanges);
+ boolean existsCont = solo.searchButton(cont);
+
+ if (existsRecentChanges && existsCont) {
+ solo.clickOnButton(cont);
+ }
+ }
+
+ private void cleanDirectory(File file) {
+ if(!file.exists()) return;
+ for(String name:file.list()) {
+ if(!name.startsWith("oi-") && !name.startsWith(".oi-")) {
+ throw new RuntimeException(file + " contains unexpected file");
+ }
+ File child = new File(file, name);
+ if(child.isDirectory())
+ cleanDirectory(child);
+ else
+ child.delete();
+ }
+ file.delete();
+ if(file.exists()) {
+ throw new RuntimeException("Deletion of " + file + " failed");
+ }
+ }
+
+ private void createFile(String path, String content) throws IOException {
+ File file = new File(path);
+ FileWriter wr = new FileWriter(file);
+ wr.write(content);
+ wr.close();
+ }
+
+ private void createDirectory(String path) throws IOException {
+ File file = new File(path);
+ file.mkdir();
+ if(!file.exists())
+ throw new IOException("Creation of " + path + " failed");
+ }
+
+ private void deleteDirectory(String path) {
+ File file = new File(path);
+ if(file.exists())
+ if(file.isDirectory())
+ cleanDirectory(file);
+ file.delete();
+ }
+
+ public void testNavigation() throws IOException {
+// if(solo.searchText("Accept")) {
+// solo.clickOnButton("Accept");
+// if(solo.searchButton("Continue"))
+// solo.clickOnButton("Continue");
+// }
+ createDirectory(sdcardPath + "oi-filemanager-tests");
+ createFile(sdcardPath + "oi-filemanager-tests/oi-test.txt", "");
+ createDirectory(sdcardPath + "oi-filemanager-tests/oi-test-dir");
+ createFile(sdcardPath + "oi-filemanager-tests/oi-test-dir/oi-fff.txt", "");
+
+ solo.clickOnText("oi-filemanager-tests");
+ assertTrue(solo.searchText("oi-test.txt"));
+ solo.clickOnText("oi-test-dir");
+ assertTrue(solo.searchText("oi-fff.txt"));
+
+ solo.goBack();
+ solo.goBack();
+ solo.clickOnText("oi-filemanager-tests");
+ assertTrue(solo.searchText("oi-test.txt"));
+
+ solo.clickOnText("oi-test-dir");
+ solo.goBack();
+ assertTrue(solo.searchText("oi-test.txt"));
+
+ solo.goBack();
+ }
+
+ public void testModification() throws IOException {
+ createDirectory(sdcardPath + "oi-filemanager-tests");
+ createFile(sdcardPath + "oi-filemanager-tests/oi-rem-test.txt", "");
+ solo.clickOnText("oi-filemanager-tests");
+ solo.clickLongOnText("oi-rem-test.txt");
+ solo.clickOnText(getAppString(org.openintents.filemanager.R.string.menu_delete)); // Delete
+ solo.clickOnText(getAppString(android.R.string.ok));
+
+ //when actionbar is present, this test case should find the first ImageButton
+ if(android.os.Build.VERSION.SDK_INT < 11)
+ solo.clickOnMenuItem(getAppString(org.openintents.filemanager.R.string.menu_new_folder)); // New Folder
+ else
+ solo.clickOnImageButton(0);
+ solo.enterText(0, "oi-created-folder");
+ solo.clickOnText(getAppString(android.R.string.ok));
+
+ solo.goBack();
+ assertTrue(solo.searchText("oi-created-folder"));
+ solo.goBack();
+
+ File createdFolder = new File(sdcardPath + "oi-filemanager-tests/oi-created-folder");
+ assertTrue(createdFolder.exists());
+ assertTrue(createdFolder.isDirectory());
+ assertFalse(new File(sdcardPath + "oi-filemanager-tests/oi-rem-test.txt").exists());
+ }
+
+ public void testBookmarks() throws IOException {
+ String fn = "oi-bookmark-" + random.nextInt(1000);
+ createDirectory(sdcardPath + "oi-filemanager-tests");
+ createDirectory(sdcardPath + "oi-filemanager-tests/" + fn);
+ createFile(sdcardPath + "oi-filemanager-tests/" + fn + "/oi-inside-book.txt", "");
+
+ // create bookmark
+
+ solo.clickOnText("oi-filemanager-tests");
+ solo.clickLongOnText(fn);
+ solo.clickOnText(getAppString(org.openintents.filemanager.R.string.menu_bookmark)); // Add to bookmarks
+
+ // navigate to it
+
+ solo.clickOnMenuItem(getAppString(org.openintents.filemanager.R.string.bookmarks)); // Bookmarks
+ solo.clickOnText(fn);
+ assertTrue(solo.searchText("oi-inside-book.txt"));
+ solo.goBack();
+ solo.goBack();
+
+ // remove it
+
+ solo.clickOnMenuItem(getAppString(org.openintents.filemanager.R.string.settings));
+ solo.clickOnText(getAppString(org.openintents.filemanager.R.string.bookmarks_manage));
+ solo.clickOnText(fn);
+ solo.clickOnText(getAppString(org.openintents.filemanager.R.string.bookmarks_delete));
+ solo.goBack();
+
+ // make sure that it is deleted
+
+ solo.clickOnMenuItem(getAppString(org.openintents.filemanager.R.string.bookmarks));
+ assertFalse(solo.searchText(fn));
+ solo.goBack();
+ solo.goBack();
+ }
+
+ public void testActions() throws IOException {
+ createDirectory(sdcardPath + "oi-filemanager-tests");
+ createDirectory(sdcardPath + "oi-filemanager-tests/oi-move-target");
+ createFile(sdcardPath + "oi-filemanager-tests/oi-file-1.txt", "");
+ createFile(sdcardPath + "oi-filemanager-tests/oi-file-2.txt", "");
+ createFile(sdcardPath + "oi-filemanager-tests/oi-file-3.txt", "");
+ createFile(sdcardPath + "oi-filemanager-tests/oi-file-4.txt", "");
+ createFile(sdcardPath + "oi-filemanager-tests/oi-file-5.txt", "");
+ solo.clickOnText("oi-filemanager-tests");
+
+ // copy
+
+ solo.clickLongOnText("oi-file-1.txt");
+ solo.clickOnText(getAppString(org.openintents.filemanager.R.string.menu_copy));
+ selectTargetAndCheck("oi-move-target", "oi-file-1.txt", null);
+ assertTrue(solo.searchText("oi-file-1.txt"));
+
+ // move
+
+ solo.clickLongOnText("oi-file-2.txt");
+ solo.clickOnText(getAppString(org.openintents.filemanager.R.string.menu_move));
+ selectTargetAndCheck("oi-move-target", "oi-file-2.txt", null);
+ assertFalse(solo.searchText("oi-file-2.txt"));
+
+ // multi select
+
+ solo.clickOnMenuItem(getAppString(org.openintents.filemanager.R.string.menu_multi_select));
+ solo.clickOnText("oi-file-3.txt");
+ solo.clickOnText("oi-file-4.txt");
+ solo.clickOnText(getAppString(org.openintents.filemanager.R.string.move_button_multiselect));
+ selectTargetAndCheck("oi-move-target", "oi-file-3.txt", "oi-file-4.txt");
+
+ // rename
+
+ solo.clickLongOnText("oi-file-5.txt");
+ solo.clickOnText(getAppString(org.openintents.filemanager.R.string.menu_rename));
+ solo.enterText(0, "oi-renamed-file.txt");
+ solo.clickOnText(getAppString(android.R.string.ok)); // not sure what to do
+ assertTrue(solo.searchText("oi-renamed-file.txt"));
+
+ solo.goBack();
+ solo.goBack();
+ }
+
+ private void selectTargetAndCheck(String dirname, String name1, String name2) throws IOException {
+ createDirectory(sdcardPath + "oi-filemanager-tests");
+ solo.clickOnText(dirname);
+ solo.clickOnButton(getAppString(org.openintents.filemanager.R.string.copy_button) + "|" +
+ getAppString(org.openintents.filemanager.R.string.move_button));
+ solo.clickOnText(dirname);
+ assertTrue(solo.searchText(name1));
+ if(name2 != null)
+ assertTrue(solo.searchText(name2));
+ solo.goBack();
+ }
+
+ public void testDetails() throws IOException {
+ createDirectory(sdcardPath + "oi-filemanager-tests");
+ createFile(sdcardPath + "oi-filemanager-tests/oi-detail.txt", "abcdefg");
+
+ solo.clickOnText("oi-filemanager-tests");
+
+ solo.clickLongOnText("oi-detail.txt");
+ solo.clickOnText(getAppString(org.openintents.filemanager.R.string.menu_details));
+ assertTrue(solo.searchText(getAppString(org.openintents.filemanager.R.string.details_type_file)));
+ // depending on locale:
+ assertTrue(solo.searchText("7.00B") || solo.searchText("7.00 B") || solo.searchText("7,00B") || solo.searchText("7,00 B"));
+
+ // not sure:
+ //Calendar today = new GregorianCalendar();
+ //String todayString = today.get(Calendar.DAY_OF_MONTH) + "/" + today.get(Calendar.MONTH) + "/" + today.get(Calendar.YEAR);
+ //assertTrue(solo.searchText(todayString));
+
+ solo.goBack();
+ solo.goBack();
+ solo.goBack();
+ }
+
+ public void testFilters() throws IOException {
+ createDirectory(sdcardPath + "oi-filemanager-tests");
+ createFile(sdcardPath + "oi-filemanager-tests/oi-not-filter.txt", "");
+ createFile(sdcardPath + "oi-filemanager-tests/oi-filtered.py", "");
+ createDirectory(sdcardPath + "oi-filemanager-tests/oi-f-dir");
+ solo.clickOnText("oi-filemanager-tests");
+
+ solo.clickOnMenuItem(getAppString(org.openintents.filemanager.R.string.menu_filter));
+ solo.enterText(0, ".py");
+ solo.clickOnButton(getAppString(android.R.string.ok));
+
+ assertTrue(solo.searchText("oi-filtered.py"));
+ assertTrue(solo.searchText("oi-f-dir"));
+ assertFalse(solo.searchText("oi-not-filter.txt"));
+
+ solo.goBack();
+ solo.goBack();
+ }
+
+ public void testHiddenFiles() throws IOException {
+ createDirectory(sdcardPath + "oi-filemanager-tests");
+ createFile(sdcardPath + "oi-filemanager-tests/.oi-hidden.txt", "");
+ solo.clickOnText("oi-filemanager-tests");
+
+ boolean origState = solo.searchText(".oi-hidden.txt");
+
+ solo.clickOnMenuItem(getAppString(org.openintents.filemanager.R.string.settings));
+
+ solo.clickOnText(getAppString(org.openintents.filemanager.R.string.preference_displayhiddenfiles_title));
+ solo.goBack();
+ assertTrue(origState != solo.searchText(".oi-hidden.txt"));
+
+ solo.goBack();
+ solo.goBack();
+ }
+
+ public void testOrder() throws IOException, InterruptedException {
+ createDirectory(sdcardPath + "oi-filemanager-tests");
+ createFile(sdcardPath + "oi-filemanager-tests/oi-b.txt", "bbb");
+ Thread.sleep(10); // make sure that next file is younger
+ createFile(sdcardPath + "oi-filemanager-tests/oi-a.txt", "aaaaaa");
+ Thread.sleep(10);
+ createFile(sdcardPath + "oi-filemanager-tests/oi-c.txt", "");
+ solo.clickOnText("oi-filemanager-tests");
+
+ String[] sortOrders = activity.getResources().getStringArray(org.openintents.filemanager.R.array.preference_sortby_names);
+
+ setAscending(true);
+ setSortOrder(sortOrders[0]);
+ assertItemsInOrder("oi-a.txt", "oi-b.txt", "oi-c.txt");
+
+ setSortOrder(sortOrders[1]);
+ assertItemsInOrder("oi-c.txt", "oi-b.txt", "oi-a.txt");
+
+ setSortOrder(sortOrders[2]);
+ assertItemsInOrder("oi-b.txt", "oi-a.txt", "oi-c.txt");
+
+ setAscending(false);
+ setSortOrder(sortOrders[0]);
+ assertItemsInOrder("oi-c.txt", "oi-b.txt", "oi-a.txt");
+ }
+
+ private void setSortOrder(String name) {
+ solo.clickOnMenuItem(getAppString(org.openintents.filemanager.R.string.settings));
+ solo.clickOnText(getAppString(org.openintents.filemanager.R.string.preference_sortby));
+ solo.clickOnText(name);
+ solo.goBack();
+ }
+
+ private void setAscending(boolean enabled) {
+ SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(activity);
+ SharedPreferences.Editor editor = settings.edit();
+ editor.putBoolean("ascending", enabled);
+ editor.commit();
+ }
+
+ private void assertItemsInOrder(String a, String b, String c) {
+ int aPos = solo.getText(a).getTop();
+ int bPos = solo.getText(b).getTop();
+ int cPos = solo.getText(c).getTop();
+ if(aPos > bPos)
+ fail("aPos > bPos");
+ if(bPos > cPos)
+ fail("bpos > cPos");
+ }
+
+ public void testIntentSaveAs() throws IOException {
+ createDirectory(sdcardPath + "oi-filemanager-tests");
+ createFile(sdcardPath + "oi-filemanager-tests/oi-to-open.txt", "bbb");
+
+ Uri uri = Uri.parse("file:///mnt/sdcard/oi-filemanager-tests/oi-to-open.txt");
+ intent = new Intent("android.intent.action.VIEW", uri);
+ intent.setClassName("org.openintents.filemanager",
+ "org.openintents.filemanager.SaveAsActivity");
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ activity = getInstrumentation().startActivitySync(intent);
+
+ solo.enterText(0, "oi-target.txt");
+ solo.clickOnButton(getAppString(android.R.string.ok));
+ assertTrue(new File(sdcardPath + "oi-filemanager-tests/oi-to-open.txtoi-target.txt").exists());
+ solo.goBack();
+ solo.goBack();
+ }
+
+ public void testIntentUrl() throws IOException {
+ createDirectory(sdcardPath + "oi-filemanager-tests");
+ createDirectory(sdcardPath + "oi-filemanager-tests/oi-dir-to-open");
+ createDirectory(sdcardPath + "oi-filemanager-tests/oi-dir-to-open/oi-intent");
+
+ Uri uri = Uri.parse("file:///mnt/sdcard/oi-filemanager-tests/oi-dir-to-open");
+ intent = new Intent("android.intent.action.VIEW", uri);
+ intent.setClassName("org.openintents.filemanager",
+ "org.openintents.filemanager.FileManagerActivity");
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ activity = getInstrumentation().startActivitySync(intent);
+
+ assertTrue(solo.searchText("oi-intent"));
+ solo.goBack();
+ solo.goBack();
+ }
+
+ public void testIntentUri() throws IOException {
+ createDirectory(sdcardPath + "oi-filemanager-tests");
+ createFile(sdcardPath + "oi-filemanager-tests/oi-to-open.txt", "bbb");
+
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setData(Uri.parse("file://" + sdcardPath + "oi-filemanager-tests/oi-to-open.txt"));
+ intent.setPackage("org.openintents.filemanager");
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ activity = getInstrumentation().startActivitySync(intent);
+
+ assertTrue(solo.searchText("oi-to-open.txt"));
+ solo.goBack();
+ solo.goBack();
+ }
+
+ public void testIntentPickFile() throws IOException {
+ // startActivityForResult is, I think, impossible to test on Robotinium
+ createDirectory(sdcardPath + "oi-filemanager-tests");
+ createFile(sdcardPath + "oi-filemanager-tests/oi-pick-file", "");
+
+ Uri uri = Uri.parse("file:///mnt/sdcard/oi-filemanager-tests/oi-dir-to-open");
+ intent = new Intent("org.openintents.action.PICK_FILE", uri);
+ intent.setClassName("org.openintents.filemanager",
+ "org.openintents.filemanager.FileManagerActivity");
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ activity = getInstrumentation().startActivitySync(intent);
+
+ solo.clickOnText("oi-pick-file");
+ solo.clickOnButton(getAppString(android.R.string.ok));
+
+ solo.goBack();
+ }
+
+ public void testIntentRememberPickFilePath() throws IOException {
+ String[] actions = new String[]{
+ "org.openintents.action.PICK_FILE",
+ "org.openintents.action.PICK_DIRECTORY",
+ Intent.ACTION_GET_CONTENT
+ };
+
+ for(int i=0;i<3;i++){
+ createDirectory(sdcardPath + "oi-filemanager-tests");
+ if(i==1){ //Pick directory
+ createDirectory(sdcardPath + "oi-filemanager-tests/oi-dir-to-pick");
+ }
+ else{
+ createFile(sdcardPath + "oi-filemanager-tests/oi-file-to-pick.txt", "bbb");
+ }
+ //Directory because PICK_DIRECTORY doesn't show files
+ createDirectory(sdcardPath + "oi-to-pick-test-folder-deleted");
+
+
+ // Pick a file first
+ Uri uri = Uri.parse("file:///mnt/sdcard"); //If there was already a remembered pick file path
+ intent = new Intent(actions[i], uri);
+ intent.setClassName("org.openintents.filemanager",
+ "org.openintents.filemanager.FileManagerActivity");
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ activity = getInstrumentation().startActivitySync(intent);
+
+ solo.clickOnText("oi-filemanager-tests");
+ if(i==1) //Pick directory
+ solo.clickOnText("oi-dir-to-pick");
+ else
+ solo.clickOnText("oi-file-to-pick.txt");
+
+ if(i != 2) // When ACTION_GET_CONTENT, the file is picked automatically, when clicked
+ solo.clickOnButton(getAppString(android.R.string.ok));
+
+ // Check, if we are in the oi-filemanager-tests directory
+ intent = new Intent(actions[i]);
+ intent.setClassName("org.openintents.filemanager",
+ "org.openintents.filemanager.FileManagerActivity");
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ activity = getInstrumentation().startActivitySync(intent);
+
+ solo.goBack();
+
+
+ //Delete the oi-filemanager-tests directory
+ deleteDirectory(sdcardPath + "oi-filemanager-tests");
+
+ //Check, if the current directory is the default (sdcardPath)
+ intent = new Intent(actions[i]);
+ intent.setClassName("org.openintents.filemanager",
+ "org.openintents.filemanager.FileManagerActivity");
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ activity = getInstrumentation().startActivitySync(intent);
+
+ assertTrue(solo.searchText("oi-to-pick-test-folder-deleted"));
+
+ //Clean up
+ (new File(sdcardPath + "oi-to-pick-test-folder-deleted")).delete();
+
+ solo.goBack();
+ solo.goBack();
+ }
+ }
+
+ public void testBrowseToOnPressEnter() throws IOException {
+ String dirPath = "oi-filemanager-tests";
+ String filename = "oi-test-is-in-right-directory";
+ createDirectory(sdcardPath + dirPath);
+ createFile(sdcardPath + dirPath + "/" + filename, "");
+
+ /*
+ * We start at the SD card. Home ImageButton has index 0. Then there's a mnt classic button.
+ * And finally SD card ImageButton with index 1. (Android 1.x and 2.x)
+ *
+ * Remark: On Android 3.x(?) and 4.x, the index may have to be set to 2?
+ */
+ int imageButtonIndex = 0;
+ if(android.os.Build.VERSION.SDK_INT < 11)
+ imageButtonIndex = 1;
+ else
+ imageButtonIndex = 2;
+ solo.clickOnImageButton(imageButtonIndex);
+
+ solo.clickOnEditText(0); // Let the editText has focus to be able to send the enter key.
+ solo.enterText(0, "/"+dirPath);
+ solo.sendKey(Solo.ENTER);
+
+ assertTrue(solo.searchText(filename));
+
+ solo.goBack();
+ solo.goBack();
+ }
+
+ // Other possible tests:
+ // testSend
+ // testMore
+ // testKeyboardFilter
+}
\ No newline at end of file