package me.guillaumin.android.osmtracker.test.gpx; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.database.Cursor; import android.os.Environment; import android.preference.PreferenceManager; import android.provider.MediaStore; import android.test.ActivityInstrumentationTestCase2; import junit.framework.Assert; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import me.guillaumin.android.osmtracker.OSMTracker; import me.guillaumin.android.osmtracker.activity.TrackManager; import me.guillaumin.android.osmtracker.db.DataHelper; import me.guillaumin.android.osmtracker.gpx.ExportToStorageTask; import me.guillaumin.android.osmtracker.test.util.MockData; public class ExportTrackTaskTest extends ActivityInstrumentationTestCase2<TrackManager> { private long trackId; private File trackFile; public ExportTrackTaskTest() { super("me.guillaumin.android.osmtracker", TrackManager.class); } @Override protected void setUp() throws Exception { // Delete file entry in media library getActivity().getContentResolver().delete( MediaStore.Files.getContentUri("external"), MediaStore.Files.FileColumns.DATA + " LIKE ?", new String[] {"%/osmtracker/gpx-test"}); Cursor cursor = getActivity().managedQuery( MediaStore.Files.getContentUri("external"), null, MediaStore.Files.FileColumns.DATA + " LIKE ?", new String[] {"%/osmtracker/gpx-test"}, null); Assert.assertEquals(0, cursor.getCount()); trackFile = new File(Environment.getExternalStorageDirectory(), "osmtracker/gpx-test.gpx"); if (trackFile.exists()) { Assert.assertTrue(trackFile.delete()); } trackId = MockData.mockTrack(getActivity()); new DataHelper(getActivity()).stopTracking(trackId); // Ensure easy filename SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); Editor e = prefs.edit(); e.clear(); e.putString(OSMTracker.Preferences.KEY_OUTPUT_FILENAME, OSMTracker.Preferences.VAL_OUTPUT_FILENAME_NAME); e.putBoolean(OSMTracker.Preferences.KEY_OUTPUT_DIR_PER_TRACK, false); e.putBoolean(OSMTracker.Preferences.KEY_OUTPUT_GPX_HDOP_APPROXIMATION, true); Assert.assertTrue(e.commit()); } public void test() throws Exception { new ExportToStorageTask(getActivity(), trackId).execute().get(); // Ensure file contents are OK Assert.assertTrue(trackFile.exists()); Assert.assertEquals( readFully( getInstrumentation().getContext().getAssets().open("gpx/gpx-test.gpx")), readFully(new FileInputStream(trackFile))); // Ensure the media library has been refreshed // We have to wait for the refresh Intent to be dispatched long maxWaitTime = 1000 * 5; long waited = 0; Cursor c = null; while (waited < maxWaitTime) { c = getActivity().managedQuery( MediaStore.Files.getContentUri("external"), null, MediaStore.Files.FileColumns.DATA + " LIKE ?", new String[]{"%/osmtracker/gpx-test.gpx"}, null); if (c.moveToFirst()) { break; } Thread.sleep(250); waited += 250; } Assert.assertEquals(1, c.getCount()); Assert.assertEquals(0, c.getInt(c.getColumnIndex(MediaStore.Files.FileColumns.MEDIA_TYPE))); Assert.assertEquals("gpx-test", c.getString(c.getColumnIndex(MediaStore.Files.FileColumns.TITLE))); } private static String readFully(InputStream is) throws IOException { BufferedReader reader = new BufferedReader( new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line; while( (line=reader.readLine()) != null ) { sb.append(line).append(System.getProperty("line.separator")); } reader.close(); return sb.toString(); } }