From d1d8412654c639abfab816b1420b0de2c863f879 Mon Sep 17 00:00:00 2001 From: Martijn Brekhof Date: Tue, 11 Jun 2019 09:47:11 +0200 Subject: [PATCH] Refactored unit tests (#643) * Removed redundant configureHostInfo It was only used to set the Kodi backend version which is also set using setKodiMajorVersion. * Removed unused annotations and throwables * Improved robustness of SlideUpPanelTests Replaced explicit sleeps with the waitForView action. Fixed issue in waitForView action as it required the UI to be idle which is mostly not the case for the bottom panel with the progress indicator. * Improved robustness of eventserver When eventserver handles a wrong payload this should not crash but simply show a log message and let the actual test fail. --- .../kore/testhelpers/action/ViewActions.java | 2 -- .../xbmc/kore/tests/ui/AbstractTestClass.java | 8 ----- .../tests/ui/addons/AddonsActivityTests.java | 5 --- .../tests/ui/movies/MoviesActivityTests.java | 5 --- .../RestoreSearchQueryListFragmentTest.java | 8 ----- .../tests/ui/music/MusicActivityTests.java | 5 --- .../RestoreSearchQueryViewPagerTest.java | 8 ----- .../tests/ui/music/SlideUpPanelTests.java | 36 +++++++++++-------- .../controlpad/eventserver/ButtonTests.java | 31 +++++++--------- .../eventserver/KodiPreV17Tests.java | 14 ++------ .../remote/controlpad/http/ButtonTests.java | 4 --- .../controlpad/http/KodiPreV17Tests.java | 5 --- .../ui/tvshows/TVShowsActivityTests.java | 5 --- .../eventserver/EventPacketBUTTON.java | 20 +++++++---- 14 files changed, 51 insertions(+), 105 deletions(-) diff --git a/app/src/androidTest/java/org/xbmc/kore/testhelpers/action/ViewActions.java b/app/src/androidTest/java/org/xbmc/kore/testhelpers/action/ViewActions.java index 5aca193..3192375 100644 --- a/app/src/androidTest/java/org/xbmc/kore/testhelpers/action/ViewActions.java +++ b/app/src/androidTest/java/org/xbmc/kore/testhelpers/action/ViewActions.java @@ -22,7 +22,6 @@ import android.support.test.espresso.UiController; import android.support.test.espresso.ViewAction; import android.support.test.espresso.action.MotionEvents; import android.support.test.espresso.action.Press; -import android.support.test.espresso.action.ScrollToAction; import android.support.test.espresso.util.HumanReadables; import android.support.test.espresso.util.TreeIterables; import android.support.v4.view.PagerAdapter; @@ -92,7 +91,6 @@ public final class ViewActions { @Override public void perform(UiController uiController, View view) { - uiController.loopMainThreadUntilIdle(); final long endTime = System.currentTimeMillis() + millis; do { for (View child : TreeIterables.breadthFirstViewTraversal(view)) { diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/AbstractTestClass.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/AbstractTestClass.java index 4295130..cc84b2c 100644 --- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/AbstractTestClass.java +++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/AbstractTestClass.java @@ -62,12 +62,6 @@ abstract public class AbstractTestClass { */ abstract protected void setSharedPreferences(Context context); - /** - * Called from {@link #setUp()} right after HostInfo has been created. - * @param hostInfo created HostInfo used by the activity under test - */ - abstract protected void configureHostInfo(HostInfo hostInfo); - private LoaderIdlingResource loaderIdlingResource; private ActivityTestRule activityTestRule; private static MockTcpServer server; @@ -114,8 +108,6 @@ abstract public class AbstractTestClass { hostInfo = Database.addHost(context, server.getHostName(), HostConnection.PROTOCOL_TCP, HostInfo.DEFAULT_HTTP_PORT, server.getPort(), useEventServer, kodiMajorVersion); - //Allow each test to change the host info - configureHostInfo(hostInfo); loaderIdlingResource = new LoaderIdlingResource(activityTestRule.getActivity().getSupportLoaderManager()); IdlingRegistry.getInstance().register(loaderIdlingResource); diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/addons/AddonsActivityTests.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/addons/AddonsActivityTests.java index 73edf58..3aa34e0 100644 --- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/addons/AddonsActivityTests.java +++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/addons/AddonsActivityTests.java @@ -79,11 +79,6 @@ public class AddonsActivityTests extends AbstractTestClass { } - @Override - protected void configureHostInfo(HostInfo hostInfo) { - - } - @Before public void setUp() throws Throwable { super.setUp(); diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/movies/MoviesActivityTests.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/movies/MoviesActivityTests.java index b7f9614..9d065f0 100644 --- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/movies/MoviesActivityTests.java +++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/movies/MoviesActivityTests.java @@ -58,11 +58,6 @@ public class MoviesActivityTests extends AbstractTestClass { } - @Override - protected void configureHostInfo(HostInfo hostInfo) { - - } - /** * Test if action bar title initially displays Movies */ diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/movies/RestoreSearchQueryListFragmentTest.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/movies/RestoreSearchQueryListFragmentTest.java index 5d79213..0bbbbbc 100644 --- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/movies/RestoreSearchQueryListFragmentTest.java +++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/movies/RestoreSearchQueryListFragmentTest.java @@ -18,7 +18,6 @@ package org.xbmc.kore.tests.ui.movies; import android.content.Context; import android.support.test.espresso.Espresso; -import android.support.test.filters.LargeTest; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; @@ -26,13 +25,11 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.xbmc.kore.R; -import org.xbmc.kore.host.HostInfo; import org.xbmc.kore.testhelpers.EspressoTestUtils; import org.xbmc.kore.tests.ui.AbstractTestClass; import org.xbmc.kore.ui.sections.video.MoviesActivity; @RunWith(AndroidJUnit4.class) -@LargeTest public class RestoreSearchQueryListFragmentTest extends AbstractTestClass { private final String SEARCH_QUERY = "Room"; @@ -53,11 +50,6 @@ public class RestoreSearchQueryListFragmentTest extends AbstractTestClass { } - @Override - protected void configureHostInfo(HostInfo hostInfo) { - - } - /** * Test if action bar title initially displays Music */ diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/music/RestoreSearchQueryViewPagerTest.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/music/RestoreSearchQueryViewPagerTest.java index 148231f..b0af3eb 100644 --- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/music/RestoreSearchQueryViewPagerTest.java +++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/music/RestoreSearchQueryViewPagerTest.java @@ -19,7 +19,6 @@ package org.xbmc.kore.tests.ui.music; import android.app.Activity; import android.content.Context; import android.support.test.espresso.Espresso; -import android.support.test.filters.LargeTest; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; @@ -27,7 +26,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.xbmc.kore.R; -import org.xbmc.kore.host.HostInfo; import org.xbmc.kore.testhelpers.EspressoTestUtils; import org.xbmc.kore.testhelpers.LoaderIdlingResource; import org.xbmc.kore.tests.ui.AbstractTestClass; @@ -37,7 +35,6 @@ import static org.xbmc.kore.testhelpers.EspressoTestUtils.clickAlbumsTab; import static org.xbmc.kore.testhelpers.EspressoTestUtils.clickArtistsTab; @RunWith(AndroidJUnit4.class) -@LargeTest public class RestoreSearchQueryViewPagerTest extends AbstractTestClass { private final String ARTIST_SEARCH_QUERY = "Ben"; @@ -64,11 +61,6 @@ public class RestoreSearchQueryViewPagerTest extends AbstractTestClass { } - @Override - protected void configureHostInfo(HostInfo hostInfo) { - - } - @Override public void setUp() throws Throwable { super.setUp(); @@ -409,7 +403,12 @@ public class SlideUpPanelTests extends AbstractTestClass { rotateDevice(getActivity()); - onView(withId(R.id.vli_seek_bar)).check(matches(withProgress(volume))); + onView(isRoot()).perform(ViewActions.waitForView(R.id.vli_seek_bar, new ViewActions.CheckStatus() { + @Override + public boolean check(View v) { + return ((SeekBar) v).getProgress() == volume; + } + }, 10000)); onView(withId(R.id.vli_volume_text)).check(matches(withText(String.valueOf(volume)))); assertTrue(getApplicationHandler().getVolume() == volume); } @@ -486,9 +485,14 @@ public class SlideUpPanelTests extends AbstractTestClass { getPlayerHandler().startPlay(); SeekBar seekBar = (SeekBar) getActivity().findViewById(R.id.mpi_seek_bar); - int progress = seekBar.getProgress(); - SystemClock.sleep(1000); //wait one second to check if progression has indeed progressed - assertTrue(seekBar.getProgress() > progress); + final int progress = seekBar.getProgress(); + onView(isRoot()).perform(ViewActions.waitForView( + R.id.mpi_seek_bar, new ViewActions.CheckStatus() { + @Override + public boolean check(View v) { + return ((SeekBar) v).getProgress() > progress; + } + }, 10000)); } /** @@ -502,11 +506,15 @@ public class SlideUpPanelTests extends AbstractTestClass { public void progressionUpdaterStartedAfterPlay() { expandPanel(); SeekBar seekBar = (SeekBar) getActivity().findViewById(R.id.mpi_seek_bar); - int progress = seekBar.getProgress(); + final int progress = seekBar.getProgress(); - SystemClock.sleep(1000); //wait one second to check if progression has indeed progressed - - assertTrue(seekBar.getProgress() > progress); + onView(isRoot()).perform(ViewActions.waitForView( + R.id.mpi_seek_bar, new ViewActions.CheckStatus() { + @Override + public boolean check(View v) { + return ((SeekBar) v).getProgress() > progress; + } + }, 10000)); } /** diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/ButtonTests.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/ButtonTests.java index 981f1b3..0265aca 100644 --- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/ButtonTests.java +++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/ButtonTests.java @@ -37,8 +37,6 @@ import org.xbmc.kore.testutils.eventserver.EventPacketBUTTON; import org.xbmc.kore.testutils.eventserver.MockEventServer; import org.xbmc.kore.ui.sections.remote.RemoteActivity; -import java.io.IOException; - import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.action.ViewActions.click; import static android.support.test.espresso.action.ViewActions.longClick; @@ -62,13 +60,8 @@ public class ButtonTests extends AbstractTestClass { Utils.setUseEventServerPreference(context, true); } - @Override - protected void configureHostInfo(HostInfo hostInfo) { - - } - @BeforeClass - public static void setupEventServer() throws Throwable { + public static void setupEventServer() { mockEventServer = new MockEventServer(); mockEventServer.setListenPort(HostInfo.DEFAULT_EVENT_SERVER_PORT); mockEventServer.start(); @@ -86,40 +79,40 @@ public class ButtonTests extends AbstractTestClass { } @AfterClass - public static void cleanup() throws IOException { + public static void cleanup() { mockEventServer.shutdown(); } @Test - public void leftControlPadButtonTest() throws InterruptedException { + public void leftControlPadButtonTest() { onView(withId(R.id.left)).perform(click()); testRemoteButton(ButtonCodes.REMOTE_LEFT); } @Test - public void rightControlPadButtonTest() throws InterruptedException { + public void rightControlPadButtonTest() { onView(withId(R.id.right)).perform(click()); testRemoteButton(ButtonCodes.REMOTE_RIGHT); } @Test - public void upControlPadButtonTest() throws InterruptedException { + public void upControlPadButtonTest() { onView(withId(R.id.up)).perform(click()); testRemoteButton(ButtonCodes.REMOTE_UP); } @Test - public void downControlPadButtonTest() throws InterruptedException { + public void downControlPadButtonTest() { onView(withId(R.id.down)).perform(click()); testRemoteButton(ButtonCodes.REMOTE_DOWN); } @Test - public void selectPadButtonTest() throws InterruptedException { + public void selectPadButtonTest() { onView(withId(R.id.select)).perform(click()); testRemoteButton(ButtonCodes.REMOTE_SELECT); @@ -128,14 +121,14 @@ public class ButtonTests extends AbstractTestClass { //The following tests do not use the event server. They're included here //to make sure they still work when the event server is enabled. @Test - public void contextControlPadButtonTest() throws InterruptedException { + public void contextControlPadButtonTest() { onView(withId(R.id.context)).perform(click()); TestUtils.testHTTPEvent(Input.ExecuteAction.METHOD_NAME, Input.ExecuteAction.CONTEXTMENU); } @Test - public void infoControlPadButtonTest() throws InterruptedException { + public void infoControlPadButtonTest() { HostManager.getInstance(getActivity()).getHostInfo().setKodiVersionMajor(17); onView(withId(R.id.info)).perform(click()); @@ -144,21 +137,21 @@ public class ButtonTests extends AbstractTestClass { } @Test - public void infoControlPadButtonLongClickTest() throws InterruptedException { + public void infoControlPadButtonLongClickTest() { onView(withId(R.id.info)).perform(longClick()); TestUtils.testHTTPEvent(Input.ExecuteAction.METHOD_NAME, Input.ExecuteAction.PLAYERPROCESSINFO); } @Test - public void osdControlPadButtonTest() throws InterruptedException { + public void osdControlPadButtonTest() { onView(withId(R.id.osd)).perform(click()); TestUtils.testHTTPEvent(Input.ExecuteAction.METHOD_NAME, Input.ExecuteAction.OSD); } @Test - public void backControlPadButtonTest() throws InterruptedException { + public void backControlPadButtonTest() { onView(withId(R.id.back)).perform(click()); TestUtils.testHTTPEvent(Input.Back.METHOD_NAME, null); diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/KodiPreV17Tests.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/KodiPreV17Tests.java index 415ad04..9cb27d4 100644 --- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/KodiPreV17Tests.java +++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/eventserver/KodiPreV17Tests.java @@ -33,8 +33,6 @@ import org.xbmc.kore.tests.ui.AbstractTestClass; import org.xbmc.kore.testutils.eventserver.MockEventServer; import org.xbmc.kore.ui.sections.remote.RemoteActivity; -import java.io.IOException; - import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.action.ViewActions.longClick; import static android.support.test.espresso.matcher.ViewMatchers.withId; @@ -57,12 +55,8 @@ public class KodiPreV17Tests extends AbstractTestClass { Utils.setUseEventServerPreference(context, true); } - @Override - protected void configureHostInfo(HostInfo hostInfo) { - } - @BeforeClass - public static void setupEventServer() throws Throwable { + public static void setupEventServer() { mockEventServer = new MockEventServer(); mockEventServer.setListenPort(HostInfo.DEFAULT_EVENT_SERVER_PORT); mockEventServer.start(); @@ -80,14 +74,12 @@ public class KodiPreV17Tests extends AbstractTestClass { } @AfterClass - public static void cleanup() throws IOException { + public static void cleanup() { mockEventServer.shutdown(); } @Test - public void infoControlPadButtonLongClickTest() throws InterruptedException { - HostManager.getInstance(getActivity()).getHostInfo().setKodiVersionMajor(16); - + public void infoControlPadButtonLongClickTest() { onView(withId(R.id.info)).perform(longClick()); String actionReceived = getInputHandler().getAction(); diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/ButtonTests.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/ButtonTests.java index 9561a06..d91c0c5 100644 --- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/ButtonTests.java +++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/ButtonTests.java @@ -50,10 +50,6 @@ public class ButtonTests extends AbstractTestClass { Utils.setUseEventServerPreference(context, false); } - @Override - protected void configureHostInfo(HostInfo hostInfo) { - } - @Override public void setUp() throws Throwable { setKodiMajorVersion(HostInfo.KODI_V17_KRYPTON); diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/KodiPreV17Tests.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/KodiPreV17Tests.java index 47a3ab6..1b10b3f 100644 --- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/KodiPreV17Tests.java +++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/remote/controlpad/http/KodiPreV17Tests.java @@ -48,11 +48,6 @@ public class KodiPreV17Tests extends AbstractTestClass { Utils.setUseEventServerPreference(context, false); } - @Override - protected void configureHostInfo(HostInfo hostInfo) { - hostInfo.setKodiVersionMajor(16); - } - @Override public void setUp() throws Throwable { setKodiMajorVersion(HostInfo.KODI_V16_JARVIS); diff --git a/app/src/androidTest/java/org/xbmc/kore/tests/ui/tvshows/TVShowsActivityTests.java b/app/src/androidTest/java/org/xbmc/kore/tests/ui/tvshows/TVShowsActivityTests.java index 95cff57..cc4120f 100644 --- a/app/src/androidTest/java/org/xbmc/kore/tests/ui/tvshows/TVShowsActivityTests.java +++ b/app/src/androidTest/java/org/xbmc/kore/tests/ui/tvshows/TVShowsActivityTests.java @@ -61,11 +61,6 @@ public class TVShowsActivityTests extends AbstractTestClass { } - @Override - protected void configureHostInfo(HostInfo hostInfo) { - - } - /** * Test if action bar title initially displays TV Shows */ diff --git a/app/src/debug/java/org/xbmc/kore/testutils/eventserver/EventPacketBUTTON.java b/app/src/debug/java/org/xbmc/kore/testutils/eventserver/EventPacketBUTTON.java index 8795798..8f73e62 100644 --- a/app/src/debug/java/org/xbmc/kore/testutils/eventserver/EventPacketBUTTON.java +++ b/app/src/debug/java/org/xbmc/kore/testutils/eventserver/EventPacketBUTTON.java @@ -16,9 +16,12 @@ package org.xbmc.kore.testutils.eventserver; +import org.xbmc.kore.utils.LogUtils; + import java.nio.ByteBuffer; public class EventPacketBUTTON extends EventPacket { + private final static String TAG = LogUtils.makeLogTag(EventPacketBUTTON.class); private short code; private String mapName; @@ -34,14 +37,19 @@ public class EventPacketBUTTON extends EventPacket { super(packet); byte[] payload = getPayload(); - code = ByteBuffer.wrap(payload, 0, 2).getShort(); - flags = ByteBuffer.wrap(payload, 2, 2).getShort(); - amount = ByteBuffer.wrap(payload, 4, 2).getShort(); - mapName = getStringFromPayload(payload, 6); + try { + code = ByteBuffer.wrap(payload, 0, 2).getShort(); + flags = ByteBuffer.wrap(payload, 2, 2).getShort(); + amount = ByteBuffer.wrap(payload, 4, 2).getShort(); - int nextStringPosition = 6 + mapName.getBytes().length + 1; - buttonName = getStringFromPayload(payload, nextStringPosition); + mapName = getStringFromPayload(payload, 6); + + int nextStringPosition = 6 + mapName.getBytes().length + 1; + buttonName = getStringFromPayload(payload, nextStringPosition); + } catch (ArrayIndexOutOfBoundsException e) { + LogUtils.LOGE(TAG, "Error handling payload " + new String(payload)); + } } public String getButtonName() {