package edu.mit.media.funf.probe.builtin;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import android.os.Debug;
import android.test.AndroidTestCase;
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import edu.mit.media.funf.FunfManager;
import edu.mit.media.funf.json.IJsonObject;
import edu.mit.media.funf.probe.Probe;
import edu.mit.media.funf.probe.Probe.ContinuousProbe;
import edu.mit.media.funf.probe.Probe.DataListener;
import edu.mit.media.funf.probe.Probe.State;
import edu.mit.media.funf.probe.Probe.StateListener;
import edu.mit.media.funf.probe.builtin.ProbeKeys.BluetoothKeys;
import edu.mit.media.funf.time.TimeUnit;
/**
* This class turns on and off all of the builtin probes.
* While it doesn't test any of the output, it does ensure that basic use of the probes does not crash the process.
* @author alangardner
*
*/
public class TestAllBuiltinProbes extends AndroidTestCase {
public static final String TAG = "FunfTest";
private DataListener listener = new DataListener() {
@Override
public void onDataReceived(IJsonObject completeProbeUri, IJsonObject data) {
Log.i(TAG, "DATA: " + completeProbeUri.toString() + " " + data.toString());
// Log.i(TAG, "date: " + data.get(ProbeKeys.CallLogKeys.DATE).getAsLong());
// Log.i(TAG, "Probes" + data.get(BluetoothKeys.PROBE));
// Log.i(TAG, "TIMESTAMP: " + data.get(BluetoothKeys.TIMESTAMP));
// Log.i(TAG, "RSSI: " + data.get(BluetoothKeys.RSSI));
// Log.i(TAG, "NAME: " + data.get(BluetoothKeys.NAME));
// Log.i(TAG, "CLASS: " + data.get(BluetoothKeys.CLASS));
}
@Override
public void onDataCompleted(IJsonObject completeProbeUri, JsonElement checkpoint) {
Log.i(TAG, "COMPLETE: " + completeProbeUri.toString());
}
};
private StateListener stateListener = new StateListener() {
@Override
public void onStateChanged(Probe probe, State previousState) {
Log.i(TAG, probe.getClass().getName() + ": " + probe.getState());
Log.i(TAG, getGson().toJson(probe));
}
};
private Gson gson;
public Gson getGson() {
if (gson == null) {
gson = new GsonBuilder().registerTypeAdapterFactory(FunfManager.getProbeFactory(getContext())).create();
}
return gson;
}
@SuppressWarnings("rawtypes")
public static final Class[] ALL_PROBES = {
// AccelerometerFeaturesProbe.class, //ok
// AccelerometerSensorProbe.class, //ok
// ApplicationsProbe.class, //ok
// AudioFeaturesProbe.class, //ok
// AudioMediaProbe.class, //ok
// BatteryProbe.class, //ok
// BluetoothProbe.class, //configuration ok, but I have not yet get the return of scan data
// BrowserBookmarksProbe.class, //ok
// BrowserSearchesProbe.class, //ok
// CallLogProbe.class, //ok, dumps all call_log
// CellTowerProbe.class, //?, use bundle
// ContactProbe.class, //ok
// GravitySensorProbe.class, //ok
// GyroscopeSensorProbe.class, //ok
// HardwareInfoProbe.class, //ok
// ImageMediaProbe.class, //ok
// LightSensorProbe.class, //ok
// LinearAccelerationSensorProbe.class,
// LocationProbe.class, //ok, pass
// MagneticFieldSensorProbe.class,
// OrientationSensorProbe.class,
PressureSensorProbe.class,
// ProcessStatisticsProbe.class,
// ProximitySensorProbe.class,
// RotationVectorSensorProbe.class, //ok, rotation vector
// RunningApplicationsProbe.class, //not quite sure ??? not quite sure how it works? only get the COMPLETE message
// ServicesProbe.class,
// SimpleLocationProbe.class, //ok
// ScreenProbe.class, // ok
// SmsProbe.class, //ok, return one-way hashed value of both sender and content
// TelephonyProbe.class, //said disabled
// TemperatureSensorProbe.class,
// TimeOffsetProbe.class,
// VideoMediaProbe.class,
// WifiProbe.class
};
@SuppressWarnings("unchecked")
public void testAll() throws ClassNotFoundException, IOException, InterruptedException, ParseException {
Log.i(TAG,"Running");
Debug.startMethodTracing("calc");
List<Class<? extends Probe>> allProbeClasses = Arrays.asList((Class<? extends Probe>[])ALL_PROBES);
// Run one at a time
Gson gson = getGson();
for (Class<? extends Probe> probeClass : allProbeClasses) {
JsonObject config = new JsonObject();
//config.addProperty("sensorDelay", SensorProbe.SENSOR_DELAY_NORMAL);
/*
* For those probes that need to set datetime
*/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
Date date= sdf.parse("2012-06-16 00:00:00");
long timeInMillisSinceEpoch = date.getTime();
long epochTime = TimeUnit.MILLISECONDS.toSeconds(timeInMillisSinceEpoch);
Log.i(TAG, "epochTime: " + epochTime);
String epochString = Long.toString(epochTime);
//config.addProperty("maxScanTime", "60");
config.addProperty("afterDate", epochString);
//look at SensorProbe for tag: "configurable"
config.addProperty("asdf", 1); //it doesn't crash the
config.addProperty("zzzz", "__");
Probe probe = gson.fromJson(config, probeClass);//the time that build the probe and add default configuration
probe.addStateListener(stateListener);
probe.registerListener(listener);
Thread.sleep(30000L);
if (probe instanceof ContinuousProbe) {
((ContinuousProbe)probe).unregisterListener(listener);
}
}
// Run simultaneously //why running simultaneously?
List<Probe> probes = new ArrayList<Probe>();
for (Class<? extends Probe> probeClass : allProbeClasses) {
probes.add(gson.fromJson(Probe.DEFAULT_CONFIG, probeClass));
}
for (Probe probe : probes) {
probe.addStateListener(stateListener);
probe.registerListener(listener);
}
Thread.sleep(1000L);
for (Probe probe : probes) {
if (probe instanceof ContinuousProbe) {
((ContinuousProbe)probe).unregisterListener(listener);
}
}
Thread.sleep(1000L); // Give probes time stop
Debug.stopMethodTracing();
}
}