Loading src/com/android/settings/datausage/lib/NetworkCycleBucketRepository.kt +5 −11 Original line number Diff line number Diff line Loading @@ -18,11 +18,10 @@ package com.android.settings.datausage.lib import android.content.Context import android.net.NetworkTemplate import android.text.format.DateUtils import android.util.Range import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.asFourWeeks import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.bucketRange import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.getCycles import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.reverseBucketRange import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.Bucket import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.aggregate import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.filterTime Loading @@ -39,16 +38,11 @@ class NetworkCycleBucketRepository( getCycles().map { aggregateUsage(it) }.filter { it.usage > 0 } private fun getCycles(): List<Range<Long>> = networkCycleDataRepository.getPolicy()?.getCycles() ?: queryCyclesAsFourWeeks() networkCycleDataRepository.getPolicy()?.getCycles().orEmpty() .ifEmpty { queryCyclesAsFourWeeks() } private fun queryCyclesAsFourWeeks(): List<Range<Long>> { val timeRange = buckets.aggregate()?.timeRange ?: return emptyList() return reverseBucketRange( startTime = timeRange.lower, endTime = timeRange.upper, step = DateUtils.WEEK_IN_MILLIS * 4, ) } private fun queryCyclesAsFourWeeks(): List<Range<Long>> = buckets.aggregate()?.timeRange.asFourWeeks() fun queryChartData(usageData: NetworkUsageData) = NetworkCycleChartData( total = usageData, Loading src/com/android/settings/datausage/lib/NetworkCycleDataRepository.kt +12 −10 Original line number Diff line number Diff line Loading @@ -42,16 +42,10 @@ class NetworkCycleDataRepository( fun loadFirstCycle(): NetworkUsageData? = getCycles().firstOrNull()?.let { queryUsage(it) } override fun getCycles(): List<Range<Long>> = getPolicy()?.getCycles() ?: queryCyclesAsFourWeeks() getPolicy()?.getCycles().orEmpty().ifEmpty { queryCyclesAsFourWeeks() } private fun queryCyclesAsFourWeeks(): List<Range<Long>> { val timeRange = networkStatsRepository.getTimeRange() ?: return emptyList() return reverseBucketRange( startTime = timeRange.lower, endTime = timeRange.upper, step = DateUtils.WEEK_IN_MILLIS * 4, ) } private fun queryCyclesAsFourWeeks(): List<Range<Long>> = networkStatsRepository.getTimeRange().asFourWeeks() override fun getPolicy(): NetworkPolicy? = with(NetworkPolicyEditor(policyManager)) { Loading @@ -59,7 +53,6 @@ class NetworkCycleDataRepository( getPolicy(networkTemplate) } override fun queryUsage(range: Range<Long>) = NetworkUsageData( startTime = range.lower, endTime = range.upper, Loading @@ -71,6 +64,15 @@ class NetworkCycleDataRepository( Range(it.lower.toInstant().toEpochMilli(), it.upper.toInstant().toEpochMilli()) }.toList() fun Range<Long>?.asFourWeeks(): List<Range<Long>> { val timeRange = this ?: return emptyList() return reverseBucketRange( startTime = timeRange.lower, endTime = timeRange.upper, step = DateUtils.WEEK_IN_MILLIS * 4, ) } fun bucketRange(startTime: Long, endTime: Long, step: Long): List<Range<Long>> = (startTime..endTime step step).zipWithNext(::Range) Loading tests/spa_unit/src/com/android/settings/datausage/lib/NetworkCycleBucketRepositoryTest.kt +43 −15 Original line number Diff line number Diff line Loading @@ -42,6 +42,13 @@ class NetworkCycleBucketRepositoryTest { private val mockNetworkCycleDataRepository = mock<NetworkCycleDataRepository>() private fun createRepository(buckets: List<Bucket>) = NetworkCycleBucketRepository( context = context, networkTemplate = template, buckets = buckets, networkCycleDataRepository = mockNetworkCycleDataRepository, ) @Test fun loadCycles_byPolicy() { val policy = mock<NetworkPolicy> { Loading @@ -52,9 +59,7 @@ class NetworkCycleBucketRepositoryTest { mockNetworkCycleDataRepository.stub { on { getPolicy() } doReturn policy } val repository = NetworkCycleBucketRepository( context = context, networkTemplate = template, val repository = createRepository( buckets = listOf( Bucket( uid = 0, Loading @@ -62,8 +67,7 @@ class NetworkCycleBucketRepositoryTest { startTimeStamp = CYCLE1_START_TIME, endTimeStamp = CYCLE1_END_TIME, ) ), networkCycleDataRepository = mockNetworkCycleDataRepository, ) ) val cycles = repository.loadCycles() Loading @@ -78,13 +82,14 @@ class NetworkCycleBucketRepositoryTest { } @Test fun loadCycles_asFourWeeks() { fun loadCycles_policyHasNoCycle_asFourWeeks() { val policy = mock<NetworkPolicy> { on { cycleIterator() } doReturn emptyList<Range<ZonedDateTime>>().iterator() } mockNetworkCycleDataRepository.stub { on { getPolicy() } doReturn null on { getPolicy() } doReturn policy } val repository = NetworkCycleBucketRepository( context = context, networkTemplate = template, val repository = createRepository( buckets = listOf( Bucket( uid = 0, Loading @@ -92,8 +97,34 @@ class NetworkCycleBucketRepositoryTest { startTimeStamp = CYCLE2_START_TIME, endTimeStamp = CYCLE2_END_TIME, ) ) ) val cycles = repository.loadCycles() assertThat(cycles).containsExactly( NetworkUsageData( startTime = CYCLE2_END_TIME - DateUtils.WEEK_IN_MILLIS * 4, endTime = CYCLE2_END_TIME, usage = CYCLE2_BYTES, ), networkCycleDataRepository = mockNetworkCycleDataRepository, ) } @Test fun loadCycles_noPolicy_asFourWeeks() { mockNetworkCycleDataRepository.stub { on { getPolicy() } doReturn null } val repository = createRepository( buckets = listOf( Bucket( uid = 0, bytes = CYCLE2_BYTES, startTimeStamp = CYCLE2_START_TIME, endTimeStamp = CYCLE2_END_TIME, ) ) ) val cycles = repository.loadCycles() Loading @@ -114,9 +145,7 @@ class NetworkCycleBucketRepositoryTest { endTime = CYCLE4_END_TIME, usage = CYCLE3_BYTES + CYCLE4_BYTES, ) val repository = NetworkCycleBucketRepository( context = context, networkTemplate = template, val repository = createRepository( buckets = listOf( Bucket( uid = 0, Loading @@ -131,7 +160,6 @@ class NetworkCycleBucketRepositoryTest { endTimeStamp = CYCLE4_END_TIME, ), ), networkCycleDataRepository = mockNetworkCycleDataRepository, ) val summary = repository.queryChartData(cycle) Loading tests/spa_unit/src/com/android/settings/datausage/lib/NetworkCycleDataRepositoryTest.kt +23 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settings.testutils.zonedDateTime import com.google.common.truth.Truth.assertThat import java.time.ZonedDateTime import kotlinx.coroutines.test.runTest import org.junit.Test import org.junit.runner.RunWith Loading Loading @@ -77,7 +78,28 @@ class NetworkCycleDataRepositoryTest { } @Test fun loadFirstCycle_asFourWeeks() = runTest { fun loadFirstCycle_policyHasNoCycle_asFourWeeks() = runTest { val policy = mock<NetworkPolicy> { on { cycleIterator() } doReturn emptyList<Range<ZonedDateTime>>().iterator() } doReturn(policy).whenever(repository).getPolicy() mockNetworkStatsRepository.stub { on { getTimeRange() } doReturn Range(CYCLE2_START_TIME, CYCLE2_END_TIME) } val firstCycle = repository.loadFirstCycle() assertThat(firstCycle).isEqualTo( NetworkUsageData( startTime = CYCLE2_END_TIME - DateUtils.WEEK_IN_MILLIS * 4, endTime = CYCLE2_END_TIME, usage = CYCLE2_BYTES, ), ) } @Test fun loadFirstCycle_noPolicy_asFourWeeks() = runTest { doReturn(null).whenever(repository).getPolicy() mockNetworkStatsRepository.stub { on { getTimeRange() } doReturn Range(CYCLE2_START_TIME, CYCLE2_END_TIME) Loading Loading
src/com/android/settings/datausage/lib/NetworkCycleBucketRepository.kt +5 −11 Original line number Diff line number Diff line Loading @@ -18,11 +18,10 @@ package com.android.settings.datausage.lib import android.content.Context import android.net.NetworkTemplate import android.text.format.DateUtils import android.util.Range import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.asFourWeeks import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.bucketRange import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.getCycles import com.android.settings.datausage.lib.NetworkCycleDataRepository.Companion.reverseBucketRange import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.Bucket import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.aggregate import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.filterTime Loading @@ -39,16 +38,11 @@ class NetworkCycleBucketRepository( getCycles().map { aggregateUsage(it) }.filter { it.usage > 0 } private fun getCycles(): List<Range<Long>> = networkCycleDataRepository.getPolicy()?.getCycles() ?: queryCyclesAsFourWeeks() networkCycleDataRepository.getPolicy()?.getCycles().orEmpty() .ifEmpty { queryCyclesAsFourWeeks() } private fun queryCyclesAsFourWeeks(): List<Range<Long>> { val timeRange = buckets.aggregate()?.timeRange ?: return emptyList() return reverseBucketRange( startTime = timeRange.lower, endTime = timeRange.upper, step = DateUtils.WEEK_IN_MILLIS * 4, ) } private fun queryCyclesAsFourWeeks(): List<Range<Long>> = buckets.aggregate()?.timeRange.asFourWeeks() fun queryChartData(usageData: NetworkUsageData) = NetworkCycleChartData( total = usageData, Loading
src/com/android/settings/datausage/lib/NetworkCycleDataRepository.kt +12 −10 Original line number Diff line number Diff line Loading @@ -42,16 +42,10 @@ class NetworkCycleDataRepository( fun loadFirstCycle(): NetworkUsageData? = getCycles().firstOrNull()?.let { queryUsage(it) } override fun getCycles(): List<Range<Long>> = getPolicy()?.getCycles() ?: queryCyclesAsFourWeeks() getPolicy()?.getCycles().orEmpty().ifEmpty { queryCyclesAsFourWeeks() } private fun queryCyclesAsFourWeeks(): List<Range<Long>> { val timeRange = networkStatsRepository.getTimeRange() ?: return emptyList() return reverseBucketRange( startTime = timeRange.lower, endTime = timeRange.upper, step = DateUtils.WEEK_IN_MILLIS * 4, ) } private fun queryCyclesAsFourWeeks(): List<Range<Long>> = networkStatsRepository.getTimeRange().asFourWeeks() override fun getPolicy(): NetworkPolicy? = with(NetworkPolicyEditor(policyManager)) { Loading @@ -59,7 +53,6 @@ class NetworkCycleDataRepository( getPolicy(networkTemplate) } override fun queryUsage(range: Range<Long>) = NetworkUsageData( startTime = range.lower, endTime = range.upper, Loading @@ -71,6 +64,15 @@ class NetworkCycleDataRepository( Range(it.lower.toInstant().toEpochMilli(), it.upper.toInstant().toEpochMilli()) }.toList() fun Range<Long>?.asFourWeeks(): List<Range<Long>> { val timeRange = this ?: return emptyList() return reverseBucketRange( startTime = timeRange.lower, endTime = timeRange.upper, step = DateUtils.WEEK_IN_MILLIS * 4, ) } fun bucketRange(startTime: Long, endTime: Long, step: Long): List<Range<Long>> = (startTime..endTime step step).zipWithNext(::Range) Loading
tests/spa_unit/src/com/android/settings/datausage/lib/NetworkCycleBucketRepositoryTest.kt +43 −15 Original line number Diff line number Diff line Loading @@ -42,6 +42,13 @@ class NetworkCycleBucketRepositoryTest { private val mockNetworkCycleDataRepository = mock<NetworkCycleDataRepository>() private fun createRepository(buckets: List<Bucket>) = NetworkCycleBucketRepository( context = context, networkTemplate = template, buckets = buckets, networkCycleDataRepository = mockNetworkCycleDataRepository, ) @Test fun loadCycles_byPolicy() { val policy = mock<NetworkPolicy> { Loading @@ -52,9 +59,7 @@ class NetworkCycleBucketRepositoryTest { mockNetworkCycleDataRepository.stub { on { getPolicy() } doReturn policy } val repository = NetworkCycleBucketRepository( context = context, networkTemplate = template, val repository = createRepository( buckets = listOf( Bucket( uid = 0, Loading @@ -62,8 +67,7 @@ class NetworkCycleBucketRepositoryTest { startTimeStamp = CYCLE1_START_TIME, endTimeStamp = CYCLE1_END_TIME, ) ), networkCycleDataRepository = mockNetworkCycleDataRepository, ) ) val cycles = repository.loadCycles() Loading @@ -78,13 +82,14 @@ class NetworkCycleBucketRepositoryTest { } @Test fun loadCycles_asFourWeeks() { fun loadCycles_policyHasNoCycle_asFourWeeks() { val policy = mock<NetworkPolicy> { on { cycleIterator() } doReturn emptyList<Range<ZonedDateTime>>().iterator() } mockNetworkCycleDataRepository.stub { on { getPolicy() } doReturn null on { getPolicy() } doReturn policy } val repository = NetworkCycleBucketRepository( context = context, networkTemplate = template, val repository = createRepository( buckets = listOf( Bucket( uid = 0, Loading @@ -92,8 +97,34 @@ class NetworkCycleBucketRepositoryTest { startTimeStamp = CYCLE2_START_TIME, endTimeStamp = CYCLE2_END_TIME, ) ) ) val cycles = repository.loadCycles() assertThat(cycles).containsExactly( NetworkUsageData( startTime = CYCLE2_END_TIME - DateUtils.WEEK_IN_MILLIS * 4, endTime = CYCLE2_END_TIME, usage = CYCLE2_BYTES, ), networkCycleDataRepository = mockNetworkCycleDataRepository, ) } @Test fun loadCycles_noPolicy_asFourWeeks() { mockNetworkCycleDataRepository.stub { on { getPolicy() } doReturn null } val repository = createRepository( buckets = listOf( Bucket( uid = 0, bytes = CYCLE2_BYTES, startTimeStamp = CYCLE2_START_TIME, endTimeStamp = CYCLE2_END_TIME, ) ) ) val cycles = repository.loadCycles() Loading @@ -114,9 +145,7 @@ class NetworkCycleBucketRepositoryTest { endTime = CYCLE4_END_TIME, usage = CYCLE3_BYTES + CYCLE4_BYTES, ) val repository = NetworkCycleBucketRepository( context = context, networkTemplate = template, val repository = createRepository( buckets = listOf( Bucket( uid = 0, Loading @@ -131,7 +160,6 @@ class NetworkCycleBucketRepositoryTest { endTimeStamp = CYCLE4_END_TIME, ), ), networkCycleDataRepository = mockNetworkCycleDataRepository, ) val summary = repository.queryChartData(cycle) Loading
tests/spa_unit/src/com/android/settings/datausage/lib/NetworkCycleDataRepositoryTest.kt +23 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settings.testutils.zonedDateTime import com.google.common.truth.Truth.assertThat import java.time.ZonedDateTime import kotlinx.coroutines.test.runTest import org.junit.Test import org.junit.runner.RunWith Loading Loading @@ -77,7 +78,28 @@ class NetworkCycleDataRepositoryTest { } @Test fun loadFirstCycle_asFourWeeks() = runTest { fun loadFirstCycle_policyHasNoCycle_asFourWeeks() = runTest { val policy = mock<NetworkPolicy> { on { cycleIterator() } doReturn emptyList<Range<ZonedDateTime>>().iterator() } doReturn(policy).whenever(repository).getPolicy() mockNetworkStatsRepository.stub { on { getTimeRange() } doReturn Range(CYCLE2_START_TIME, CYCLE2_END_TIME) } val firstCycle = repository.loadFirstCycle() assertThat(firstCycle).isEqualTo( NetworkUsageData( startTime = CYCLE2_END_TIME - DateUtils.WEEK_IN_MILLIS * 4, endTime = CYCLE2_END_TIME, usage = CYCLE2_BYTES, ), ) } @Test fun loadFirstCycle_noPolicy_asFourWeeks() = runTest { doReturn(null).whenever(repository).getPolicy() mockNetworkStatsRepository.stub { on { getTimeRange() } doReturn Range(CYCLE2_START_TIME, CYCLE2_END_TIME) Loading