Skip to content
This repository has been archived by the owner on Aug 30, 2023. It is now read-only.

feat: Take sampleRate from metadata #262

Merged
merged 1 commit into from
Feb 11, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ final class ManifestMetadataReader {
static final String DSN_KEY = "io.sentry.dsn";
static final String DEBUG_KEY = "io.sentry.debug";
static final String DEBUG_LEVEL = "io.sentry.debug.level";
static final String SAMPLE_RATE = "io.sentry.sample-rate";
static final String ANR_ENABLE = "io.sentry.anr.enable";
static final String ANR_REPORT_DEBUG = "io.sentry.anr.report-debug";
static final String ANR_TIMEOUT_INTERVAL_MILLS = "io.sentry.anr.timeout-interval-mills";
Expand All @@ -22,8 +23,9 @@ final class ManifestMetadataReader {

private ManifestMetadataReader() {}

static void applyMetadata(Context context, SentryAndroidOptions options) {
static void applyMetadata(@NotNull Context context, @NotNull SentryAndroidOptions options) {
if (context == null) throw new IllegalArgumentException("The application context is required.");
if (options == null) throw new IllegalArgumentException("The options object is required.");

try {
Bundle metadata = getMetadata(context);
Expand All @@ -44,6 +46,14 @@ static void applyMetadata(Context context, SentryAndroidOptions options) {
options.getLogger().log(SentryLevel.DEBUG, "isAnrEnabled read: %s", isAnrEnabled);
options.setAnrEnabled(isAnrEnabled);

if (options.getSampleRate() == null) {
Double sampleRate = metadata.getDouble(SAMPLE_RATE, -1);
options.getLogger().log(SentryLevel.DEBUG, "sampleRate read: %s", sampleRate);
if (sampleRate != -1) {
options.setSampleRate(sampleRate);
}
}
marandaneto marked this conversation as resolved.
Show resolved Hide resolved

boolean isAnrReportInDebug =
metadata.getBoolean(ANR_REPORT_DEBUG, options.isAnrReportInDebug());
options
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,25 @@
package io.sentry.android.core

import android.content.Context
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.os.Bundle
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.anyVararg
import com.nhaarman.mockitokotlin2.argWhere
import com.nhaarman.mockitokotlin2.eq
import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.never
import com.nhaarman.mockitokotlin2.verify
import com.nhaarman.mockitokotlin2.whenever
import io.sentry.core.ILogger
import io.sentry.core.SentryLevel
import kotlin.test.BeforeTest
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNull
import kotlin.test.assertTrue
import org.junit.runner.RunWith

Expand Down Expand Up @@ -43,4 +51,72 @@ class ManifestMetadataReaderTest {
options.setLogger(logger)
verify(logger, never()).log(eq(SentryLevel.ERROR), any<String>(), any())
}

@Test
fun `applyMetadata reads sampleRate from metadata`() {
// Arrange
val options = SentryAndroidOptions()
val expectedPackageName = "io.sentry.test"
val expectedSampleRate = 0.99
val contextMock: Context = mock()
whenever(contextMock.packageName).thenReturn(expectedPackageName)
val bundle: Bundle = mock()
whenever(bundle.getDouble(eq(ManifestMetadataReader.SAMPLE_RATE), anyVararg())).thenReturn(expectedSampleRate)
val packageManagerMock: PackageManager = mock()
val applicationInfo: ApplicationInfo = mock()
applicationInfo.metaData = bundle
whenever(packageManagerMock.getApplicationInfo(argWhere { it == expectedPackageName }, eq(PackageManager.GET_META_DATA))).thenReturn(applicationInfo)
whenever(contextMock.packageManager).thenReturn(packageManagerMock)

// Act
ManifestMetadataReader.applyMetadata(contextMock, options)

// Assert
assertEquals(expectedSampleRate, options.sampleRate)
}

@Test
fun `applyMetadata does not override sampleRate from options`() {
// Arrange
val expectedSampleRate = 0.99
val options = SentryAndroidOptions()
options.sampleRate = expectedSampleRate
val expectedPackageName = "io.sentry.test"
val contextMock: Context = mock()
whenever(contextMock.packageName).thenReturn(expectedPackageName)
val bundle: Bundle = mock()
whenever(bundle.getDouble(eq(ManifestMetadataReader.SAMPLE_RATE), anyVararg())).thenReturn(0.1)
val packageManagerMock: PackageManager = mock()
val applicationInfo: ApplicationInfo = mock()
applicationInfo.metaData = bundle
whenever(packageManagerMock.getApplicationInfo(argWhere { it == expectedPackageName }, eq(PackageManager.GET_META_DATA))).thenReturn(applicationInfo)
whenever(contextMock.packageManager).thenReturn(packageManagerMock)

// Act
ManifestMetadataReader.applyMetadata(contextMock, options)

// Assert
assertEquals(expectedSampleRate, options.sampleRate)
}

@Test
fun `applyMetadata without specifying sampleRate, stays null`() {
// Arrange
val options = SentryAndroidOptions()
val expectedPackageName = "io.sentry.test"
val contextMock: Context = mock()
whenever(contextMock.packageName).thenReturn(expectedPackageName)
val bundle: Bundle = mock()
val packageManagerMock: PackageManager = mock()
val applicationInfo: ApplicationInfo = mock()
applicationInfo.metaData = bundle
whenever(packageManagerMock.getApplicationInfo(argWhere { it == expectedPackageName }, eq(PackageManager.GET_META_DATA))).thenReturn(applicationInfo)
whenever(contextMock.packageManager).thenReturn(packageManagerMock)

// Act
ManifestMetadataReader.applyMetadata(contextMock, options)

// Assert
assertNull(options.sampleRate)
}
}