diff options
| author | cyBerta <cyberta@riseup.net> | 2023-11-21 15:05:38 +0100 | 
|---|---|---|
| committer | cyBerta <cyberta@riseup.net> | 2023-11-23 09:51:28 +0100 | 
| commit | 85e5ed816451b6e78574a40980f6b30876836e4d (patch) | |
| tree | cf671b43510792e64c7e666b41e4ab83d2cd4c90 /app/src/androidTest/java | |
| parent | 41dee27f6d6b2240097a3f8b5112e1a8fb8fde03 (diff) | |
fixing Screenshot tests for Bitmask, provider setup screenshot tests are also fixed for custom flavored builds.
Diffstat (limited to 'app/src/androidTest/java')
3 files changed, 185 insertions, 167 deletions
| diff --git a/app/src/androidTest/java/se/leap/bitmaskclient/ProviderSetupTest.java b/app/src/androidTest/java/se/leap/bitmaskclient/ProviderSetupTest.java new file mode 100644 index 00000000..a878951a --- /dev/null +++ b/app/src/androidTest/java/se/leap/bitmaskclient/ProviderSetupTest.java @@ -0,0 +1,92 @@ +package se.leap.bitmaskclient; + + +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.action.ViewActions.replaceText; +import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static androidx.test.espresso.matcher.ViewMatchers.withTagValue; +import static androidx.test.espresso.matcher.ViewMatchers.withText; +import static utils.CustomInteractions.tryResolve; + +import android.app.Instrumentation; +import android.content.Context; + +import androidx.test.espresso.ViewInteraction; +import androidx.test.ext.junit.rules.ActivityScenarioRule; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.LargeTest; +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.uiautomator.UiDevice; +import androidx.test.uiautomator.UiObjectNotFoundException; + +import org.hamcrest.Matchers; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runner.manipulation.Ordering; + +import se.leap.bitmaskclient.base.fragments.MainActivityErrorDialog; +import se.leap.bitmaskclient.base.utils.PreferenceHelper; +import se.leap.bitmaskclient.providersetup.activities.SetupActivity; +import tools.fastlane.screengrab.Screengrab; +import tools.fastlane.screengrab.UiAutomatorScreenshotStrategy; +import tools.fastlane.screengrab.locale.LocaleTestRule; +import utils.ProviderSetupUtils; + +@LargeTest +@RunWith(AndroidJUnit4.class) +public class ProviderSetupTest { + +    @ClassRule +    public static final LocaleTestRule localeTestRule = new LocaleTestRule(); + +    @Rule +    public ActivityScenarioRule<SetupActivity> mActivityScenarioRule = +            new ActivityScenarioRule<>(SetupActivity.class); + +    UiDevice device; + +    @Before +    public void setup() { +        Screengrab.setDefaultScreenshotStrategy(new UiAutomatorScreenshotStrategy()); +        //PreferenceHelper.clear(); +        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); +        device = UiDevice.getInstance(instrumentation); +    } + +    @Test +    public void test01_setupProviderDefault() { +        ProviderSetupUtils.runProviderSetup(device, true, false, InstrumentationRegistry.getInstrumentation().getTargetContext()); +    } + +    @Test +    public void test01_setupProviderCircumvention() { +        ProviderSetupUtils.runProviderSetup(device, true, true, InstrumentationRegistry.getInstrumentation().getTargetContext()); +    } + +    @Test +    public void testaddManuallyNewProviderScreenshot() { +        if (!"normal".equals(BuildConfig.FLAVOR_branding)) { +            System.out.println("skipping custom provider url test"); +            return; +        } +        ViewInteraction radioButtonSelection = tryResolve(onView(withText(R.string.add_provider)), matches(isDisplayed())); +        radioButtonSelection.perform(click()); + +        onView(withId(R.id.edit_customProvider)).perform(replaceText("https://leapvpn.myserver.org")); +        Screengrab.screenshot("setup_custom_provider"); +        onView(withId(R.id.setup_next_button)).perform(click()); +        onView(withId(R.id.setup_next_button)).perform(click()); +        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); +        tryResolve( +                onView(withText(context.getString(R.string.malformed_url, context.getString(R.string.app_name)))), +                matches(isDisplayed()), +                20); +        Screengrab.screenshot("setup_provider_error_dialog"); +    } +} diff --git a/app/src/androidTest/java/se/leap/bitmaskclient/base/ProviderBaseTest.java b/app/src/androidTest/java/se/leap/bitmaskclient/base/ProviderBaseTest.java deleted file mode 100644 index 68676bee..00000000 --- a/app/src/androidTest/java/se/leap/bitmaskclient/base/ProviderBaseTest.java +++ /dev/null @@ -1,167 +0,0 @@ -package se.leap.bitmaskclient.base; - -import static androidx.test.core.app.ApplicationProvider.getApplicationContext; -import static androidx.test.espresso.Espresso.onData; -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.assertion.ViewAssertions.matches; -import static androidx.test.espresso.contrib.DrawerMatchers.isClosed; -import static androidx.test.espresso.matcher.RootMatchers.isDialog; -import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withTagValue; -import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.Matchers.allOf; -import static org.hamcrest.Matchers.anything; -import static org.hamcrest.Matchers.is; -import static utils.CustomInteractions.tryResolve; - -import android.app.Instrumentation; -import android.content.SharedPreferences; -import android.net.VpnService; -import android.view.Gravity; - -import androidx.test.espresso.ViewInteraction; -import androidx.test.espresso.contrib.DrawerActions; -import androidx.test.ext.junit.rules.ActivityScenarioRule; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.filters.LargeTest; -import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.uiautomator.UiDevice; -import androidx.test.uiautomator.UiObject; -import androidx.test.uiautomator.UiObjectNotFoundException; -import androidx.test.uiautomator.UiSelector; - -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.FixMethodOrder; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; - -import se.leap.bitmaskclient.R; -import se.leap.bitmaskclient.base.utils.PreferenceHelper; -import tools.fastlane.screengrab.Screengrab; -import tools.fastlane.screengrab.UiAutomatorScreenshotStrategy; -import tools.fastlane.screengrab.locale.LocaleTestRule; - -@LargeTest -@RunWith(AndroidJUnit4.class) -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public abstract class ProviderBaseTest { - -    @ClassRule -    public static final LocaleTestRule localeTestRule = new LocaleTestRule(); - -    @Rule -    public ActivityScenarioRule<StartActivity> mActivityScenarioRule = -            new ActivityScenarioRule<>(StartActivity.class); - -    UiDevice device; -    @Before -    public void setup() { -        Screengrab.setDefaultScreenshotStrategy(new UiAutomatorScreenshotStrategy()); -        SharedPreferences preferences = PreferenceHelper.getSharedPreferences(getApplicationContext()); -        preferences.edit().clear().commit(); -        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); -        device = UiDevice.getInstance(instrumentation); -    } - -    @Test -    public void test01_vpnStartTest() throws InterruptedException, UiObjectNotFoundException { -        boolean configurationNeeded = configureProviderIfNeeded(); - -        ViewInteraction mainButtonStop; -        if (!configurationNeeded) { -            // click on Main on/off button and start VPN -            ViewInteraction mainButton = tryResolve( -                    onView(withId(R.id.main_button)), -                    matches(isDisplayed()) -            ); - -            mainButton.perform(click()); -            Thread.sleep(50); -            Screengrab.screenshot("VPN_connecting"); - -            mainButtonStop = tryResolve( -                    onView(allOf( -                            withId(R.id.button), -                            withTagValue(is("button_circle_stop")))), -                    matches(isDisplayed()), -                    20); -            Screengrab.screenshot("VPN_connected"); -        } else { -            // handle VPN permission dialog -            if (VpnService.prepare(getApplicationContext()) != null) { -                UiObject okButton = device.findObject(new UiSelector().packageName("com.android.vpndialogs").resourceId("android:id/button1")); -                okButton.click(); -            } -            // on new configurations the VPN is automatically started -            Screengrab.screenshot("VPN_connecting"); -            mainButtonStop = tryResolve( -                    onView(allOf( -                            withId(R.id.button), -                            withTagValue(is("button_circle_stop")))), -                    matches(isDisplayed()), -                    20); -            Screengrab.screenshot("VPN_connected"); -        } - -        mainButtonStop.perform(click()); -        Screengrab.screenshot("VPN_ask_disconnect"); - -        onView(withText(android.R.string.yes)) -                .inRoot(isDialog()) -                .check(matches(isDisplayed())) -                .perform(click()); -        Screengrab.screenshot("VPN_disconnected"); -    } - -    @Test -    public void test02_SettingsFragmentScreenshots() { -        onView(withId(R.id.drawer_layout)) -                .check(matches(isClosed(Gravity.LEFT))) // Left Drawer should be closed. -                .perform(DrawerActions.open()); // Open Drawer - -        Screengrab.screenshot("navigationDrawer"); - -        // Start the screen of your activity. -        onView(withId(R.id.advancedSettings)) -                .perform(click()); - -        Screengrab.screenshot("settingsFragment"); -    } - -    @Test -    public void test03_LocationSelectionFragmentScreenshots() { -        onView(withId(R.id.drawer_layout)) -                .check(matches(isClosed(Gravity.LEFT))) // Left Drawer should be closed. -                .perform(DrawerActions.open()); // Open Drawer - -        onView(withId(R.id.manualGatewaySelection)) -                .perform(click()); - -        Screengrab.screenshot("GatewaySelectionFragment"); -    } - -    @Test -    public void test04_AppExclusionFragmentScreenshots() { -        onView(withId(R.id.drawer_layout)) -                .check(matches(isClosed(Gravity.LEFT))) // Left Drawer should be closed. -                .perform(DrawerActions.open()); // Open Drawer - -        onView(withId(R.id.advancedSettings)).perform(click()); - -        onView(withId(R.id.exclude_apps)).perform(click()); - -        tryResolve( -                onData(anything()).inAdapterView(withId(android.R.id.list)).atPosition(2), -                matches(isDisplayed()), -                5); - -        Screengrab.screenshot("App_Exclusion_Fragment"); -    } - -    public abstract boolean configureProviderIfNeeded(); -} diff --git a/app/src/androidTest/java/utils/ProviderSetupUtils.java b/app/src/androidTest/java/utils/ProviderSetupUtils.java new file mode 100644 index 00000000..10e0b950 --- /dev/null +++ b/app/src/androidTest/java/utils/ProviderSetupUtils.java @@ -0,0 +1,93 @@ +package utils; + +import static androidx.test.core.app.ApplicationProvider.getApplicationContext; +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static androidx.test.espresso.matcher.ViewMatchers.withTagValue; +import static androidx.test.espresso.matcher.ViewMatchers.withText; +import static utils.CustomInteractions.tryResolve; + +import android.content.Context; +import android.net.VpnService; + +import androidx.test.espresso.NoMatchingViewException; +import androidx.test.espresso.ViewInteraction; +import androidx.test.espresso.matcher.ViewMatchers; +import androidx.test.uiautomator.UiDevice; +import androidx.test.uiautomator.UiObject; +import androidx.test.uiautomator.UiObjectNotFoundException; +import androidx.test.uiautomator.UiSelector; + +import org.hamcrest.Matchers; + +import se.leap.bitmaskclient.BuildConfig; +import se.leap.bitmaskclient.R; +import tools.fastlane.screengrab.Screengrab; + +public class ProviderSetupUtils { + +    public static void runProviderSetup(UiDevice device, boolean takeConfigurationScreenshots, boolean useCircumvention, Context targetContext) { +        try { +            // ------- PROVIDER SELECTION -------------- +            if ("normal".equals(BuildConfig.FLAVOR_branding)) { +                System.out.println("next: provider selection"); +                ViewInteraction radioButtonSelection = tryResolve(onView(withText("Riseup")), matches(isDisplayed())); +                if (takeConfigurationScreenshots) Screengrab.screenshot("provider_selection"); +                radioButtonSelection.perform(click()); +                // next button click +                onView(withText(R.string.next)).perform(click()); +            } + +            // ------- CIRCUMVENTION SELECTION -------------- +            System.out.println("next: standard/circumvention selection"); +            if (useCircumvention) { +                onView(withText(targetContext.getString(R.string.use_circumvention_tech))).perform(click()); +            } else { +                onView(withText(targetContext.getString(R.string.use_standard_vpn, targetContext.getString(R.string.app_name)))).perform(click()); +            } +            if (takeConfigurationScreenshots) Screengrab.screenshot("circumvention_selection"); + +            // ------- CONFIGURATION PROGRESS -------------- +            System.out.println("next: configuring"); +            onView(withText(R.string.next)).perform(click()); +            tryResolve( +                    onView( +                            Matchers.allOf( +                                    withText(R.string.configuring_provider), +                                    withId(R.id.tv_title) +                            ) +                    ), +                    matches(isDisplayed()) +            ); +            if (takeConfigurationScreenshots) Screengrab.screenshot("configuring_provider"); + +            // ------- VPN PERMISSON DIALOG -------------- +            boolean showPermissionDialog = false; +            if (VpnService.prepare(getApplicationContext()) != null) { +                showPermissionDialog = true; +                tryResolve(onView(withText(R.string.upcoming_connection_request_description)), matches(isDisplayed()), useCircumvention ? 180 : 20); +                System.out.println("next: next permission request"); +                onView(withText(R.string.next)).perform(click()); +                UiObject okButton = device.findObject(new UiSelector().packageName("com.android.vpndialogs").resourceId("android:id/button1")); +                okButton.waitForExists(30000); +                okButton.click(); +                device.waitForWindowUpdate("com.android.vpndialogs", 1000); +            } + +            // ------- START VPN -------------- +            System.out.println("next: perform click on VPN button"); +            ViewInteraction interaction = tryResolve(onView(withTagValue(Matchers.is("button_setup_circle_custom"))), matches(isDisplayed()), useCircumvention && !showPermissionDialog ? 180 : 20); +            Screengrab.screenshot("all_set_start_vpn"); +            interaction.perform(click()); +        } catch (NoMatchingViewException e) { +            // it might be that the provider was already configured, so we print the stack +            // trace here and try to continue +            e.printStackTrace(); +        } catch (UiObjectNotFoundException | NullPointerException e) { +            e.printStackTrace(); +        } +    } +} | 
