package edu.mit.media.funf; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.test.AndroidTestCase; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonParser; import com.google.gson.JsonPrimitive; import com.google.gson.internal.LazilyParsedNumber; import edu.mit.media.funf.json.IJsonArray; import edu.mit.media.funf.json.IJsonObject; import edu.mit.media.funf.json.JsonUtils; import edu.mit.media.funf.probe.Probe; import edu.mit.media.funf.probe.Probe.DataListener; import edu.mit.media.funf.probe.builtin.AccelerometerFeaturesProbe; public class FunfManagerTest extends AndroidTestCase { private JsonParser parser = new JsonParser(); private FunfManager manager; private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } @Override public void onServiceConnected(ComponentName name, IBinder service) { manager = ((FunfManager.LocalBinder)service).getManager(); } }; public class SampleDataListener implements DataListener { public BlockingQueue<IJsonObject> dataEvents = new LinkedBlockingQueue<IJsonObject>(); public BlockingQueue<IJsonObject> completeEvents = new LinkedBlockingQueue<IJsonObject>(); @Override public void onDataReceived(IJsonObject probeConfig, IJsonObject data) { dataEvents.add(data); } @Override public void onDataCompleted(IJsonObject probeConfig, JsonElement checkpoint) { completeEvents.add(probeConfig); } }; public SampleDataListener listener = new SampleDataListener(); @Override protected void setUp() throws Exception { super.setUp(); listener = new SampleDataListener(); getContext().bindService(new Intent(getContext(), FunfManager.class), conn, Context.BIND_AUTO_CREATE); waitForServiceConnection(3000); } public void waitForServiceConnection(long millisToWait) { long time = System.currentTimeMillis(); while (System.currentTimeMillis() < time + millisToWait) { if (manager != null) { break; } else { try { Thread.sleep(100); } catch (InterruptedException e) { } } } } private final String probeConfig = "{\"@type\": \"" + AccelerometerFeaturesProbe.class.getName() + "\" " + "}"; public void testDataRequest() { manager.requestData(listener, parser.parse(probeConfig)); IJsonObject data = null; try { data = listener.dataEvents.poll(10, TimeUnit.SECONDS); } catch (InterruptedException e) { } if (data == null) { fail("Should have returned data within time alloted"); } manager.unrequestData(listener, parser.parse(probeConfig)); IJsonObject complete = null; try { complete = listener.completeEvents.poll(10, TimeUnit.SECONDS); } catch (InterruptedException e) { } if (complete == null) { fail("Should have completed within time alloted"); } } public void testIJsonObjectEqualsAndHash() { JsonElement p1 = JsonUtils.immutable(new JsonPrimitive(new LazilyParsedNumber("1"))); JsonElement p2 = JsonUtils.immutable(new JsonPrimitive(1)); assertEquals(p1, p2); assertEquals(p1.hashCode(), p2.hashCode()); Gson gson = manager.getGson(); Probe probe = gson.fromJson(probeConfig, Probe.class); IJsonObject o1 = (IJsonObject)JsonUtils.immutable(gson.toJsonTree(probe)); IJsonArray a1 = o1.getAsJsonArray("freqBandEdges"); IJsonArray a2 = (IJsonArray)JsonUtils.immutable(new JsonParser().parse(gson.toJson(a1))); assertEquals(a1, a2); assertEquals(a1.hashCode(), a2.hashCode()); IJsonObject o2 = (IJsonObject)JsonUtils.immutable(new JsonParser().parse(gson.toJson(o1))); assertEquals(o1, o2); assertEquals(o1.hashCode(), o2.hashCode()); } public void testRegisterPipeline() { } }