package it.geosolutions.geocollect.android.core.test;
import it.geosolutions.geocollect.android.core.mission.MissionFeature;
import it.geosolutions.geocollect.android.core.mission.PendingMissionListActivity;
import it.geosolutions.geocollect.android.core.mission.utils.MissionUtils;
import it.geosolutions.geocollect.android.core.mission.utils.PersistenceUtils;
import it.geosolutions.geocollect.android.core.mission.utils.SpatialiteUtils;
import it.geosolutions.geocollect.android.core.mission.utils.UploadTask;
import it.geosolutions.geocollect.model.config.MissionTemplate;
import it.geosolutions.geocollect.model.http.CommitResponse;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
import jsqlite.Database;
import android.content.Context;
import android.content.Intent;
import android.test.ActivityUnitTestCase;
import android.util.Log;
import eu.geopaparazzi.library.util.ResourcesManager;
public class UploadTest extends ActivityUnitTestCase<PendingMissionListActivity> {
static String TAG = "UploadTest";
public UploadTest(){
super(PendingMissionListActivity.class);
}
public UploadTest(Class<PendingMissionListActivity> activityClass) {
super(activityClass);
}
/**
* Tests the upload function
* @throws InterruptedException
*/
public void testUpload() throws InterruptedException{
final Context targetContext = getInstrumentation().getTargetContext();
//setup the activity
Intent intent = new Intent(getInstrumentation().getTargetContext(),PendingMissionListActivity.class);
startActivity(intent, null, null);
//get template and db
final MissionTemplate t = MissionUtils.getDefaultTemplate(targetContext);
assertNotNull(t);
final Database db = getSpatialiteDatabase(targetContext);
assertNotNull(db);
String tableName = t.schema_seg.localSourceStore;
// load
ArrayList<MissionFeature> results = MissionUtils.getMissionFeatures(tableName, db);
// Check result
assertTrue(results.size() > 0);
//select one
Random r = new Random();
int random = r.nextInt(results.size() - 1);
MissionFeature mf = results.get(random);
assertNotNull(mf);
Log.d(TAG, "uploading "+ MissionUtils.getFeatureGCID(mf));
//add to uploadables
HashMap<String,ArrayList<String>> uploadables = PersistenceUtils.loadUploadables(targetContext);
if(uploadables.containsKey(tableName)){
//list exists, add this entry
uploadables.get(tableName).add(mf.id);
}else{
ArrayList<String> ids = new ArrayList<String>();
ids.add(mf.id);
uploadables.put(tableName, ids);
}
PersistenceUtils.saveUploadables(targetContext, uploadables);
//upload this one
ArrayList<MissionFeature> uploads = new ArrayList<>();
uploads.add(mf);
//check the activity context
assertNotNull(getActivity());
assertTrue(getActivity() instanceof PendingMissionListActivity);
new UploadTask(
targetContext,
t,
uploads){
@Override
public void hideMedia() {}
@Override
public void dataDone() {}
@Override
public void done(CommitResponse result) {
Log.d(TAG, "upload done "+ Boolean.toString(result.isSuccess()));
assertTrue(result.isSuccess());
}
}.execute();
//wait for the result
Thread.sleep(5000);
}
public Database getSpatialiteDatabase(Context context){
Database spatialiteDatabase = null;
try {
File sdcardDir = ResourcesManager.getInstance(context).getSdcardDir();
File spatialDbFile = new File(sdcardDir, "geocollect/genova.sqlite");
if (!spatialDbFile.getParentFile().exists()) {
throw new RuntimeException();
}
spatialiteDatabase = new jsqlite.Database();
spatialiteDatabase.open(spatialDbFile.getAbsolutePath(), jsqlite.Constants.SQLITE_OPEN_READWRITE
| jsqlite.Constants.SQLITE_OPEN_CREATE);
Log.v("MISSION_DETAIL", SpatialiteUtils.queryVersions(spatialiteDatabase));
Log.v("MISSION_DETAIL", spatialiteDatabase.dbversion());
return spatialiteDatabase;
} catch (Exception e) {
Log.v("MISSION_DETAIL", Log.getStackTraceString(e));
return null;
}
}
}