diff --git a/briar-android/src/org/briarproject/android/SetupActivity.java b/briar-android/src/org/briarproject/android/SetupActivity.java index bac901a07fbed9063dbd5d0b2f7516a682a9a291..84ef23185793f3de86cae6149b0b461cf1d45790 100644 --- a/briar-android/src/org/briarproject/android/SetupActivity.java +++ b/briar-android/src/org/briarproject/android/SetupActivity.java @@ -9,12 +9,14 @@ import static android.view.Gravity.CENTER_HORIZONTAL; import static android.view.View.GONE; import static android.view.View.VISIBLE; import static android.widget.LinearLayout.VERTICAL; +import static java.util.logging.Level.INFO; import static org.briarproject.android.util.CommonLayoutParams.MATCH_MATCH; import static org.briarproject.android.util.CommonLayoutParams.WRAP_WRAP; import static org.briarproject.api.crypto.PasswordStrengthEstimator.WEAK; import java.util.Arrays; import java.util.concurrent.Executor; +import java.util.logging.Logger; import javax.inject.Inject; @@ -48,6 +50,9 @@ import android.widget.TextView; public class SetupActivity extends RoboActivity implements OnClickListener { + private static final Logger LOG = + Logger.getLogger(SetupActivity.class.getName()); + @Inject @CryptoExecutor private Executor cryptoExecutor; @Inject private PasswordStrengthEstimator strengthEstimator; private EditText nicknameEntry = null; @@ -66,6 +71,7 @@ public class SetupActivity extends RoboActivity implements OnClickListener { @Override public void onCreate(Bundle state) { super.onCreate(state); + LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(MATCH_MATCH); layout.setOrientation(VERTICAL); @@ -217,16 +223,13 @@ public class SetupActivity extends RoboActivity implements OnClickListener { cryptoExecutor.execute(new Runnable() { public void run() { byte[] key = crypto.generateSecretKey().getEncoded(); - byte[] encrypted = crypto.encryptWithPassword(key, password); - storeEncryptedDatabaseKey(encrypted); databaseConfig.setEncryptionKey(key); - KeyPair keyPair = crypto.generateSignatureKeyPair(); - final byte[] publicKey = keyPair.getPublic().getEncoded(); - final byte[] privateKey = keyPair.getPrivate().getEncoded(); - LocalAuthor a = authorFactory.createLocalAuthor(nickname, - publicKey, privateKey); - showHomeScreen(referenceManager.putReference(a, - LocalAuthor.class)); + byte[] encrypted = encryptDatabaseKey(key, password); + for(int i = 0; i < password.length; i++) password[i] = 0; + storeEncryptedDatabaseKey(encrypted); + LocalAuthor localAuthor = createLocalAuthor(nickname); + showHomeScreen(referenceManager.putReference(localAuthor, + LocalAuthor.class)); } }); } @@ -235,11 +238,37 @@ public class SetupActivity extends RoboActivity implements OnClickListener { e.delete(0, e.length()); } - private void storeEncryptedDatabaseKey(byte[] encrypted) { + private void storeEncryptedDatabaseKey(final byte[] encrypted) { + long start = System.currentTimeMillis(); SharedPreferences prefs = getSharedPreferences("db", MODE_PRIVATE); Editor editor = prefs.edit(); editor.putString("key", StringUtils.toHexString(encrypted)); editor.commit(); + long duration = System.currentTimeMillis() - start; + if(LOG.isLoggable(INFO)) + LOG.info("Key storage took " + duration + " ms"); + } + + private byte[] encryptDatabaseKey(byte[] key, char[] password) { + long start = System.currentTimeMillis(); + byte[] encrypted = crypto.encryptWithPassword(key, password); + long duration = System.currentTimeMillis() - start; + if(LOG.isLoggable(INFO)) + LOG.info("Key derivation took " + duration + " ms"); + return encrypted; + } + + private LocalAuthor createLocalAuthor(String nickname) { + long start = System.currentTimeMillis(); + KeyPair keyPair = crypto.generateSignatureKeyPair(); + byte[] publicKey = keyPair.getPublic().getEncoded(); + byte[] privateKey = keyPair.getPrivate().getEncoded(); + LocalAuthor localAuthor = authorFactory.createLocalAuthor(nickname, + publicKey, privateKey); + long duration = System.currentTimeMillis() - start; + if(LOG.isLoggable(INFO)) + LOG.info("Identity creation took " + duration + " ms"); + return localAuthor; } private void showHomeScreen(final long handle) { diff --git a/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java b/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java index c76b397eadf42a6402fa5ae4d20800be949f7ec7..ce4f0e5e092a19a9c6ebfa604b5f7c849a0c1c23 100644 --- a/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java +++ b/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java @@ -16,12 +16,14 @@ import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.Service; +import org.briarproject.api.system.Clock; class LifecycleManagerImpl implements LifecycleManager { private static final Logger LOG = Logger.getLogger(LifecycleManagerImpl.class.getName()); + private final Clock clock; private final DatabaseComponent db; private final Collection<Service> services; private final Collection<ExecutorService> executors; @@ -30,7 +32,8 @@ class LifecycleManagerImpl implements LifecycleManager { private final CountDownLatch shutdownLatch = new CountDownLatch(1); @Inject - LifecycleManagerImpl(DatabaseComponent db) { + LifecycleManagerImpl(Clock clock, DatabaseComponent db) { + this.clock = clock; this.db = db; services = new CopyOnWriteArrayList<Service>(); executors = new CopyOnWriteArrayList<ExecutorService>(); @@ -51,20 +54,30 @@ class LifecycleManagerImpl implements LifecycleManager { public boolean startServices() { try { if(LOG.isLoggable(INFO)) LOG.info("Starting"); + long start = clock.currentTimeMillis(); boolean reopened = db.open(); + long duration = clock.currentTimeMillis() - start; if(LOG.isLoggable(INFO)) { - if(reopened) LOG.info("Database reopened"); - else LOG.info("Database created"); + if(reopened) + LOG.info("Reopening database took " + duration + " ms"); + else LOG.info("Creating database took " + duration + " ms"); } dbLatch.countDown(); for(Service s : services) { + start = clock.currentTimeMillis(); boolean started = s.start(); + duration = clock.currentTimeMillis() - start; + if(!started) { + if(LOG.isLoggable(WARNING)) { + String name = s.getClass().getName(); + LOG.warning(name + " did not start"); + } + return false; + } if(LOG.isLoggable(INFO)) { String name = s.getClass().getName(); - if(started) LOG.info("Service started: " + name); - else LOG.info("Service failed to start: " + name); + LOG.info("Starting " + name + " took " + duration + " ms"); } - if(!started) return false; } startupLatch.countDown(); return true; diff --git a/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java b/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java index b0375dad7e49c5a2da457cfcade8d2188684d30b..b78aba1bb29c8f56633c954892651bb6c5ae8e2a 100644 --- a/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java +++ b/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java @@ -37,6 +37,7 @@ import org.briarproject.api.plugins.simplex.SimplexPluginConfig; import org.briarproject.api.plugins.simplex.SimplexPluginFactory; import org.briarproject.api.plugins.simplex.SimplexTransportReader; import org.briarproject.api.plugins.simplex.SimplexTransportWriter; +import org.briarproject.api.system.Clock; import org.briarproject.api.transport.ConnectionDispatcher; import org.briarproject.api.ui.UiCallback; @@ -50,6 +51,7 @@ class PluginManagerImpl implements PluginManager { private final Executor pluginExecutor; private final SimplexPluginConfig simplexPluginConfig; private final DuplexPluginConfig duplexPluginConfig; + private final Clock clock; private final DatabaseComponent db; private final Poller poller; private final ConnectionDispatcher dispatcher; @@ -60,12 +62,13 @@ class PluginManagerImpl implements PluginManager { @Inject PluginManagerImpl(@PluginExecutor Executor pluginExecutor, SimplexPluginConfig simplexPluginConfig, - DuplexPluginConfig duplexPluginConfig, DatabaseComponent db, - Poller poller, ConnectionDispatcher dispatcher, - UiCallback uiCallback) { + DuplexPluginConfig duplexPluginConfig, Clock clock, + DatabaseComponent db, Poller poller, + ConnectionDispatcher dispatcher, UiCallback uiCallback) { this.pluginExecutor = pluginExecutor; this.simplexPluginConfig = simplexPluginConfig; this.duplexPluginConfig = duplexPluginConfig; + this.clock = clock; this.db = db; this.poller = poller; this.dispatcher = dispatcher; @@ -167,19 +170,31 @@ class PluginManagerImpl implements PluginManager { return; } try { + long start = clock.currentTimeMillis(); db.addTransport(id, plugin.getMaxLatency()); + long duration = clock.currentTimeMillis() - start; + if(LOG.isLoggable(INFO)) + LOG.info("Adding transport took " + duration + " ms"); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); return; } try { - if(plugin.start()) { + long start = clock.currentTimeMillis(); + boolean started = plugin.start(); + long duration = clock.currentTimeMillis() - start; + if(started) { simplexPlugins.add(plugin); - } else { if(LOG.isLoggable(INFO)) { String name = plugin.getClass().getSimpleName(); - LOG.info(name + " did not start"); + LOG.info("Starting " + name + " took " + + duration + " ms"); + } + } else { + if(LOG.isLoggable(WARNING)) { + String name = plugin.getClass().getSimpleName(); + LOG.warning(name + " did not start"); } } } catch(IOException e) { @@ -216,19 +231,31 @@ class PluginManagerImpl implements PluginManager { return; } try { + long start = clock.currentTimeMillis(); db.addTransport(id, plugin.getMaxLatency()); + long duration = clock.currentTimeMillis() - start; + if(LOG.isLoggable(INFO)) + LOG.info("Adding transport took " + duration + " ms"); } catch(DbException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); return; } try { - if(plugin.start()) { + long start = clock.currentTimeMillis(); + boolean started = plugin.start(); + long duration = clock.currentTimeMillis() - start; + if(started) { duplexPlugins.add(plugin); - } else { if(LOG.isLoggable(INFO)) { String name = plugin.getClass().getSimpleName(); - LOG.info(name + " did not start"); + LOG.info("Starting " + name + " took " + + duration + " ms"); + } + } else { + if(LOG.isLoggable(WARNING)) { + String name = plugin.getClass().getSimpleName(); + LOG.warning(name + " did not start"); } } } catch(IOException e) { @@ -253,7 +280,13 @@ class PluginManagerImpl implements PluginManager { public void run() { try { + long start = clock.currentTimeMillis(); plugin.stop(); + long duration = clock.currentTimeMillis() - start; + if(LOG.isLoggable(INFO)) { + String name = plugin.getClass().getSimpleName(); + LOG.info("Stopping " + name + " took " + duration + " ms"); + } } catch(IOException e) { if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); } finally { diff --git a/briar-tests/src/org/briarproject/plugins/PluginManagerImplTest.java b/briar-tests/src/org/briarproject/plugins/PluginManagerImplTest.java index 92a5407ed34a48e245d1d368bdb2ab64e1ddd2a8..78ddfb5e8477f094b194a8ea6715d3241371162f 100644 --- a/briar-tests/src/org/briarproject/plugins/PluginManagerImplTest.java +++ b/briar-tests/src/org/briarproject/plugins/PluginManagerImplTest.java @@ -16,9 +16,10 @@ import org.briarproject.api.plugins.simplex.SimplexPlugin; import org.briarproject.api.plugins.simplex.SimplexPluginCallback; import org.briarproject.api.plugins.simplex.SimplexPluginConfig; import org.briarproject.api.plugins.simplex.SimplexPluginFactory; +import org.briarproject.api.system.Clock; +import org.briarproject.api.system.SystemClock; import org.briarproject.api.transport.ConnectionDispatcher; import org.briarproject.api.ui.UiCallback; - import org.jmock.Expectations; import org.jmock.Mockery; import org.junit.Test; @@ -27,6 +28,7 @@ public class PluginManagerImplTest extends BriarTestCase { @Test public void testStartAndStop() throws Exception { + Clock clock = new SystemClock(); Mockery context = new Mockery(); final Executor pluginExecutor = Executors.newCachedThreadPool(); final SimplexPluginConfig simplexPluginConfig = @@ -118,7 +120,7 @@ public class PluginManagerImplTest extends BriarTestCase { oneOf(duplexPlugin).stop(); }}); PluginManagerImpl p = new PluginManagerImpl(pluginExecutor, - simplexPluginConfig, duplexPluginConfig, db, poller, + simplexPluginConfig, duplexPluginConfig, clock, db, poller, dispatcher, uiCallback); // Two plugins should be started and stopped assertTrue(p.start());