11package com.mapbox.navigation.instrumentation_tests.core
22
33import android.location.Location
4- import androidx.annotation.IntegerRes
54import com.mapbox.api.directions.v5.DirectionsCriteria
65import com.mapbox.api.directions.v5.models.RouteOptions
76import com.mapbox.geojson.Point
@@ -25,20 +24,20 @@ import com.mapbox.navigation.instrumentation_tests.utils.coroutines.requestRoute
2524import com.mapbox.navigation.instrumentation_tests.utils.coroutines.routesUpdates
2625import com.mapbox.navigation.instrumentation_tests.utils.coroutines.sdkTest
2726import com.mapbox.navigation.instrumentation_tests.utils.coroutines.setNavigationRoutesAndWaitForUpdate
28- import com.mapbox.navigation.instrumentation_tests.utils.http.FailByRequestMockRequestHandler
2927import com.mapbox.navigation.instrumentation_tests.utils.http.MockDirectionsRefreshHandler
3028import com.mapbox.navigation.instrumentation_tests.utils.http.MockDirectionsRequestHandler
3129import com.mapbox.navigation.instrumentation_tests.utils.http.MockRoutingTileEndpointErrorRequestHandler
30+ import com.mapbox.navigation.instrumentation_tests.utils.http.NthAttemptHandler
3231import com.mapbox.navigation.instrumentation_tests.utils.location.MockLocationReplayerRule
3332import com.mapbox.navigation.instrumentation_tests.utils.readRawFileText
3433import com.mapbox.navigation.testing.ui.BaseTest
34+ import com.mapbox.navigation.testing.ui.http.MockRequestHandler
3535import com.mapbox.navigation.testing.ui.utils.getMapboxAccessTokenFromResources
3636import kotlinx.coroutines.delay
3737import kotlinx.coroutines.flow.filter
3838import kotlinx.coroutines.flow.first
3939import kotlinx.coroutines.flow.take
4040import kotlinx.coroutines.flow.toList
41- import org.junit.After
4241import org.junit.Assert.assertEquals
4342import org.junit.Before
4443import org.junit.Rule
@@ -55,48 +54,34 @@ class RouteRefreshOnDemandTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::
5554 @get:Rule
5655 val mockLocationReplayerRule = MockLocationReplayerRule (mockLocationUpdatesRule)
5756
58- private lateinit var failedRefreshHandlerWrapper: FailByRequestMockRequestHandler
59- private lateinit var refreshHandler: MockDirectionsRefreshHandler
57+ private lateinit var baseRefreshHandler: MockDirectionsRefreshHandler
6058 private lateinit var mapboxNavigation: MapboxNavigation
6159 private val twoCoordinates = listOf (
6260 Point .fromLngLat(- 121.496066 , 38.577764 ),
6361 Point .fromLngLat(- 121.480279 , 38.57674 )
6462 )
6563
66- override fun setupMockLocation (): Location = mockLocationUpdatesRule.generateLocationUpdate {
67- latitude = twoCoordinates[0 ].latitude()
68- longitude = twoCoordinates[0 ].longitude()
69- bearing = 190f
70- }
71-
7264 @Before
73- fun setup () {
74- setupMockRequestHandlers(
75- twoCoordinates,
76- R .raw.route_response_route_refresh,
77- R .raw.route_response_route_refresh_annotations,
78- " route_response_route_refresh"
65+ fun setUp () {
66+ baseRefreshHandler = MockDirectionsRefreshHandler (
67+ " route_response_single_route_refresh" ,
68+ readRawFileText(activity, R .raw.route_response_route_refresh_annotations),
7969 )
8070 }
8171
82- @After
83- fun tearDown () {
84- failedRefreshHandlerWrapper.failResponse = false
72+ override fun setupMockLocation (): Location = mockLocationUpdatesRule.generateLocationUpdate {
73+ latitude = twoCoordinates[0 ].latitude()
74+ longitude = twoCoordinates[0 ].longitude()
75+ bearing = 190f
8576 }
8677
8778 @Test
8879 fun immediate_route_refresh_before_planned () = sdkTest {
8980 val observer = TestObserver ()
9081 val routeRefreshes = mutableListOf<RoutesUpdatedResult >()
91- val routeRefreshOptions = RouteRefreshOptions .Builder ()
92- .intervalMillis(TimeUnit .SECONDS .toMillis(30 ))
93- .build()
94- RouteRefreshOptions ::class .java.getDeclaredField(" intervalMillis" ).apply {
95- isAccessible = true
96- set(routeRefreshOptions, 5_000L )
97- }
98- refreshHandler.jsonResponseModifier = DynamicResponseModifier ()
99- createMapboxNavigation(routeRefreshOptions)
82+ setupMockRequestHandlers(baseRefreshHandler)
83+ baseRefreshHandler.jsonResponseModifier = DynamicResponseModifier ()
84+ createMapboxNavigation(createRouteRefreshOptionsWithInvalidInterval(5000 ))
10085 val routeOptions = generateRouteOptions(twoCoordinates)
10186 val requestedRoutes = mapboxNavigation.requestRoutes(routeOptions)
10287 .getSuccessfulResultOrThrowException()
@@ -150,6 +135,45 @@ class RouteRefreshOnDemandTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::
150135 )
151136 }
152137
138+ @Test
139+ fun route_refresh_on_demand_between_planned_attempts () = sdkTest {
140+ val observer = TestObserver ()
141+ baseRefreshHandler.jsonResponseModifier = DynamicResponseModifier ()
142+ setupMockRequestHandlers(
143+ NthAttemptHandler (baseRefreshHandler, 1 )
144+ )
145+
146+ createMapboxNavigation(createRouteRefreshOptionsWithInvalidInterval(5_000 ))
147+ mapboxNavigation.routeRefreshController.registerRouteRefreshStateObserver(observer)
148+ mapboxNavigation.startTripSession()
149+ val routeOptions = generateRouteOptions(twoCoordinates)
150+ val requestedRoutes = mapboxNavigation.requestRoutes(routeOptions)
151+ .getSuccessfulResultOrThrowException()
152+ .routes
153+ mapboxNavigation.setNavigationRoutesAndWaitForUpdate(requestedRoutes)
154+ delay(8000 ) // refresh interval + accuracy
155+
156+ mapboxNavigation.routeRefreshController.requestImmediateRouteRefresh()
157+
158+ // one from immediate and the next planned
159+ mapboxNavigation.routesUpdates()
160+ .filter { it.reason == RoutesExtra .ROUTES_UPDATE_REASON_REFRESH }
161+ .take(2 )
162+ .toList()
163+
164+ assertEquals(
165+ listOf (
166+ RouteRefreshExtra .REFRESH_STATE_STARTED ,
167+ RouteRefreshExtra .REFRESH_STATE_CANCELED ,
168+ RouteRefreshExtra .REFRESH_STATE_STARTED ,
169+ RouteRefreshExtra .REFRESH_STATE_FINISHED_SUCCESS ,
170+ RouteRefreshExtra .REFRESH_STATE_STARTED ,
171+ RouteRefreshExtra .REFRESH_STATE_FINISHED_SUCCESS ,
172+ ),
173+ observer.getStatesSnapshot()
174+ )
175+ }
176+
153177 private fun createMapboxNavigation (routeRefreshOptions : RouteRefreshOptions ) {
154178 mapboxNavigation = MapboxNavigationProvider .create(
155179 NavigationOptions .Builder (activity)
@@ -186,27 +210,17 @@ class RouteRefreshOnDemandTest : BaseTest<EmptyTestActivity>(EmptyTestActivity::
186210 }
187211
188212 private fun setupMockRequestHandlers (
189- coordinates : List <Point >,
190- @IntegerRes routesResponse : Int ,
191- @IntegerRes refreshResponse : Int ,
192- responseTestUuid : String ,
193- acceptedGeometryIndex : Int? = null,
213+ refreshHandler : MockRequestHandler ,
194214 ) {
195215 mockWebServerRule.requestHandlers.clear()
196216 mockWebServerRule.requestHandlers.add(
197217 MockDirectionsRequestHandler (
198218 " driving-traffic" ,
199- readRawFileText(activity, routesResponse ),
200- coordinates
219+ readRawFileText(activity, R .raw.route_response_single_route_refresh ),
220+ twoCoordinates
201221 )
202222 )
203- refreshHandler = MockDirectionsRefreshHandler (
204- responseTestUuid,
205- readRawFileText(activity, refreshResponse),
206- acceptedGeometryIndex
207- )
208- failedRefreshHandlerWrapper = FailByRequestMockRequestHandler (refreshHandler)
209- mockWebServerRule.requestHandlers.add(failedRefreshHandlerWrapper)
223+ mockWebServerRule.requestHandlers.add(refreshHandler)
210224 mockWebServerRule.requestHandlers.add(MockRoutingTileEndpointErrorRequestHandler ())
211225 }
212226
0 commit comments