summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/offline/OfflineManagerTest.kt
blob: dd22d28f8475f5a2d85861c26ae420f134c897b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package com.mapbox.mapboxsdk.testapp.offline

import android.R
import android.content.Context
import android.support.test.espresso.Espresso.onView
import android.support.test.espresso.IdlingRegistry
import android.support.test.espresso.UiController
import android.support.test.espresso.assertion.ViewAssertions.matches
import android.support.test.espresso.idling.CountingIdlingResource
import android.support.test.espresso.matcher.ViewMatchers.isDisplayed
import android.support.test.espresso.matcher.ViewMatchers.withId
import android.support.test.runner.AndroidJUnit4
import com.mapbox.mapboxsdk.maps.MapboxMap
import com.mapbox.mapboxsdk.offline.OfflineManager
import com.mapbox.mapboxsdk.offline.OfflineRegion
import com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke
import com.mapbox.mapboxsdk.testapp.activity.BaseActivityTest
import com.mapbox.mapboxsdk.testapp.activity.espresso.EspressoTestActivity
import org.junit.Test
import org.junit.runner.RunWith
import java.io.File
import java.io.FileOutputStream

@RunWith(AndroidJUnit4::class)
class OfflineManagerTest : BaseActivityTest() {

  companion object {
    private const val TEST_DB_FILE_NAME = "offline.db"
  }

  private val context: Context by lazy { rule.activity }

  private lateinit var offlineIdlingResource: CountingIdlingResource

  override fun getActivityClass(): Class<*> {
    return EspressoTestActivity::class.java
  }

  override fun beforeTest() {
    super.beforeTest()
    offlineIdlingResource = CountingIdlingResource("idling_resource")
    IdlingRegistry.getInstance().register(offlineIdlingResource)
  }

  @Test
  fun offlineMergeListDeleteTest() {
    validateTestSetup()

    invoke(mapboxMap) { _: UiController, _: MapboxMap ->
      offlineIdlingResource.increment()
      copyAsset(context)
      OfflineManager.getInstance(context).mergeOfflineRegions(
        context.filesDir.absolutePath + "/" + TEST_DB_FILE_NAME,
        object : OfflineManager.MergeOfflineRegionsCallback {
          override fun onMerge(offlineRegions: Array<out OfflineRegion>?) {
            assert(offlineRegions?.size == 1)
            offlineIdlingResource.decrement()
          }

          override fun onError(error: String?) {
            throw RuntimeException("Unable to merge external offline database. $error")
          }
        })
    }

    invoke(mapboxMap) { _: UiController, _: MapboxMap ->
      offlineIdlingResource.increment()
      OfflineManager.getInstance(context).listOfflineRegions(object : OfflineManager.ListOfflineRegionsCallback {
        override fun onList(offlineRegions: Array<out OfflineRegion>?) {
          assert(offlineRegions?.size == 1)
          if (offlineRegions != null) {
            for (region in offlineRegions) {
              offlineIdlingResource.increment()
              region.delete(object : OfflineRegion.OfflineRegionDeleteCallback {
                override fun onDelete() {
                  offlineIdlingResource.decrement()
                }

                override fun onError(error: String?) {
                  throw RuntimeException("Unable to delete region with ID: ${region.id}. $error")
                }
              })
            }
          } else {
            throw RuntimeException("Unable to find merged region.")
          }
          offlineIdlingResource.decrement()
        }

        override fun onError(error: String?) {
          throw RuntimeException("Unable to obtain offline regions list. $error")
        }
      })
    }

    // waiting for offline idling resource
    onView(withId(R.id.content)).check(matches(isDisplayed()))
  }

  override fun afterTest() {
    super.afterTest()
    IdlingRegistry.getInstance().unregister(offlineIdlingResource)
  }

  private fun copyAsset(context: Context) {
    val bufferSize = 1024
    val assetManager = context.assets
    val inputStream = assetManager.open(TEST_DB_FILE_NAME)
    val outputStream = FileOutputStream(File(context.filesDir.absoluteFile, TEST_DB_FILE_NAME))

    try {
      inputStream.copyTo(outputStream, bufferSize)
    } finally {
      inputStream.close()
      outputStream.flush()
      outputStream.close()
    }
  }
}