From f7b74e49637bbcaf5f4914186b4829905451ff51 Mon Sep 17 00:00:00 2001 From: Hocuri Date: Wed, 11 Aug 2021 14:01:15 +0200 Subject: [PATCH] Add simple benchmark & a test framework (#2022) See #2019, #2020 and #2021 for failed attempts at using a benchmark framework. So, for now I'll just go with timing the results manually. For trying this out: - Backup your current account first, maybe there are some bugs in switching accounts. - You can run benchmarks on either an emulated device or a real device. For better benchmark results, you should run the benchmark on a real device and make sure that the core is compiled in release mode. - Disable animations on your device, otherwise the test may fail. (Developer options -> Window animation scale, Transition animation scale & Animatior duration scale -> set all three of them to 0x) - In Android Studio: File -> Sync project with gradle files - In Android Studio: Run -> Edit configurations -> `+` -> Android Instrumented test -> Either select a specific class or select "All in Module" -> OK -> Select your configuration in the toolbar -> Click on the green "run" button in the toolbar to run the tests When the benchmark is done, you will get a result like `MEASURED RESULTS (Benchmark) - Going thorough all 10 chats: 11635,11207,11363,11352,11279,11183,11137,11145,11032,11057`, Paste `11635,11207,11363,11352,11279,11183,11137,11145,11032,11057` into a cell in a LibreOffice spreadsheet, do `Data -> Text to columns`, choose `,` as a separator, hit `OK`, and create a diagram. --- README.md | 26 ++++ .../b44t/messenger/EnterChatsBenchmark.java | 144 ++++++++++++++++++ build.gradle | 13 +- gradle.properties | 2 +- .../PassphraseRequiredActionBarActivity.java | 3 +- .../securesms/connect/AccountManager.java | 6 +- .../thoughtcrime/securesms/util/Prefs.java | 6 +- .../thoughtcrime/securesms/util/ViewUtil.java | 8 + 8 files changed, 198 insertions(+), 10 deletions(-) create mode 100644 androidTest/com/b44t/messenger/EnterChatsBenchmark.java diff --git a/README.md b/README.md index cdab96bf7..0ecd760d2 100644 --- a/README.md +++ b/README.md @@ -155,6 +155,32 @@ environment. `export PATH=$PATH:$ANDROID_NDK`. +# Run UI Tests and Benchmarks + +- You don't necessarily need a dedicated testing device. + Backup your current account first, maybe there are some bugs in switching accounts. + +- You can run benchmarks on either an emulated device or a real device. + You need at least Android 9. For better benchmark results, + you should run the benchmark on a real device and make sure that the core is compiled in release mode. + +- Disable animations on your device, otherwise the test may fail: + at "Developer options" + set all of "Window animation scale", "Transition animation scale" and "Animatior duration scale" to 0x + +- In Android Studio: "File" / "Sync project with gradle files" + +- In Android Studio: "Run" / "Edit configurations" / "+" / "Android Instrumented test": + Either select a specific class or select "All in Module" / "OK" / + Select your configuration in the toolbar / Click on the green "run" button in the toolbar to run the tests + +When the benchmark is done, you will get a result like +`MEASURED RESULTS (Benchmark) - Going thorough all 10 chats: 11635,11207,11363,11352,11279,11183,11137,11145,11032,11057`. +You can paste `11635,11207,11363,11352,11279,11183,11137,11145,11032,11057` +into a cell in a LibreOffice spreadsheet, do "Data" / "Text to columns", +choose `,` as a separator, hit "OK", and create a diagram. + + # Credits The user interface classes are based on the Signal messenger. diff --git a/androidTest/com/b44t/messenger/EnterChatsBenchmark.java b/androidTest/com/b44t/messenger/EnterChatsBenchmark.java new file mode 100644 index 000000000..2b9ef833e --- /dev/null +++ b/androidTest/com/b44t/messenger/EnterChatsBenchmark.java @@ -0,0 +1,144 @@ +package com.b44t.messenger; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +import androidx.test.espresso.contrib.RecyclerViewActions; +import androidx.test.ext.junit.rules.ActivityScenarioRule; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.LargeTest; + +import org.junit.After; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.thoughtcrime.securesms.ConversationListActivity; +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.connect.AccountManager; +import org.thoughtcrime.securesms.connect.DcHelper; +import org.thoughtcrime.securesms.util.Prefs; + +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.Espresso.pressBack; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.action.ViewActions.replaceText; +import static androidx.test.espresso.action.ViewActions.typeText; +import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription; +import static androidx.test.espresso.matcher.ViewMatchers.withHint; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static androidx.test.espresso.matcher.ViewMatchers.withText; +import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; + + +@RunWith(AndroidJUnit4.class) +@LargeTest +public class EnterChatsBenchmark { + + // ============================================================================================== + // Set this to true if you already have at least 10 chats on your existing DeltaChat installation + // and want to traverse through them instead of 10 newly created chats + private final static boolean USE_EXISTING_CHATS = false; + // ============================================================================================== + private final static int GO_THROUGH_ALL_CHATS_N_TIMES = 8; + + // ============================================================================================== + // PLEASE BACKUP YOUR ACCOUNT BEFORE RUNNING THIS! + // ============================================================================================== + + private final static String TAG = EnterChatsBenchmark.class.getSimpleName(); + + @Rule + public ActivityScenarioRule activityRule = new ActivityScenarioRule<>(getConversationsListIntent()); + + private Intent getConversationsListIntent() { + Intent intent = + Intent.makeMainActivity( + new ComponentName(getInstrumentation().getTargetContext(), ConversationListActivity.class)); + if (!USE_EXISTING_CHATS) { + Context context = getInstrumentation().getTargetContext(); + AccountManager.getInstance().beginAccountCreation(context); + DcContext c = DcHelper.getContext(context); + c.setConfig("configured_addr", "alice@example.org"); + c.setConfig("configured_mail_pw", "abcd"); + c.setConfig("configured", "1"); + } + return intent; + } + + @Test + public void createAndEnterNChats() { + Prefs.setEnterSendsEnabled(getInstrumentation().getTargetContext(), true); + + if (!USE_EXISTING_CHATS) { + createChatAndGoBack("Group #1", "Hello!", "Some links: https://testrun.org", "And a command: /help"); + createChatAndGoBack("Group #2", "example.org, alice@example.org", "aaaaaaa", "bbbbbb"); + createChatAndGoBack("Group #3", repeat("Some string ", 600), repeat("Another string", 200), "Hi!!!"); + createChatAndGoBack("Group #4", "xyzabc", "Hi!!!!", "Let's meet!"); + createChatAndGoBack("Group #5", repeat("aaaa", 40), "bbbbbbbbbbbbbbbbbb", "ccccccccccccccc"); + createChatAndGoBack("Group #6", "aaaaaaaaaaa", repeat("Hi! ", 1000), "bbbbbbbbbb"); + createChatAndGoBack("Group #7", repeat("abcdefg ", 500), repeat("xxxxx", 100), "yrrrrrrrrrrrrr"); + createChatAndGoBack("Group #8", "and a number: 037362/384756", "ccccc", "Nice!"); + createChatAndGoBack("Group #9", "ddddddddddddddddd", "zuuuuuuuuuuuuuuuu", "ccccc"); + createChatAndGoBack("Group #10", repeat("xxxxxxyyyyy", 100), repeat("String!!", 10), "abcd"); + } + + String[] times = new String[GO_THROUGH_ALL_CHATS_N_TIMES]; + for (int i = 0; i