Merge branch 'test_data_config' into 'master'

Make test data creation configurable.

Closes #1149

See merge request akwizgran/briar!771
This commit is contained in:
akwizgran
2018-04-24 16:35:15 +00:00
8 changed files with 335 additions and 46 deletions

View File

@@ -352,6 +352,16 @@
/> />
</activity> </activity>
<activity
android:name="org.briarproject.briar.android.test.TestDataActivity"
android:label="Create test data"
android:parentActivityName="org.briarproject.briar.android.settings.SettingsActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.briarproject.briar.android.settings.SettingsActivity"
/>
</activity>
<activity <activity
android:name="org.briarproject.briar.android.panic.PanicPreferencesActivity" android:name="org.briarproject.briar.android.panic.PanicPreferencesActivity"
android:label="@string/panic_setting" android:label="@string/panic_setting"

View File

@@ -70,6 +70,7 @@ import org.briarproject.briar.android.sharing.ShareForumFragment;
import org.briarproject.briar.android.sharing.ShareForumMessageFragment; import org.briarproject.briar.android.sharing.ShareForumMessageFragment;
import org.briarproject.briar.android.sharing.SharingModule; import org.briarproject.briar.android.sharing.SharingModule;
import org.briarproject.briar.android.splash.SplashScreenActivity; import org.briarproject.briar.android.splash.SplashScreenActivity;
import org.briarproject.briar.android.test.TestDataActivity;
import dagger.Component; import dagger.Component;
@@ -147,6 +148,8 @@ public interface ActivityComponent {
void inject(SettingsActivity activity); void inject(SettingsActivity activity);
void inject(TestDataActivity activity);
void inject(ChangePasswordActivity activity); void inject(ChangePasswordActivity activity);
void inject(IntroductionActivity activity); void inject(IntroductionActivity activity);

View File

@@ -30,7 +30,6 @@ import org.briarproject.bramble.api.system.AndroidExecutor;
import org.briarproject.bramble.util.StringUtils; import org.briarproject.bramble.util.StringUtils;
import org.briarproject.briar.R; import org.briarproject.briar.R;
import org.briarproject.briar.android.util.UserFeedback; import org.briarproject.briar.android.util.UserFeedback;
import org.briarproject.briar.api.test.TestDataCreator;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -105,8 +104,6 @@ public class SettingsFragment extends PreferenceFragmentCompat
@Inject @Inject
AndroidExecutor androidExecutor; AndroidExecutor androidExecutor;
@Inject
TestDataCreator testDataCreator;
@Override @Override
public void onAttach(Context context) { public void onAttach(Context context) {
@@ -153,14 +150,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
}); });
Preference testData = findPreference("pref_key_test_data"); Preference testData = findPreference("pref_key_test_data");
if (IS_DEBUG_BUILD) { if (!IS_DEBUG_BUILD) {
testData.setOnPreferenceClickListener(preference -> {
LOG.info("Creating test data");
testDataCreator.createTestData();
getActivity().finish();
return true;
});
} else {
testData.setVisible(false); testData.setVisible(false);
} }

View File

@@ -0,0 +1,100 @@
package org.briarproject.briar.android.test;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.view.MenuItem;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import org.briarproject.briar.R;
import org.briarproject.briar.android.activity.ActivityComponent;
import org.briarproject.briar.android.activity.BriarActivity;
import org.briarproject.briar.android.navdrawer.NavDrawerActivity;
import org.briarproject.briar.api.test.TestDataCreator;
import javax.inject.Inject;
public class TestDataActivity extends BriarActivity {
@Inject
TestDataCreator testDataCreator;
private TextView[] textViews = new TextView[5];
private SeekBar[] seekBars = new SeekBar[5];
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
}
setContentView(R.layout.activity_test_data);
textViews[0] = findViewById(R.id.textViewContactsSb);
textViews[1] = findViewById(R.id.textViewMessagesSb);
textViews[2] = findViewById(R.id.TextViewBlogPostsSb);
textViews[3] = findViewById(R.id.TextViewForumsSb);
textViews[4] = findViewById(R.id.TextViewForumMessagesSb);
seekBars[0] = findViewById(R.id.seekBarContacts);
seekBars[1] = findViewById(R.id.seekBarMessages);
seekBars[2] = findViewById(R.id.seekBarBlogPosts);
seekBars[3] = findViewById(R.id.seekBarForums);
seekBars[4] = findViewById(R.id.seekBarForumMessages);
for (int i = 0; i < 5; i++) {
final TextView textView = textViews[i];
seekBars[i].setOnSeekBarChangeListener(
new OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar,
int progress,
boolean fromUser) {
textView.setText("" + progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
findViewById(R.id.buttonCreateTestData).setOnClickListener(
v -> {
createTestData();
});
}
private void createTestData() {
testDataCreator.createTestData(seekBars[0].getProgress(),
seekBars[1].getProgress(), seekBars[2].getProgress(),
seekBars[3].getProgress(), seekBars[4].getProgress());
Intent intent = new Intent(this, NavDrawerActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
}
@Override
public void injectActivity(ActivityComponent component) {
component.inject(this);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
}
return false;
}
}

View File

@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:padding="8dp">
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textViewContacts"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Number of contacts"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<SeekBar
android:id="@+id/seekBarContacts"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:max="50"
android:progress="20"
app:layout_constraintEnd_toStartOf="@+id/textViewContactsSb"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textViewContacts"/>
<TextView
android:id="@+id/textViewContactsSb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="2"
android:text="20"
app:layout_constraintBottom_toBottomOf="@+id/seekBarContacts"
app:layout_constraintEnd_toEndOf="parent"/>
<TextView
android:id="@+id/textViewMessages"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Number of messages per contact"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/seekBarContacts"/>
<SeekBar
android:id="@+id/seekBarMessages"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:max="50"
android:paddingTop="5dp"
android:progress="15"
app:layout_constraintEnd_toStartOf="@+id/textViewMessagesSb"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textViewMessages"/>
<TextView
android:id="@+id/textViewMessagesSb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="2"
android:text="20"
app:layout_constraintBottom_toBottomOf="@+id/seekBarMessages"
app:layout_constraintEnd_toEndOf="parent"/>
<TextView
android:id="@+id/textViewBlogPosts"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Number of blog posts"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/seekBarMessages"/>
<SeekBar
android:id="@+id/seekBarBlogPosts"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:max="50"
android:paddingTop="5dp"
android:progress="30"
app:layout_constraintEnd_toStartOf="@+id/TextViewBlogPostsSb"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textViewBlogPosts"/>
<TextView
android:id="@+id/TextViewBlogPostsSb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="2"
android:text="20"
app:layout_constraintBottom_toBottomOf="@+id/seekBarBlogPosts"
app:layout_constraintEnd_toEndOf="parent"/>
<TextView
android:id="@+id/textViewForums"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Number of forums"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/seekBarBlogPosts"/>
<SeekBar
android:id="@+id/seekBarForums"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:max="10"
android:paddingTop="5dp"
android:progress="3"
app:layout_constraintEnd_toStartOf="@+id/TextViewForumsSb"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textViewForums"/>
<TextView
android:id="@+id/TextViewForumsSb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="2"
android:text="20"
app:layout_constraintBottom_toBottomOf="@+id/seekBarForums"
app:layout_constraintEnd_toEndOf="parent"/>
<TextView
android:id="@+id/textViewForumMessages"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Number of forum messages"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/seekBarForums"/>
<SeekBar
android:id="@+id/seekBarForumMessages"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:max="50"
android:paddingTop="5dp"
android:progress="30"
app:layout_constraintEnd_toStartOf="@+id/TextViewForumMessagesSb"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textViewForumMessages"/>
<TextView
android:id="@+id/TextViewForumMessagesSb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="2"
android:text="20"
app:layout_constraintBottom_toBottomOf="@+id/seekBarForumMessages"
app:layout_constraintEnd_toEndOf="parent"/>
<Button
android:id="@+id/buttonCreateTestData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="Create test data"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/seekBarForumMessages"/>
</android.support.constraint.ConstraintLayout>
</ScrollView>
</android.support.constraint.ConstraintLayout>

View File

@@ -124,6 +124,11 @@
<Preference <Preference
android:key="pref_key_test_data" android:key="pref_key_test_data"
android:title="Create Test Data"/> android:title="Create Test Data">
</PreferenceScreen> <intent
android:targetClass="org.briarproject.briar.android.test.TestDataActivity"
android:targetPackage="@string/app_package"/>
</Preference>
</PreferenceScreen>

View File

@@ -5,7 +5,17 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
@NotNullByDefault @NotNullByDefault
public interface TestDataCreator { public interface TestDataCreator {
/* Creates fake test data on the DatabaseExecutor */ /**
void createTestData(); * Create fake test data on the DatabaseExecutor
*
* @param numContacts Number of contacts to create.
* @param numPrivateMsgs Number of private messages to create for each
* contact.
* @param numBlogPosts Number of blog posts to create.
* @param numForums Number of forums to create.
* @param numForumPosts Number of forum posts to create per forum.
*/
void createTestData(int numContacts, int numPrivateMsgs, int numBlogPosts,
int numForums, int numForumPosts);
} }

View File

@@ -61,12 +61,6 @@ import static org.briarproject.briar.test.TestData.GROUP_NAMES;
public class TestDataCreatorImpl implements TestDataCreator { public class TestDataCreatorImpl implements TestDataCreator {
private final static int NUM_CONTACTS = 20;
private final static int NUM_PRIVATE_MSGS = 15;
private final static int NUM_BLOG_POSTS = 30;
private final static int NUM_FORUMS = 3;
private final static int NUM_FORUM_POSTS = 30;
private final Logger LOG = private final Logger LOG =
Logger.getLogger(TestDataCreatorImpl.class.getName()); Logger.getLogger(TestDataCreatorImpl.class.getName());
@@ -119,10 +113,12 @@ public class TestDataCreatorImpl implements TestDataCreator {
this.ioExecutor = ioExecutor; this.ioExecutor = ioExecutor;
} }
public void createTestData() { public void createTestData(int numContacts, int numPrivateMsgs,
int numBlogPosts, int numForums, int numForumPosts) {
ioExecutor.execute(() -> { ioExecutor.execute(() -> {
try { try {
createTestDataOnDbExecutor(); createTestDataOnDbExecutor(numContacts, numPrivateMsgs,
numBlogPosts, numForums, numForumPosts);
} catch (DbException e) { } catch (DbException e) {
if (LOG.isLoggable(WARNING)) if (LOG.isLoggable(WARNING))
LOG.log(WARNING, "Creating test data failed", e); LOG.log(WARNING, "Creating test data failed", e);
@@ -131,21 +127,23 @@ public class TestDataCreatorImpl implements TestDataCreator {
} }
@IoExecutor @IoExecutor
private void createTestDataOnDbExecutor() throws DbException { private void createTestDataOnDbExecutor(int numContacts, int numPrivateMsgs,
List<Contact> contacts = createContacts(); int numBlogPosts, int numForums, int numForumPosts)
createPrivateMessages(contacts); throws DbException {
createBlogPosts(contacts); List<Contact> contacts = createContacts(numContacts);
List<Forum> forums = createForums(contacts); createPrivateMessages(contacts, numPrivateMsgs);
createBlogPosts(contacts, numBlogPosts);
List<Forum> forums = createForums(contacts, numForums, numForumPosts);
for (Forum forum : forums) { for (Forum forum : forums) {
createRandomForumPosts(forum, contacts); createRandomForumPosts(forum, contacts, numForumPosts);
} }
} }
private List<Contact> createContacts() throws DbException { private List<Contact> createContacts(int numContacts) throws DbException {
List<Contact> contacts = new ArrayList<>(NUM_CONTACTS); List<Contact> contacts = new ArrayList<>(numContacts);
LocalAuthor localAuthor = identityManager.getLocalAuthor(); LocalAuthor localAuthor = identityManager.getLocalAuthor();
for (int i = 0; i < NUM_CONTACTS; i++) { for (int i = 0; i < numContacts; i++) {
Contact contact = addRandomContact(localAuthor); Contact contact = addRandomContact(localAuthor);
contacts.add(contact); contacts.add(contact);
} }
@@ -210,7 +208,7 @@ public class TestDataCreatorImpl implements TestDataCreator {
String btAddress = getRandomBluetoothAddress(); String btAddress = getRandomBluetoothAddress();
String uuid = getRandomUUID(); String uuid = getRandomUUID();
bt.put(BluetoothConstants.PROP_ADDRESS, btAddress); bt.put(BluetoothConstants.PROP_ADDRESS, btAddress);
bt.put(BluetoothConstants.PROP_UUID,uuid); bt.put(BluetoothConstants.PROP_UUID, uuid);
props.put(BluetoothConstants.ID, bt); props.put(BluetoothConstants.ID, bt);
// LAN // LAN
@@ -271,11 +269,12 @@ public class TestDataCreatorImpl implements TestDataCreator {
return sb.toString(); return sb.toString();
} }
private void createPrivateMessages(List<Contact> contacts) private void createPrivateMessages(List<Contact> contacts,
int numPrivateMsgs)
throws DbException { throws DbException {
for (Contact contact : contacts) { for (Contact contact : contacts) {
Group group = messagingManager.getContactGroup(contact); Group group = messagingManager.getContactGroup(contact);
for (int i = 0; i < NUM_PRIVATE_MSGS; i++) { for (int i = 0; i < numPrivateMsgs; i++) {
try { try {
createPrivateMessage(group.getId(), i); createPrivateMessage(group.getId(), i);
} catch (FormatException e) { } catch (FormatException e) {
@@ -284,7 +283,7 @@ public class TestDataCreatorImpl implements TestDataCreator {
} }
} }
if (LOG.isLoggable(INFO)) { if (LOG.isLoggable(INFO)) {
LOG.info("Created " + NUM_PRIVATE_MSGS + LOG.info("Created " + numPrivateMsgs +
" private messages per contact."); " private messages per contact.");
} }
} }
@@ -313,15 +312,15 @@ public class TestDataCreatorImpl implements TestDataCreator {
} }
} }
private void createBlogPosts(List<Contact> contacts) private void createBlogPosts(List<Contact> contacts, int numBlogPosts)
throws DbException { throws DbException {
for (int i = 0; i < NUM_BLOG_POSTS; i++) { for (int i = 0; i < numBlogPosts; i++) {
Contact contact = contacts.get(random.nextInt(contacts.size())); Contact contact = contacts.get(random.nextInt(contacts.size()));
LocalAuthor author = localAuthors.get(contact); LocalAuthor author = localAuthors.get(contact);
addBlogPost(author, i); addBlogPost(author, i);
} }
if (LOG.isLoggable(INFO)) { if (LOG.isLoggable(INFO)) {
LOG.info("Created " + NUM_BLOG_POSTS + " blog posts."); LOG.info("Created " + numBlogPosts + " blog posts.");
} }
} }
@@ -339,10 +338,11 @@ public class TestDataCreatorImpl implements TestDataCreator {
} }
} }
private List<Forum> createForums(List<Contact> contacts) private List<Forum> createForums(List<Contact> contacts, int numForums,
int numForumPosts)
throws DbException { throws DbException {
List<Forum> forums = new ArrayList<>(NUM_FORUMS); List<Forum> forums = new ArrayList<>(numForums);
for (int i = 0; i < NUM_FORUMS; i++) { for (int i = 0; i < numForums; i++) {
// create forum // create forum
String name = GROUP_NAMES[random.nextInt(GROUP_NAMES.length)]; String name = GROUP_NAMES[random.nextInt(GROUP_NAMES.length)];
Forum forum = forumManager.addForum(name); Forum forum = forumManager.addForum(name);
@@ -361,16 +361,17 @@ public class TestDataCreatorImpl implements TestDataCreator {
forums.add(forum); forums.add(forum);
} }
if (LOG.isLoggable(INFO)) { if (LOG.isLoggable(INFO)) {
LOG.info("Created " + NUM_FORUMS + " forums with " + LOG.info("Created " + numForums + " forums with " +
NUM_FORUM_POSTS + " posts each."); numForumPosts + " posts each.");
} }
return forums; return forums;
} }
private void createRandomForumPosts(Forum forum, List<Contact> contacts) private void createRandomForumPosts(Forum forum, List<Contact> contacts,
int numForumPosts)
throws DbException { throws DbException {
List<ForumPost> posts = new ArrayList<>(); List<ForumPost> posts = new ArrayList<>();
for (int i = 0; i < NUM_FORUM_POSTS; i++) { for (int i = 0; i < numForumPosts; i++) {
Contact contact = contacts.get(random.nextInt(contacts.size())); Contact contact = contacts.get(random.nextInt(contacts.size()));
LocalAuthor author = localAuthors.get(contact); LocalAuthor author = localAuthors.get(contact);
long timestamp = clock.currentTimeMillis() - i * 60 * 1000; long timestamp = clock.currentTimeMillis() - i * 60 * 1000;