/*
* 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.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
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);
OutputStreamWriter wr = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
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");
if(android.os.Build.VERSION.SDK_INT < 11)
solo.clickOnText(getAppString(org.openintents.filemanager.R.string.menu_delete)); // Delete
else
solo.clickOnActionBarItem(org.openintents.filemanager.R.id.menu_delete);
solo.clickOnText(getAppString(android.R.string.ok));
if(android.os.Build.VERSION.SDK_INT < 11)
solo.clickOnMenuItem(getAppString(org.openintents.filemanager.R.string.menu_create_folder), true); // New Folder
else
solo.clickOnActionBarItem(org.openintents.filemanager.R.id.menu_create_folder);
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
if(android.os.Build.VERSION.SDK_INT < 11)
solo.clickOnMenuItem(getAppString(org.openintents.filemanager.R.string.bookmarks)); // Bookmarks
else
solo.clickOnActionBarItem(org.openintents.filemanager.R.id.menu_bookmarks);
solo.clickOnText(fn);
assertTrue(solo.searchText("oi-inside-book.txt"));
// remove it
if(android.os.Build.VERSION.SDK_INT < 11)
solo.clickOnMenuItem(getAppString(org.openintents.filemanager.R.string.bookmarks)); // Bookmarks
else
solo.clickOnActionBarItem(org.openintents.filemanager.R.id.menu_bookmarks);
solo.clickLongOnText(fn);
if(android.os.Build.VERSION.SDK_INT < 11)
solo.clickOnText(getAppString(org.openintents.filemanager.R.string.menu_delete));
else
solo.clickOnActionBarItem(org.openintents.filemanager.R.id.menu_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));
navigateToTargetAndPasteAndCheck("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));
navigateToTargetAndPasteAndCheck("oi-move-target", "oi-file-2.txt", null);
assertFalse(solo.searchText("oi-file-2.txt"));
// multi select
if(android.os.Build.VERSION.SDK_INT < 11){
solo.clickOnMenuItem(getAppString(org.openintents.filemanager.R.string.menu_multiselect));
solo.clickOnText("oi-file-3.txt");
solo.clickOnText("oi-file-4.txt");
solo.clickOnImageButton(1);
solo.goBack();
navigateToTargetAndPasteAndCheck("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 navigateToTargetAndPasteAndCheck(String dirname, String name1, String name2) throws IOException {
createDirectory(sdcardPath + "oi-filemanager-tests/");
solo.clickOnText(dirname);
if(android.os.Build.VERSION.SDK_INT < 11)
solo.clickOnMenuItem(getAppString(org.openintents.filemanager.R.string.menu_paste), true);
else
solo.clickOnActionBarItem(org.openintents.filemanager.R.id.menu_paste);
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 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://" + sdcardPath + "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.clickLongOnText(Environment.getExternalStorageDirectory().getParentFile().getName());
solo.enterText(0, "oi-target.txt");
solo.sendKey(Solo.ENTER);
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://" + sdcardPath + "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 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://" + sdcardPath + "oi-filemanager-tests");
intent = new Intent("org.openintents.action.PICK_FILE", uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity = getInstrumentation().startActivitySync(intent);
solo.clickOnText("oi-pick-file");
solo.goBack();
}
public void testIntentRememberPickFilePath() throws IOException {
String[] actions = new String[]{
org.openintents.intents.FileManagerIntents.ACTION_PICK_FILE,
org.openintents.intents.FileManagerIntents.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://" + sdcardPath); //If there was already a remembered pick file path
intent = new Intent(actions[i], uri);
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(org.openintents.filemanager.R.string.directory_pick));
// Check, if we are in the oi-filemanager-tests directory
intent = new Intent(actions[i]);
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.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.
*/
solo.clickLongOnText(Environment.getExternalStorageDirectory().getParentFile().getName());
solo.clickOnEditText(0); // Let the editText have 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();
}
// Current implementation directly opens the file and therefore can't be tested.
// 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.setClass(activity, org.openintents.filemanager.FileManagerActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//
// activity = getInstrumentation().startActivitySync(intent);
//
// assertTrue(solo.searchText("oi-to-open.txt"));
// solo.goBack();
// solo.goBack();
// }
// Removed as Filter action is obsolete and removed.
// 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();
// }
// Other possible tests:
// testSend
// testMore
// testKeyboardFilter
}