package de.blau.android.osm;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.orhanobut.mockwebserverplus.MockWebServerPlus;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.preference.PreferenceManager;
import android.support.test.InstrumentationRegistry;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.LargeTest;
import de.blau.android.App;
import de.blau.android.Main;
import de.blau.android.R;
import de.blau.android.SignalHandler;
import de.blau.android.prefs.AdvancedPrefDatabase;
import de.blau.android.prefs.Preferences;
import de.blau.android.resources.TileLayerServer;
import de.blau.android.tasks.Note;
import de.blau.android.tasks.OsmoseBug;
import de.blau.android.tasks.Task;
import de.blau.android.tasks.TransferTasks;
import okhttp3.HttpUrl;
@RunWith(AndroidJUnit4.class)
@LargeTest
public class OsmoseTest {
MockWebServerPlus mockServer = null;
Context context = null;
AdvancedPrefDatabase prefDB = null;
Main main = null;
Task t = null;
@Rule
public ActivityTestRule<Main> mActivityRule = new ActivityTestRule<>(Main.class);
@Before
public void setup() {
context = InstrumentationRegistry.getInstrumentation().getTargetContext();
main = mActivityRule.getActivity();
Preferences prefs = new Preferences(context);
prefs.setBackGroundLayer(TileLayerServer.LAYER_NONE); // try to avoid downloading tiles
main.getMap().setPrefs(main, prefs);
mockServer = new MockWebServerPlus();
HttpUrl mockBaseUrl = mockServer.server().url("/en/api/0.2/");
System.out.println("mock api url " + mockBaseUrl.toString());
prefs.putString(R.string.config_osmoseServer_key, mockBaseUrl.scheme()+"://"+mockBaseUrl.host()+":"+mockBaseUrl.port()+"/");
prefDB = new AdvancedPrefDatabase(context);
prefDB.deleteAPI("Test");
prefDB.addAPI("Test", "Test", mockBaseUrl.toString(), null, null, "user", "pass", null, false);
prefDB.selectAPI("Test");
}
@After
public void teardown() {
try {
mockServer.server().shutdown();
} catch (IOException ioex) {
System.out.println("Stopping mock webserver exception " + ioex);
}
}
@Test
public void osmoseDownload() {
final CountDownLatch signal = new CountDownLatch(1);
mockServer.enqueue("osmoseDownload");
App.getTaskStorage().reset();
try {
final Server s = new Server(context, prefDB.getCurrentAPI(),"vesupucci test");
SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(context);
Resources r = context.getResources();
String osmoseErrorSelector = r.getString(R.string.bugfilter_osmose_error);
String osmoseWarningSelector = r.getString(R.string.bugfilter_osmose_warning);
String osmoseMinorIssueSelector = r.getString(R.string.bugfilter_osmose_minor_issue);
Set<String> set = new HashSet<String>(Arrays.asList(osmoseErrorSelector,osmoseWarningSelector,osmoseMinorIssueSelector)) ;
p.edit().putStringSet(r.getString(R.string.config_bugFilter_key), set).commit();
Assert.assertTrue(new Preferences(context).taskFilter().contains(osmoseErrorSelector));
Assert.assertTrue(new Preferences(context).taskFilter().contains(osmoseWarningSelector));
Assert.assertTrue(new Preferences(context).taskFilter().contains(osmoseMinorIssueSelector));
TransferTasks.downloadBox(context,s,new BoundingBox(8.3879800D,47.3892400D,8.3844600D,47.3911300D), false, new SignalHandler(signal));
} catch (Exception e) {
Assert.fail(e.getMessage());
}
try {
signal.await(40, TimeUnit.SECONDS);
} catch (InterruptedException e) {
Assert.fail(e.getMessage());
}
ArrayList<Task> tasks = App.getTaskStorage().getTasks();
//
Assert.assertEquals(92, tasks.size());
try {
tasks = App.getTaskStorage().getTasks(new BoundingBox(8.3702816, 47.3050382, 8.3702818, 47.3050384));
} catch (Exception e){
Assert.fail(e.getMessage());
}
t = tasks.get(0);
Assert.assertTrue(t instanceof OsmoseBug);
Assert.assertEquals(11187837418L,t.getId());
}
@Test
public void osmoseUpload() {
osmoseDownload();
OsmoseBug b = (OsmoseBug) t; // ugly but removes code duplication
b.setFalse();
b.setChanged();
Assert.assertTrue(b.hasBeenChanged());
final CountDownLatch signal = new CountDownLatch(1);
mockServer.enqueue("200");
try {
Assert.assertTrue(TransferTasks.uploadOsmoseBug(context, b, new SignalHandler(signal)));
} catch (Exception e) {
Assert.fail(e.getMessage());
}
try {
signal.await(40, TimeUnit.SECONDS);
} catch (InterruptedException e) {
Assert.fail(e.getMessage());
}
Assert.assertFalse(b.hasBeenChanged());
}
@Test
public void osmoseUploadFail() {
osmoseDownload();
OsmoseBug b = (OsmoseBug) t; // ugly but removes code duplication
b.setFalse();
b.setChanged();
Assert.assertTrue(b.hasBeenChanged());
final CountDownLatch signal = new CountDownLatch(1);
mockServer.enqueue("500");
try {
Assert.assertFalse(TransferTasks.uploadOsmoseBug(context, b, new SignalHandler(signal)));
} catch (Exception e) {
Assert.fail(e.getMessage());
}
try {
signal.await(40, TimeUnit.SECONDS);
} catch (InterruptedException e) {
Assert.fail(e.getMessage());
}
Assert.assertTrue(b.hasBeenChanged());
}
@Test
public void notesAmdOsmoseUpload() {
osmoseDownload();
OsmoseBug b = (OsmoseBug) t; // ugly but removes code duplication
b.setFalse();
b.setChanged();
Assert.assertTrue(b.hasBeenChanged());
Note n = new Note((int)(51.0*1E7D),(int)(0.1*1E7D));
Assert.assertTrue(n.isNew());
App.getTaskStorage().add(n);
final CountDownLatch signal = new CountDownLatch(1);
mockServer.enqueue("200");
final Server s = new Server(context, prefDB.getCurrentAPI(),"vesupucci test");
try {
TransferTasks.upload( main, s, new SignalHandler(signal));
} catch (Exception e) {
Assert.fail(e.getMessage());
}
try {
signal.await(40, TimeUnit.SECONDS);
} catch (InterruptedException e) {
Assert.fail(e.getMessage());
}
Assert.assertFalse(b.hasBeenChanged());
Assert.assertFalse(n.hasBeenChanged());
}
}