Initial support for testing the DeviceCommunicationService
Lots of support classes to enable local testing, without a device or an emulator.
This commit is contained in:
parent
cedd95186f
commit
77cad5c47f
|
@ -31,9 +31,16 @@ android {
|
||||||
// optional path to report (default will be lint-results.html in the builddir)
|
// optional path to report (default will be lint-results.html in the builddir)
|
||||||
htmlOutput file("$project.buildDir/reports/lint/lint.html")
|
htmlOutput file("$project.buildDir/reports/lint/lint.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testOptions {
|
||||||
|
unitTests.returnDefaultValues = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
testCompile 'junit:junit:4.12'
|
||||||
|
testCompile "org.mockito:mockito-core:1.9.5"
|
||||||
|
|
||||||
compile fileTree(dir: 'libs', include: ['*.jar'])
|
compile fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
compile 'com.android.support:appcompat-v7:21.0.3'
|
compile 'com.android.support:appcompat-v7:21.0.3'
|
||||||
compile 'com.android.support:support-v4:21.0.3'
|
compile 'com.android.support:support-v4:21.0.3'
|
||||||
|
@ -41,9 +48,6 @@ dependencies {
|
||||||
compile 'org.slf4j:slf4j-api:1.7.7'
|
compile 'org.slf4j:slf4j-api:1.7.7'
|
||||||
compile 'com.github.PhilJay:MPAndroidChart:2.1.0'
|
compile 'com.github.PhilJay:MPAndroidChart:2.1.0'
|
||||||
compile 'com.github.pfichtner:durationformatter:0.1.1'
|
compile 'com.github.pfichtner:durationformatter:0.1.1'
|
||||||
|
|
||||||
testCompile 'junit:junit:4.12'
|
|
||||||
// testCompile "org.mockito:mockito-core:1.9.5"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
check.dependsOn 'findbugs', 'pmd', 'lint'
|
check.dependsOn 'findbugs', 'pmd', 'lint'
|
||||||
|
|
|
@ -21,8 +21,8 @@ import nodomain.freeyourgadget.gadgetbridge.database.ActivityDatabaseHandler;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
|
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceService;
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.DeviceService;
|
import nodomain.freeyourgadget.gadgetbridge.model.DeviceService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.DeviceCommunicationService;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.FileUtils;
|
import nodomain.freeyourgadget.gadgetbridge.util.FileUtils;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
|
|
||||||
public class GBApplication extends Application {
|
public class GBApplication extends Application {
|
||||||
// Since this class must not log to slf4j, we use plain android.util.Log
|
// Since this class must not log to slf4j, we use plain android.util.Log
|
||||||
|
@ -39,7 +39,7 @@ public class GBApplication extends Application {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected DeviceService createDeviceService() {
|
protected DeviceService createDeviceService() {
|
||||||
return new GBDeviceService(this, DeviceCommunicationService.class);
|
return new GBDeviceService(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -55,6 +55,7 @@ public class GBApplication extends Application {
|
||||||
// StatusPrinter.print(lc);
|
// StatusPrinter.print(lc);
|
||||||
// Logger logger = LoggerFactory.getLogger(GBApplication.class);
|
// Logger logger = LoggerFactory.getLogger(GBApplication.class);
|
||||||
|
|
||||||
|
GB.environment = GBEnvironment.createDeviceEnvironment();
|
||||||
mActivityDatabaseHandler = new ActivityDatabaseHandler(context);
|
mActivityDatabaseHandler = new ActivityDatabaseHandler(context);
|
||||||
// for testing DB stuff
|
// for testing DB stuff
|
||||||
// SQLiteDatabase db = mActivityDatabaseHandler.getWritableDatabase();
|
// SQLiteDatabase db = mActivityDatabaseHandler.getWritableDatabase();
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge;
|
||||||
|
|
||||||
|
public class GBEnvironment {
|
||||||
|
private boolean localTest;
|
||||||
|
private boolean deviceTest;
|
||||||
|
|
||||||
|
public static GBEnvironment createLocalTestEnvironment() {
|
||||||
|
GBEnvironment env = new GBEnvironment();
|
||||||
|
env.localTest = true;
|
||||||
|
return env;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static GBEnvironment createDeviceEnvironment() {
|
||||||
|
GBEnvironment env = new GBEnvironment();
|
||||||
|
return env;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isTest() {
|
||||||
|
return localTest || deviceTest;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isLocalTest() {
|
||||||
|
return localTest;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -12,17 +12,18 @@ import java.util.UUID;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.Alarm;
|
import nodomain.freeyourgadget.gadgetbridge.model.Alarm;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.DeviceService;
|
import nodomain.freeyourgadget.gadgetbridge.model.DeviceService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.ServiceCommand;
|
import nodomain.freeyourgadget.gadgetbridge.model.ServiceCommand;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.DeviceCommunicationService;
|
||||||
|
|
||||||
public class GBDeviceService implements DeviceService {
|
public class GBDeviceService implements DeviceService {
|
||||||
protected final Context mContext;
|
protected final Context mContext;
|
||||||
protected final Class<? extends Service> mServiceClass;
|
protected final Class<? extends Service> mServiceClass;
|
||||||
|
|
||||||
public GBDeviceService(Context context, Class<? extends Service> serviceClass) {
|
public GBDeviceService(Context context) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mServiceClass = serviceClass;
|
mServiceClass = DeviceCommunicationService.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Intent createIntent() {
|
protected Intent createIntent() {
|
||||||
Intent startIntent = new Intent(mContext, mServiceClass);
|
Intent startIntent = new Intent(mContext, mServiceClass);
|
||||||
return startIntent;
|
return startIntent;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,5 +3,5 @@ package nodomain.freeyourgadget.gadgetbridge.model;
|
||||||
public enum DeviceType {
|
public enum DeviceType {
|
||||||
UNKNOWN,
|
UNKNOWN,
|
||||||
PEBBLE,
|
PEBBLE,
|
||||||
MIBAND
|
TEST, MIBAND
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,11 +107,13 @@ public class DeviceCommunicationService extends Service {
|
||||||
start(); // ensure started
|
start(); // ensure started
|
||||||
String btDeviceAddress = intent.getStringExtra(EXTRA_DEVICE_ADDRESS);
|
String btDeviceAddress = intent.getStringExtra(EXTRA_DEVICE_ADDRESS);
|
||||||
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
|
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||||
|
if (sharedPrefs != null) { // may be null in test cases
|
||||||
if (btDeviceAddress == null) {
|
if (btDeviceAddress == null) {
|
||||||
btDeviceAddress = sharedPrefs.getString("last_device_address", null);
|
btDeviceAddress = sharedPrefs.getString("last_device_address", null);
|
||||||
} else {
|
} else {
|
||||||
sharedPrefs.edit().putString("last_device_address", btDeviceAddress).apply();
|
sharedPrefs.edit().putString("last_device_address", btDeviceAddress).apply();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (btDeviceAddress != null && !isConnecting() && !isConnected()) {
|
if (btDeviceAddress != null && !isConnecting() && !isConnected()) {
|
||||||
if (mDeviceSupport != null) {
|
if (mDeviceSupport != null) {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import android.bluetooth.BluetoothDevice;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBException;
|
import nodomain.freeyourgadget.gadgetbridge.GBException;
|
||||||
|
@ -26,11 +27,18 @@ public class DeviceSupportFactory {
|
||||||
|
|
||||||
public synchronized DeviceSupport createDeviceSupport(String deviceAddress) throws GBException {
|
public synchronized DeviceSupport createDeviceSupport(String deviceAddress) throws GBException {
|
||||||
DeviceSupport deviceSupport;
|
DeviceSupport deviceSupport;
|
||||||
if (deviceAddress.indexOf(":") == deviceAddress.lastIndexOf(":")) { // only one colon
|
int indexFirstColon = deviceAddress.indexOf(":");
|
||||||
|
if (indexFirstColon > 0) {
|
||||||
|
if (indexFirstColon == deviceAddress.lastIndexOf(":")) { // only one colon
|
||||||
deviceSupport = createTCPDeviceSupport(deviceAddress);
|
deviceSupport = createTCPDeviceSupport(deviceAddress);
|
||||||
} else {
|
} else {
|
||||||
|
// multiple colons -- bt?
|
||||||
deviceSupport = createBTDeviceSupport(deviceAddress);
|
deviceSupport = createBTDeviceSupport(deviceAddress);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// no colon at all, maybe a class name?
|
||||||
|
deviceSupport = createClassNameDeviceSupport(deviceAddress);
|
||||||
|
}
|
||||||
|
|
||||||
if (deviceSupport != null) {
|
if (deviceSupport != null) {
|
||||||
return deviceSupport;
|
return deviceSupport;
|
||||||
|
@ -41,6 +49,21 @@ public class DeviceSupportFactory {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private DeviceSupport createClassNameDeviceSupport(String className) throws GBException {
|
||||||
|
try {
|
||||||
|
Class<?> deviceSupportClass = Class.forName(className);
|
||||||
|
Constructor<?> constructor = deviceSupportClass.getConstructor();
|
||||||
|
DeviceSupport support = (DeviceSupport) constructor.newInstance();
|
||||||
|
// has to create the device itself
|
||||||
|
support.setContext(null, null, mContext);
|
||||||
|
return support;
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
return null; // not a class, or not known at least
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new GBException("Error creating DeviceSupport instance for " + className, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void checkBtAvailability() {
|
private void checkBtAvailability() {
|
||||||
if (mBtAdapter == null) {
|
if (mBtAdapter == null) {
|
||||||
GB.toast(mContext.getString(R.string.bluetooth_is_not_supported_), Toast.LENGTH_SHORT, GB.WARN);
|
GB.toast(mContext.getString(R.string.bluetooth_is_not_supported_), Toast.LENGTH_SHORT, GB.WARN);
|
||||||
|
|
|
@ -24,6 +24,7 @@ import java.nio.ByteBuffer;
|
||||||
import java.nio.ByteOrder;
|
import java.nio.ByteOrder;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.GBEnvironment;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.activities.ControlCenter;
|
import nodomain.freeyourgadget.gadgetbridge.activities.ControlCenter;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventScreenshot;
|
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventScreenshot;
|
||||||
|
@ -42,6 +43,7 @@ public class GB {
|
||||||
public static final int INFO = 1;
|
public static final int INFO = 1;
|
||||||
public static final int WARN = 2;
|
public static final int WARN = 2;
|
||||||
public static final int ERROR = 3;
|
public static final int ERROR = 3;
|
||||||
|
public static GBEnvironment environment;
|
||||||
|
|
||||||
public static Notification createNotification(String text, Context context) {
|
public static Notification createNotification(String text, Context context) {
|
||||||
Intent notificationIntent = new Intent(context, ControlCenter.class);
|
Intent notificationIntent = new Intent(context, ControlCenter.class);
|
||||||
|
@ -224,6 +226,9 @@ public class GB {
|
||||||
* @param ex optional exception to be logged
|
* @param ex optional exception to be logged
|
||||||
*/
|
*/
|
||||||
public static void toast(final Context context, final String message, final int displayTime, final int severity, final Throwable ex) {
|
public static void toast(final Context context, final String message, final int displayTime, final int severity, final Throwable ex) {
|
||||||
|
if (env().isLocalTest()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
Looper mainLooper = Looper.getMainLooper();
|
Looper mainLooper = Looper.getMainLooper();
|
||||||
if (Thread.currentThread() == mainLooper.getThread()) {
|
if (Thread.currentThread() == mainLooper.getThread()) {
|
||||||
log(message, severity, ex);
|
log(message, severity, ex);
|
||||||
|
@ -291,4 +296,8 @@ public class GB {
|
||||||
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
nm.notify(NOTIFICATION_ID_INSTALL, notification);
|
nm.notify(NOTIFICATION_ID_INSTALL, notification);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static GBEnvironment env() {
|
||||||
|
return environment;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.service;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
|
||||||
|
import junit.framework.Assert;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.test.GBMockApplication;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.test.GBMockContext;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.test.GBMockPackageManager;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.test.MockHelper;
|
||||||
|
|
||||||
|
public abstract class AbstractServiceTestCase<T extends Service> {
|
||||||
|
private static final int ID = -1; // currently not supported
|
||||||
|
private Class<T> mServiceClass;
|
||||||
|
private T mServiceInstance;
|
||||||
|
private Context mContext;
|
||||||
|
private Application mApplication;
|
||||||
|
private boolean wasStarted;
|
||||||
|
private PackageManager mPackageManager;
|
||||||
|
private NotificationManager mNotificationManager;
|
||||||
|
private MockHelper mMockHelper;
|
||||||
|
|
||||||
|
protected AbstractServiceTestCase(Class<T> serviceClass) {
|
||||||
|
mServiceClass = serviceClass;
|
||||||
|
Assert.assertNotNull(serviceClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Context getContext() {
|
||||||
|
return mContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
mMockHelper = new MockHelper();
|
||||||
|
mPackageManager = createPackageManager();
|
||||||
|
mApplication = createApplication(mPackageManager);
|
||||||
|
mContext = createContext(mApplication);
|
||||||
|
mNotificationManager = mMockHelper.createNotificationManager(mContext);
|
||||||
|
mServiceInstance = createService(mServiceClass, mApplication, mNotificationManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() throws Exception {
|
||||||
|
if (mServiceInstance != null) {
|
||||||
|
stopService();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startService(Intent intent) {
|
||||||
|
if (!wasStarted) {
|
||||||
|
wasStarted = true;
|
||||||
|
mServiceInstance.onCreate();
|
||||||
|
}
|
||||||
|
mServiceInstance.onStartCommand(intent, Service.START_FLAG_REDELIVERY, ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopService() {
|
||||||
|
mServiceInstance.onDestroy();
|
||||||
|
mServiceInstance = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Application createApplication(PackageManager packageManager) {
|
||||||
|
return new GBMockApplication(packageManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected PackageManager createPackageManager() {
|
||||||
|
return new GBMockPackageManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Application getApplication() {
|
||||||
|
return mApplication;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Context createContext(final Application application) {
|
||||||
|
return new GBMockContext(application);
|
||||||
|
}
|
||||||
|
|
||||||
|
private T createService(Class<T> serviceClass, Application application, NotificationManager notificationManager) throws Exception {
|
||||||
|
T service = mMockHelper.createService(serviceClass, application);
|
||||||
|
mMockHelper.addSystemServiceTo(service, Context.NOTIFICATION_SERVICE, getNotificationService());
|
||||||
|
return service;
|
||||||
|
}
|
||||||
|
|
||||||
|
private NotificationManager getNotificationService() {
|
||||||
|
return mNotificationManager;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.service;
|
||||||
|
|
||||||
|
import android.test.ServiceTestCase;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.test.TestDeviceSupport;
|
||||||
|
|
||||||
|
public class DeviceCommunicationServiceTestCase extends AbstractServiceTestCase<DeviceCommunicationService> {
|
||||||
|
private static final java.lang.String TEST_DEVICE_ADDRESS = TestDeviceSupport.class.getName();
|
||||||
|
|
||||||
|
private TestDeviceService mDeviceService;
|
||||||
|
|
||||||
|
public DeviceCommunicationServiceTestCase() {
|
||||||
|
super(DeviceCommunicationService.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
mDeviceService = new TestDeviceService(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStart() {
|
||||||
|
mDeviceService.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testConnect() {
|
||||||
|
mDeviceService.connect(TEST_DEVICE_ADDRESS);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.service;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceService;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.test.GBMockIntent;
|
||||||
|
|
||||||
|
public class TestDeviceService extends GBDeviceService {
|
||||||
|
private final AbstractServiceTestCase<?> mTestCase;
|
||||||
|
|
||||||
|
public TestDeviceService(AbstractServiceTestCase<?> testCase) throws Exception {
|
||||||
|
super(testCase.getContext());
|
||||||
|
mTestCase = testCase;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Intent createIntent() {
|
||||||
|
return new GBMockIntent();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void invokeService(Intent intent) {
|
||||||
|
mTestCase.startService(intent);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.test;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.test.mock.MockApplication;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.GBEnvironment;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
|
|
||||||
|
public class GBMockApplication extends MockApplication {
|
||||||
|
private final PackageManager mPackageManager;
|
||||||
|
|
||||||
|
public GBMockApplication(PackageManager packageManager) {
|
||||||
|
GB.environment = GBEnvironment.createDeviceEnvironment().createLocalTestEnvironment();
|
||||||
|
mPackageManager = packageManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Context getApplicationContext() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public PackageManager getPackageManager() {
|
||||||
|
return mPackageManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.test;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.test.mock.MockContext;
|
||||||
|
|
||||||
|
public class GBMockContext extends MockContext {
|
||||||
|
private final Application mApplication;
|
||||||
|
|
||||||
|
public GBMockContext(Application application) {
|
||||||
|
mApplication = application;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Context getApplicationContext() {
|
||||||
|
return mApplication;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PackageManager getPackageManager() {
|
||||||
|
return mApplication.getPackageManager();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,387 @@
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.test;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class GBMockIntent extends Intent {
|
||||||
|
private String mAction;
|
||||||
|
private Map<String,Object> extras = new HashMap<>();
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent setAction(String action) {
|
||||||
|
mAction = action;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAction() {
|
||||||
|
return mAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, boolean value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, byte value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, char value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, short value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, int value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, long value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, float value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, double value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, String value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, CharSequence value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, Parcelable value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, Parcelable[] value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Intent putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putIntegerArrayListExtra(String name, ArrayList<Integer> value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putStringArrayListExtra(String name, ArrayList<String> value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putCharSequenceArrayListExtra(String name, ArrayList<CharSequence> value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, Serializable value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, boolean[] value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, byte[] value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, short[] value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, char[] value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, int[] value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, long[] value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, float[] value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, double[] value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, String[] value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, CharSequence[] value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Intent putExtra(String name, Bundle value) {
|
||||||
|
extras.put(name, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getBooleanExtra(String name, boolean defaultValue) {
|
||||||
|
if (extras.containsKey(name)) {
|
||||||
|
return (boolean) extras.get(name);
|
||||||
|
}
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte getByteExtra(String name, byte defaultValue) {
|
||||||
|
if (extras.containsKey(name)) {
|
||||||
|
return (byte) extras.get(name);
|
||||||
|
}
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public short getShortExtra(String name, short defaultValue) {
|
||||||
|
if (extras.containsKey(name)) {
|
||||||
|
return (short) extras.get(name);
|
||||||
|
}
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public char getCharExtra(String name, char defaultValue) {
|
||||||
|
if (extras.containsKey(name)) {
|
||||||
|
return (char) extras.get(name);
|
||||||
|
}
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getIntExtra(String name, int defaultValue) {
|
||||||
|
if (extras.containsKey(name)) {
|
||||||
|
return (int) extras.get(name);
|
||||||
|
}
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getLongExtra(String name, long defaultValue) {
|
||||||
|
if (extras.containsKey(name)) {
|
||||||
|
return (long) extras.get(name);
|
||||||
|
}
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getFloatExtra(String name, float defaultValue) {
|
||||||
|
if (extras.containsKey(name)) {
|
||||||
|
return (float) extras.get(name);
|
||||||
|
}
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getDoubleExtra(String name, double defaultValue) {
|
||||||
|
if (extras.containsKey(name)) {
|
||||||
|
return (double) extras.get(name);
|
||||||
|
}
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence getCharSequenceExtra(String name) {
|
||||||
|
return (CharSequence) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T extends Parcelable> T getParcelableExtra(String name) {
|
||||||
|
return (T) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Parcelable[] getParcelableArrayExtra(String name) {
|
||||||
|
return (Parcelable[]) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T extends Parcelable> ArrayList<T> getParcelableArrayListExtra(String name) {
|
||||||
|
return (ArrayList<T>) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Serializable getSerializableExtra(String name) {
|
||||||
|
return (Serializable) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<Integer> getIntegerArrayListExtra(String name) {
|
||||||
|
return (ArrayList<Integer>) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<String> getStringArrayListExtra(String name) {
|
||||||
|
return (ArrayList<String>) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<CharSequence> getCharSequenceArrayListExtra(String name) {
|
||||||
|
return (ArrayList<CharSequence>) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean[] getBooleanArrayExtra(String name) {
|
||||||
|
return (boolean[]) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] getByteArrayExtra(String name) {
|
||||||
|
return (byte[]) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public short[] getShortArrayExtra(String name) {
|
||||||
|
return (short[]) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public char[] getCharArrayExtra(String name) {
|
||||||
|
return (char[]) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int[] getIntArrayExtra(String name) {
|
||||||
|
return (int[]) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long[] getLongArrayExtra(String name) {
|
||||||
|
return (long[]) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float[] getFloatArrayExtra(String name) {
|
||||||
|
return (float[]) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double[] getDoubleArrayExtra(String name) {
|
||||||
|
return (double[]) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] getStringArrayExtra(String name) {
|
||||||
|
return (String[]) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence[] getCharSequenceArrayExtra(String name) {
|
||||||
|
return (CharSequence[]) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getStringExtra(String name) {
|
||||||
|
return (String) extras.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "GBMockIntent: " + mAction;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.test;
|
||||||
|
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.test.mock.MockPackageManager;
|
||||||
|
|
||||||
|
public class GBMockPackageManager extends MockPackageManager {
|
||||||
|
@Override
|
||||||
|
public void setComponentEnabledSetting(ComponentName componentName, int newState, int flags) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.test;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import junit.framework.Assert;
|
||||||
|
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
|
||||||
|
public class MockHelper {
|
||||||
|
public <T extends Service> NotificationManager createNotificationManager(Context mContext) throws Exception {
|
||||||
|
Constructor<?>[] constructors = NotificationManager.class.getDeclaredConstructors();
|
||||||
|
constructors[0].setAccessible(true);
|
||||||
|
Class<?>[] parameterTypes = constructors[0].getParameterTypes();
|
||||||
|
return (NotificationManager) constructors[0].newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends Service> T createService(Class<T> serviceClass, Application application) throws Exception {
|
||||||
|
Constructor<T> constructor = serviceClass.getConstructor();
|
||||||
|
Assert.assertNotNull(constructor);
|
||||||
|
T realService = constructor.newInstance();
|
||||||
|
T mockedService = Mockito.spy(realService);
|
||||||
|
Mockito.when(mockedService.getApplicationContext()).thenReturn(application);
|
||||||
|
Mockito.when(mockedService.getPackageManager()).thenReturn(application.getPackageManager());
|
||||||
|
return mockedService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSystemServiceTo(Context context, String serviceName, Object service) {
|
||||||
|
Mockito.when(context.getSystemService(serviceName)).thenReturn(service);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,122 @@
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.test;
|
||||||
|
|
||||||
|
import android.bluetooth.BluetoothAdapter;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.model.Alarm;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.model.ServiceCommand;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.AbstractDeviceSupport;
|
||||||
|
|
||||||
|
public class TestDeviceSupport extends AbstractDeviceSupport {
|
||||||
|
|
||||||
|
public TestDeviceSupport() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setContext(GBDevice gbDevice, BluetoothAdapter btAdapter, Context context) {
|
||||||
|
gbDevice = new GBDevice(getClass().getName(), "Test Device", DeviceType.TEST);
|
||||||
|
super.setContext(gbDevice, btAdapter, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean connect() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispose() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean useAutoConnect() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void pair() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSMS(String from, String body) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEmail(String from, String subject, String body) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onGenericNotification(String title, String details) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSetTime() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSetAlarms(ArrayList<? extends Alarm> alarms) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSetCallState(@Nullable String number, @Nullable String name, ServiceCommand command) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSetMusicInfo(String artist, String album, String track) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onInstallApp(Uri uri) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAppInfoReq() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAppStart(UUID uuid) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAppDelete(UUID uuid) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFetchActivityData() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onReboot() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFindDevice(boolean start) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onScreenshotReq() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue