diff --git a/.circleci/config.yml b/.circleci/config.yml index cc8353b008b..1a3ea50c5b1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,9 +12,9 @@ parameters: #---------- EXECUTORS ---------- #------------------------------- executors: - ndk-r21e-latest-executor: + ndk-r22-latest-executor: docker: - - image: mbgl/android-ndk-r21e:latest + - image: mbgl/android-ndk-r22:latest working_directory: ~/code environment: MBX_CI_DOMAIN: o619qyc20d.execute-api.us-east-1.amazonaws.com @@ -439,7 +439,7 @@ commands: #-------------------------- jobs: prepare-and-assemble: - executor: ndk-r21e-latest-executor + executor: ndk-r22-latest-executor steps: - checkout - when: @@ -468,7 +468,7 @@ jobs: - write-workspace unit-tests-core: - executor: ndk-r21e-latest-executor + executor: ndk-r22-latest-executor steps: - when: condition: @@ -482,7 +482,7 @@ jobs: - run: exit 0 unit-tests-ui: - executor: ndk-r21e-latest-executor + executor: ndk-r22-latest-executor steps: - when: condition: @@ -498,7 +498,7 @@ jobs: # - codecov static-analysis: - executor: ndk-r21e-latest-executor + executor: ndk-r22-latest-executor steps: - when: condition: @@ -517,7 +517,7 @@ jobs: - run: exit 0 publish-documentation: - executor: ndk-r21e-latest-executor + executor: ndk-r22-latest-executor steps: - checkout - prepare-mbx-ci @@ -530,7 +530,7 @@ jobs: ./scripts/publish_api_docs_android.sh -p $GITHUB_WRITER_TOKEN -t $CIRCLE_TAG changelog-verification: - executor: ndk-r21e-latest-executor + executor: ndk-r22-latest-executor steps: - checkout - when: @@ -544,7 +544,7 @@ jobs: - verify-changelog ui-robo-tests: - executor: ndk-r21e-latest-executor + executor: ndk-r22-latest-executor environment: JVM_OPTS: -Xmx3200m BUILDTYPE: Debug @@ -572,7 +572,7 @@ jobs: - run: exit 0 internal-instrumentation-tests: - executor: ndk-r21e-latest-executor + executor: ndk-r22-latest-executor environment: JVM_OPTS: -Xmx3200m BUILDTYPE: Debug @@ -594,7 +594,7 @@ jobs: - run: exit 0 instrumentation-tests: - executor: ndk-r21e-latest-executor + executor: ndk-r22-latest-executor environment: JVM_OPTS: -Xmx3200m BUILDTYPE: Debug @@ -614,13 +614,13 @@ jobs: - run: exit 0 mobile-metrics-benchmarks: - executor: ndk-r21e-latest-executor + executor: ndk-r22-latest-executor steps: - checkout - trigger-mobile-metrics release-snapshot: - executor: ndk-r21e-latest-executor + executor: ndk-r22-latest-executor steps: - checkout - generate-version-name @@ -637,7 +637,7 @@ jobs: - trigger-mobile-metrics release: - executor: ndk-r21e-latest-executor + executor: ndk-r22-latest-executor steps: - checkout - generate-version-name diff --git a/examples/build.gradle b/examples/build.gradle index 872090fb2e4..5737afdd12c 100644 --- a/examples/build.gradle +++ b/examples/build.gradle @@ -71,11 +71,6 @@ android { } } - dexOptions { - maxProcessCount 8 - javaMaxHeapSize "2g" - preDexLibraries true - } lintOptions { abortOnError false @@ -92,6 +87,9 @@ task downloadUnstrippedNativeLibsDir(type: com.mapbox.gradle.NativeDownloadTask) dependenciesList.mapboxNavigator, dependenciesList.mapboxCommonNative ] + sdkRegistryToken = project.hasProperty('SDK_REGISTRY_TOKEN') + ? project.property('SDK_REGISTRY_TOKEN') + : System.getenv('SDK_REGISTRY_TOKEN') } dependencies { diff --git a/gradle.properties b/gradle.properties index 58ff2311bc0..ee747e61d02 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,6 +26,11 @@ org.gradle.jvmargs=-Xmx2048M android.useAndroidX=true android.enableJetifier=true +# Increases stack size for the Kotlin compiler to prevent StackOverflowError +# when compiling MapboxRouteLineViewTest.kt. Similar issue: +# https://youtrack.jetbrains.com/issue/KT-46822 +systemProp.kotlin.daemon.jvm.options=-Xss8m + # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 30eaa71b310..07d7c6cc2fc 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -4,7 +4,7 @@ ext { androidVersions = [ minSdkVersion : 21, targetSdkVersion : 30, - compileSdkVersion : 30 + compileSdkVersion : 31, ] // Navigation Native CI can run SDK CI downstream with forced Navigation Native version @@ -40,12 +40,12 @@ ext { junit : '4.12', constraintLayout : '1.1.3', mockito : '2.23.4', - mockkVersion : '1.10.0', + mockkVersion : '1.12.1', butterknife : '10.1.0', - leakCanaryVersion : '2.3', + leakCanaryVersion : '2.7', espressoVersion : '3.1.0', commonsIO : '2.6', - robolectric : '4.3.1', + robolectric : '4.7.3', mockwebserver : '4.9.0', gmsLocation : '17.0.0', ktlint : '0.41.0', @@ -164,18 +164,18 @@ ext { pluginVersion = [ checkstyle : '8.2', pmd : '5.8.1', - gradle : '4.0.1', + gradle : '7.0.4', dependencyGraph : '0.5.0', dependencyUpdates : '0.29.0', kotlin : kotlinVersion, license : '0.8.5', jacoco : '0.2', googleServices : '4.3.3', - mapboxSdkVersions : '1.1.0', + mapboxSdkVersions : '1.1.3', dokka : '1.4.20', mapboxSdkRegistry : '0.4.0', mapboxAccessToken : '0.2.1', - mapboxNativeDownload : '0.1.2', + mapboxNativeDownload : '0.2.2', firebaseCrashlytics : '2.5.1' ] diff --git a/gradle/jacoco.gradle b/gradle/jacoco.gradle index 0f252b545a5..61c63f8e195 100644 --- a/gradle/jacoco.gradle +++ b/gradle/jacoco.gradle @@ -7,4 +7,8 @@ jacoco { tasks.withType(Test) { // needed to capture coverage from Robolectric tests jacoco.includeNoLocationClasses = true + + // required to run on Java 9+ + // refs https://github.com/gradle/gradle/issues/5184#issuecomment-457865951 + jacoco.excludes = ['jdk.internal.*'] } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 61a5f9e7d29..61d3f631117 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-all.zip diff --git a/libnavigation-core/src/test/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesControllerTest.kt b/libnavigation-core/src/test/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesControllerTest.kt index ed278fd9f50..6ce56a6cb82 100644 --- a/libnavigation-core/src/test/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesControllerTest.kt +++ b/libnavigation-core/src/test/java/com/mapbox/navigation/core/routealternatives/RouteAlternativesControllerTest.kt @@ -403,17 +403,17 @@ class RouteAlternativesControllerTest { ) ) - val routeProgressSlot = slot() - val alternativesSlot = slot>() - val routerOriginSlot = slot() + val routeProgressSlots = mutableListOf() + val alternativesSlots = mutableListOf>() + val routerOriginSlots = mutableListOf() verify(exactly = 2) { observer.onRouteAlternatives( - capture(routeProgressSlot), - capture(alternativesSlot), - capture(routerOriginSlot) + capture(routeProgressSlots), + capture(alternativesSlots), + capture(routerOriginSlots), ) } - assertEquals(RouterOrigin.Offboard, routerOriginSlot.captured) + assertEquals(RouterOrigin.Offboard, routerOriginSlots.last()) } @Test @@ -453,17 +453,17 @@ class RouteAlternativesControllerTest { ) ) - val routeProgressSlot = slot() - val alternativesSlot = slot>() - val routerOriginSlot = slot() + val routeProgressSlots = mutableListOf() + val alternativesSlots = mutableListOf>() + val routerOriginSlots = mutableListOf() verify(exactly = 2) { observer.onRouteAlternatives( - capture(routeProgressSlot), - capture(alternativesSlot), - capture(routerOriginSlot) + capture(routeProgressSlots), + capture(alternativesSlots), + capture(routerOriginSlots), ) } - assertEquals(RouterOrigin.Offboard, routerOriginSlot.captured) + assertEquals(RouterOrigin.Offboard, routerOriginSlots.last()) } @Test diff --git a/libnavui-maps/src/test/java/com/mapbox/navigation/ui/maps/internal/route/line/MapboxRouteLineUtilsTest.kt b/libnavui-maps/src/test/java/com/mapbox/navigation/ui/maps/internal/route/line/MapboxRouteLineUtilsTest.kt index 07633d24845..041fe0073be 100644 --- a/libnavui-maps/src/test/java/com/mapbox/navigation/ui/maps/internal/route/line/MapboxRouteLineUtilsTest.kt +++ b/libnavui-maps/src/test/java/com/mapbox/navigation/ui/maps/internal/route/line/MapboxRouteLineUtilsTest.kt @@ -60,7 +60,6 @@ import com.mapbox.navigation.ui.maps.route.line.model.RouteStyleDescriptor import io.mockk.every import io.mockk.mockk import io.mockk.mockkStatic -import io.mockk.slot import io.mockk.unmockkStatic import io.mockk.verify import org.junit.Assert @@ -448,10 +447,10 @@ class MapboxRouteLineUtilsTest { .withRouteLineBelowLayerId(LocationComponentConstants.MODEL_LAYER) .displayRestrictedRoadSections(true) .build() - val waypointSourceValueSlot = slot() - val primaryRouteSourceValueSlot = slot() - val alternativeRoute1SourceValueSlot = slot() - val alternativeRoute2SourceValueSlot = slot() + val waypointSourceValueSlots = mutableListOf() + val primaryRouteSourceValueSlots = mutableListOf() + val alternativeRoute1SourceValueSlots = mutableListOf() + val alternativeRoute2SourceValueSlots = mutableListOf() val addStyleLayerSlots = mutableListOf() val addStyleLayerPositionSlots = mutableListOf() val mockLayer = mockk { @@ -519,121 +518,121 @@ class MapboxRouteLineUtilsTest { verify { style.addStyleSource( - WAYPOINT_SOURCE_ID, capture(waypointSourceValueSlot) + WAYPOINT_SOURCE_ID, capture(waypointSourceValueSlots), ) } assertEquals( "geojson", - (waypointSourceValueSlot.captured.contents as HashMap)["type"]!!.contents + (waypointSourceValueSlots.last().contents as HashMap)["type"]!!.contents, ) assertEquals( 16L, - (waypointSourceValueSlot.captured.contents as HashMap)["maxzoom"]!! + (waypointSourceValueSlots.last().contents as HashMap)["maxzoom"]!! .contents ) assertEquals( "", - (waypointSourceValueSlot.captured.contents as HashMap)["data"]!!.contents + (waypointSourceValueSlots.last().contents as HashMap)["data"]!!.contents, ) assertEquals( DEFAULT_ROUTE_SOURCES_TOLERANCE, - (waypointSourceValueSlot.captured.contents as HashMap) + (waypointSourceValueSlots.last().contents as HashMap) ["tolerance"]!!.contents ) verify { style.addStyleSource( PRIMARY_ROUTE_SOURCE_ID, - capture(primaryRouteSourceValueSlot) + capture(primaryRouteSourceValueSlots), ) } assertEquals( "geojson", - (primaryRouteSourceValueSlot.captured.contents as HashMap)["type"] + (primaryRouteSourceValueSlots.last().contents as HashMap)["type"] !!.contents ) assertEquals( 16L, - (primaryRouteSourceValueSlot.captured.contents as HashMap)["maxzoom"] + (primaryRouteSourceValueSlots.last().contents as HashMap)["maxzoom"] !!.contents ) assertEquals( true, - (primaryRouteSourceValueSlot.captured.contents as HashMap)["lineMetrics"] + (primaryRouteSourceValueSlots.last().contents as HashMap)["lineMetrics"] !!.contents ) assertEquals( "", - (primaryRouteSourceValueSlot.captured.contents as HashMap)["data"] + (primaryRouteSourceValueSlots.last().contents as HashMap)["data"] !!.contents ) assertEquals( DEFAULT_ROUTE_SOURCES_TOLERANCE, - (primaryRouteSourceValueSlot.captured.contents as HashMap) + (primaryRouteSourceValueSlots.last().contents as HashMap) ["tolerance"]!!.contents ) verify { style.addStyleSource( ALTERNATIVE_ROUTE1_SOURCE_ID, - capture(alternativeRoute1SourceValueSlot) + capture(alternativeRoute1SourceValueSlots), ) } assertEquals( "geojson", - (alternativeRoute1SourceValueSlot.captured.contents as HashMap) + (alternativeRoute1SourceValueSlots.last().contents as HashMap) ["type"]!!.contents ) assertEquals( 16L, - (alternativeRoute1SourceValueSlot.captured.contents as HashMap) + (alternativeRoute1SourceValueSlots.last().contents as HashMap) ["maxzoom"]!!.contents ) assertEquals( true, - (alternativeRoute1SourceValueSlot.captured.contents as HashMap) + (alternativeRoute1SourceValueSlots.last().contents as HashMap) ["lineMetrics"]!!.contents ) assertEquals( "", - (alternativeRoute1SourceValueSlot.captured.contents as HashMap) + (alternativeRoute1SourceValueSlots.last().contents as HashMap) ["data"]!!.contents ) assertEquals( DEFAULT_ROUTE_SOURCES_TOLERANCE, - (alternativeRoute1SourceValueSlot.captured.contents as HashMap) + (alternativeRoute1SourceValueSlots.last().contents as HashMap) ["tolerance"]!!.contents ) verify { style.addStyleSource( ALTERNATIVE_ROUTE2_SOURCE_ID, - capture(alternativeRoute2SourceValueSlot) + capture(alternativeRoute2SourceValueSlots), ) } assertEquals( "geojson", - (alternativeRoute2SourceValueSlot.captured.contents as HashMap) + (alternativeRoute2SourceValueSlots.last().contents as HashMap) ["type"]!!.contents ) assertEquals( 16L, - (alternativeRoute2SourceValueSlot.captured.contents as HashMap) + (alternativeRoute2SourceValueSlots.last().contents as HashMap) ["maxzoom"]!!.contents ) assertEquals( true, - (alternativeRoute2SourceValueSlot.captured.contents as HashMap) + (alternativeRoute2SourceValueSlots.last().contents as HashMap) ["lineMetrics"]!!.contents ) assertEquals( "", - (alternativeRoute2SourceValueSlot.captured.contents as HashMap) + (alternativeRoute2SourceValueSlots.last().contents as HashMap) ["data"]!!.contents ) assertEquals( DEFAULT_ROUTE_SOURCES_TOLERANCE, - (alternativeRoute2SourceValueSlot.captured.contents as HashMap) + (alternativeRoute2SourceValueSlots.last().contents as HashMap) ["tolerance"]!!.contents ) diff --git a/libnavui-maps/src/test/java/com/mapbox/navigation/ui/maps/route/arrow/RouteArrowUtilsTest.kt b/libnavui-maps/src/test/java/com/mapbox/navigation/ui/maps/route/arrow/RouteArrowUtilsTest.kt index fbc6a71774f..97108989389 100644 --- a/libnavui-maps/src/test/java/com/mapbox/navigation/ui/maps/route/arrow/RouteArrowUtilsTest.kt +++ b/libnavui-maps/src/test/java/com/mapbox/navigation/ui/maps/route/arrow/RouteArrowUtilsTest.kt @@ -28,7 +28,6 @@ import com.mapbox.navigation.ui.maps.route.RouteLayerConstants.RESTRICTED_ROAD_L import com.mapbox.navigation.ui.maps.route.arrow.model.RouteArrowOptions import io.mockk.every import io.mockk.mockk -import io.mockk.slot import io.mockk.verify import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue @@ -191,8 +190,8 @@ class RouteArrowUtilsTest { @Test fun initializeLayers() { val options = RouteArrowOptions.Builder(ctx).build() - val shaftSourceValueSlot = slot() - val headSourceValueSlot = slot() + val shaftSourceValueSlots = mutableListOf() + val headSourceValueSlots = mutableListOf() val addStyleLayerSlots = mutableListOf() val addStyleLayerPositionSlots = mutableListOf() val mockImage = mockk(relaxed = true) @@ -224,46 +223,46 @@ class RouteArrowUtilsTest { verify { style.addStyleSource( ARROW_SHAFT_SOURCE_ID, - capture(shaftSourceValueSlot) + capture(shaftSourceValueSlots), ) } assertEquals( "geojson", - (shaftSourceValueSlot.captured.contents as HashMap)["type"]!!.contents + (shaftSourceValueSlots.last().contents as HashMap)["type"]!!.contents, ) assertEquals( 16L, - (shaftSourceValueSlot.captured.contents as HashMap)["maxzoom"]!!.contents + (shaftSourceValueSlots.last().contents as HashMap)["maxzoom"]!!.contents, ) assertEquals( "", - (shaftSourceValueSlot.captured.contents as HashMap)["data"]!!.contents + (shaftSourceValueSlots.last().contents as HashMap)["data"]!!.contents, ) assertEquals( DEFAULT_ROUTE_SOURCES_TOLERANCE, - (shaftSourceValueSlot.captured.contents as HashMap) + (shaftSourceValueSlots.last().contents as HashMap) ["tolerance"]!!.contents ) verify { - style.addStyleSource(ARROW_HEAD_SOURCE_ID, capture(headSourceValueSlot)) + style.addStyleSource(ARROW_HEAD_SOURCE_ID, capture(headSourceValueSlots)) } assertEquals( "geojson", - (headSourceValueSlot.captured.contents as HashMap)["type"]!!.contents + (headSourceValueSlots.last().contents as HashMap)["type"]!!.contents, ) assertEquals( 16L, - (headSourceValueSlot.captured.contents as HashMap)["maxzoom"]!!.contents + (headSourceValueSlots.last().contents as HashMap)["maxzoom"]!!.contents, ) assertEquals( "", - (headSourceValueSlot.captured.contents as HashMap)["data"]!! + (headSourceValueSlots.last().contents as HashMap)["data"]!! .contents.toString() ) assertEquals( DEFAULT_ROUTE_SOURCES_TOLERANCE, - (headSourceValueSlot.captured.contents as HashMap) + (headSourceValueSlots.last().contents as HashMap) ["tolerance"]!!.contents ) @@ -321,7 +320,7 @@ class RouteArrowUtilsTest { @Test fun initializeLayers_whenCustomAboveLayerConfigured() { val options = RouteArrowOptions.Builder(ctx).withAboveLayerId("foobar").build() - val shaftSourceValueSlot = slot() + val shaftSourceValueSlots = mutableListOf() val addStyleLayerSlots = mutableListOf() val addStyleLayerPositionSlots = mutableListOf() val mockImage = mockk(relaxed = true) @@ -355,7 +354,7 @@ class RouteArrowUtilsTest { verify { style.addStyleSource( ARROW_SHAFT_SOURCE_ID, - capture(shaftSourceValueSlot) + capture(shaftSourceValueSlots), ) } verify { @@ -386,8 +385,8 @@ class RouteArrowUtilsTest { fun initializeLayers_whenAboveLayerNotExists() { val mockImage = mockk(relaxed = true) val options = RouteArrowOptions.Builder(ctx).build() - val shaftSourceValueSlot = slot() - val headSourceValueSlot = slot() + val shaftSourceValueSlots = mutableListOf() + val headSourceValueSlots = mutableListOf() val addStyleLayerSlots = mutableListOf() val addStyleLayerPositionSlots = mutableListOf() val style = mockk