From 685496fb153ca4fba16f563ed7055326a3c3c8d7 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Thu, 10 May 2018 15:11:54 +0100 Subject: [PATCH 1/5] Extract DatabaseConfig implementation. --- .../briar/android/AndroidDatabaseConfig.java | 64 +++++++++++++++++++ .../briarproject/briar/android/AppModule.java | 49 +------------- 2 files changed, 66 insertions(+), 47 deletions(-) create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/AndroidDatabaseConfig.java diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AndroidDatabaseConfig.java b/briar-android/src/main/java/org/briarproject/briar/android/AndroidDatabaseConfig.java new file mode 100644 index 000000000..3f98bd8cc --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/AndroidDatabaseConfig.java @@ -0,0 +1,64 @@ +package org.briarproject.briar.android; + +import org.briarproject.bramble.api.crypto.SecretKey; +import org.briarproject.bramble.api.db.DatabaseConfig; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import java.io.File; + +import javax.annotation.Nullable; + +@NotNullByDefault +class AndroidDatabaseConfig implements DatabaseConfig { + + private final File dir; + + @Nullable + private volatile SecretKey key = null; + @Nullable + private volatile String nickname = null; + + AndroidDatabaseConfig(File dir) { + this.dir = dir; + } + + @Override + public boolean databaseExists() { + // FIXME should not run on UiThread #620 + if (!dir.isDirectory()) return false; + File[] files = dir.listFiles(); + return files != null && files.length > 0; + } + + @Override + public File getDatabaseDirectory() { + return dir; + } + + @Override + public void setEncryptionKey(SecretKey key) { + this.key = key; + } + + @Override + public void setLocalAuthorName(String nickname) { + this.nickname = nickname; + } + + @Override + @Nullable + public String getLocalAuthorName() { + return nickname; + } + + @Override + @Nullable + public SecretKey getEncryptionKey() { + return key; + } + + @Override + public long getMaxSize() { + return Long.MAX_VALUE; + } +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java index 67af25ac6..4060305a6 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java @@ -5,7 +5,6 @@ import android.content.SharedPreferences; import org.briarproject.bramble.api.crypto.CryptoComponent; import org.briarproject.bramble.api.crypto.PublicKey; -import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.db.DatabaseConfig; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.lifecycle.LifecycleManager; @@ -23,7 +22,6 @@ import org.briarproject.briar.api.android.ScreenFilterMonitor; import java.io.File; import java.security.GeneralSecurityException; -import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; @@ -87,51 +85,7 @@ public class AppModule { File dir = app.getApplicationContext().getDir("db", MODE_PRIVATE); @MethodsNotNullByDefault @ParametersNotNullByDefault - DatabaseConfig databaseConfig = new DatabaseConfig() { - - private volatile SecretKey key; - private volatile String nickname; - - @Override - public boolean databaseExists() { - // FIXME should not run on UiThread #620 - if (!dir.isDirectory()) return false; - File[] files = dir.listFiles(); - return files != null && files.length > 0; - } - - @Override - public File getDatabaseDirectory() { - return dir; - } - - @Override - public void setEncryptionKey(SecretKey key) { - this.key = key; - } - - @Override - public void setLocalAuthorName(String nickname) { - this.nickname = nickname; - } - - @Override - @Nullable - public String getLocalAuthorName() { - return nickname; - } - - @Override - @Nullable - public SecretKey getEncryptionKey() { - return key; - } - - @Override - public long getMaxSize() { - return Long.MAX_VALUE; - } - }; + DatabaseConfig databaseConfig = new AndroidDatabaseConfig(dir); return databaseConfig; } @@ -204,4 +158,5 @@ public class AppModule { lifecycleManager.registerService(dozeWatchdog); return dozeWatchdog; } + } From 5e0ca10dae424d141170dab4d5ba8cc25eeec891 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 11 May 2018 09:19:34 +0100 Subject: [PATCH 2/5] Add logging to debug account setup. --- .../bramble/util/AndroidUtils.java | 60 ++++++++++++++++++- .../briarproject/bramble/util/IoUtils.java | 17 +++++- .../briar/android/AndroidDatabaseConfig.java | 32 +++++++++- .../controller/ConfigControllerImpl.java | 24 ++++++-- .../android/login/SetupControllerImpl.java | 11 +++- .../android/splash/SplashScreenActivity.java | 14 ++++- 6 files changed, 145 insertions(+), 13 deletions(-) diff --git a/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java b/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java index 15edba9c4..fe13a7106 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java @@ -6,15 +6,22 @@ import android.os.Build; import android.provider.Settings; import java.io.File; +import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Scanner; +import java.util.logging.Logger; import static android.content.Context.MODE_PRIVATE; +import static java.util.logging.Level.INFO; public class AndroidUtils { + private static final Logger LOG = + Logger.getLogger(AndroidUtils.class.getName()); + // Fake Bluetooth address returned by BluetoothAdapter on API 23 and later private static final String FAKE_BLUETOOTH_ADDRESS = "02:00:00:00:00:00"; @@ -51,17 +58,66 @@ public class AndroidUtils { && !address.equals(FAKE_BLUETOOTH_ADDRESS); } + public static void logDataDirContents(Context ctx) { + if (LOG.isLoggable(INFO)) { + LOG.info("Contents of data directory:"); + logFileOrDir(new File(ctx.getApplicationInfo().dataDir)); + } + } + + private static void logFileOrDir(File f) { + LOG.info(f.getAbsolutePath() + " " + f.length()); + if (f.isDirectory()) { + File[] children = f.listFiles(); + if (children == null) { + LOG.info("Could not list files in " + f.getAbsolutePath()); + } else { + for (File child : children) logFileOrDir(child); + } + } + } + + public static File getSharedPrefsFile(Context ctx, String name) { + File dataDir = new File(ctx.getApplicationInfo().dataDir); + File prefsDir = new File(dataDir, "shared_prefs"); + return new File(prefsDir, name + ".xml"); + } + + public static void logFileContents(File f) { + if (LOG.isLoggable(INFO)) { + LOG.info("Contents of " + f.getAbsolutePath() + ":"); + try { + Scanner s = new Scanner(f); + while (s.hasNextLine()) LOG.info(s.nextLine()); + s.close(); + } catch (FileNotFoundException e) { + LOG.info(f.getAbsolutePath() + " not found"); + } + } + } + public static void deleteAppData(Context ctx) { File dataDir = new File(ctx.getApplicationInfo().dataDir); + if (LOG.isLoggable(INFO)) + LOG.info("Deleting app data from " + dataDir.getAbsolutePath()); File[] children = dataDir.listFiles(); if (children != null) { for (File child : children) { - if (!child.getName().equals("lib")) + if (!child.getName().equals("lib")) { + if (LOG.isLoggable(INFO)) + LOG.info("Deleting " + child.getAbsolutePath()); IoUtils.deleteFileOrDir(child); + } } + } else if (LOG.isLoggable(INFO)) { + LOG.info("Could not list files in " + dataDir.getAbsolutePath()); } // Recreate the cache dir as some OpenGL drivers expect it to exist - new File(dataDir, "cache").mkdir(); + boolean recreated = new File(dataDir, "cache").mkdir(); + if (LOG.isLoggable(INFO)) { + if (recreated) LOG.info("Recreated cache dir"); + else LOG.info("Could not recreate cache dir"); + } } public static File getReportDir(Context ctx) { diff --git a/bramble-api/src/main/java/org/briarproject/bramble/util/IoUtils.java b/bramble-api/src/main/java/org/briarproject/bramble/util/IoUtils.java index 13b05d84c..6e14576c7 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/util/IoUtils.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/util/IoUtils.java @@ -9,20 +9,33 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; +import java.util.logging.Logger; import javax.annotation.Nullable; +import static java.util.logging.Level.INFO; + @NotNullByDefault public class IoUtils { + private static final Logger LOG = Logger.getLogger(IoUtils.class.getName()); + public static void deleteFileOrDir(File f) { if (f.isFile()) { - f.delete(); + delete(f); } else if (f.isDirectory()) { File[] children = f.listFiles(); if (children != null) for (File child : children) deleteFileOrDir(child); - f.delete(); + delete(f); + } + } + + private static void delete(File f) { + boolean deleted = f.delete(); + if (LOG.isLoggable(INFO)) { + if (deleted) LOG.info("Deleted " + f.getAbsolutePath()); + else LOG.info("Could not delete " + f.getAbsolutePath()); } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AndroidDatabaseConfig.java b/briar-android/src/main/java/org/briarproject/briar/android/AndroidDatabaseConfig.java index 3f98bd8cc..2fe5df11a 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AndroidDatabaseConfig.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AndroidDatabaseConfig.java @@ -5,12 +5,18 @@ import org.briarproject.bramble.api.db.DatabaseConfig; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import java.io.File; +import java.util.logging.Logger; import javax.annotation.Nullable; +import static java.util.logging.Level.INFO; + @NotNullByDefault class AndroidDatabaseConfig implements DatabaseConfig { + private static final Logger LOG = + Logger.getLogger(AndroidDatabaseConfig.class.getName()); + private final File dir; @Nullable @@ -25,35 +31,59 @@ class AndroidDatabaseConfig implements DatabaseConfig { @Override public boolean databaseExists() { // FIXME should not run on UiThread #620 - if (!dir.isDirectory()) return false; + if (!dir.isDirectory()) { + if (LOG.isLoggable(INFO)) + LOG.info(dir.getAbsolutePath() + " is not a directory"); + return false; + } File[] files = dir.listFiles(); + if (LOG.isLoggable(INFO)) { + if (files == null) { + LOG.info("Could not list files in " + dir.getAbsolutePath()); + } else { + LOG.info("Files in " + dir.getAbsolutePath() + ":"); + for (File f : files) LOG.info(f.getName()); + } + LOG.info("Database exists: " + (files != null && files.length > 0)); + } return files != null && files.length > 0; } @Override public File getDatabaseDirectory() { + File dir = this.dir; + if (LOG.isLoggable(INFO)) + LOG.info("Database directory: " + dir.getAbsolutePath()); return dir; } @Override public void setEncryptionKey(SecretKey key) { + LOG.info("Setting database key"); this.key = key; } @Override public void setLocalAuthorName(String nickname) { + LOG.info("Setting local author name"); this.nickname = nickname; } @Override @Nullable public String getLocalAuthorName() { + String nickname = this.nickname; + if (LOG.isLoggable(INFO)) + LOG.info("Local author name has been set: " + (nickname != null)); return nickname; } @Override @Nullable public SecretKey getEncryptionKey() { + SecretKey key = this.key; + if (LOG.isLoggable(INFO)) + LOG.info("Database key has been set: " + (key != null)); return key; } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/controller/ConfigControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/controller/ConfigControllerImpl.java index 3c1979444..5b0f7b46d 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/controller/ConfigControllerImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/controller/ConfigControllerImpl.java @@ -7,12 +7,19 @@ import org.briarproject.bramble.api.db.DatabaseConfig; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.util.AndroidUtils; +import java.util.logging.Logger; + import javax.annotation.Nullable; import javax.inject.Inject; +import static java.util.logging.Level.INFO; + @NotNullByDefault public class ConfigControllerImpl implements ConfigController { + private static final Logger LOG = + Logger.getLogger(ConfigControllerImpl.class.getName()); + private static final String PREF_DB_KEY = "key"; private final SharedPreferences briarPrefs; @@ -23,17 +30,20 @@ public class ConfigControllerImpl implements ConfigController { DatabaseConfig databaseConfig) { this.briarPrefs = briarPrefs; this.databaseConfig = databaseConfig; - } @Override @Nullable public String getEncryptedDatabaseKey() { - return briarPrefs.getString(PREF_DB_KEY, null); + String key = briarPrefs.getString(PREF_DB_KEY, null); + if (LOG.isLoggable(INFO)) + LOG.info("Got database key from preferences: " + (key != null)); + return key; } @Override public void storeEncryptedDatabaseKey(String hex) { + LOG.info("Storing database key in preferences"); SharedPreferences.Editor editor = briarPrefs.edit(); editor.putString(PREF_DB_KEY, hex); editor.apply(); @@ -41,21 +51,27 @@ public class ConfigControllerImpl implements ConfigController { @Override public void deleteAccount(Context ctx) { + LOG.info("Deleting account"); SharedPreferences.Editor editor = briarPrefs.edit(); editor.clear(); editor.apply(); AndroidUtils.deleteAppData(ctx); + AndroidUtils.logDataDirContents(ctx); } @Override public boolean accountExists() { String hex = getEncryptedDatabaseKey(); - return hex != null && databaseConfig.databaseExists(); + boolean exists = hex != null && databaseConfig.databaseExists(); + if (LOG.isLoggable(INFO)) LOG.info("Account exists: " + exists); + return exists; } @Override public boolean accountSignedIn() { - return databaseConfig.getEncryptionKey() != null; + boolean signedIn = databaseConfig.getEncryptionKey() != null; + if (LOG.isLoggable(INFO)) LOG.info("Signed in: " + signedIn); + return signedIn; } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java index a491aee7a..6d12d55f1 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java @@ -9,10 +9,12 @@ import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator; import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.db.DatabaseConfig; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.util.AndroidUtils; import org.briarproject.briar.android.controller.handler.ResultHandler; import org.briarproject.briar.android.controller.handler.UiResultHandler; import java.util.concurrent.Executor; +import java.util.logging.Logger; import javax.inject.Inject; @@ -20,8 +22,11 @@ import javax.inject.Inject; public class SetupControllerImpl extends PasswordControllerImpl implements SetupController { + private static final Logger LOG = + Logger.getLogger(SetupControllerImpl.class.getName()); + @Nullable - private SetupActivity setupActivity; + private SetupActivity setupActivity; // TODO: Should be volatile @Inject SetupControllerImpl(SharedPreferences briarPrefs, @@ -91,11 +96,15 @@ public class SetupControllerImpl extends PasswordControllerImpl String password = setupActivity.getPassword(); if (password == null) throw new IllegalStateException(); cryptoExecutor.execute(() -> { + LOG.info("Creating account"); + AndroidUtils.logDataDirContents(setupActivity); databaseConfig.setLocalAuthorName(authorName); SecretKey key = crypto.generateSecretKey(); databaseConfig.setEncryptionKey(key); String hex = encryptDatabaseKey(key, password); storeEncryptedDatabaseKey(hex); + LOG.info("Created account"); + AndroidUtils.logDataDirContents(setupActivity); resultHandler.onResult(null); }); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java index f21f460aa..fecce6251 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/splash/SplashScreenActivity.java @@ -8,6 +8,7 @@ import android.support.v7.preference.PreferenceManager; import android.transition.Fade; import org.briarproject.bramble.api.system.AndroidExecutor; +import org.briarproject.bramble.util.AndroidUtils; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.BaseActivity; @@ -44,9 +45,11 @@ public class SplashScreenActivity extends BaseActivity { setContentView(R.layout.splash); if (configController.accountSignedIn()) { + LOG.info("Already signed in, not showing splash screen"); startActivity(new Intent(this, OpenDatabaseActivity.class)); finish(); } else { + LOG.info("Showing splash screen"); new Handler().postDelayed(() -> { startNextActivity(); supportFinishAfterTransition(); @@ -64,9 +67,12 @@ public class SplashScreenActivity extends BaseActivity { LOG.info("Expired"); startActivity(new Intent(this, ExpiredActivity.class)); } else { + AndroidUtils.logDataDirContents(this); if (configController.accountExists()) { + LOG.info("Account exists"); startActivity(new Intent(this, OpenDatabaseActivity.class)); } else { + LOG.info("Account does not exist"); configController.deleteAccount(this); startActivity(new Intent(this, SetupActivity.class)); } @@ -74,8 +80,10 @@ public class SplashScreenActivity extends BaseActivity { } private void setPreferencesDefaults() { - androidExecutor.runOnBackgroundThread(() -> - PreferenceManager.setDefaultValues(SplashScreenActivity.this, - R.xml.panic_preferences, false)); + androidExecutor.runOnBackgroundThread(() -> { + PreferenceManager.setDefaultValues(SplashScreenActivity.this, + R.xml.panic_preferences, false); + LOG.info("Finished setting panic preference defaults"); + }); } } From f3b69a26f8607e6cd44d8d2d4e30a4bf387e8ef3 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 11 May 2018 09:20:57 +0100 Subject: [PATCH 3/5] Remove unused exception declarations. --- .../src/main/java/org/briarproject/bramble/util/IoUtils.java | 3 +-- .../briarproject/briar/android/ScreenFilterMonitorImpl.java | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/util/IoUtils.java b/bramble-api/src/main/java/org/briarproject/bramble/util/IoUtils.java index 6e14576c7..0d4b3d8e0 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/util/IoUtils.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/util/IoUtils.java @@ -39,8 +39,7 @@ public class IoUtils { } } - public static void copyAndClose(InputStream in, OutputStream out) - throws IOException { + public static void copyAndClose(InputStream in, OutputStream out) { byte[] buf = new byte[4096]; try { while (true) { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/ScreenFilterMonitorImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/ScreenFilterMonitorImpl.java index fa9122c45..ebc14bde5 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/ScreenFilterMonitorImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/ScreenFilterMonitorImpl.java @@ -14,7 +14,6 @@ import android.content.pm.Signature; import android.support.annotation.UiThread; import org.briarproject.bramble.api.lifecycle.Service; -import org.briarproject.bramble.api.lifecycle.ServiceException; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.system.AndroidExecutor; import org.briarproject.bramble.util.StringUtils; @@ -196,7 +195,7 @@ class ScreenFilterMonitorImpl implements ScreenFilterMonitor, Service { } @Override - public void startService() throws ServiceException { + public void startService() { if (used.getAndSet(true)) throw new IllegalStateException(); androidExecutor.runOnUiThread(() -> { IntentFilter filter = new IntentFilter(); @@ -212,7 +211,7 @@ class ScreenFilterMonitorImpl implements ScreenFilterMonitor, Service { } @Override - public void stopService() throws ServiceException { + public void stopService() { androidExecutor.runOnUiThread(() -> { if (receiver != null) app.unregisterReceiver(receiver); }); From 1987dcb936c5f584bb7dbda486f4b68936eeaf8e Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 11 May 2018 09:21:45 +0100 Subject: [PATCH 4/5] Make field that's used on background thread volatile. --- .../briar/android/login/SetupControllerImpl.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java index 6d12d55f1..97814637b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java @@ -26,7 +26,7 @@ public class SetupControllerImpl extends PasswordControllerImpl Logger.getLogger(SetupControllerImpl.class.getName()); @Nullable - private SetupActivity setupActivity; // TODO: Should be volatile + private volatile SetupActivity setupActivity; @Inject SetupControllerImpl(SharedPreferences briarPrefs, @@ -44,6 +44,7 @@ public class SetupControllerImpl extends PasswordControllerImpl @Override public boolean needToShowDozeFragment() { + SetupActivity setupActivity = this.setupActivity; if (setupActivity == null) throw new IllegalStateException(); return DozeView.needsToBeShown(setupActivity) || HuaweiView.needsToBeShown(setupActivity); @@ -51,31 +52,35 @@ public class SetupControllerImpl extends PasswordControllerImpl @Override public void setAuthorName(String authorName) { + SetupActivity setupActivity = this.setupActivity; if (setupActivity == null) throw new IllegalStateException(); setupActivity.setAuthorName(authorName); } @Override public void setPassword(String password) { + SetupActivity setupActivity = this.setupActivity; if (setupActivity == null) throw new IllegalStateException(); setupActivity.setPassword(password); } @Override public void showPasswordFragment() { + SetupActivity setupActivity = this.setupActivity; if (setupActivity == null) throw new IllegalStateException(); setupActivity.showPasswordFragment(); } @Override public void showDozeFragment() { + SetupActivity setupActivity = this.setupActivity; if (setupActivity == null) throw new IllegalStateException(); setupActivity.showDozeFragment(); } @Override public void createAccount() { - if (setupActivity == null) throw new IllegalStateException(); + SetupActivity setupActivity = this.setupActivity; UiResultHandler resultHandler = new UiResultHandler(setupActivity) { @Override @@ -90,6 +95,7 @@ public class SetupControllerImpl extends PasswordControllerImpl // Package access for testing void createAccount(ResultHandler resultHandler) { + SetupActivity setupActivity = this.setupActivity; if (setupActivity == null) throw new IllegalStateException(); String authorName = setupActivity.getAuthorName(); if (authorName == null) throw new IllegalStateException(); From df7d48d54d6b996e866176552f9f68bb56a884c5 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 11 May 2018 09:40:10 +0100 Subject: [PATCH 5/5] Fix test expectations. --- .../android/login/SetupControllerImplTest.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/briar-android/src/test/java/org/briarproject/briar/android/login/SetupControllerImplTest.java b/briar-android/src/test/java/org/briarproject/briar/android/login/SetupControllerImplTest.java index 6fe3f42c8..b70524102 100644 --- a/briar-android/src/test/java/org/briarproject/briar/android/login/SetupControllerImplTest.java +++ b/briar-android/src/test/java/org/briarproject/briar/android/login/SetupControllerImplTest.java @@ -1,6 +1,7 @@ package org.briarproject.briar.android.login; import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; import org.briarproject.bramble.api.crypto.CryptoComponent; import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator; @@ -8,10 +9,13 @@ import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.db.DatabaseConfig; import org.briarproject.bramble.test.BrambleMockTestCase; import org.briarproject.bramble.test.ImmediateExecutor; +import org.briarproject.bramble.test.TestUtils; import org.jmock.Expectations; import org.jmock.lib.legacy.ClassImposteriser; +import org.junit.After; import org.junit.Test; +import java.io.File; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; @@ -40,6 +44,7 @@ public class SetupControllerImplTest extends BrambleMockTestCase { private final String encryptedHex = "010203"; private final byte[] encryptedBytes = new byte[] {1, 2, 3}; private final SecretKey key = getSecretKey(); + private final File testDir = TestUtils.getTestDirectory(); public SetupControllerImplTest() { context.setImposteriser(ClassImposteriser.INSTANCE); @@ -50,6 +55,11 @@ public class SetupControllerImplTest extends BrambleMockTestCase { @SuppressWarnings("ResultOfMethodCallIgnored") public void testCreateAccount() { context.checking(new Expectations() {{ + // Allow the contents of the data directory to be logged + allowing(setupActivity).getApplicationInfo(); + will(returnValue(new ApplicationInfo() {{ + dataDir = testDir.getAbsolutePath(); + }})); // Set the author name and password oneOf(setupActivity).setAuthorName(authorName); oneOf(setupActivity).setPassword(password); @@ -84,4 +94,9 @@ public class SetupControllerImplTest extends BrambleMockTestCase { s.createAccount(result -> called.set(true)); assertTrue(called.get()); } + + @After + public void tearDown() { + TestUtils.deleteTestDirectory(testDir); + } }