diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 000000000..d87cba2b3 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,29 @@ +name: Lint project + +on: + pull_request: + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - name: Checkout submodules + uses: actions/checkout@v4 + with: + fetch-depth: 1 + token: ${{ secrets.ACCESS_TOKEN }} + persist-credentials: false + + - name: set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: 17.0.10 + distribution: "adopt" + cache: gradle + + - name: Accept Android SDK licences + run: yes | "${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" --licenses + + - name: Lint - check Code Style + run: ./gradlew spotlessCheck diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0f6425fd0..3cbca18ec 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,9 +36,6 @@ jobs: - name: Accept Android SDK licences run: yes | "${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" --licenses - - name: Check Code Style - run: ./gradlew spotlessCheck - - name: Build and check run: ./gradlew assembleDebug assembleDebugAndroidTest build check diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index adcdd78d9..93249b643 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,16 +7,17 @@ repos: language: system stages: [pre-commit] pass_filenames: false -## TODO: before merge - remove above and uncomment below -# - id: spotless-apply -# name: Spotless Apply -# entry: ./gradlew spotlessApply -# language: system -# stages: [pre-commit] -# pass_filenames: false -# - id: spotless-check -# name: Spotless Check -# entry: ./gradlew spotlessCheck -# language: system -# stages: [pre-commit] -# pass_filenames: false + + - id: spotless-apply + name: Spotless Apply + entry: ./gradlew spotlessApply + language: system + stages: [pre-commit] + pass_filenames: false + + - id: spotless-check + name: Spotless Check + entry: ./gradlew spotlessCheck + language: system + stages: [pre-commit] + pass_filenames: false diff --git a/backtrace-library/build.gradle b/backtrace-library/build.gradle index a0c05d3d7..ed9cf57a4 100644 --- a/backtrace-library/build.gradle +++ b/backtrace-library/build.gradle @@ -1,3 +1,5 @@ +import com.diffplug.gradle.spotless.SpotlessTask + plugins { id 'com.android.library' id 'com.gladed.androidgitversion' version '0.4.14' @@ -129,3 +131,7 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.7.0' androidTestImplementation "org.mockito:mockito-android:5.19.0" } + +tasks.withType(SpotlessTask).configureEach { + enabled = false +} diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/ApplicationMetadataTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/ApplicationMetadataTest.java index ca4e07275..96f9e8695 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/ApplicationMetadataTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/ApplicationMetadataTest.java @@ -5,16 +5,13 @@ import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - +import backtraceio.library.common.ApplicationMetadataCache; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import backtraceio.library.common.ApplicationMetadataCache; - @RunWith(AndroidJUnit4.class) public class ApplicationMetadataTest { private Context context; @@ -44,5 +41,4 @@ public void shouldCorrectlyRetrieveApplicationVersion() throws PackageManager.Na PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getOpPackageName(), 0); assertEquals(cache.getApplicationVersion(), String.valueOf(packageInfo.versionCode)); } - } diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientAttachmentsTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientAttachmentsTest.java index d9f54ec27..6385a715b 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientAttachmentsTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientAttachmentsTest.java @@ -6,25 +6,20 @@ import static org.junit.Assert.assertNotNull; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; - import backtraceio.library.events.OnServerResponseEventListener; import backtraceio.library.events.RequestHandler; import backtraceio.library.models.BacktraceData; import backtraceio.library.models.BacktraceResult; import backtraceio.library.models.types.BacktraceResultStatus; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import net.jodah.concurrentunit.Waiter; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceClientAttachmentsTest { @@ -50,10 +45,12 @@ public void sendBacktraceExceptionAttachments() { // GIVEN final String attachment0 = "/someDir/someFile.log"; final String attachment1 = "/someDir/someOtherFile.log"; - List attachments = new ArrayList() {{ - add(attachment0); - add(attachment1); - }}; + List attachments = new ArrayList() { + { + add(attachment0); + add(attachment1); + } + }; BacktraceClient backtraceClient = new BacktraceClient(context, credentials, database, attachments); @@ -61,32 +58,31 @@ public void sendBacktraceExceptionAttachments() { RequestHandler rh = new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new Exception(resultMessage), new - OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - // THEN - assertEquals(resultMessage, backtraceResult.message); - assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertNotNull(backtraceResult.getBacktraceReport()); - assertNotNull(backtraceResult.getBacktraceReport().exception); - - // We should have the file attachment paths included - assertEquals(2, backtraceResult.getBacktraceReport().attachmentPaths.size()); - assertTrue(backtraceResult.getBacktraceReport().attachmentPaths.contains(attachment0)); - assertTrue(backtraceResult.getBacktraceReport().attachmentPaths.contains(attachment1)); - - waiter.resume(); - } - } - ); + backtraceClient.send(new Exception(resultMessage), new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + // THEN + assertEquals(resultMessage, backtraceResult.message); + assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); + assertNotNull(backtraceResult.getBacktraceReport()); + assertNotNull(backtraceResult.getBacktraceReport().exception); + + // We should have the file attachment paths included + assertEquals( + 2, backtraceResult.getBacktraceReport().attachmentPaths.size()); + assertTrue(backtraceResult.getBacktraceReport().attachmentPaths.contains(attachment0)); + assertTrue(backtraceResult.getBacktraceReport().attachmentPaths.contains(attachment1)); + + waiter.resume(); + } + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); @@ -104,30 +100,29 @@ public void sendBacktraceExceptionNoAttachments() { RequestHandler rh = new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new Exception(resultMessage), new - OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - // THEN - assertEquals(resultMessage, backtraceResult.message); - assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertNotNull(backtraceResult.getBacktraceReport()); - assertNotNull(backtraceResult.getBacktraceReport().exception); - - // We should NOT have any attachment paths included by default - assertEquals(0, backtraceResult.getBacktraceReport().attachmentPaths.size()); - - waiter.resume(); - } - } - ); + backtraceClient.send(new Exception(resultMessage), new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + // THEN + assertEquals(resultMessage, backtraceResult.message); + assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); + assertNotNull(backtraceResult.getBacktraceReport()); + assertNotNull(backtraceResult.getBacktraceReport().exception); + + // We should NOT have any attachment paths included by default + assertEquals( + 0, backtraceResult.getBacktraceReport().attachmentPaths.size()); + + waiter.resume(); + } + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientAttributeTests.java b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientAttributeTests.java index de6437747..7a7b32762 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientAttributeTests.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientAttributeTests.java @@ -5,26 +5,21 @@ import static org.junit.Assert.assertNotNull; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - +import backtraceio.library.events.RequestHandler; +import backtraceio.library.models.BacktraceResult; +import backtraceio.library.models.types.BacktraceResultStatus; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; import net.jodah.concurrentunit.Waiter; - import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -import backtraceio.library.events.RequestHandler; -import backtraceio.library.models.BacktraceResult; -import backtraceio.library.models.types.BacktraceResultStatus; - @RunWith(AndroidJUnit4.class) public class BacktraceClientAttributeTests { private Context context; @@ -142,15 +137,14 @@ public void attributesShouldBeAvailableInReport() { Object value = data.getAttributes().get(attributeKey); assertNotNull(value); assertEquals(value, attributeValue); - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); }; backtraceClient.setOnRequestHandler(rh); final Waiter waiter = new Waiter(); // WHEN - backtraceClient.send(new Exception(errorMessage), backtraceResult -> waiter.resume() - ); + backtraceClient.send(new Exception(errorMessage), backtraceResult -> waiter.resume()); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); @@ -158,5 +152,4 @@ public void attributesShouldBeAvailableInReport() { fail(ex.getMessage()); } } - } diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientBreadcrumbsTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientBreadcrumbsTest.java index 036266555..6693de8b2 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientBreadcrumbsTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientBreadcrumbsTest.java @@ -7,27 +7,8 @@ import static org.junit.Assert.assertNull; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import junit.framework.TestCase; - -import net.jodah.concurrentunit.Waiter; - -import org.json.JSONObject; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; - import backtraceio.library.breadcrumbs.BacktraceBreadcrumbs; import backtraceio.library.events.OnServerResponseEventListener; import backtraceio.library.events.RequestHandler; @@ -35,6 +16,19 @@ import backtraceio.library.models.BacktraceData; import backtraceio.library.models.BacktraceResult; import backtraceio.library.models.types.BacktraceResultStatus; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import junit.framework.TestCase; +import net.jodah.concurrentunit.Waiter; +import org.json.JSONObject; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceClientBreadcrumbsTest { @@ -52,7 +46,8 @@ public void setUp() { context = InstrumentationRegistry.getInstrumentation().getContext(); credentials = new BacktraceCredentials("https://example-endpoint.com/", ""); - BacktraceDatabase database = new BacktraceDatabase(context, context.getFilesDir().getAbsolutePath()); + BacktraceDatabase database = + new BacktraceDatabase(context, context.getFilesDir().getAbsolutePath()); backtraceClient = new BacktraceClient(context, credentials, database); } @@ -73,36 +68,34 @@ public void sendBacktraceExceptionBreadcrumbs() { RequestHandler rh = new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new Exception(resultMessage), new - OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - // THEN - assertEquals(resultMessage, backtraceResult.message); - assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertNotNull(backtraceResult.getBacktraceReport()); - assertNotNull(backtraceResult.getBacktraceReport().attributes); - assertNotNull(backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); - assertNotNull(backtraceResult.getBacktraceReport().exception); - - // We should have the breadcrumbs attachment path included if breadcrumbs are enabled - assertNotEquals(0, backtraceResult.getBacktraceReport().attachmentPaths.size()); - - // We log one breadcrumb by default, the breadcrumb configuration - assertEquals(1L, - backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); - - waiter.resume(); - } - } - ); + backtraceClient.send(new Exception(resultMessage), new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + // THEN + assertEquals(resultMessage, backtraceResult.message); + assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); + assertNotNull(backtraceResult.getBacktraceReport()); + assertNotNull(backtraceResult.getBacktraceReport().attributes); + assertNotNull(backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); + assertNotNull(backtraceResult.getBacktraceReport().exception); + + // We should have the breadcrumbs attachment path included if breadcrumbs are enabled + assertNotEquals( + 0, backtraceResult.getBacktraceReport().attachmentPaths.size()); + + // We log one breadcrumb by default, the breadcrumb configuration + assertEquals(1L, backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); + + waiter.resume(); + } + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); @@ -122,8 +115,8 @@ public void sendBacktraceExceptionBreadcrumbsAddBreadcrumb() { RequestHandler rh = new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); @@ -141,29 +134,30 @@ public BacktraceResult onRequest(BacktraceData data) { TestCase.assertEquals("breadcrumb", parsedBreadcrumb.get("message")); // WHEN - backtraceClient.send(new Exception(resultMessage), new - OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - // THEN - assertEquals(resultMessage, backtraceResult.message); - assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertNotNull(backtraceResult.getBacktraceReport()); - assertNotNull(backtraceResult.getBacktraceReport().attributes); - assertNotNull(backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); - assertNotNull(backtraceResult.getBacktraceReport().exception); - - // We should have the breadcrumbs attachment path included if breadcrumbs are enabled - assertNotEquals(0, backtraceResult.getBacktraceReport().attachmentPaths.size()); - - // After adding a new breadcrumb, we should have incremented the breadcrumbs.lastId - assertEquals(2L, - backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); - - waiter.resume(); - } - } - ); + backtraceClient.send(new Exception(resultMessage), new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + // THEN + assertEquals(resultMessage, backtraceResult.message); + assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); + assertNotNull(backtraceResult.getBacktraceReport()); + assertNotNull(backtraceResult.getBacktraceReport().attributes); + assertNotNull( + backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); + assertNotNull(backtraceResult.getBacktraceReport().exception); + + // We should have the breadcrumbs attachment path included if breadcrumbs are enabled + assertNotEquals( + 0, + backtraceResult.getBacktraceReport().attachmentPaths.size()); + + // After adding a new breadcrumb, we should have incremented the breadcrumbs.lastId + assertEquals( + 2L, backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); + + waiter.resume(); + } + }); waiter.await(5, TimeUnit.SECONDS); } catch (Exception ex) { fail(ex.getMessage()); @@ -181,8 +175,8 @@ public void sendBacktraceExceptionBreadcrumbsClearBreadcrumb() { RequestHandler rh = new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); @@ -193,29 +187,30 @@ public BacktraceResult onRequest(BacktraceData data) { backtraceClient.addBreadcrumb("breadcrumb2"); // WHEN - backtraceClient.send(new Exception(resultMessage), new - OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - // THEN - assertEquals(resultMessage, backtraceResult.message); - assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertNotNull(backtraceResult.getBacktraceReport()); - assertNotNull(backtraceResult.getBacktraceReport().attributes); - assertNotNull(backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); - assertNotNull(backtraceResult.getBacktraceReport().exception); - - // We should have the breadcrumbs attachment path included if breadcrumbs are enabled - assertNotEquals(0, backtraceResult.getBacktraceReport().attachmentPaths.size()); - - // After adding new breadcrumbs, we should have incremented the breadcrumbs.lastId - assertEquals(3L, - (long) backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); - - waiter.resume(); - } - } - ); + backtraceClient.send(new Exception(resultMessage), new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + // THEN + assertEquals(resultMessage, backtraceResult.message); + assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); + assertNotNull(backtraceResult.getBacktraceReport()); + assertNotNull(backtraceResult.getBacktraceReport().attributes); + assertNotNull( + backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); + assertNotNull(backtraceResult.getBacktraceReport().exception); + + // We should have the breadcrumbs attachment path included if breadcrumbs are enabled + assertNotEquals( + 0, + backtraceResult.getBacktraceReport().attachmentPaths.size()); + + // After adding new breadcrumbs, we should have incremented the breadcrumbs.lastId + assertEquals(3L, (long) + backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); + + waiter.resume(); + } + }); List breadcrumbLogFileData = readBreadcrumbLogFile(); TestCase.assertEquals(3, breadcrumbLogFileData.size()); @@ -231,29 +226,30 @@ public void onEvent(BacktraceResult backtraceResult) { backtraceClient.clearBreadcrumbs(); // WHEN - backtraceClient.send(new Exception(resultMessage), new - OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - // THEN - assertEquals(resultMessage, backtraceResult.message); - assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertNotNull(backtraceResult.getBacktraceReport()); - assertNotNull(backtraceResult.getBacktraceReport().attributes); - assertNotNull(backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); - assertNotNull(backtraceResult.getBacktraceReport().exception); - - // We should have the breadcrumbs attachment path included if breadcrumbs are enabled - assertNotEquals(0, backtraceResult.getBacktraceReport().attachmentPaths.size()); - - // Since we cleared, we should only have the configuration breadcrumb - assertEquals(1L, - backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); - - waiter.resume(); - } - } - ); + backtraceClient.send(new Exception(resultMessage), new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + // THEN + assertEquals(resultMessage, backtraceResult.message); + assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); + assertNotNull(backtraceResult.getBacktraceReport()); + assertNotNull(backtraceResult.getBacktraceReport().attributes); + assertNotNull( + backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); + assertNotNull(backtraceResult.getBacktraceReport().exception); + + // We should have the breadcrumbs attachment path included if breadcrumbs are enabled + assertNotEquals( + 0, + backtraceResult.getBacktraceReport().attachmentPaths.size()); + + // Since we cleared, we should only have the configuration breadcrumb + assertEquals( + 1L, backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); + + waiter.resume(); + } + }); breadcrumbLogFileData = readBreadcrumbLogFile(); TestCase.assertEquals(1, breadcrumbLogFileData.size()); @@ -276,32 +272,31 @@ public void sendBacktraceExceptionNoBreadcrumbs() { RequestHandler rh = new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new Exception(resultMessage), new - OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - // THEN - assertEquals(resultMessage, backtraceResult.message); - assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertNotNull(backtraceResult.getBacktraceReport()); - assertNotNull(backtraceResult.getBacktraceReport().attributes); - assertNotNull(backtraceResult.getBacktraceReport().exception); - - // We should NOT have the breadcrumbs attachment path included by default - assertEquals(0, backtraceResult.getBacktraceReport().attachmentPaths.size()); - - assertNull(backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); - waiter.resume(); - } - } - ); + backtraceClient.send(new Exception(resultMessage), new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + // THEN + assertEquals(resultMessage, backtraceResult.message); + assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); + assertNotNull(backtraceResult.getBacktraceReport()); + assertNotNull(backtraceResult.getBacktraceReport().attributes); + assertNotNull(backtraceResult.getBacktraceReport().exception); + + // We should NOT have the breadcrumbs attachment path included by default + assertEquals( + 0, backtraceResult.getBacktraceReport().attachmentPaths.size()); + + assertNull(backtraceResult.getBacktraceReport().attributes.get("breadcrumbs.lastId")); + waiter.resume(); + } + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); @@ -324,7 +319,8 @@ public void verifyBreadcrumbCallbackInvocation() { } public List readBreadcrumbLogFile() throws IOException { - BacktraceBreadcrumbs breadcrumbs = new BacktraceBreadcrumbs(context.getFilesDir().getAbsolutePath()); + BacktraceBreadcrumbs breadcrumbs = + new BacktraceBreadcrumbs(context.getFilesDir().getAbsolutePath()); File breadcrumbLogFile = new File(breadcrumbs.getBreadcrumbLogPath()); List breadcrumbLogFileData = new ArrayList(); diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientEventsTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientEventsTest.java index 3dd7f716e..8c7d5a862 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientEventsTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientEventsTest.java @@ -5,20 +5,8 @@ import android.content.Context; import android.net.Uri; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.ArrayList; -import java.util.UUID; -import java.util.concurrent.TimeUnit; - import backtraceio.library.events.OnBeforeSendEventListener; import backtraceio.library.events.OnServerErrorEventListener; import backtraceio.library.events.OnServerResponseEventListener; @@ -26,6 +14,13 @@ import backtraceio.library.models.BacktraceData; import backtraceio.library.models.BacktraceResult; import backtraceio.library.models.types.BacktraceResultStatus; +import java.util.ArrayList; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import net.jodah.concurrentunit.Waiter; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; /** * Instrumented test, which will execute on an Android device. @@ -86,8 +81,7 @@ public void useBeforeSendAndRequestHandler() { RequestHandler rh = new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { - return new BacktraceResult(null, data.getAttributes().get(attributeKey), - BacktraceResultStatus.Ok); + return new BacktraceResult(null, data.getAttributes().get(attributeKey), BacktraceResultStatus.Ok); } }; diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientMetricsTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientMetricsTest.java index 20a8d6c35..f2de9faae 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientMetricsTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientMetricsTest.java @@ -9,19 +9,8 @@ import static org.junit.Assert.assertTrue; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import net.jodah.concurrentunit.Waiter; - -import org.json.JSONObject; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.concurrent.TimeUnit; - import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.events.EventsOnServerResponseEventListener; import backtraceio.library.events.EventsRequestHandler; @@ -33,6 +22,12 @@ import backtraceio.library.models.metrics.EventsResult; import backtraceio.library.models.types.BacktraceResultStatus; import backtraceio.library.services.BacktraceMetrics; +import java.util.concurrent.TimeUnit; +import net.jodah.concurrentunit.Waiter; +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceClientMetricsTest { @@ -41,7 +36,18 @@ public class BacktraceClientMetricsTest { public BacktraceCredentials credentials; private final String summedEventName = "activity-changed"; // existing attribute name in Backtrace - private final String[] uniqueAttributeName = {"uname.version", "cpu.boottime", "screen.orientation", "battery.state", "device.airplane_mode", "device.sdk", "device.brand", "system.memory.total", "uname.sysname", "application.package"}; + private final String[] uniqueAttributeName = { + "uname.version", + "cpu.boottime", + "screen.orientation", + "battery.state", + "device.airplane_mode", + "device.sdk", + "device.brand", + "system.memory.total", + "uname.sysname", + "application.package" + }; private final String defaultBaseUrl = BacktraceMetrics.defaultBaseUrl; private final String token = "aaaaabbbbbccccf82668682e69f59b38e0a853bed941e08e85f4bf5eb2c5458"; @@ -50,13 +56,13 @@ public class BacktraceClientMetricsTest { * NOTE: Some of these tests are very time-sensitive so you may occasionally get false negative results. * For best results run under low CPU load and low memory utilization conditions. */ - @Before public void setUp() { BacktraceLogger.setLogger(new BacktraceInternalLogger(LogLevel.DEBUG)); context = InstrumentationRegistry.getInstrumentation().getContext(); credentials = new BacktraceCredentials("https://universe.sp.backtrace.io:6098", token); - BacktraceDatabase database = new BacktraceDatabase(context, context.getFilesDir().getAbsolutePath()); + BacktraceDatabase database = + new BacktraceDatabase(context, context.getFilesDir().getAbsolutePath()); backtraceClient = new BacktraceClient(context, credentials, database); } @@ -102,7 +108,8 @@ public void try3TimesOn503() { final Waiter waiter = new Waiter(); final int timeBetweenRetriesMillis = 1; - backtraceClient.metrics.enable(new BacktraceMetricsSettings(credentials, defaultBaseUrl, 0, timeBetweenRetriesMillis)); + backtraceClient.metrics.enable( + new BacktraceMetricsSettings(credentials, defaultBaseUrl, 0, timeBetweenRetriesMillis)); final MockRequestHandler mockUniqueRequestHandler = new MockRequestHandler(); mockUniqueRequestHandler.statusCode = 503; final MockRequestHandler mockSummedRequestHandler = new MockRequestHandler(); @@ -113,7 +120,9 @@ public void try3TimesOn503() { backtraceClient.metrics.setUniqueEventsOnServerResponse(new EventsOnServerResponseEventListener() { @Override public void onEvent(EventsResult result) { - assertEquals(mockUniqueRequestHandler.numAttempts - 1, result.getEventsPayload().getDroppedEvents()); + assertEquals( + mockUniqueRequestHandler.numAttempts - 1, + result.getEventsPayload().getDroppedEvents()); String eventsPayloadJson = BacktraceSerializeHelper.toJson(result.getEventsPayload()); assertFalse(eventsPayloadJson.isEmpty()); assertEquals(BacktraceResultStatus.ServerError, result.status); @@ -123,7 +132,9 @@ public void onEvent(EventsResult result) { backtraceClient.metrics.setSummedEventsOnServerResponse(new EventsOnServerResponseEventListener() { @Override public void onEvent(EventsResult result) { - assertEquals(mockSummedRequestHandler.numAttempts - 1, result.getEventsPayload().getDroppedEvents()); + assertEquals( + mockSummedRequestHandler.numAttempts - 1, + result.getEventsPayload().getDroppedEvents()); String eventsPayloadJson = BacktraceSerializeHelper.toJson(result.getEventsPayload()); assertFalse(eventsPayloadJson.isEmpty()); assertEquals(BacktraceResultStatus.ServerError, result.status); @@ -162,7 +173,9 @@ public void tryOnceOnHttpError() { backtraceClient.metrics.setUniqueEventsOnServerResponse(new EventsOnServerResponseEventListener() { @Override public void onEvent(EventsResult result) { - assertEquals(mockUniqueRequestHandler.numAttempts - 1, result.getEventsPayload().getDroppedEvents()); + assertEquals( + mockUniqueRequestHandler.numAttempts - 1, + result.getEventsPayload().getDroppedEvents()); String eventsPayloadJson = BacktraceSerializeHelper.toJson(result.getEventsPayload()); assertFalse(eventsPayloadJson.isEmpty()); assertEquals(BacktraceResultStatus.ServerError, result.status); @@ -173,7 +186,9 @@ public void onEvent(EventsResult result) { backtraceClient.metrics.setSummedEventsOnServerResponse(new EventsOnServerResponseEventListener() { @Override public void onEvent(EventsResult result) { - assertEquals(mockSummedRequestHandler.numAttempts - 1, result.getEventsPayload().getDroppedEvents()); + assertEquals( + mockSummedRequestHandler.numAttempts - 1, + result.getEventsPayload().getDroppedEvents()); String eventsPayloadJson = BacktraceSerializeHelper.toJson(result.getEventsPayload()); assertFalse(eventsPayloadJson.isEmpty()); assertEquals(BacktraceResultStatus.ServerError, result.status); @@ -183,7 +198,8 @@ public void onEvent(EventsResult result) { // Enabling metrics will automatically send startup events final int timeBetweenRetriesMillis = 1; - backtraceClient.metrics.enable(new BacktraceMetricsSettings(credentials, defaultBaseUrl, 0, timeBetweenRetriesMillis)); + backtraceClient.metrics.enable( + new BacktraceMetricsSettings(credentials, defaultBaseUrl, 0, timeBetweenRetriesMillis)); try { waiter.await(5, TimeUnit.SECONDS, 2); @@ -235,7 +251,8 @@ public void onEvent(EventsResult result) { assertEquals(1, mockRequestHandler.numAttempts); assertFalse(mockRequestHandler.lastEventPayloadJson.isEmpty()); - assertEquals(maximumNumberOfEvents, backtraceClient.metrics.getUniqueEvents().size()); + assertEquals( + maximumNumberOfEvents, backtraceClient.metrics.getUniqueEvents().size()); } @Test @@ -266,7 +283,9 @@ public void onEvent(EventsResult result) { assertEquals(0, mockRequestHandler.numAttempts); assertNull(mockRequestHandler.lastEventPayloadJson); - assertEquals(maximumNumberOfEvents - 1, backtraceClient.metrics.getUniqueEvents().size()); + assertEquals( + maximumNumberOfEvents - 1, + backtraceClient.metrics.getUniqueEvents().size()); } @Test @@ -338,7 +357,7 @@ public void onEvent(EventsResult result) { assertEquals(0, mockRequestHandler.numAttempts); // We will always have startup unique event GUID assertEquals(2, backtraceClient.metrics.getUniqueEvents().size()); - //assertEquals(1, backtraceClient.metrics.getSummedEvents().size()); + // assertEquals(1, backtraceClient.metrics.getSummedEvents().size()); } @Test @@ -363,8 +382,11 @@ public void onEvent(EventsResult result) { JSONObject json; try { json = new JSONObject(eventsPayloadJsonString); - JSONObject uniqueEventJson = json.getJSONArray("unique_events").getJSONObject(0); - assertEquals(uniqueEventAttributeName, uniqueEventJson.getJSONArray("unique").get(0)); + JSONObject uniqueEventJson = + json.getJSONArray("unique_events").getJSONObject(0); + assertEquals( + uniqueEventAttributeName, + uniqueEventJson.getJSONArray("unique").get(0)); assertNotNull(uniqueEventJson.getJSONObject("attributes").getString("guid")); } catch (Exception e) { fail(e.toString()); @@ -381,7 +403,8 @@ public void onEvent(EventsResult result) { waiter.resume(); } }); - backtraceClient.metrics.enable(new BacktraceMetricsSettings(credentials, defaultBaseUrl, 0), uniqueEventAttributeName); + backtraceClient.metrics.enable( + new BacktraceMetricsSettings(credentials, defaultBaseUrl, 0), uniqueEventAttributeName); try { waiter.await(5, TimeUnit.SECONDS, 2); @@ -413,8 +436,16 @@ public void onEvent(EventsResult result) { JSONObject json; try { json = new JSONObject(eventsPayloadJsonString); - assertEquals("guid", json.getJSONArray("unique_events").getJSONObject(0).getJSONArray("unique").get(0)); - assertNotNull(json.getJSONArray("unique_events").getJSONObject(0).getJSONObject("attributes").getString("guid")); + assertEquals( + "guid", + json.getJSONArray("unique_events") + .getJSONObject(0) + .getJSONArray("unique") + .get(0)); + assertNotNull(json.getJSONArray("unique_events") + .getJSONObject(0) + .getJSONObject("attributes") + .getString("guid")); } catch (Exception e) { fail(e.toString()); } @@ -433,7 +464,9 @@ public void onEvent(EventsResult result) { JSONObject json; try { json = new JSONObject(eventsPayloadJsonString); - assertEquals("Application Launches", json.getJSONArray("summed_events").getJSONObject(0).getString("metric_group")); + assertEquals( + "Application Launches", + json.getJSONArray("summed_events").getJSONObject(0).getString("metric_group")); } catch (Exception e) { fail(e.toString()); } @@ -445,7 +478,6 @@ public void onEvent(EventsResult result) { backtraceClient.metrics.enable(new BacktraceMetricsSettings(credentials, defaultBaseUrl, 0)); - try { waiter.await(5, TimeUnit.SECONDS, 2); } catch (Exception e) { @@ -461,7 +493,6 @@ public void onEvent(EventsResult result) { assertEquals(0, backtraceClient.metrics.getSummedEvents().size()); } - @Test public void metricsAttributesShouldChangeIfClientAttributeChanges() { final Waiter waiter = new Waiter(); diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientProguardTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientProguardTest.java index ec382eaa3..804192952 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientProguardTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientProguardTest.java @@ -6,41 +6,40 @@ import static org.junit.Assert.assertNull; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.TimeUnit; - import backtraceio.library.events.OnServerResponseEventListener; import backtraceio.library.events.RequestHandler; import backtraceio.library.models.BacktraceData; import backtraceio.library.models.BacktraceResult; import backtraceio.library.models.json.BacktraceReport; import backtraceio.library.models.types.BacktraceResultStatus; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import net.jodah.concurrentunit.Waiter; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceClientProguardTest { private Context context; private BacktraceCredentials credentials; private final String resultMessage = "From request handler"; - private final Map attributes = new HashMap() {{ - put("test", "value"); - }}; + private final Map attributes = new HashMap() { + { + put("test", "value"); + } + }; // For Proguard private final UUID proguardMappingUUID = UUID.randomUUID(); - private final Map proguardAttributes = new HashMap() {{ - put("symbolication_id", proguardMappingUUID.toString()); - }}; + private final Map proguardAttributes = new HashMap() { + { + put("symbolication_id", proguardMappingUUID.toString()); + } + }; @Before public void setUp() { @@ -59,22 +58,21 @@ public void sendBacktraceReportWithStringAndAttributesProguard() { @Override public BacktraceResult onRequest(BacktraceData data) { assertEquals("proguard", data.getSymbolication()); - return new BacktraceResult(data.getReport(), data.getReport().message, - BacktraceResultStatus.Ok); + return new BacktraceResult(data.getReport(), data.getReport().message, BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new BacktraceReport(this.resultMessage, this.proguardAttributes), - new OnServerResponseEventListener() { + backtraceClient.send( + new BacktraceReport(this.resultMessage, this.proguardAttributes), new OnServerResponseEventListener() { @Override public void onEvent(BacktraceResult backtraceResult) { // THEN assertEquals(resultMessage, backtraceResult.message); - assertEquals(proguardAttributes.get("symbolication_id"), - backtraceResult.getBacktraceReport().attributes.get("symbolication_id") - ); + assertEquals( + proguardAttributes.get("symbolication_id"), + backtraceResult.getBacktraceReport().attributes.get("symbolication_id")); assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); assertNotNull(backtraceResult.getBacktraceReport()); assertNull(backtraceResult.getBacktraceReport().exception); @@ -98,22 +96,21 @@ public void sendBacktraceReportWithStringAndAttributesNoProguard() { @Override public BacktraceResult onRequest(BacktraceData data) { assertNull(data.getSymbolication()); - return new BacktraceResult(data.getReport(), data.getReport().message, - BacktraceResultStatus.Ok); + return new BacktraceResult(data.getReport(), data.getReport().message, BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new BacktraceReport(this.resultMessage, this.attributes), - new OnServerResponseEventListener() { + backtraceClient.send( + new BacktraceReport(this.resultMessage, this.attributes), new OnServerResponseEventListener() { @Override public void onEvent(BacktraceResult backtraceResult) { // THEN assertEquals(resultMessage, backtraceResult.message); - assertEquals(attributes.get("test"), - backtraceResult.getBacktraceReport().attributes.get("test") - ); + assertEquals( + attributes.get("test"), + backtraceResult.getBacktraceReport().attributes.get("test")); assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); assertNotNull(backtraceResult.getBacktraceReport()); assertNull(backtraceResult.getBacktraceReport().exception); @@ -139,31 +136,30 @@ public void sendBacktraceReportWithExceptionAndAttributesProguard() { @Override public BacktraceResult onRequest(BacktraceData data) { assertEquals("proguard", data.getSymbolication()); - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new BacktraceReport( - new Exception(this.resultMessage), this.proguardAttributes), new - OnServerResponseEventListener() { + backtraceClient.send( + new BacktraceReport(new Exception(this.resultMessage), this.proguardAttributes), + new OnServerResponseEventListener() { @Override public void onEvent(BacktraceResult backtraceResult) { // THEN assertEquals(resultMessage, backtraceResult.message); assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertEquals(proguardAttributes.get("symbolication_id"), - backtraceResult.getBacktraceReport().attributes.get("symbolication_id") - ); + assertEquals( + proguardAttributes.get("symbolication_id"), + backtraceResult.getBacktraceReport().attributes.get("symbolication_id")); assertNotNull(backtraceResult.getBacktraceReport()); assertNotNull(backtraceResult.getBacktraceReport().exception); waiter.resume(); } - } - ); + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); @@ -181,31 +177,30 @@ public void sendBacktraceReportWithExceptionAndAttributesNoProguard() { @Override public BacktraceResult onRequest(BacktraceData data) { assertNull(data.getSymbolication()); - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new BacktraceReport( - new Exception(this.resultMessage), this.attributes), new - OnServerResponseEventListener() { + backtraceClient.send( + new BacktraceReport(new Exception(this.resultMessage), this.attributes), + new OnServerResponseEventListener() { @Override public void onEvent(BacktraceResult backtraceResult) { // THEN assertEquals(resultMessage, backtraceResult.message); assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertEquals(attributes.get("test"), - backtraceResult.getBacktraceReport().attributes.get("test") - ); + assertEquals( + attributes.get("test"), + backtraceResult.getBacktraceReport().attributes.get("test")); assertNotNull(backtraceResult.getBacktraceReport()); assertNotNull(backtraceResult.getBacktraceReport().exception); waiter.resume(); } - } - ); + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); @@ -225,30 +220,28 @@ public void sendBacktraceExceptionProguard() { @Override public BacktraceResult onRequest(BacktraceData data) { assertEquals("proguard", data.getSymbolication()); - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new Exception(resultMessage), new - OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - - // THEN - assertEquals(resultMessage, backtraceResult.message); - assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertEquals(proguardAttributes.get("symbolication_id"), - backtraceResult.getBacktraceReport().attributes.get("symbolication_id") - ); - assertNotNull(backtraceResult.getBacktraceReport()); - assertNotNull(backtraceResult.getBacktraceReport().exception); - waiter.resume(); - } - } - ); + backtraceClient.send(new Exception(resultMessage), new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + + // THEN + assertEquals(resultMessage, backtraceResult.message); + assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); + assertEquals( + proguardAttributes.get("symbolication_id"), + backtraceResult.getBacktraceReport().attributes.get("symbolication_id")); + assertNotNull(backtraceResult.getBacktraceReport()); + assertNotNull(backtraceResult.getBacktraceReport().exception); + waiter.resume(); + } + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); @@ -267,30 +260,28 @@ public void sendBacktraceExceptionNoProguard() { @Override public BacktraceResult onRequest(BacktraceData data) { assertNull(data.getSymbolication()); - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new Exception(resultMessage), new - OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - - // THEN - assertEquals(resultMessage, backtraceResult.message); - assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertEquals(proguardAttributes.get("symbolication_id"), - backtraceResult.getBacktraceReport().attributes.get("symbolication_id") - ); - assertNotNull(backtraceResult.getBacktraceReport()); - assertNotNull(backtraceResult.getBacktraceReport().exception); - waiter.resume(); - } - } - ); + backtraceClient.send(new Exception(resultMessage), new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + + // THEN + assertEquals(resultMessage, backtraceResult.message); + assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); + assertEquals( + proguardAttributes.get("symbolication_id"), + backtraceResult.getBacktraceReport().attributes.get("symbolication_id")); + assertNotNull(backtraceResult.getBacktraceReport()); + assertNotNull(backtraceResult.getBacktraceReport().exception); + waiter.resume(); + } + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); @@ -310,30 +301,27 @@ public void sendBacktraceStringProguard() { @Override public BacktraceResult onRequest(BacktraceData data) { assertEquals("proguard", data.getSymbolication()); - return new BacktraceResult(data.getReport(), data.getReport().message, - BacktraceResultStatus.Ok); + return new BacktraceResult(data.getReport(), data.getReport().message, BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(resultMessage, new - OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - - // THEN - assertEquals(resultMessage, backtraceResult.message); - assertEquals(proguardAttributes.get("symbolication_id"), - backtraceResult.getBacktraceReport().attributes.get("symbolication_id") - ); - assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertNotNull(backtraceResult.getBacktraceReport()); - assertNull(backtraceResult.getBacktraceReport().exception); - waiter.resume(); - } - } - ); + backtraceClient.send(resultMessage, new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + + // THEN + assertEquals(resultMessage, backtraceResult.message); + assertEquals( + proguardAttributes.get("symbolication_id"), + backtraceResult.getBacktraceReport().attributes.get("symbolication_id")); + assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); + assertNotNull(backtraceResult.getBacktraceReport()); + assertNull(backtraceResult.getBacktraceReport().exception); + waiter.resume(); + } + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); @@ -352,30 +340,27 @@ public void sendBacktraceStringNoProguard() { @Override public BacktraceResult onRequest(BacktraceData data) { assertNull(data.getSymbolication()); - return new BacktraceResult(data.getReport(), data.getReport().message, - BacktraceResultStatus.Ok); + return new BacktraceResult(data.getReport(), data.getReport().message, BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(resultMessage, new - OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - - // THEN - assertEquals(resultMessage, backtraceResult.message); - assertEquals(proguardAttributes.get("symbolication_id"), - backtraceResult.getBacktraceReport().attributes.get("symbolication_id") - ); - assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertNotNull(backtraceResult.getBacktraceReport()); - assertNull(backtraceResult.getBacktraceReport().exception); - waiter.resume(); - } - } - ); + backtraceClient.send(resultMessage, new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + + // THEN + assertEquals(resultMessage, backtraceResult.message); + assertEquals( + proguardAttributes.get("symbolication_id"), + backtraceResult.getBacktraceReport().attributes.get("symbolication_id")); + assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); + assertNotNull(backtraceResult.getBacktraceReport()); + assertNull(backtraceResult.getBacktraceReport().exception); + waiter.resume(); + } + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientSendTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientSendTest.java index a742c664b..612121459 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientSendTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientSendTest.java @@ -7,26 +7,8 @@ import static org.junit.Assert.assertTrue; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import net.jodah.concurrentunit.Waiter; - -import org.json.JSONException; -import org.json.JSONObject; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Stack; -import java.util.concurrent.TimeUnit; - import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.events.OnServerResponseEventListener; import backtraceio.library.events.RequestHandler; @@ -34,13 +16,28 @@ import backtraceio.library.models.BacktraceResult; import backtraceio.library.models.json.BacktraceReport; import backtraceio.library.models.types.BacktraceResultStatus; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Stack; +import java.util.concurrent.TimeUnit; +import net.jodah.concurrentunit.Waiter; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceClientSendTest { private final String resultMessage = "From request handler"; - private final Map attributes = new HashMap() {{ - put("test", "value"); - }}; + private final Map attributes = new HashMap() { + { + put("test", "value"); + } + }; private Context context; private BacktraceCredentials credentials; @@ -58,15 +55,14 @@ public void sendException() { RequestHandler rh = new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { - return new BacktraceResult(null, data.getReport().exception.getMessage(), - BacktraceResultStatus.ServerError); + return new BacktraceResult( + null, data.getReport().exception.getMessage(), BacktraceResultStatus.ServerError); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new Exception(this.resultMessage), new OnServerResponseEventListener - () { + backtraceClient.send(new Exception(this.resultMessage), new OnServerResponseEventListener() { @Override public void onEvent(BacktraceResult backtraceResult) { // THEN @@ -87,19 +83,23 @@ public void onEvent(BacktraceResult backtraceResult) { public void sendExceptionWithManyCause() { // GIVEN final String lastExceptionExpectedMessage = "New Exception"; - final Exception causedException = new Exception(new IOException(new IllegalArgumentException(lastExceptionExpectedMessage))); + final Exception causedException = + new Exception(new IOException(new IllegalArgumentException(lastExceptionExpectedMessage))); final StackTraceElement[] stackTraceElements = new StackTraceElement[1]; - stackTraceElements[0] = new StackTraceElement("BacktraceClientSendTest.class", "sendCausedException", "BacktraceClientSendTest.java", 1); + stackTraceElements[0] = new StackTraceElement( + "BacktraceClientSendTest.class", "sendCausedException", "BacktraceClientSendTest.java", 1); causedException.setStackTrace(stackTraceElements); final BacktraceClient backtraceClient = new BacktraceClient(context, credentials); final Waiter waiter = new Waiter(); - final Stack expectedExceptionMessages = new Stack() {{ - add("New Exception"); - add("java.lang.IllegalArgumentException: New Exception"); - add("java.io.IOException: java.lang.IllegalArgumentException: New Exception"); - }}; + final Stack expectedExceptionMessages = new Stack() { + { + add("New Exception"); + add("java.lang.IllegalArgumentException: New Exception"); + add("java.io.IOException: java.lang.IllegalArgumentException: New Exception"); + } + }; RequestHandler rh = data -> { String jsonString = BacktraceSerializeHelper.toJson(data); @@ -107,8 +107,12 @@ public void sendExceptionWithManyCause() { try { // THEN final JSONObject jsonObject = new JSONObject(jsonString); - final JSONObject exceptionProperties = jsonObject.getJSONObject("annotations").getJSONObject("Exception properties"); - final String mainExceptionMessage = jsonObject.getJSONObject("annotations").getJSONObject("Exception").getString("message"); + final JSONObject exceptionProperties = + jsonObject.getJSONObject("annotations").getJSONObject("Exception properties"); + final String mainExceptionMessage = jsonObject + .getJSONObject("annotations") + .getJSONObject("Exception") + .getString("message"); final String mainExceptionExpectedMessage = expectedExceptionMessages.pop(); assertEquals(mainExceptionExpectedMessage, mainExceptionMessage); assertTrue(exceptionProperties.getJSONArray("stack-trace").length() > 0); @@ -119,8 +123,7 @@ public void sendExceptionWithManyCause() { fail(e.getMessage()); } - return new BacktraceResult(data.getReport(), data.getReport().message, - BacktraceResultStatus.Ok); + return new BacktraceResult(data.getReport(), data.getReport().message, BacktraceResultStatus.Ok); }; backtraceClient.setOnRequestHandler(rh); @@ -145,25 +148,23 @@ public void sendBacktraceReportWithString() { RequestHandler rh = new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { - return new BacktraceResult(data.getReport(), data.getReport().message, - BacktraceResultStatus.Ok); + return new BacktraceResult(data.getReport(), data.getReport().message, BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new BacktraceReport(this.resultMessage), new - OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - // THEN - assertEquals(resultMessage, backtraceResult.message); - assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertNotNull(backtraceResult.getBacktraceReport()); - assertNull(backtraceResult.getBacktraceReport().exception); - waiter.resume(); - } - }); + backtraceClient.send(new BacktraceReport(this.resultMessage), new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + // THEN + assertEquals(resultMessage, backtraceResult.message); + assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); + assertNotNull(backtraceResult.getBacktraceReport()); + assertNull(backtraceResult.getBacktraceReport().exception); + waiter.resume(); + } + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); @@ -180,22 +181,21 @@ public void sendBacktraceReportWithStringAndAttributes() { RequestHandler rh = new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { - return new BacktraceResult(data.getReport(), data.getReport().message, - BacktraceResultStatus.Ok); + return new BacktraceResult(data.getReport(), data.getReport().message, BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new BacktraceReport(this.resultMessage, this.attributes), - new OnServerResponseEventListener() { + backtraceClient.send( + new BacktraceReport(this.resultMessage, this.attributes), new OnServerResponseEventListener() { @Override public void onEvent(BacktraceResult backtraceResult) { // THEN assertEquals(resultMessage, backtraceResult.message); - assertEquals(attributes.get("test"), - backtraceResult.getBacktraceReport().attributes.get("test") - ); + assertEquals( + attributes.get("test"), + backtraceResult.getBacktraceReport().attributes.get("test")); assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); assertNotNull(backtraceResult.getBacktraceReport()); assertNull(backtraceResult.getBacktraceReport().exception); @@ -218,25 +218,25 @@ public void sendBacktraceReportWithException() { RequestHandler rh = new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new BacktraceReport(new Exception(this - .resultMessage)), new OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - // THEN - assertEquals(resultMessage, backtraceResult.message); - assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertNotNull(backtraceResult.getBacktraceReport()); - assertNotNull(backtraceResult.getBacktraceReport().exception); - waiter.resume(); - } - }); + backtraceClient.send( + new BacktraceReport(new Exception(this.resultMessage)), new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + // THEN + assertEquals(resultMessage, backtraceResult.message); + assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); + assertNotNull(backtraceResult.getBacktraceReport()); + assertNotNull(backtraceResult.getBacktraceReport().exception); + waiter.resume(); + } + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); @@ -253,31 +253,30 @@ public void sendBacktraceReportWithExceptionAndAttributes() { RequestHandler rh = new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new BacktraceReport( - new Exception(this.resultMessage), this.attributes), new - OnServerResponseEventListener() { + backtraceClient.send( + new BacktraceReport(new Exception(this.resultMessage), this.attributes), + new OnServerResponseEventListener() { @Override public void onEvent(BacktraceResult backtraceResult) { // THEN assertEquals(resultMessage, backtraceResult.message); assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertEquals(attributes.get("test"), - backtraceResult.getBacktraceReport().attributes.get("test") - ); + assertEquals( + attributes.get("test"), + backtraceResult.getBacktraceReport().attributes.get("test")); assertNotNull(backtraceResult.getBacktraceReport()); assertNotNull(backtraceResult.getBacktraceReport().exception); waiter.resume(); } - } - ); + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); @@ -300,7 +299,6 @@ public void sendExceptionWithInnerException() { backtraceClient.sendSuppressedExceptions(true); final Waiter waiter = new Waiter(); - backtraceClient.setOnRequestHandler(new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { @@ -308,8 +306,8 @@ public BacktraceResult onRequest(BacktraceData data) { if (reportData.size() == expectedNumberOfReports) { waiter.resume(); } - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }); backtraceClient.send(outerException); @@ -336,13 +334,13 @@ public void sendMultipleReports() { RequestHandler rh = new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); - //WHEN + // WHEN for (final String message : messages) { backtraceClient.send(new Exception(message), new OnServerResponseEventListener() { @Override diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientSerializationTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientSerializationTest.java index 53a581823..11dade3e7 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientSerializationTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientSerializationTest.java @@ -5,22 +5,8 @@ import static org.junit.Assert.assertNotNull; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import com.google.gson.annotations.SerializedName; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.events.OnServerResponseEventListener; import backtraceio.library.events.RequestHandler; @@ -28,15 +14,25 @@ import backtraceio.library.models.BacktraceResult; import backtraceio.library.models.json.BacktraceReport; import backtraceio.library.models.types.BacktraceResultStatus; +import com.google.gson.annotations.SerializedName; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import net.jodah.concurrentunit.Waiter; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; abstract class CustomExceptionBase extends Exception { @SerializedName("message") public String message; + public CustomExceptionBase(String message) { super(message); this.message = message; } } + class SerializationTestException extends CustomExceptionBase { @SerializedName("message") public String message; @@ -48,15 +44,16 @@ public SerializationTestException(String message) { } } - @RunWith(AndroidJUnit4.class) public class BacktraceClientSerializationTest { private Context context; private BacktraceCredentials credentials; private final String resultMessage = "serialization test message"; - private final Map attributes = new HashMap() {{ - put("test", "value"); - }}; + private final Map attributes = new HashMap() { + { + put("test", "value"); + } + }; @Before public void setUp() { @@ -64,7 +61,6 @@ public void setUp() { credentials = new BacktraceCredentials("https://example-endpoint.com/", ""); } - @Test public void sendReportWithTheSameJsonKeys() { // GIVEN @@ -78,25 +74,26 @@ public BacktraceResult onRequest(BacktraceData data) { String reportJson = BacktraceSerializeHelper.toJson(data.getReport()); assertNotNull(reportJson); - - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new BacktraceReport(new SerializationTestException("serialization test message")), new OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - // THEN - assertEquals(resultMessage, backtraceResult.message); - assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); - assertNotNull(backtraceResult.getBacktraceReport()); - assertNotNull(backtraceResult.getBacktraceReport().exception); - waiter.resume(); - } - }); + backtraceClient.send( + new BacktraceReport(new SerializationTestException("serialization test message")), + new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + // THEN + assertEquals(resultMessage, backtraceResult.message); + assertEquals(BacktraceResultStatus.Ok, backtraceResult.status); + assertNotNull(backtraceResult.getBacktraceReport()); + assertNotNull(backtraceResult.getBacktraceReport().exception); + waiter.resume(); + } + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientSummedEventTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientSummedEventTest.java index cab05d7a2..2495cf690 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientSummedEventTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientSummedEventTest.java @@ -7,20 +7,8 @@ import static org.junit.Assert.assertNotEquals; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.events.EventsOnServerResponseEventListener; import backtraceio.library.events.EventsRequestHandler; @@ -32,6 +20,13 @@ import backtraceio.library.models.metrics.EventsResult; import backtraceio.library.models.types.BacktraceResultStatus; import backtraceio.library.services.BacktraceMetrics; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import net.jodah.concurrentunit.Waiter; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceClientSummedEventTest { @@ -47,13 +42,13 @@ public class BacktraceClientSummedEventTest { * NOTE: Some of these tests are very time-sensitive so you may occasionally get false negative results. * For best results run under low CPU load and low memory utilization conditions. */ - @Before public void setUp() { BacktraceLogger.setLogger(new BacktraceInternalLogger(LogLevel.DEBUG)); context = InstrumentationRegistry.getInstrumentation().getContext(); credentials = new BacktraceCredentials("https://universe.sp.backtrace.io:6098", token); - BacktraceDatabase database = new BacktraceDatabase(context, context.getFilesDir().getAbsolutePath()); + BacktraceDatabase database = + new BacktraceDatabase(context, context.getFilesDir().getAbsolutePath()); backtraceClient = new BacktraceClient(context, credentials, database); } @@ -136,7 +131,8 @@ public void try3TimesOn503AndDropSummedEventsIfMaxNumEventsReached() { final Waiter waiter = new Waiter(); final int timeBetweenRetriesMillis = 1; - backtraceClient.metrics.enable(new BacktraceMetricsSettings(credentials, defaultBaseUrl, 0, timeBetweenRetriesMillis)); + backtraceClient.metrics.enable( + new BacktraceMetricsSettings(credentials, defaultBaseUrl, 0, timeBetweenRetriesMillis)); final MockRequestHandler mockSummedRequestHandler = new MockRequestHandler(); mockSummedRequestHandler.statusCode = 503; backtraceClient.metrics.setSummedEventsRequestHandler(mockSummedRequestHandler); @@ -144,7 +140,9 @@ public void try3TimesOn503AndDropSummedEventsIfMaxNumEventsReached() { backtraceClient.metrics.setSummedEventsOnServerResponse(new EventsOnServerResponseEventListener() { @Override public void onEvent(EventsResult result) { - assertEquals(mockSummedRequestHandler.numAttempts - 1, result.getEventsPayload().getDroppedEvents()); + assertEquals( + mockSummedRequestHandler.numAttempts - 1, + result.getEventsPayload().getDroppedEvents()); String eventsPayloadJson = BacktraceSerializeHelper.toJson(result.getEventsPayload()); assertFalse(eventsPayloadJson.isEmpty()); assertEquals(BacktraceResultStatus.ServerError, result.status); @@ -178,7 +176,9 @@ public void addAndStoreSummedEvent() { assertTrue(backtraceClient.metrics.addSummedEvent(summedEventName)); assertEquals(1, backtraceClient.metrics.getSummedEvents().size()); - assertEquals(summedEventName, backtraceClient.metrics.getSummedEvents().getFirst().getName()); + assertEquals( + summedEventName, + backtraceClient.metrics.getSummedEvents().getFirst().getName()); assertNotEquals(0, backtraceClient.metrics.getSummedEvents().getFirst().getTimestamp()); } @@ -186,15 +186,26 @@ public void addAndStoreSummedEvent() { public void addSummedEventWithAttributes() { backtraceClient.metrics.enable(new BacktraceMetricsSettings(credentials, defaultBaseUrl, 0)); - Map myCustomAttributes = new HashMap() {{ - put("foo", "bar"); - }}; + Map myCustomAttributes = new HashMap() { + { + put("foo", "bar"); + } + }; assertTrue(backtraceClient.metrics.addSummedEvent(summedEventName, myCustomAttributes)); assertEquals(1, backtraceClient.metrics.getSummedEvents().size()); - assertEquals(summedEventName, backtraceClient.metrics.getSummedEvents().getFirst().getName()); + assertEquals( + summedEventName, + backtraceClient.metrics.getSummedEvents().getFirst().getName()); assertNotEquals(0, backtraceClient.metrics.getSummedEvents().getFirst().getTimestamp()); - assertEquals("bar", backtraceClient.metrics.getSummedEvents().getFirst().getAttributes().get("foo")); + assertEquals( + "bar", + backtraceClient + .metrics + .getSummedEvents() + .getFirst() + .getAttributes() + .get("foo")); } @Test diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientUniqueEventTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientUniqueEventTest.java index ad6a15d07..746ebf28e 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientUniqueEventTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientUniqueEventTest.java @@ -1,29 +1,16 @@ package backtraceio.library; +import static java.lang.Thread.sleep; import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertTrue; import static junit.framework.TestCase.fail; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; -import static java.lang.Thread.sleep; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ConcurrentLinkedDeque; -import java.util.concurrent.TimeUnit; - import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.events.EventsOnServerResponseEventListener; import backtraceio.library.events.EventsRequestHandler; @@ -38,6 +25,14 @@ import backtraceio.library.models.metrics.UniqueEvent; import backtraceio.library.models.types.BacktraceResultStatus; import backtraceio.library.services.BacktraceMetrics; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.concurrent.TimeUnit; +import net.jodah.concurrentunit.Waiter; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceClientUniqueEventTest { @@ -45,7 +40,18 @@ public class BacktraceClientUniqueEventTest { public BacktraceClient backtraceClient; public BacktraceCredentials credentials; // existing attribute name in Backtrace - private final String[] uniqueAttributeName = {"uname.version", "cpu.boottime", "screen.orientation", "battery.state", "device.airplane_mode", "device.sdk", "device.brand", "system.memory.total", "uname.sysname", "application.package"}; + private final String[] uniqueAttributeName = { + "uname.version", + "cpu.boottime", + "screen.orientation", + "battery.state", + "device.airplane_mode", + "device.sdk", + "device.brand", + "system.memory.total", + "uname.sysname", + "application.package" + }; private final String defaultBaseUrl = BacktraceMetrics.defaultBaseUrl; private final String token = "aaaaabbbbbccccf82668682e69f59b38e0a853bed941e08e85f4bf5eb2c5458"; @@ -54,13 +60,13 @@ public class BacktraceClientUniqueEventTest { * NOTE: Some of these tests are very time-sensitive so you may occasionally get false negative results. * For best results run under low CPU load and low memory utilization conditions. */ - @Before public void setUp() { BacktraceLogger.setLogger(new BacktraceInternalLogger(LogLevel.DEBUG)); context = InstrumentationRegistry.getInstrumentation().getContext(); credentials = new BacktraceCredentials("https://universe.sp.backtrace.io:6098", token); - BacktraceDatabase database = new BacktraceDatabase(context, context.getFilesDir().getAbsolutePath()); + BacktraceDatabase database = + new BacktraceDatabase(context, context.getFilesDir().getAbsolutePath()); backtraceClient = new BacktraceClient(context, credentials, database); } @@ -205,7 +211,8 @@ public void onEvent(EventsResult result) { backtraceClient.metrics.addUniqueEvent(uniqueAttributeName[i]); } - assertEquals(maximumNumberOfEvents, backtraceClient.metrics.getUniqueEvents().size()); + assertEquals( + maximumNumberOfEvents, backtraceClient.metrics.getUniqueEvents().size()); } @Test @@ -216,7 +223,9 @@ public void addAndStoreUniqueEvent() { // Account for the startup unique event assertEquals(2, backtraceClient.metrics.getUniqueEvents().size()); - assertEquals(uniqueAttributeName[0], backtraceClient.metrics.getUniqueEvents().getLast().getName()); + assertEquals( + uniqueAttributeName[0], + backtraceClient.metrics.getUniqueEvents().getLast().getName()); assertNotEquals(0, backtraceClient.metrics.getUniqueEvents().getLast().getTimestamp()); // See how we get all different kinds of attributes in backtraceio.library.models.BacktraceData.setAttributes @@ -225,7 +234,14 @@ public void addAndStoreUniqueEvent() { BacktraceAttributes backtraceAttributes = new BacktraceAttributes(context, null, backtraceClient.attributes); expectedAttributes.putAll(backtraceAttributes.getAllAttributes()); - assertEquals(expectedAttributes.size(), backtraceClient.metrics.getUniqueEvents().getLast().getAttributes().size()); + assertEquals( + expectedAttributes.size(), + backtraceClient + .metrics + .getUniqueEvents() + .getLast() + .getAttributes() + .size()); } @Test @@ -236,7 +252,9 @@ public void addAndStoreUniqueEventNullAttributes() { // Account for the startup unique event assertEquals(2, backtraceClient.metrics.getUniqueEvents().size()); - assertEquals(uniqueAttributeName[0], backtraceClient.metrics.getUniqueEvents().getLast().getName()); + assertEquals( + uniqueAttributeName[0], + backtraceClient.metrics.getUniqueEvents().getLast().getName()); assertNotEquals(0, backtraceClient.metrics.getUniqueEvents().getLast().getTimestamp()); // See how we get all different kinds of attributes in backtraceio.library.models.BacktraceData.setAttributes @@ -245,23 +263,41 @@ public void addAndStoreUniqueEventNullAttributes() { BacktraceAttributes backtraceAttributes = new BacktraceAttributes(context, null, backtraceClient.attributes); expectedAttributes.putAll(backtraceAttributes.getAllAttributes()); - assertEquals(expectedAttributes.size(), backtraceClient.metrics.getUniqueEvents().getLast().getAttributes().size()); + assertEquals( + expectedAttributes.size(), + backtraceClient + .metrics + .getUniqueEvents() + .getLast() + .getAttributes() + .size()); } @Test public void addAndStoreUniqueEventWithAttributes() { backtraceClient.metrics.enable(new BacktraceMetricsSettings(credentials, defaultBaseUrl, 0)); - Map myCustomAttributes = new HashMap() {{ - put("foo", "bar"); - }}; + Map myCustomAttributes = new HashMap() { + { + put("foo", "bar"); + } + }; assertTrue(backtraceClient.metrics.addUniqueEvent(uniqueAttributeName[0], myCustomAttributes)); // Account for the startup unique event assertEquals(2, backtraceClient.metrics.getUniqueEvents().size()); - assertEquals(uniqueAttributeName[0], backtraceClient.metrics.getUniqueEvents().getLast().getName()); + assertEquals( + uniqueAttributeName[0], + backtraceClient.metrics.getUniqueEvents().getLast().getName()); assertNotEquals(0, backtraceClient.metrics.getUniqueEvents().getLast().getTimestamp()); - assertEquals("bar", backtraceClient.metrics.getUniqueEvents().getLast().getAttributes().get("foo")); + assertEquals( + "bar", + backtraceClient + .metrics + .getUniqueEvents() + .getLast() + .getAttributes() + .get("foo")); // See how we get all different kinds of attributes in backtraceio.library.models.BacktraceData.setAttributes Map expectedAttributes = new HashMap(); @@ -269,7 +305,14 @@ public void addAndStoreUniqueEventWithAttributes() { BacktraceAttributes backtraceAttributes = new BacktraceAttributes(context, null, backtraceClient.attributes); expectedAttributes.putAll(backtraceAttributes.getAllAttributes()); - assertEquals(expectedAttributes.size() + 1, backtraceClient.metrics.getUniqueEvents().getLast().getAttributes().size()); + assertEquals( + expectedAttributes.size() + 1, + backtraceClient + .metrics + .getUniqueEvents() + .getLast() + .getAttributes() + .size()); } @Test @@ -287,16 +330,26 @@ public void doAddUniqueEventIfUniqueAttributeDefinedInCustomAttributes() { final String expectedKey = "foo"; final String expectedValue = "bar"; - Map myCustomAttributes = new HashMap() {{ - put(expectedKey, expectedValue); - }}; + Map myCustomAttributes = new HashMap() { + { + put(expectedKey, expectedValue); + } + }; assertTrue(backtraceClient.metrics.addUniqueEvent(expectedKey, myCustomAttributes)); // Account for the startup unique event assertEquals(2, backtraceClient.metrics.getUniqueEvents().size()); - assertEquals(expectedKey, backtraceClient.metrics.getUniqueEvents().getLast().getName()); + assertEquals( + expectedKey, backtraceClient.metrics.getUniqueEvents().getLast().getName()); assertNotEquals(0, backtraceClient.metrics.getUniqueEvents().getLast().getTimestamp()); - assertEquals(expectedValue, backtraceClient.metrics.getUniqueEvents().getLast().getAttributes().get(expectedKey)); + assertEquals( + expectedValue, + backtraceClient + .metrics + .getUniqueEvents() + .getLast() + .getAttributes() + .get(expectedKey)); } @Test @@ -350,8 +403,16 @@ public void uniqueEventWithCustomAttributeExistsEvenIfCustomAttributeDeletedLate backtraceClient.attributes.remove(expectedKey); - assertEquals(expectedValue, backtraceClient.metrics.getUniqueEvents().getLast().getAttributes().get(expectedKey)); - assertEquals(expectedKey, backtraceClient.metrics.getUniqueEvents().getLast().getName()); + assertEquals( + expectedValue, + backtraceClient + .metrics + .getUniqueEvents() + .getLast() + .getAttributes() + .get(expectedKey)); + assertEquals( + expectedKey, backtraceClient.metrics.getUniqueEvents().getLast().getName()); } @Test @@ -360,8 +421,11 @@ public void uniqueEventUpdateTimestamp() { assertTrue(backtraceClient.metrics.addUniqueEvent(uniqueAttributeName[0])); - assertEquals(uniqueAttributeName[0], backtraceClient.metrics.getUniqueEvents().getLast().getName()); - long previousTimestamp = backtraceClient.metrics.getUniqueEvents().getLast().getTimestamp(); + assertEquals( + uniqueAttributeName[0], + backtraceClient.metrics.getUniqueEvents().getLast().getName()); + long previousTimestamp = + backtraceClient.metrics.getUniqueEvents().getLast().getTimestamp(); // Wait 1 second so that the timestamp will update on the next send. // Timestamp granularity is 1 second @@ -374,7 +438,8 @@ public void uniqueEventUpdateTimestamp() { // Force update backtraceClient.metrics.send(); - long updatedTimestamp = backtraceClient.metrics.getUniqueEvents().getLast().getTimestamp(); + long updatedTimestamp = + backtraceClient.metrics.getUniqueEvents().getLast().getTimestamp(); assertTrue(updatedTimestamp > previousTimestamp); } @@ -388,16 +453,35 @@ public void uniqueEventUpdateAttributes() { assertTrue(backtraceClient.metrics.addUniqueEvent(uniqueAttributeName[0])); - assertEquals(uniqueAttributeName[0], backtraceClient.metrics.getUniqueEvents().getLast().getName()); - assertNull(backtraceClient.metrics.getUniqueEvents().getLast().getAttributes().get(expectedKey)); + assertEquals( + uniqueAttributeName[0], + backtraceClient.metrics.getUniqueEvents().getLast().getName()); + assertNull(backtraceClient + .metrics + .getUniqueEvents() + .getLast() + .getAttributes() + .get(expectedKey)); backtraceClient.attributes.put(expectedKey, expectedValue); // It should not be added to the unique event yet - assertNull(backtraceClient.metrics.getUniqueEvents().getLast().getAttributes().get(expectedKey)); + assertNull(backtraceClient + .metrics + .getUniqueEvents() + .getLast() + .getAttributes() + .get(expectedKey)); // Force update backtraceClient.metrics.send(); - assertEquals(expectedValue, backtraceClient.metrics.getUniqueEvents().getLast().getAttributes().get(expectedKey)); + assertEquals( + expectedValue, + backtraceClient + .metrics + .getUniqueEvents() + .getLast() + .getAttributes() + .get(expectedKey)); } } diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceCredentialsTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceCredentialsTest.java index a38adb5f1..2d9b14312 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceCredentialsTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceCredentialsTest.java @@ -4,9 +4,7 @@ import static org.junit.Assert.assertNull; import android.net.Uri; - import androidx.test.ext.junit.runners.AndroidJUnit4; - import org.junit.Test; import org.junit.runner.RunWith; @@ -15,7 +13,8 @@ public class BacktraceCredentialsTest { private final String fakeUniverse = "universe"; private final String fakeToken = "aaaaabbbbbccccf82668682e69f59b38e0a853bed941e08e85f4bf5eb2c54584"; - private final String legacyUrl = "https://" + fakeUniverse + ".sp.backtrace.io:6098/post?format=json&token=" + fakeToken; + private final String legacyUrl = + "https://" + fakeUniverse + ".sp.backtrace.io:6098/post?format=json&token=" + fakeToken; private final String url = "https://submit.backtrace.io/" + fakeUniverse + "/" + fakeToken + "/json"; private final String urlPrefix = "https://" + fakeUniverse + ".sp.backtrace.io:6098"; diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceErrorTypeAttributeTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceErrorTypeAttributeTest.java index e8ca3470b..4f9bd39ad 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceErrorTypeAttributeTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceErrorTypeAttributeTest.java @@ -5,18 +5,8 @@ import static org.junit.Assert.assertEquals; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.concurrent.TimeUnit; - import backtraceio.library.events.OnServerResponseEventListener; import backtraceio.library.events.RequestHandler; import backtraceio.library.models.BacktraceAttributeConsts; @@ -24,6 +14,11 @@ import backtraceio.library.models.BacktraceResult; import backtraceio.library.models.json.BacktraceReport; import backtraceio.library.models.types.BacktraceResultStatus; +import java.util.concurrent.TimeUnit; +import net.jodah.concurrentunit.Waiter; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceErrorTypeAttributeTest { @@ -42,7 +37,9 @@ public void setDefaultErrorTypeForExceptionTypeOfError() { BacktraceReport report = new BacktraceReport(new Exception("test exception")); assertTrue(report.attributes.containsKey(BacktraceAttributeConsts.ErrorType)); - assertEquals(report.attributes.get(BacktraceAttributeConsts.ErrorType), BacktraceAttributeConsts.HandledExceptionAttributeType); + assertEquals( + report.attributes.get(BacktraceAttributeConsts.ErrorType), + BacktraceAttributeConsts.HandledExceptionAttributeType); } @Test @@ -50,7 +47,9 @@ public void setDefaultErrorTypeForMessageType() { BacktraceReport report = new BacktraceReport("test message"); assertTrue(report.attributes.containsKey(BacktraceAttributeConsts.ErrorType)); - assertEquals(report.attributes.get(BacktraceAttributeConsts.ErrorType), BacktraceAttributeConsts.MessageAttributeType); + assertEquals( + report.attributes.get(BacktraceAttributeConsts.ErrorType), + BacktraceAttributeConsts.MessageAttributeType); } @Test @@ -62,27 +61,27 @@ public void sendBacktraceExceptionWithErrorType() { RequestHandler rh = new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { - return new BacktraceResult(data.getReport(), data.getReport().exception.getMessage(), - BacktraceResultStatus.Ok); + return new BacktraceResult( + data.getReport(), data.getReport().exception.getMessage(), BacktraceResultStatus.Ok); } }; backtraceClient.setOnRequestHandler(rh); // WHEN - backtraceClient.send(new Exception("test exception"), new - OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - // THEN - String errorType = backtraceResult.getBacktraceReport().attributes.get(BacktraceAttributeConsts.ErrorType).toString(); - assertEquals( - errorType, - BacktraceAttributeConsts.HandledExceptionAttributeType); - - waiter.resume(); - } - } - ); + backtraceClient.send(new Exception("test exception"), new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + // THEN + String errorType = backtraceResult + .getBacktraceReport() + .attributes + .get(BacktraceAttributeConsts.ErrorType) + .toString(); + assertEquals(errorType, BacktraceAttributeConsts.HandledExceptionAttributeType); + + waiter.resume(); + } + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceFileAttachments.java b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceFileAttachments.java index ea31aae3c..4b292292d 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceFileAttachments.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceFileAttachments.java @@ -5,19 +5,17 @@ import static org.junit.Assert.assertNotNull; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.rule.GrantPermissionRule; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - +import backtraceio.library.common.FileHelper; +import backtraceio.library.common.MultiFormRequestHelper; +import backtraceio.library.events.OnServerResponseEventListener; +import backtraceio.library.events.RequestHandler; +import backtraceio.library.models.BacktraceData; +import backtraceio.library.models.BacktraceResult; +import backtraceio.library.models.json.BacktraceReport; +import backtraceio.library.models.types.BacktraceResultStatus; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -27,15 +25,12 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; - -import backtraceio.library.common.FileHelper; -import backtraceio.library.common.MultiFormRequestHelper; -import backtraceio.library.events.OnServerResponseEventListener; -import backtraceio.library.events.RequestHandler; -import backtraceio.library.models.BacktraceData; -import backtraceio.library.models.BacktraceResult; -import backtraceio.library.models.json.BacktraceReport; -import backtraceio.library.models.types.BacktraceResultStatus; +import net.jodah.concurrentunit.Waiter; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceFileAttachments { @@ -46,7 +41,6 @@ public class BacktraceFileAttachments { private static Context context; private String absolutePath; - @Before public void setUp() { context = InstrumentationRegistry.getInstrumentation().getContext(); @@ -56,17 +50,19 @@ public void setUp() { } @Rule - public GrantPermissionRule mRuntimePermissionRule = GrantPermissionRule.grant(android - .Manifest.permission.READ_EXTERNAL_STORAGE); + public GrantPermissionRule mRuntimePermissionRule = + GrantPermissionRule.grant(android.Manifest.permission.READ_EXTERNAL_STORAGE); @Test public void streamFileAttachment() { // GIVEN final Waiter waiter = new Waiter(); createTestFile(); - final List attachments = new ArrayList() {{ - add(absolutePath); - }}; + final List attachments = new ArrayList() { + { + add(absolutePath); + } + }; // WHEN final List fileContents = new ArrayList<>(); @@ -86,18 +82,17 @@ public BacktraceResult onRequest(BacktraceData data) { return new BacktraceResult(); } }); - client.send(new BacktraceReport("test", null, attachments), new - OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - // THEN - assertNotNull(backtraceResult); - assertEquals(backtraceResult.status, BacktraceResultStatus.Ok); - assertEquals(1, fileContents.size()); - assertEquals(fileContent, new String(fileContents.get(0))); - waiter.resume(); - } - }); + client.send(new BacktraceReport("test", null, attachments), new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + // THEN + assertNotNull(backtraceResult); + assertEquals(backtraceResult.status, BacktraceResultStatus.Ok); + assertEquals(1, fileContents.size()); + assertEquals(fileContent, new String(fileContents.get(0))); + waiter.resume(); + } + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(5, TimeUnit.SECONDS); @@ -110,12 +105,14 @@ public void onEvent(BacktraceResult backtraceResult) { public void streamNotExistFiles() { // GIVEN final Waiter waiter = new Waiter(); - final List attachments = new ArrayList() {{ - add(null); - add(""); - add("broken path"); - add(context.getFilesDir().getAbsolutePath() + "/not_existing_file.txt"); - }}; + final List attachments = new ArrayList() { + { + add(null); + add(""); + add("broken path"); + add(context.getFilesDir().getAbsolutePath() + "/not_existing_file.txt"); + } + }; // WHEN final List fileContents = new ArrayList<>(); @@ -137,17 +134,16 @@ public BacktraceResult onRequest(BacktraceData data) { return new BacktraceResult(); } }); - client.send(new BacktraceReport("test", null, attachments), new - OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - // THEN - assertNotNull(backtraceResult); - assertEquals(backtraceResult.status, BacktraceResultStatus.Ok); - assertEquals(0, fileContents.size()); - waiter.resume(); - } - }); + client.send(new BacktraceReport("test", null, attachments), new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + // THEN + assertNotNull(backtraceResult); + assertEquals(backtraceResult.status, BacktraceResultStatus.Ok); + assertEquals(0, fileContents.size()); + waiter.resume(); + } + }); // WAIT FOR THE RESULT FROM ANOTHER THREAD try { waiter.await(1005, TimeUnit.SECONDS); @@ -161,7 +157,6 @@ public void tearDown() { deleteTestFile(); } - public boolean createTestFile() { try { FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE); diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceUrlTests.java b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceUrlTests.java index 1198d7ca8..674bf9d12 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceUrlTests.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceUrlTests.java @@ -1,9 +1,7 @@ package backtraceio.library; import android.net.Uri; - import androidx.test.ext.junit.runners.AndroidJUnit4; - import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/SettingAttributesTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/SettingAttributesTest.java index be6e3a24c..cb93f63ea 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/SettingAttributesTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/SettingAttributesTest.java @@ -6,21 +6,8 @@ import static org.junit.Assert.fail; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - import backtraceio.library.events.OnServerResponseEventListener; import backtraceio.library.events.RequestHandler; import backtraceio.library.models.BacktraceAttributeConsts; @@ -31,7 +18,14 @@ import backtraceio.library.models.json.BacktraceAttributes; import backtraceio.library.models.json.BacktraceReport; import backtraceio.library.models.types.BacktraceResultStatus; - +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import net.jodah.concurrentunit.Waiter; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class SettingAttributesTest { @@ -47,9 +41,11 @@ public void setUp() { context = InstrumentationRegistry.getInstrumentation().getContext(); final String url = "https://backtrace.io/"; backtraceCredentials = new BacktraceCredentials(url); - clientAttributes = new HashMap() {{ - put(customClientAttributeKey, customClientAttributeValue); - }}; + clientAttributes = new HashMap() { + { + put(customClientAttributeKey, customClientAttributeValue); + } + }; } @Test @@ -68,7 +64,8 @@ public void createBacktraceClientWithContextAndCredentials() { @Test public void createBacktraceClientWithContextCredentialsAndDatabaseSettings() { // GIVEN - BacktraceClient client = new BacktraceClient(context, this.backtraceCredentials, new BacktraceDatabaseSettings("/")); + BacktraceClient client = + new BacktraceClient(context, this.backtraceCredentials, new BacktraceDatabaseSettings("/")); // WHEN Map attributes = client.getAttributes(); int size = attributes.size(); @@ -108,7 +105,8 @@ public void createBacktraceClientWithContextCredentialsAndAttributes() { @Test public void createBacktraceClientWithContextCredentialsDatabaseSettingsAndAttributes() { // GIVEN - BacktraceClient client = new BacktraceClient(context, this.backtraceCredentials, new BacktraceDatabaseSettings("/"), this.clientAttributes); + BacktraceClient client = new BacktraceClient( + context, this.backtraceCredentials, new BacktraceDatabaseSettings("/"), this.clientAttributes); // WHEN Map attributes = client.getAttributes(); int size = attributes.size(); @@ -122,7 +120,8 @@ public void createBacktraceClientWithContextCredentialsDatabaseSettingsAndAttrib @Test public void createBacktraceClientWithContextCredentialsDatabaseAndAttributes() { // GIVEN - BacktraceClient client = new BacktraceClient(context, this.backtraceCredentials, (BacktraceDatabase) null, this.clientAttributes); + BacktraceClient client = new BacktraceClient( + context, this.backtraceCredentials, (BacktraceDatabase) null, this.clientAttributes); // WHEN Map attributes = client.getAttributes(); int size = attributes.size(); @@ -137,7 +136,8 @@ public void createBacktraceClientWithContextCredentialsDatabaseAndAttributes() { public void checkIfAttributesAreInBacktraceData() { // GIVEN final Waiter waiter = new Waiter(); - BacktraceClient backtraceClient = new BacktraceClient(context, this.backtraceCredentials, (BacktraceDatabase) null, this.clientAttributes); + BacktraceClient backtraceClient = new BacktraceClient( + context, this.backtraceCredentials, (BacktraceDatabase) null, this.clientAttributes); RequestHandler rh = new RequestHandler() { @Override public BacktraceResult onRequest(BacktraceData data) { @@ -167,7 +167,7 @@ public void onEvent(BacktraceResult backtraceResult) { @Test public void checkIfAttributesAreSettingWellInUnhandledExceptionHandler() { -// GIVEN + // GIVEN final Waiter waiter = new Waiter(); final String exceptionMessage = "expected!"; Thread customThread = new Thread(new Runnable() { @@ -180,9 +180,13 @@ public BacktraceResult onRequest(BacktraceData data) { final BacktraceReport dataReport = data.getReport(); waiter.assertTrue(dataReport.attributes.containsKey(customClientAttributeKey)); - waiter.assertEquals(customClientAttributeValue, dataReport.attributes.get(customClientAttributeKey)); - waiter.assertEquals(exceptionMessage, data.getReport().exception.getMessage()); - waiter.assertEquals(dataReport.attributes.get(BacktraceAttributeConsts.ErrorType), BacktraceAttributeConsts.UnhandledExceptionAttributeType); + waiter.assertEquals( + customClientAttributeValue, dataReport.attributes.get(customClientAttributeKey)); + waiter.assertEquals( + exceptionMessage, data.getReport().exception.getMessage()); + waiter.assertEquals( + dataReport.attributes.get(BacktraceAttributeConsts.ErrorType), + BacktraceAttributeConsts.UnhandledExceptionAttributeType); waiter.resume(); return new BacktraceResult(data.getReport(), "", BacktraceResultStatus.Ok); diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/anr/BacktraceAppExitInfoSenderHandlerTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/anr/BacktraceAppExitInfoSenderHandlerTest.java index 422f564d4..1b1897fb3 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/anr/BacktraceAppExitInfoSenderHandlerTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/anr/BacktraceAppExitInfoSenderHandlerTest.java @@ -8,26 +8,9 @@ import android.app.ApplicationExitInfo; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SdkSuppress; import androidx.test.platform.app.InstrumentationRegistry; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - import backtraceio.library.BacktraceClient; import backtraceio.library.BacktraceCredentials; import backtraceio.library.TestUtils; @@ -35,6 +18,18 @@ import backtraceio.library.models.BacktraceApiResult; import backtraceio.library.models.BacktraceData; import backtraceio.library.models.BacktraceResult; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import net.jodah.concurrentunit.Waiter; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; @RunWith(AndroidJUnit4.class) public class BacktraceAppExitInfoSenderHandlerTest { @@ -54,8 +49,16 @@ public void setUp() throws Exception { this.backtraceClient = new BacktraceClient(this.mockContext, credentials); } - private ExitInfo mockApplicationExitInfo(String description, Long timestamp, int reason, - int pid, int importance, long pss, long rss, InputStream stacktrace) throws IOException { + private ExitInfo mockApplicationExitInfo( + String description, + Long timestamp, + int reason, + int pid, + int importance, + long pss, + long rss, + InputStream stacktrace) + throws IOException { ExitInfo mockExitInfo = mock(ExitInfo.class); when(mockExitInfo.getDescription()).thenReturn(description); when(mockExitInfo.getTimestamp()).thenReturn(timestamp); @@ -68,17 +71,25 @@ private ExitInfo mockApplicationExitInfo(String description, Long timestamp, int return mockExitInfo; } - private ExitInfo mockApplicationExitInfo(String description, Long timestamp, int reason, InputStream stacktrace) throws IOException { + private ExitInfo mockApplicationExitInfo(String description, Long timestamp, int reason, InputStream stacktrace) + throws IOException { return mockApplicationExitInfo(description, timestamp, reason, 0, 0, 0L, 0L, stacktrace); } private ProcessExitInfoProvider mockActivityManagerExitInfoProvider() throws IOException { ActivityManagerExitInfoProvider mock = mock(ActivityManagerExitInfoProvider.class); final List exitInfoList = new ArrayList<>(); - exitInfoList.add(mockApplicationExitInfo("random-text", System.currentTimeMillis(), ApplicationExitInfo.REASON_CRASH_NATIVE, null)); - exitInfoList.add(mockApplicationExitInfo("anr", System.currentTimeMillis(), ApplicationExitInfo.REASON_ANR, TestUtils.readFileAsStream(this, ANR_APPEXIT_STACKTRACE_FILE))); - exitInfoList.add(mockApplicationExitInfo("anr without stacktrace", System.currentTimeMillis(), ApplicationExitInfo.REASON_ANR, null)); - exitInfoList.add(mockApplicationExitInfo("random-description", System.currentTimeMillis(), ApplicationExitInfo.REASON_LOW_MEMORY, null)); + exitInfoList.add(mockApplicationExitInfo( + "random-text", System.currentTimeMillis(), ApplicationExitInfo.REASON_CRASH_NATIVE, null)); + exitInfoList.add(mockApplicationExitInfo( + "anr", + System.currentTimeMillis(), + ApplicationExitInfo.REASON_ANR, + TestUtils.readFileAsStream(this, ANR_APPEXIT_STACKTRACE_FILE))); + exitInfoList.add(mockApplicationExitInfo( + "anr without stacktrace", System.currentTimeMillis(), ApplicationExitInfo.REASON_ANR, null)); + exitInfoList.add(mockApplicationExitInfo( + "random-description", System.currentTimeMillis(), ApplicationExitInfo.REASON_LOW_MEMORY, null)); when(mock.getHistoricalExitInfo(PACKAGE_NAME, 0, 0)).thenReturn(exitInfoList); when(mock.getSupportedTypesOfExitInfo()).thenReturn(Collections.singletonList(ApplicationExitInfo.REASON_ANR)); @@ -114,8 +125,9 @@ public BacktraceResult onRequest(BacktraceData data) { waiter.assertEquals("anr", anrAnnotations.get("description")); waiter.assertEquals(ApplicationExitInfo.REASON_ANR, anrAnnotations.get("reason-code")); waiter.assertEquals("anr", anrAnnotations.get("reason")); - waiter.assertTrue(((Map)annotations.get("ANR parsed stacktrace")).size() > 0); - waiter.assertEquals("backtraceio.library.anr.BacktraceANRExitInfoException", attributes.get("classifier")); + waiter.assertTrue(((Map) annotations.get("ANR parsed stacktrace")).size() > 0); + waiter.assertEquals( + "backtraceio.library.anr.BacktraceANRExitInfoException", attributes.get("classifier")); waiter.assertEquals("Hang", attributes.get("error.type")); waiter.assertTrue(attributes.get("ANR stacktrace").length() > 0); waiter.resume(); @@ -124,7 +136,8 @@ public BacktraceResult onRequest(BacktraceData data) { } }); // WHEN - new BacktraceAppExitInfoSenderHandler(this.backtraceClient, PACKAGE_NAME, anrExitInfoState, mockProcessExitInfoProvider); + new BacktraceAppExitInfoSenderHandler( + this.backtraceClient, PACKAGE_NAME, anrExitInfoState, mockProcessExitInfoProvider); // THEN try { @@ -150,7 +163,8 @@ public BacktraceResult onRequest(BacktraceData data) { } }); // WHEN - new BacktraceAppExitInfoSenderHandler(this.backtraceClient, PACKAGE_NAME, anrExitInfoState, mockProcessExitInfoProvider); + new BacktraceAppExitInfoSenderHandler( + this.backtraceClient, PACKAGE_NAME, anrExitInfoState, mockProcessExitInfoProvider); // THEN try { diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/breadcrumbs/BacktraceBreadcrumbsTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/breadcrumbs/BacktraceBreadcrumbsTest.java index 99bb74592..69dade937 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/breadcrumbs/BacktraceBreadcrumbsTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/breadcrumbs/BacktraceBreadcrumbsTest.java @@ -7,24 +7,20 @@ import static junit.framework.TestCase.fail; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import org.json.JSONException; -import org.json.JSONObject; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; - +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceBreadcrumbsTest { @@ -53,7 +49,8 @@ public void testAddBreadcrumb() { try { assertTrue(backtraceBreadcrumbs.addBreadcrumb("Test")); - List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile( + context.getFilesDir().getAbsolutePath()); // First breadcrumb is configuration breadcrumb // We start from the second breadcrumb @@ -70,7 +67,8 @@ public void testClearBreadcrumbs() { try { assertTrue(backtraceBreadcrumbs.addBreadcrumb("Test")); - List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile( + context.getFilesDir().getAbsolutePath()); assertEquals(2, breadcrumbLogFileData.size()); // First breadcrumb is configuration breadcrumb @@ -83,7 +81,8 @@ public void testClearBreadcrumbs() { // Should have cleared the breadcrumb we just read but // We should still have a configuration breadcrumb - breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile( + context.getFilesDir().getAbsolutePath()); assertEquals(1, breadcrumbLogFileData.size()); parsedBreadcrumb = new JSONObject(breadcrumbLogFileData.get(0)); @@ -98,12 +97,14 @@ public void testEnableBreadcrumbs() { try { cleanUp(); - backtraceBreadcrumbs = new BacktraceBreadcrumbs(context.getFilesDir().getAbsolutePath()); + backtraceBreadcrumbs = + new BacktraceBreadcrumbs(context.getFilesDir().getAbsolutePath()); assertTrue(backtraceBreadcrumbs.enableBreadcrumbs(context)); assertTrue(backtraceBreadcrumbs.addBreadcrumb("Test")); - List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile( + context.getFilesDir().getAbsolutePath()); // First breadcrumb is configuration breadcrumb // We start from the second breadcrumb @@ -119,14 +120,17 @@ public void testEnableBreadcrumbs() { @Test public void testAddBreadcrumbWithAttributes() { try { - Map attributes = new HashMap() {{ - put("floopy", "doopy"); - put("flim", "flam"); - }}; + Map attributes = new HashMap() { + { + put("floopy", "doopy"); + put("flim", "flam"); + } + }; backtraceBreadcrumbs.addBreadcrumb("Test", attributes); - List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile( + context.getFilesDir().getAbsolutePath()); // First breadcrumb is configuration breadcrumb // We start from the second breadcrumb @@ -146,7 +150,8 @@ public void testSpaceInMessage() { try { backtraceBreadcrumbs.addBreadcrumb("Testing 1 2 3"); - List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile( + context.getFilesDir().getAbsolutePath()); // First breadcrumb is configuration breadcrumb // We start from the second breadcrumb @@ -164,7 +169,8 @@ public void testNewlineInMessage() { try { backtraceBreadcrumbs.addBreadcrumb("Testing\n 1 2\n 3\n"); - List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile( + context.getFilesDir().getAbsolutePath()); // First breadcrumb is configuration breadcrumb // We start from the second breadcrumb @@ -180,22 +186,26 @@ public void testNewlineInMessage() { @Test public void testInvalidCharsInAttribute() { try { - Map attributes = new HashMap() {{ - put(" flo opy", "do o py "); - put("fl\nim", "fl\nam\n"); - put(" foo ", "b\na r "); - }}; + Map attributes = new HashMap() { + { + put(" flo opy", "do o py "); + put("fl\nim", "fl\nam\n"); + put(" foo ", "b\na r "); + } + }; backtraceBreadcrumbs.addBreadcrumb("Test", attributes); - List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile( + context.getFilesDir().getAbsolutePath()); // First breadcrumb is configuration breadcrumb // We start from the second breadcrumb JSONObject parsedBreadcrumb = new JSONObject(breadcrumbLogFileData.get(1)); assertEquals("Test", parsedBreadcrumb.get("message")); - assertEquals("do o py ", parsedBreadcrumb.getJSONObject("attributes").get(" flo opy")); + assertEquals( + "do o py ", parsedBreadcrumb.getJSONObject("attributes").get(" flo opy")); assertEquals("flam", parsedBreadcrumb.getJSONObject("attributes").get("flim")); assertEquals("ba r ", parsedBreadcrumb.getJSONObject("attributes").get(" foo ")); } catch (Exception ex) { @@ -208,7 +218,8 @@ public void testLongMessage() { try { backtraceBreadcrumbs.addBreadcrumb(longTestMessage); - List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile( + context.getFilesDir().getAbsolutePath()); // First breadcrumb is configuration breadcrumb // We start from the second breadcrumb @@ -223,21 +234,26 @@ public void testLongMessage() { @Test public void testLongAttributesLongFirst() { try { - final Map attributes = new LinkedHashMap() {{ - put(longTestAttributeKey, longTestAttributeValue); - put(reasonableLengthAttributeKey, reasonableLengthAttributeValue); - }}; + final Map attributes = new LinkedHashMap() { + { + put(longTestAttributeKey, longTestAttributeValue); + put(reasonableLengthAttributeKey, reasonableLengthAttributeValue); + } + }; backtraceBreadcrumbs.addBreadcrumb("Test", attributes); - List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile( + context.getFilesDir().getAbsolutePath()); // First breadcrumb is configuration breadcrumb // We start from the second breadcrumb JSONObject parsedBreadcrumb = new JSONObject(breadcrumbLogFileData.get(1)); assertEquals("Test", parsedBreadcrumb.get("message")); - assertEquals(expectedLongTestAttributeValue, parsedBreadcrumb.getJSONObject("attributes").get(expectedLongTestAttributeKey)); + assertEquals( + expectedLongTestAttributeValue, + parsedBreadcrumb.getJSONObject("attributes").get(expectedLongTestAttributeKey)); assertFalse(parsedBreadcrumb.getJSONObject("attributes").has(reasonableLengthAttributeKey)); } catch (Exception ex) { fail(ex.getMessage()); @@ -247,21 +263,26 @@ public void testLongAttributesLongFirst() { @Test public void testLongAttributesShortFirst() { try { - final Map attributes = new LinkedHashMap() {{ - put(reasonableLengthAttributeKey, reasonableLengthAttributeValue); - put(longTestAttributeKey, longTestAttributeValue); - }}; + final Map attributes = new LinkedHashMap() { + { + put(reasonableLengthAttributeKey, reasonableLengthAttributeValue); + put(longTestAttributeKey, longTestAttributeValue); + } + }; backtraceBreadcrumbs.addBreadcrumb("Test", attributes); - List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile( + context.getFilesDir().getAbsolutePath()); // First breadcrumb is configuration breadcrumb // We start from the second breadcrumb JSONObject parsedBreadcrumb = new JSONObject(breadcrumbLogFileData.get(1)); assertEquals("Test", parsedBreadcrumb.get("message")); - assertEquals(reasonableLengthAttributeValue, parsedBreadcrumb.getJSONObject("attributes").get(reasonableLengthAttributeKey)); + assertEquals( + reasonableLengthAttributeValue, + parsedBreadcrumb.getJSONObject("attributes").get(reasonableLengthAttributeKey)); assertFalse(parsedBreadcrumb.getJSONObject("attributes").has(expectedLongTestAttributeKey)); } catch (Exception ex) { fail(ex.getMessage()); @@ -277,13 +298,16 @@ public void testQueueFileShouldNotRollover() { try { for (int i = 0; i < numIterations; i++) { final long threadId = Thread.currentThread().getId(); - Map attributes = new HashMap() {{ - put("From Thread", threadId); - }}; + Map attributes = new HashMap() { + { + put("From Thread", threadId); + } + }; backtraceBreadcrumbs.addBreadcrumb("I am a breadcrumb", attributes); } - List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile( + context.getFilesDir().getAbsolutePath()); // First breadcrumb is configuration breadcrumb, it should be valid JSONObject parsedBreadcrumb = new JSONObject(breadcrumbLogFileData.get(0)); @@ -316,18 +340,24 @@ public void testQueueFileRollover() { try { for (int i = 0; i < numIterations; i++) { final long threadId = Thread.currentThread().getId(); - Map attributes = new HashMap() {{ - put("From Thread", threadId); - }}; + Map attributes = new HashMap() { + { + put("From Thread", threadId); + } + }; backtraceBreadcrumbs.addBreadcrumb("I am a breadcrumb", attributes); } long breadcrumbsFileSize = new File(backtraceBreadcrumbs.getBreadcrumbLogPath()).length(); - assertTrue(String.format("Size of breadcrumbs file (%s) not close enough to a full breadcrumb file (%s)", breadcrumbsFileSize, 64 * 1024), + assertTrue( + String.format( + "Size of breadcrumbs file (%s) not close enough to a full breadcrumb file (%s)", + breadcrumbsFileSize, 64 * 1024), breadcrumbsFileSize > 63 * 1024); // We should have rolled over the configuration breadcrumb, consider all breadcrumbs here - List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile( + context.getFilesDir().getAbsolutePath()); for (int i = 0; i < breadcrumbLogFileData.size(); i++) { JSONObject parsedBreadcrumb = new JSONObject(breadcrumbLogFileData.get(i)); assertEquals("I am a breadcrumb", parsedBreadcrumb.get("message")); @@ -337,8 +367,10 @@ public void testQueueFileRollover() { // Timestamp should be convertible to a long assertTrue(parsedBreadcrumb.get("timestamp") instanceof Long); final int id = (int) parsedBreadcrumb.get("id"); - assertTrue(String.format("Breadcrumb ID %s was higher than the expected numIterations %s", - id, numIterations), id <= numIterations); + assertTrue( + String.format( + "Breadcrumb ID %s was higher than the expected numIterations %s", id, numIterations), + id <= numIterations); } } catch (Exception ex) { @@ -354,20 +386,24 @@ public void testQueueFileShouldNotRolloverCustomMax() { cleanUp(); try { - backtraceBreadcrumbs = new BacktraceBreadcrumbs(context.getFilesDir().getAbsolutePath()); + backtraceBreadcrumbs = + new BacktraceBreadcrumbs(context.getFilesDir().getAbsolutePath()); backtraceBreadcrumbs.enableBreadcrumbs(context, 6400); // Account for mandatory configuration breadcrumb backtraceBreadcrumbs.setCurrentBreadcrumbId(1); for (int i = 0; i < numIterations; i++) { final long threadId = Thread.currentThread().getId(); - Map attributes = new HashMap() {{ - put("From Thread", threadId); - }}; + Map attributes = new HashMap() { + { + put("From Thread", threadId); + } + }; backtraceBreadcrumbs.addBreadcrumb("I am a breadcrumb", attributes); } - List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile( + context.getFilesDir().getAbsolutePath()); // First breadcrumb is configuration breadcrumb, it should be valid JSONObject parsedBreadcrumb = new JSONObject(breadcrumbLogFileData.get(0)); @@ -404,13 +440,16 @@ public void testQueueFileRolloverCustomMax() throws IOException, JSONException { for (int i = 0; i < numIterations; i++) { final long threadId = Thread.currentThread().getId(); - Map attributes = new HashMap() {{ - put("From Thread", threadId); - }}; + Map attributes = new HashMap() { + { + put("From Thread", threadId); + } + }; backtraceBreadcrumbs.addBreadcrumb("I am a breadcrumb", attributes); } - List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + List breadcrumbLogFileData = + BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); // We should have rolled over the configuration breadcrumb, consider all breadcrumbs here for (int i = 0; i < breadcrumbLogFileData.size(); i++) { @@ -440,7 +479,8 @@ public void breadcrumbsEnduranceTest() { threads[i].join(); } - List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath()); + List breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile( + context.getFilesDir().getAbsolutePath()); // First breadcrumb is configuration breadcrumb // We start from the second breadcrumb @@ -483,32 +523,40 @@ class BreadcrumbLogger implements Runnable { public void run() { for (int i = 0; i < this.numIterations; i++) { final long threadId = Thread.currentThread().getId(); - Map attributes = new HashMap() {{ - put("From Thread", threadId); - }}; + Map attributes = new HashMap() { + { + put("From Thread", threadId); + } + }; backtraceBreadcrumbs.addBreadcrumb("I am a breadcrumb", attributes); } } } - private final String longTestMessage = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ipsum consequat nisl vel pretium lectus quam id. Velit dignissim sodales ut eu sem integer vitae justo. Cursus euismod quis viverra nibh cras pulvinar. Pellentesque adipiscing commodo elit at imperdiet. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Purus sit amet luctus venenatis. Non consectetur a erat nam at. Pellentesque id nibh tortor id aliquet lectus proin. Purus semper eget duis at tellus. Sodales ut etiam sit amet nisl purus. Viverra justo nec ultrices dui sapien eget.\n" + - "\n" + - "Et ultrices neque ornare aenean euismod elementum nisi quis eleifend. Ut diam quam nulla porttitor. Vitae elementum curabitur vitae nunc sed. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. A diam sollicitudin tempor id eu nisl nunc. At urna condimentum mattis pellentesque id. Arcu odio ut sem nulla pharetra diam sit amet. Ipsum dolor sit amet consectetur adipiscing elit duis. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Faucibus interdum posuere lorem ipsum dolor. Aliquet risus feugiat in ante metus dictum at. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Enim nulla aliquet porttitor lacus luctus accumsan. Diam ut venenatis tellus in metus. Facilisi nullam vehicula ipsum a arcu cursus.\n" + - "\n" + - "Sed faucibus turpis in eu mi bibendum neque egestas congue. Ipsum nunc aliquet bibendum enim facilisis gravida neque convallis. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Id donec ultrices tincidunt arcu non sodales neque. Eu turpis egestas pretium aenean pharetra magna ac. Est ullamcorper eget nulla facilisi etiam dignissim diam. Eget arcu dictum varius duis at. Pretium quam vulputate dignissim suspendisse in est. Morbi quis commodo odio aenean sed adipiscing diam. Leo urna molestie at elementum eu."; + private final String longTestMessage = + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ipsum consequat nisl vel pretium lectus quam id. Velit dignissim sodales ut eu sem integer vitae justo. Cursus euismod quis viverra nibh cras pulvinar. Pellentesque adipiscing commodo elit at imperdiet. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Purus sit amet luctus venenatis. Non consectetur a erat nam at. Pellentesque id nibh tortor id aliquet lectus proin. Purus semper eget duis at tellus. Sodales ut etiam sit amet nisl purus. Viverra justo nec ultrices dui sapien eget.\n" + + "\n" + + "Et ultrices neque ornare aenean euismod elementum nisi quis eleifend. Ut diam quam nulla porttitor. Vitae elementum curabitur vitae nunc sed. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. A diam sollicitudin tempor id eu nisl nunc. At urna condimentum mattis pellentesque id. Arcu odio ut sem nulla pharetra diam sit amet. Ipsum dolor sit amet consectetur adipiscing elit duis. Adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Faucibus interdum posuere lorem ipsum dolor. Aliquet risus feugiat in ante metus dictum at. Pretium aenean pharetra magna ac placerat vestibulum lectus mauris ultrices. Enim nulla aliquet porttitor lacus luctus accumsan. Diam ut venenatis tellus in metus. Facilisi nullam vehicula ipsum a arcu cursus.\n" + + "\n" + + "Sed faucibus turpis in eu mi bibendum neque egestas congue. Ipsum nunc aliquet bibendum enim facilisis gravida neque convallis. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Id donec ultrices tincidunt arcu non sodales neque. Eu turpis egestas pretium aenean pharetra magna ac. Est ullamcorper eget nulla facilisi etiam dignissim diam. Eget arcu dictum varius duis at. Pretium quam vulputate dignissim suspendisse in est. Morbi quis commodo odio aenean sed adipiscing diam. Leo urna molestie at elementum eu."; - private final String expectedLongTestMessage = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ipsum consequat nisl vel pretium lectus quam id. Velit dignissim sodales ut eu sem integer vitae justo. Cursus euismod quis viverra nibh cras pulvinar. Pellentesque adipiscing commodo elit at imperdiet. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Purus sit amet luctus venenatis. Non consectetur a erat nam at. Pellentesque id nibh tortor id aliquet lectus proin. Purus semper eget duis at tellus. Sodales ut etiam sit amet nisl purus. Viverra justo nec ultrices dui sapien eget.Et ultrices neque ornare aenean euismod elementum nisi quis eleifend. Ut diam quam nulla porttitor. Vitae elementum curabitur vitae nunc sed. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. A diam sollicitudin tempor id eu nisl nunc. At urna condimentum mattis pellentesque id. Arcu odio ut sem nulla pharetra dia"; + private final String expectedLongTestMessage = + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ipsum consequat nisl vel pretium lectus quam id. Velit dignissim sodales ut eu sem integer vitae justo. Cursus euismod quis viverra nibh cras pulvinar. Pellentesque adipiscing commodo elit at imperdiet. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Purus sit amet luctus venenatis. Non consectetur a erat nam at. Pellentesque id nibh tortor id aliquet lectus proin. Purus semper eget duis at tellus. Sodales ut etiam sit amet nisl purus. Viverra justo nec ultrices dui sapien eget.Et ultrices neque ornare aenean euismod elementum nisi quis eleifend. Ut diam quam nulla porttitor. Vitae elementum curabitur vitae nunc sed. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. A diam sollicitudin tempor id eu nisl nunc. At urna condimentum mattis pellentesque id. Arcu odio ut sem nulla pharetra dia"; - private final String longTestAttributeKey = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ipsum consequat nisl vel pretium lectus quam id. Velit dignissim sodales ut eu sem integer vitae justo. Cursus euismod quis viverra nibh cras pulvinar. Pellentesque adipiscing commodo elit at imperdiet. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Purus sit amet luctus venenatis. Non consectetur a erat nam at. Pellentesque id nibh tortor id aliquet lectus proin. Purus semper eget duis at tellus. Sodales ut etiam sit amet nisl purus. Viverra justo nec ultrices dui sapien eget."; + private final String longTestAttributeKey = + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ipsum consequat nisl vel pretium lectus quam id. Velit dignissim sodales ut eu sem integer vitae justo. Cursus euismod quis viverra nibh cras pulvinar. Pellentesque adipiscing commodo elit at imperdiet. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Purus sit amet luctus venenatis. Non consectetur a erat nam at. Pellentesque id nibh tortor id aliquet lectus proin. Purus semper eget duis at tellus. Sodales ut etiam sit amet nisl purus. Viverra justo nec ultrices dui sapien eget."; - private final String longTestAttributeValue = "Et ultrices neque ornare aenean euismod elementum nisi quis eleifend. Ut diam quam nulla porttitor. Vitae elementum curabitur vitae nunc sed. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. A diam sollicitudin tempor id eu nisl nunc. At urna condimentum mattis pellentesque id. Arcu odio"; + private final String longTestAttributeValue = + "Et ultrices neque ornare aenean euismod elementum nisi quis eleifend. Ut diam quam nulla porttitor. Vitae elementum curabitur vitae nunc sed. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. A diam sollicitudin tempor id eu nisl nunc. At urna condimentum mattis pellentesque id. Arcu odio"; - private final String expectedLongTestAttributeKey = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ipsum consequat nisl vel pretium lectus quam id. Velit dignissim sodales ut eu sem integer vitae justo. Cursus euismod quis viverra nibh cras pulvinar. Pellentesque adipiscing commodo elit at imperdiet. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Purus sit amet luctus venenatis. Non consectetur a erat nam at. Pellentesque id nibh tortor id aliquet lectus proin. Purus semper eget duis at tellus. Sodales ut etiam sit amet nisl purus. Viverra justo nec ultrices dui sapien eget."; + private final String expectedLongTestAttributeKey = + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ipsum consequat nisl vel pretium lectus quam id. Velit dignissim sodales ut eu sem integer vitae justo. Cursus euismod quis viverra nibh cras pulvinar. Pellentesque adipiscing commodo elit at imperdiet. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Purus sit amet luctus venenatis. Non consectetur a erat nam at. Pellentesque id nibh tortor id aliquet lectus proin. Purus semper eget duis at tellus. Sodales ut etiam sit amet nisl purus. Viverra justo nec ultrices dui sapien eget."; - private final String expectedLongTestAttributeValue = "Et ultrices neque ornare aenean euismod elementum nisi quis eleifend. Ut diam quam nulla porttitor. Vitae elementum curabitur vitae nunc sed. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. A diam sollicitudin tempor id eu nisl nunc. At urna condimentum mattis pellentesque id. Arcu odio"; + private final String expectedLongTestAttributeValue = + "Et ultrices neque ornare aenean euismod elementum nisi quis eleifend. Ut diam quam nulla porttitor. Vitae elementum curabitur vitae nunc sed. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. A diam sollicitudin tempor id eu nisl nunc. At urna condimentum mattis pellentesque id. Arcu odio"; private final String reasonableLengthAttributeKey = "reasonablySizedKey"; private final String reasonableLengthAttributeValue = "reasonableSizedValue"; -} \ No newline at end of file +} diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/common/BacktraceMathHelperTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/common/BacktraceMathHelperTest.java index 4bf43baa2..481926f05 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/common/BacktraceMathHelperTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/common/BacktraceMathHelperTest.java @@ -4,7 +4,6 @@ import static junit.framework.TestCase.assertTrue; import androidx.test.ext.junit.runners.AndroidJUnit4; - import org.junit.Test; import org.junit.runner.RunWith; diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/common/BacktraceStringHelperTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/common/BacktraceStringHelperTest.java index df3d334e3..6ed1b40fc 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/common/BacktraceStringHelperTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/common/BacktraceStringHelperTest.java @@ -4,7 +4,6 @@ import static junit.framework.TestCase.assertTrue; import androidx.test.ext.junit.runners.AndroidJUnit4; - import org.junit.Test; import org.junit.runner.RunWith; @@ -29,7 +28,6 @@ public void testStringIsValid() { assertFalse(BacktraceStringHelper.isNullOrEmpty(someString)); } - @Test public void testObjectIsNull() { Object nullObject = null; diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/common/SharedPreferencesManagerTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/common/SharedPreferencesManagerTest.java index a74b8aec0..d1c4296a1 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/common/SharedPreferencesManagerTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/common/SharedPreferencesManagerTest.java @@ -9,7 +9,6 @@ import android.content.Context; import android.content.SharedPreferences; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/crashHandler/BacktraceCrashHandlerRunnerConfigurationTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/crashHandler/BacktraceCrashHandlerRunnerConfigurationTest.java index 370defa7f..88de6690d 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/crashHandler/BacktraceCrashHandlerRunnerConfigurationTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/crashHandler/BacktraceCrashHandlerRunnerConfigurationTest.java @@ -6,22 +6,18 @@ import static org.junit.Assert.fail; import androidx.test.ext.junit.runners.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - +import backtraceio.library.models.nativeHandler.CrashHandlerConfiguration; import java.util.List; import java.util.Map; - -import backtraceio.library.models.nativeHandler.CrashHandlerConfiguration; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceCrashHandlerRunnerConfigurationTest { @Test public void unsupportedAbiVersion() { CrashHandlerConfiguration crashHandlerConfiguration = new CrashHandlerConfiguration(); - for (String unsupportedAbi : - CrashHandlerConfiguration.UNSUPPORTED_ABIS) { + for (String unsupportedAbi : CrashHandlerConfiguration.UNSUPPORTED_ABIS) { assertFalse(crashHandlerConfiguration.isSupportedAbi(unsupportedAbi)); } } @@ -29,8 +25,7 @@ public void unsupportedAbiVersion() { @Test public void supportedAbiVersion() { CrashHandlerConfiguration crashHandlerConfiguration = new CrashHandlerConfiguration(); - for (String unsupportedAbi : - new String[]{"armeabi", "arm64", "arm64-v8", "x86-64"}) { + for (String unsupportedAbi : new String[] {"armeabi", "arm64", "arm64-v8", "x86-64"}) { assertTrue(crashHandlerConfiguration.isSupportedAbi(unsupportedAbi)); } } @@ -41,10 +36,15 @@ public void environmentVariableHasCorrectPathToLibrary() { String fakePathToApk = "fake/path/to/apk/apk.apk"; String fakePathToLib = "fake/path/to/lib/arm64"; String fakeAbi = "fake-abi"; - List environmentVariables = crashHandlerConfiguration.getCrashHandlerEnvironmentVariables(fakePathToApk, fakePathToLib, fakeAbi); + List environmentVariables = + crashHandlerConfiguration.getCrashHandlerEnvironmentVariables(fakePathToApk, fakePathToLib, fakeAbi); for (String envVariable : environmentVariables) { if (envVariable.startsWith(CrashHandlerConfiguration.BACKTRACE_CRASH_HANDLER)) { - assertEquals(envVariable, String.format("%s=%s!/lib/%s/libbacktrace-native.so", CrashHandlerConfiguration.BACKTRACE_CRASH_HANDLER, fakePathToApk, fakeAbi)); + assertEquals( + envVariable, + String.format( + "%s=%s!/lib/%s/libbacktrace-native.so", + CrashHandlerConfiguration.BACKTRACE_CRASH_HANDLER, fakePathToApk, fakeAbi)); return; } } @@ -57,13 +57,15 @@ public void environmentVariableContainsJavaEnvVariables() { String fakePathToApk = "fake/path/to/apk/apk.apk"; String fakePathToLib = "fake/path/to/lib/arm64"; String fakeAbi = "fake-abi"; - List environmentVariables = crashHandlerConfiguration.getCrashHandlerEnvironmentVariables(fakePathToApk, fakePathToLib, fakeAbi); + List environmentVariables = + crashHandlerConfiguration.getCrashHandlerEnvironmentVariables(fakePathToApk, fakePathToLib, fakeAbi); Map systemEnvVariables = System.getenv(); for (Map.Entry envVariable : systemEnvVariables.entrySet()) { - assertTrue(environmentVariables.indexOf(String.format("%s=%s", envVariable.getKey(), envVariable.getValue())) != -1); + assertTrue( + environmentVariables.indexOf(String.format("%s=%s", envVariable.getKey(), envVariable.getValue())) + != -1); } } - } diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/crashHandler/CrashHandlerRunnerInvocationTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/crashHandler/CrashHandlerRunnerInvocationTest.java index 0b43708f6..674db908d 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/crashHandler/CrashHandlerRunnerInvocationTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/crashHandler/CrashHandlerRunnerInvocationTest.java @@ -1,12 +1,16 @@ package backtraceio.library.crashHandler; - import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import backtraceio.library.models.nativeHandler.CrashHandlerConfiguration; +import backtraceio.library.nativeCalls.BacktraceCrashHandlerWrapper; +import backtraceio.library.nativeCalls.SystemLoader; +import backtraceio.library.services.BacktraceCrashHandlerRunner; +import java.util.HashMap; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -14,17 +18,11 @@ import org.mockito.MockitoAnnotations; import org.mockito.junit.MockitoJUnitRunner; -import java.util.HashMap; - -import backtraceio.library.models.nativeHandler.CrashHandlerConfiguration; -import backtraceio.library.nativeCalls.BacktraceCrashHandlerWrapper; -import backtraceio.library.nativeCalls.SystemLoader; -import backtraceio.library.services.BacktraceCrashHandlerRunner; - @RunWith(MockitoJUnitRunner.class) public class CrashHandlerRunnerInvocationTest { - private final static String fakePathLibrary = "path/to/lib"; + private static final String fakePathLibrary = "path/to/lib"; + @Mock BacktraceCrashHandlerWrapper backtraceCrashHandlerWrapper; @@ -36,13 +34,13 @@ public void setup() { @Test public void failIfEnvVariablesAreNotDefined() { BacktraceCrashHandlerRunner runner = new BacktraceCrashHandlerRunner(); - assertFalse(runner.run(new String[]{}, null)); + assertFalse(runner.run(new String[] {}, null)); } @Test public void failIfEnvVariablesDontStoreHandlerPath() { BacktraceCrashHandlerRunner runner = new BacktraceCrashHandlerRunner(); - assertFalse(runner.run(new String[]{}, new HashMap<>())); + assertFalse(runner.run(new String[] {}, new HashMap<>())); } @Test @@ -52,8 +50,9 @@ public void shouldExecuteCorrectlyCrashpadHandlerMethod() { when(backtraceCrashHandlerWrapper.handleCrash(any(String[].class))).thenReturn(true); - BacktraceCrashHandlerRunner runner = new BacktraceCrashHandlerRunner(backtraceCrashHandlerWrapper, mock(SystemLoader.class)); - assertTrue(runner.run(new String[]{}, envVariables)); + BacktraceCrashHandlerRunner runner = + new BacktraceCrashHandlerRunner(backtraceCrashHandlerWrapper, mock(SystemLoader.class)); + assertTrue(runner.run(new String[] {}, envVariables)); } @Test @@ -63,7 +62,8 @@ public void shouldReturnFalseWhenCrashpadFails() { when(backtraceCrashHandlerWrapper.handleCrash(any(String[].class))).thenReturn(true); - BacktraceCrashHandlerRunner runner = new BacktraceCrashHandlerRunner(backtraceCrashHandlerWrapper, mock(SystemLoader.class)); - assertTrue(runner.run(new String[]{}, envVariables)); + BacktraceCrashHandlerRunner runner = + new BacktraceCrashHandlerRunner(backtraceCrashHandlerWrapper, mock(SystemLoader.class)); + assertTrue(runner.run(new String[] {}, envVariables)); } -} \ No newline at end of file +} diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseContextMultithreadedTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseContextMultithreadedTest.java index 05de29020..546510236 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseContextMultithreadedTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseContextMultithreadedTest.java @@ -3,21 +3,18 @@ import static org.junit.Assert.assertEquals; import androidx.annotation.NonNull; - -import org.junit.Before; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.CountDownLatch; - import backtraceio.library.models.BacktraceData; import backtraceio.library.models.database.BacktraceDatabaseRecord; import backtraceio.library.models.database.BacktraceDatabaseSettings; import backtraceio.library.models.json.BacktraceReport; import backtraceio.library.services.BacktraceDatabaseContext; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import org.junit.Before; +import org.junit.Test; public class BacktraceDatabaseContextMultithreadedTest { private static class TestConfig { @@ -49,6 +46,7 @@ void printExceptions() { } } } + private BacktraceDatabaseContext databaseContext; @Before @@ -63,7 +61,7 @@ public void testConcurrentModification() throws InterruptedException { // GIVEN final TestConfig config = new TestConfig(500, 250, 150, 30000); // 30s final List initialRecords = generateMockRecords(config.recordsState); - + final CountDownLatch startLatch = new CountDownLatch(1); final ConcurrentTestState testState = new ConcurrentTestState(); @@ -84,8 +82,11 @@ public void testConcurrentModification() throws InterruptedException { assertTestResults(config, testState); } - private Thread createDeleteThread(CountDownLatch latch, List records, - int recordsToDelete, ConcurrentTestState state) { + private Thread createDeleteThread( + CountDownLatch latch, + List records, + int recordsToDelete, + ConcurrentTestState state) { return new Thread(() -> { try { latch.await(); @@ -136,7 +137,7 @@ private void startThreads(Thread... threads) { } } - private void waitForThreads(Thread deleteThread, Thread addThread, Thread readThread, int waitTimeMs) + private void waitForThreads(Thread deleteThread, Thread addThread, Thread readThread, int waitTimeMs) throws InterruptedException { deleteThread.join(waitTimeMs); addThread.join(waitTimeMs); @@ -146,9 +147,8 @@ private void waitForThreads(Thread deleteThread, Thread addThread, Thread readTh private void assertTestResults(TestConfig config, ConcurrentTestState state) { assertEquals(0, state.caughtExceptions.size()); assertEquals( - config.recordsState + config.recordsToAdd - config.recordsToDelete, - config.recordsState + state.addedRecords.size() - state.deletedRecords.size() - ); + config.recordsState + config.recordsToAdd - config.recordsToDelete, + config.recordsState + state.addedRecords.size() - state.deletedRecords.size()); } @NonNull @@ -165,9 +165,11 @@ private List generateMockRecords(int recordCount) { private BacktraceData createMockBacktraceData() { final Exception testException = new Exception("Test exception"); - final Map attributes = new HashMap() {{ - put("test_attribute", "test_value"); - }}; + final Map attributes = new HashMap() { + { + put("test_attribute", "test_value"); + } + }; return new BacktraceData.Builder(new BacktraceReport(testException, attributes)).build(); } diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseContextTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseContextTest.java index 67092948f..a565986ab 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseContextTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseContextTest.java @@ -6,24 +6,20 @@ import static org.junit.Assert.assertTrue; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.ArrayList; -import java.util.List; - import backtraceio.library.enums.database.RetryOrder; import backtraceio.library.models.BacktraceData; import backtraceio.library.models.database.BacktraceDatabaseRecord; import backtraceio.library.models.database.BacktraceDatabaseSettings; import backtraceio.library.models.json.BacktraceReport; import backtraceio.library.services.BacktraceDatabaseContext; +import java.util.ArrayList; +import java.util.List; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceDatabaseContextTest { @@ -40,6 +36,7 @@ public void setUp() { this.databaseSettings = new BacktraceDatabaseSettings(this.dbPath, RetryOrder.Queue); this.databaseContext = new BacktraceDatabaseContext(this.databaseSettings); } + @After public void after() { this.databaseContext.clear(); @@ -139,13 +136,14 @@ public void containsNullInDatabaseContext() { databaseContext.contains(null); } - @Test public void notContainsInDatabaseContext() { // GIVEN fillDatabase(); BacktraceReport report = new BacktraceReport(this.testMessage); - BacktraceData data = new BacktraceData.Builder(report).setAttributes(this.context, null).build(); + BacktraceData data = new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build(); BacktraceDatabaseRecord record = new BacktraceDatabaseRecord(data, this.dbPath); // WHEN @@ -234,7 +232,9 @@ public void tryDeleteNotExistingRecordFromDatabaseContext() { // GIVEN fillDatabase(); BacktraceReport report = new BacktraceReport(this.testMessage); - BacktraceData data = new BacktraceData.Builder(report).setAttributes(this.context, null).build(); + BacktraceData data = new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build(); BacktraceDatabaseRecord record = new BacktraceDatabaseRecord(data, this.dbPath); // WHEN @@ -259,9 +259,15 @@ private List fillDatabase() { BacktraceReport report = new BacktraceReport(this.testMessage); BacktraceReport report2 = new BacktraceReport(this.testMessage); BacktraceReport report3 = new BacktraceReport(this.testMessage); - BacktraceData data = new BacktraceData.Builder(report).setAttributes(this.context, null).build(); - BacktraceData data2 = new BacktraceData.Builder(report2).setAttributes(this.context, null).build(); - BacktraceData data3 = new BacktraceData.Builder(report3).setAttributes(this.context, null).build(); + BacktraceData data = new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build(); + BacktraceData data2 = new BacktraceData.Builder(report2) + .setAttributes(this.context, null) + .build(); + BacktraceData data3 = new BacktraceData.Builder(report3) + .setAttributes(this.context, null) + .build(); result.add(databaseContext.add(data)); result.add(databaseContext.add(data2)); result.add(databaseContext.add(data3)); @@ -273,4 +279,4 @@ private List fillDatabase() { return result; } -} \ No newline at end of file +} diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseFileContextTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseFileContextTest.java index 3c3dc2ab0..ac8566fcf 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseFileContextTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseFileContextTest.java @@ -5,19 +5,8 @@ import static org.junit.Assert.assertTrue; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - import backtraceio.library.enums.database.RetryOrder; import backtraceio.library.models.BacktraceData; import backtraceio.library.models.database.BacktraceDatabaseRecord; @@ -25,7 +14,13 @@ import backtraceio.library.models.json.BacktraceReport; import backtraceio.library.services.BacktraceDatabaseContext; import backtraceio.library.services.BacktraceDatabaseFileContext; - +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceDatabaseFileContextTest { @@ -42,7 +37,8 @@ public void setUp() { this.dbPath = this.context.getFilesDir().getAbsolutePath(); this.databaseSettings = new BacktraceDatabaseSettings(this.dbPath, RetryOrder.Queue); this.databaseContext = new BacktraceDatabaseContext(this.databaseSettings); - this.databaseFileContext = new BacktraceDatabaseFileContext(this.dbPath, this.databaseSettings.getMaxDatabaseSize(), this.databaseSettings.getMaxRecordCount()); + this.databaseFileContext = new BacktraceDatabaseFileContext( + this.dbPath, this.databaseSettings.getMaxDatabaseSize(), this.databaseSettings.getMaxRecordCount()); this.databaseContext.clear(); this.databaseFileContext.clear(); } @@ -52,12 +48,13 @@ public void after() { this.databaseContext.clear(); } - @Test public void getFilesAfterAddOne() { // GIVEN BacktraceReport report = new BacktraceReport(testMessage); - this.databaseContext.add(new BacktraceData.Builder(report).setAttributes(this.context, null).build()); + this.databaseContext.add(new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build()); // WHEN int files = countAllFiles(); @@ -73,9 +70,15 @@ public void getFilesAfterAddThree() { BacktraceReport report2 = new BacktraceReport(testMessage); BacktraceReport report3 = new BacktraceReport(testMessage); - this.databaseContext.add(new BacktraceData.Builder(report).setAttributes(this.context, null).build()); - this.databaseContext.add(new BacktraceData.Builder(report2).setAttributes(this.context, null).build()); - this.databaseContext.add(new BacktraceData.Builder(report3).setAttributes(this.context, null).build()); + this.databaseContext.add(new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build()); + this.databaseContext.add(new BacktraceData.Builder(report2) + .setAttributes(this.context, null) + .build()); + this.databaseContext.add(new BacktraceData.Builder(report3) + .setAttributes(this.context, null) + .build()); // WHEN int files = countAllFiles(); @@ -91,9 +94,15 @@ public void getRecords() { BacktraceReport report2 = new BacktraceReport(testMessage); BacktraceReport report3 = new BacktraceReport(testMessage); - this.databaseContext.add(new BacktraceData.Builder(report).setAttributes(this.context, null).build()); - this.databaseContext.add(new BacktraceData.Builder(report2).setAttributes(this.context, null).build()); - this.databaseContext.add(new BacktraceData.Builder(report3).setAttributes(this.context, null).build()); + this.databaseContext.add(new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build()); + this.databaseContext.add(new BacktraceData.Builder(report2) + .setAttributes(this.context, null) + .build()); + this.databaseContext.add(new BacktraceData.Builder(report3) + .setAttributes(this.context, null) + .build()); // WHEN int files = countRecords(); @@ -102,22 +111,24 @@ public void getRecords() { assertEquals(3, files); // 3x BacktraceDatabaseRecord, 3x BacktraceData, 3x BacktraceReport } - @Test public void clear() { // GIVEN BacktraceReport report = new BacktraceReport(testMessage); BacktraceReport report2 = new BacktraceReport(testMessage); - this.databaseContext.add(new BacktraceData.Builder(report).setAttributes(this.context, null).build()); - this.databaseContext.add(new BacktraceData.Builder(report2).setAttributes(this.context, null).build()); + this.databaseContext.add(new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build()); + this.databaseContext.add(new BacktraceData.Builder(report2) + .setAttributes(this.context, null) + .build()); // WHEN int filesAfterAdd = countAllFiles(); this.databaseFileContext.clear(); int filesAfterClear = countAllFiles(); - // THEN assertEquals(6, filesAfterAdd); // 3x BacktraceDatabaseRecord, 3x BacktraceData, 3x BacktraceReport assertEquals(0, filesAfterClear); // 3x BacktraceDatabaseRecord, 3x BacktraceData, 3x BacktraceReport @@ -129,8 +140,12 @@ public void filesConsistency() { BacktraceReport report = new BacktraceReport(testMessage); BacktraceReport report2 = new BacktraceReport(testMessage); - this.databaseContext.add(new BacktraceData.Builder(report).setAttributes(this.context, null).build()); - this.databaseContext.add(new BacktraceData.Builder(report2).setAttributes(this.context, null).build()); + this.databaseContext.add(new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build()); + this.databaseContext.add(new BacktraceData.Builder(report2) + .setAttributes(this.context, null) + .build()); // WHEN boolean result = this.databaseFileContext.validFileConsistency(); @@ -143,14 +158,19 @@ public void filesConsistency() { public void forceInconsistencyMaxRecordCount() { // GIVEN this.databaseSettings.setMaxRecordCount(1); - this.databaseFileContext = new BacktraceDatabaseFileContext(this.dbPath, this.databaseSettings.getMaxDatabaseSize(), this.databaseSettings.getMaxRecordCount()); + this.databaseFileContext = new BacktraceDatabaseFileContext( + this.dbPath, this.databaseSettings.getMaxDatabaseSize(), this.databaseSettings.getMaxRecordCount()); this.databaseContext = new BacktraceDatabaseContext(this.databaseSettings); BacktraceReport report = new BacktraceReport(testMessage); BacktraceReport report2 = new BacktraceReport(testMessage); - this.databaseContext.add(new BacktraceData.Builder(report).setAttributes(this.context, null).build()); - this.databaseContext.add(new BacktraceData.Builder(report2).setAttributes(this.context, null).build()); + this.databaseContext.add(new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build()); + this.databaseContext.add(new BacktraceData.Builder(report2) + .setAttributes(this.context, null) + .build()); // WHEN boolean result = this.databaseFileContext.validFileConsistency(); @@ -162,13 +182,18 @@ public void forceInconsistencyMaxRecordCount() { @Test public void forceInconsistencyMaxDatabaseSize() { // GIVEN - this.databaseFileContext = new BacktraceDatabaseFileContext(this.dbPath, 1, this.databaseSettings.getMaxRecordCount()); + this.databaseFileContext = + new BacktraceDatabaseFileContext(this.dbPath, 1, this.databaseSettings.getMaxRecordCount()); BacktraceReport report = new BacktraceReport(testMessage); BacktraceReport report2 = new BacktraceReport(testMessage); - this.databaseContext.add(new BacktraceData.Builder(report).setAttributes(this.context, null).build()); - this.databaseContext.add(new BacktraceData.Builder(report2).setAttributes(this.context, null).build()); + this.databaseContext.add(new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build()); + this.databaseContext.add(new BacktraceData.Builder(report2) + .setAttributes(this.context, null) + .build()); // WHEN boolean result = this.databaseFileContext.validFileConsistency(); @@ -183,14 +208,20 @@ public void removeOrphanedFiles() { BacktraceReport report = new BacktraceReport(testMessage); BacktraceReport report2 = new BacktraceReport(testMessage); - final BacktraceDatabaseRecord record = this.databaseContext.add(new BacktraceData.Builder(report).setAttributes(this.context, null).build()); - this.databaseContext.add(new BacktraceData.Builder(report2).setAttributes(this.context, null).build()); + final BacktraceDatabaseRecord record = this.databaseContext.add(new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build()); + this.databaseContext.add(new BacktraceData.Builder(report2) + .setAttributes(this.context, null) + .build()); // WHEN int countRecords = countRecords(); - List records = new ArrayList() {{ - add(record); - }}; + List records = new ArrayList() { + { + add(record); + } + }; this.databaseFileContext.removeOrphaned(records); int countRecordAfterRemoveOrphaned = countRecords(); @@ -217,4 +248,4 @@ private int countAllFiles() { } return files; } -} \ No newline at end of file +} diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseProguardTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseProguardTest.java index f3ed97ac3..e920acf0c 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseProguardTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseProguardTest.java @@ -4,18 +4,15 @@ import static org.junit.Assert.assertNull; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - +import backtraceio.library.BacktraceDatabase; +import backtraceio.library.models.json.BacktraceReport; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import backtraceio.library.BacktraceDatabase; -import backtraceio.library.models.json.BacktraceReport; - @RunWith(AndroidJUnit4.class) public class BacktraceDatabaseProguardTest { private Context context; @@ -51,7 +48,8 @@ public void addSingleRecordNoProguard() { // THEN assertEquals(report, database.get().iterator().next().getBacktraceData().getReport()); assertNull(database.get().iterator().next().getBacktraceData().symbolication); - assertEquals(testMessage, database.get().iterator().next().getBacktraceData().getReport().message); + assertEquals( + testMessage, database.get().iterator().next().getBacktraceData().getReport().message); assertEquals(1, database.count()); } @@ -69,7 +67,8 @@ public void addSingleRecordProguard() { // THEN assertEquals(report, database.get().iterator().next().getBacktraceData().getReport()); assertEquals("proguard", database.get().iterator().next().getBacktraceData().symbolication); - assertEquals(testMessage, database.get().iterator().next().getBacktraceData().getReport().message); + assertEquals( + testMessage, database.get().iterator().next().getBacktraceData().getReport().message); assertEquals(1, database.count()); } -} \ No newline at end of file +} diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseRecordTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseRecordTest.java index bb903dba2..9a3f72c28 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseRecordTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseRecordTest.java @@ -6,19 +6,8 @@ import static junit.framework.TestCase.fail; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - import backtraceio.library.BacktraceDatabase; import backtraceio.library.enums.database.RetryOrder; import backtraceio.library.models.BacktraceData; @@ -26,7 +15,13 @@ import backtraceio.library.models.database.BacktraceDatabaseRecord; import backtraceio.library.models.database.BacktraceDatabaseSettings; import backtraceio.library.models.json.BacktraceReport; - +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceDatabaseRecordTest { @@ -51,8 +46,11 @@ public void after() { public void saveAndGetRecord() { // GIVEN final BacktraceReport report = new BacktraceReport(testMessage); - final BacktraceData data = new BacktraceData.Builder(report).setAttributes(this.context, null).build(); - final BacktraceDatabaseRecord record = new BacktraceDatabaseRecord(data, this.database.getSettings().getDatabasePath()); + final BacktraceData data = new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build(); + final BacktraceDatabaseRecord record = + new BacktraceDatabaseRecord(data, this.database.getSettings().getDatabasePath()); // WHEN final boolean saveResult = record.save(); @@ -72,10 +70,12 @@ public void saveAndGetRecordWithAttachments() { // GIVEN final String attachment0 = context.getFilesDir() + "/someFile.log"; final String attachment1 = context.getFilesDir() + "/someOtherFile.log"; - final List attachments = new ArrayList() {{ - add(attachment0); - add(attachment1); - }}; + final List attachments = new ArrayList() { + { + add(attachment0); + add(attachment1); + } + }; try { assertTrue(new File(attachment0).createNewFile()); @@ -85,8 +85,11 @@ public void saveAndGetRecordWithAttachments() { } final BacktraceReport report = new BacktraceReport(testMessage, attachments); - final BacktraceData data = new BacktraceData.Builder(report).setAttributes(this.context, null).build(); - final BacktraceDatabaseRecord record = new BacktraceDatabaseRecord(data, this.database.getSettings().getDatabasePath()); + final BacktraceData data = new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build(); + final BacktraceDatabaseRecord record = + new BacktraceDatabaseRecord(data, this.database.getSettings().getDatabasePath()); // WHEN final boolean saveResult = record.save(); @@ -107,8 +110,11 @@ public void saveAndGetRecordWithAttachments() { public void deleteFileDiagnosticPathToCorruptRecord() { // GIVEN BacktraceReport report = new BacktraceReport(testMessage); - BacktraceData data = new BacktraceData.Builder(report).setAttributes(this.context, null).build(); - BacktraceDatabaseRecord record = new BacktraceDatabaseRecord(data, this.database.getSettings().getDatabasePath()); + BacktraceData data = new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build(); + BacktraceDatabaseRecord record = + new BacktraceDatabaseRecord(data, this.database.getSettings().getDatabasePath()); // WHEN boolean saveResult = record.save(); @@ -125,8 +131,11 @@ public void deleteFileDiagnosticPathToCorruptRecord() { public void deleteFileReportPathToCorruptRecord() { // GIVEN BacktraceReport report = new BacktraceReport(testMessage); - BacktraceData data = new BacktraceData.Builder(report).setAttributes(this.context, null).build(); - BacktraceDatabaseRecord record = new BacktraceDatabaseRecord(data, this.database.getSettings().getDatabasePath()); + BacktraceData data = new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build(); + BacktraceDatabaseRecord record = + new BacktraceDatabaseRecord(data, this.database.getSettings().getDatabasePath()); // WHEN boolean saveResult = record.save(); @@ -143,8 +152,11 @@ public void deleteFileReportPathToCorruptRecord() { public void createAndDeleteRecordFiles() { // GIVEN BacktraceReport report = new BacktraceReport(testMessage); - BacktraceData data = new BacktraceData.Builder(report).setAttributes(this.context, null).build(); - BacktraceDatabaseRecord record = new BacktraceDatabaseRecord(data, this.database.getSettings().getDatabasePath()); + BacktraceData data = new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build(); + BacktraceDatabaseRecord record = + new BacktraceDatabaseRecord(data, this.database.getSettings().getDatabasePath()); // WHEN boolean saveResult = record.save(); @@ -163,12 +175,16 @@ public void createAndDeleteRecordFiles() { public void readFileAndDeserialize() { // GIVEN final BacktraceReport report = new BacktraceReport(testMessage); - final BacktraceData data = new BacktraceData.Builder(report).setAttributes(this.context, null).build(); - final BacktraceDatabaseRecord record = new BacktraceDatabaseRecord(data, this.database.getSettings().getDatabasePath()); + final BacktraceData data = new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build(); + final BacktraceDatabaseRecord record = + new BacktraceDatabaseRecord(data, this.database.getSettings().getDatabasePath()); record.save(); // WHEN - final BacktraceDatabaseRecord recordFromFile = BacktraceDatabaseRecord.readFromFile(new File(record.getRecordPath())); + final BacktraceDatabaseRecord recordFromFile = + BacktraceDatabaseRecord.readFromFile(new File(record.getRecordPath())); final BacktraceData dataFromFile = recordFromFile.getBacktraceData(); // THEN diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseRecordWriterTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseRecordWriterTest.java index 0bf859e56..c0c71598d 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseRecordWriterTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseRecordWriterTest.java @@ -4,21 +4,18 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.io.File; -import java.io.IOException; -import java.util.Arrays; -import java.util.List; - import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.common.FileHelper; import backtraceio.library.models.database.BacktraceDatabaseRecordWriter; import backtraceio.library.services.BacktraceDatabaseFileContext; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceDatabaseRecordWriterTest { @@ -29,7 +26,10 @@ public class BacktraceDatabaseRecordWriterTest { @Before public void setUp() { - this.dbPath = InstrumentationRegistry.getInstrumentation().getContext().getFilesDir().getAbsolutePath(); + this.dbPath = InstrumentationRegistry.getInstrumentation() + .getContext() + .getFilesDir() + .getAbsolutePath(); this.databaseFileContext = new BacktraceDatabaseFileContext(this.dbPath, 0, 0); this.databaseFileContext.clear(); this.databaseRecordWriter = new BacktraceDatabaseRecordWriter(this.dbPath); @@ -61,7 +61,8 @@ public void writeBytes() throws IOException { public void writeObject() throws Exception { // GIVEN Exception exception = new Exception("Example message"); - StackTraceElement element = new StackTraceElement("Exception.class", "writeObject", "BacktraceDatabaseRecordWriterTest.java", 1); + StackTraceElement element = + new StackTraceElement("Exception.class", "writeObject", "BacktraceDatabaseRecordWriterTest.java", 1); StackTraceElement[] stackTraceElements = new StackTraceElement[1]; stackTraceElements[0] = element; exception.setStackTrace(stackTraceElements); diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseTest.java index 0136a23ce..3827bad94 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/database/BacktraceDatabaseTest.java @@ -3,26 +3,8 @@ import static org.junit.Assert.assertEquals; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.io.File; -import java.io.FileFilter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - import backtraceio.library.BacktraceClient; import backtraceio.library.BacktraceCredentials; import backtraceio.library.BacktraceDatabase; @@ -32,6 +14,19 @@ import backtraceio.library.models.database.BacktraceDatabaseRecord; import backtraceio.library.models.database.BacktraceDatabaseSettings; import backtraceio.library.models.json.BacktraceReport; +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.jodah.concurrentunit.Waiter; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceDatabaseTest { @@ -107,7 +102,8 @@ public void addSingleRecord() { // THEN assertEquals(report, database.get().iterator().next().getBacktraceData().getReport()); - assertEquals(testMessage, database.get().iterator().next().getBacktraceData().getReport().message); + assertEquals( + testMessage, database.get().iterator().next().getBacktraceData().getReport().message); assertEquals(1, database.count()); } @@ -140,13 +136,15 @@ public void deleteSingleRecord() { database.delete(record); assertEquals(1, database.count()); - final BacktraceDatabaseRecord recordFromDatabase = database.get().iterator().next(); + final BacktraceDatabaseRecord recordFromDatabase = + database.get().iterator().next(); assertEquals(record2, recordFromDatabase); assertEquals(report2, recordFromDatabase.getBacktraceData().getReport()); - assertEquals(report2.exception.getMessage(), recordFromDatabase.getBacktraceData().getReport().exception.getMessage()); + assertEquals( + report2.exception.getMessage(), + recordFromDatabase.getBacktraceData().getReport().exception.getMessage()); } - @Test public void clearDatabase() { assertEquals(0, database.getDatabaseSize()); @@ -235,15 +233,16 @@ public void recordLimit() { // THEN assertEquals(1, database.count()); - assertEquals(report2.message, database.get().iterator().next().getBacktraceData().getReport().message); + assertEquals( + report2.message, + database.get().iterator().next().getBacktraceData().getReport().message); } @Test public void addEmptyFileAndStartDatabase() throws IOException { // GIVEN - File file = new File( - new File(this.dbPath, String.format("%s-record.json", UUID.randomUUID())).getAbsolutePath() - ); + File file = + new File(new File(this.dbPath, String.format("%s-record.json", UUID.randomUUID())).getAbsolutePath()); file.createNewFile(); // WHEN @@ -253,5 +252,4 @@ public void addEmptyFileAndStartDatabase() throws IOException { // THEN assertEquals(database.count(), 0); } - -} \ No newline at end of file +} diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/metrics/BacktraceMetricsTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/metrics/BacktraceMetricsTest.java index d4b3b7ba1..85bbd76f4 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/metrics/BacktraceMetricsTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/metrics/BacktraceMetricsTest.java @@ -3,19 +3,8 @@ import static org.junit.Assert.assertEquals; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import junit.framework.TestCase; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.HashMap; -import java.util.Map; - import backtraceio.library.BacktraceClient; import backtraceio.library.BacktraceCredentials; import backtraceio.library.BacktraceDatabase; @@ -27,6 +16,12 @@ import backtraceio.library.models.metrics.SummedEvent; import backtraceio.library.models.metrics.UniqueEvent; import backtraceio.library.services.BacktraceMetrics; +import java.util.HashMap; +import java.util.Map; +import junit.framework.TestCase; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceMetricsTest { @@ -35,7 +30,18 @@ public class BacktraceMetricsTest { public BacktraceCredentials credentials; private final String summedEventName = "activity-changed"; // existing attribute name in Backtrace - private final String[] uniqueAttributeName = {"uname.version", "cpu.boottime", "screen.orientation", "battery.state", "device.airplane_mode", "device.sdk", "device.brand", "system.memory.total", "uname.sysname", "application.package"}; + private final String[] uniqueAttributeName = { + "uname.version", + "cpu.boottime", + "screen.orientation", + "battery.state", + "device.airplane_mode", + "device.sdk", + "device.brand", + "system.memory.total", + "uname.sysname", + "application.package" + }; private final String token = "aaaaabbbbbccccf82668682e69f59b38e0a853bed941e08e85f4bf5eb2c5458"; @@ -43,13 +49,13 @@ public class BacktraceMetricsTest { * NOTE: Some of these tests are very time-sensitive so you may occasionally get false negative results. * For best results run under low CPU load and low memory utilization conditions. */ - @Before public void setUp() { BacktraceLogger.setLogger(new BacktraceInternalLogger(LogLevel.DEBUG)); context = InstrumentationRegistry.getInstrumentation().getContext(); credentials = new BacktraceCredentials("https://universe.sp.backtrace.io:6098", token); - BacktraceDatabase database = new BacktraceDatabase(context, context.getFilesDir().getAbsolutePath()); + BacktraceDatabase database = + new BacktraceDatabase(context, context.getFilesDir().getAbsolutePath()); backtraceClient = new BacktraceClient(context, credentials, database); } @@ -57,9 +63,11 @@ public void setUp() { @Test public void addAttributesSummedEvent() { SummedEvent summedEvent = new SummedEvent(summedEventName, null); - Map attributes = new HashMap() {{ - put("foo", "bar"); - }}; + Map attributes = new HashMap() { + { + put("foo", "bar"); + } + }; summedEvent.addAttributes(attributes); assertEquals("bar", summedEvent.getAttributes().get("foo")); } @@ -67,9 +75,11 @@ public void addAttributesSummedEvent() { @Test public void addAttributesUniqueEvent() { UniqueEvent uniqueEvent = new UniqueEvent(uniqueAttributeName[0], null); - Map attributes = new HashMap() {{ - put("foo", "bar"); - }}; + Map attributes = new HashMap() { + { + put("foo", "bar"); + } + }; uniqueEvent.update(BacktraceTimeHelper.getTimestampSeconds(), attributes); assertEquals("bar", uniqueEvent.getAttributes().get("foo")); } @@ -100,7 +110,8 @@ public void tryToEnableMetricsTwoTimes() { @Test(expected = IllegalArgumentException.class) public void tryToEnableMetricsOnCustomServer() { // GIVEN - BacktraceCredentials customCredentials = new BacktraceCredentials("https://custom.on.premise.server.io:6098", token); + BacktraceCredentials customCredentials = + new BacktraceCredentials("https://custom.on.premise.server.io:6098", token); BacktraceMetrics metrics = new BacktraceMetrics(context, new HashMap<>(), null, customCredentials); // WHEN @@ -110,7 +121,8 @@ public void tryToEnableMetricsOnCustomServer() { @Test(expected = IllegalArgumentException.class) public void tryToAddSummedEventOnCustomServer() { // GIVEN - BacktraceCredentials customCredentials = new BacktraceCredentials("https://custom.on.premise.server.io:6098", token); + BacktraceCredentials customCredentials = + new BacktraceCredentials("https://custom.on.premise.server.io:6098", token); BacktraceMetrics metrics = new BacktraceMetrics(context, new HashMap<>(), null, customCredentials); // WHEN @@ -120,7 +132,8 @@ public void tryToAddSummedEventOnCustomServer() { @Test(expected = IllegalArgumentException.class) public void tryToAddUniqueEventOnCustomServer() { // GIVEN - BacktraceCredentials customCredentials = new BacktraceCredentials("https://custom.on.premise.server.io:6098", token); + BacktraceCredentials customCredentials = + new BacktraceCredentials("https://custom.on.premise.server.io:6098", token); BacktraceMetrics metrics = new BacktraceMetrics(context, new HashMap<>(), null, customCredentials); // WHEN @@ -130,7 +143,8 @@ public void tryToAddUniqueEventOnCustomServer() { @Test(expected = IllegalArgumentException.class) public void tryToSendOnCustomServer() { // GIVEN - BacktraceCredentials customCredentials = new BacktraceCredentials("https://custom.on.premise.server.io:6098", token); + BacktraceCredentials customCredentials = + new BacktraceCredentials("https://custom.on.premise.server.io:6098", token); BacktraceMetrics metrics = new BacktraceMetrics(context, new HashMap<>(), null, customCredentials); // WHEN @@ -140,11 +154,11 @@ public void tryToSendOnCustomServer() { @Test(expected = IllegalArgumentException.class) public void tryToSendStartupEventOnCustomServer() { // GIVEN - BacktraceCredentials customCredentials = new BacktraceCredentials("https://custom.on.premise.server.io:6098", token); + BacktraceCredentials customCredentials = + new BacktraceCredentials("https://custom.on.premise.server.io:6098", token); BacktraceMetrics metrics = new BacktraceMetrics(context, new HashMap<>(), null, customCredentials); // WHEN metrics.sendStartupEvent(); } - } diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/models/BacktraceDataTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/models/BacktraceDataTest.java index 2f5bb63a4..695ab23cc 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/models/BacktraceDataTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/models/BacktraceDataTest.java @@ -5,20 +5,16 @@ import static org.junit.Assert.assertTrue; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - +import backtraceio.library.models.json.BacktraceReport; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; - -import backtraceio.library.models.json.BacktraceReport; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceDataTest { @@ -40,12 +36,16 @@ public void createBacktraceDataTest() { clientAttributes.put("attr-2", true); clientAttributes.put("attr-3", "test"); // WHEN - BacktraceData backtraceData = new BacktraceData.Builder(report).setAttributes(context, clientAttributes).build(); + BacktraceData backtraceData = new BacktraceData.Builder(report) + .setAttributes(context, clientAttributes) + .build(); // THEN - assertArrayEquals( new String[]{"java.lang.IllegalAccessException"} , backtraceData.getClassifiers()); + assertArrayEquals(new String[] {"java.lang.IllegalAccessException"}, backtraceData.getClassifiers()); assertEquals(report, backtraceData.getReport()); - assertEquals("java.lang.IllegalAccessException", backtraceData.getAttributes().get("classifier")); + assertEquals( + "java.lang.IllegalAccessException", + backtraceData.getAttributes().get("classifier")); assertEquals("backtrace-android", backtraceData.getAgent()); assertEquals(backtraceio.library.BuildConfig.VERSION_NAME, backtraceData.getAgentVersion()); assertEquals("java", backtraceData.getLang()); @@ -63,6 +63,7 @@ public void createBacktraceDataTest() { assertEquals("true", backtraceData.getAttributes().get("attr-2")); assertEquals("test", backtraceData.getAttributes().get("attr-3")); } + @Test public void testBacktraceDataConstructor() { // GIVEN @@ -78,9 +79,11 @@ public void testBacktraceDataConstructor() { BacktraceData backtraceData = new BacktraceData(context, report, clientAttributes); // THEN - assertArrayEquals( new String[]{"java.lang.IllegalAccessException"}, backtraceData.getClassifiers()); + assertArrayEquals(new String[] {"java.lang.IllegalAccessException"}, backtraceData.getClassifiers()); assertEquals(report, backtraceData.getReport()); - assertEquals("java.lang.IllegalAccessException", backtraceData.getAttributes().get("classifier")); + assertEquals( + "java.lang.IllegalAccessException", + backtraceData.getAttributes().get("classifier")); assertEquals("backtrace-android", backtraceData.getAgent()); assertEquals(backtraceio.library.BuildConfig.VERSION_NAME, backtraceData.getAgentVersion()); assertEquals("java", backtraceData.getLang()); diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/models/UncaughtExceptionHandlerTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/models/UncaughtExceptionHandlerTest.java index 28d71d0f6..08c781cfb 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/models/UncaughtExceptionHandlerTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/models/UncaughtExceptionHandlerTest.java @@ -7,14 +7,10 @@ import static org.junit.Assert.fail; import android.content.Context; - import androidx.test.platform.app.InstrumentationRegistry; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.Before; -import org.junit.Test; - +import backtraceio.library.BacktraceClient; +import backtraceio.library.BacktraceCredentials; +import backtraceio.library.models.types.BacktraceResultStatus; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -23,17 +19,17 @@ import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; - -import backtraceio.library.BacktraceClient; -import backtraceio.library.BacktraceCredentials; -import backtraceio.library.models.types.BacktraceResultStatus; +import net.jodah.concurrentunit.Waiter; +import org.junit.Before; +import org.junit.Test; public class UncaughtExceptionHandlerTest { private Context context; private BacktraceCredentials credentials; - private static void setRootHandler(Thread.UncaughtExceptionHandler customRootHandler, Thread.UncaughtExceptionHandler newRootHandler) { + private static void setRootHandler( + Thread.UncaughtExceptionHandler customRootHandler, Thread.UncaughtExceptionHandler newRootHandler) { try { Field field = BacktraceExceptionHandler.class.getDeclaredField("rootHandler"); field.setAccessible(true); @@ -43,8 +39,10 @@ private static void setRootHandler(Thread.UncaughtExceptionHandler customRootHan } } - private static BacktraceExceptionHandler createBacktraceExceptionHandler(BacktraceClient client) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException { - Constructor constructor = BacktraceExceptionHandler.class.getDeclaredConstructor(BacktraceClient.class); + private static BacktraceExceptionHandler createBacktraceExceptionHandler(BacktraceClient client) + throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException { + Constructor constructor = + BacktraceExceptionHandler.class.getDeclaredConstructor(BacktraceClient.class); assertTrue(Modifier.isPrivate(constructor.getModifiers())); constructor.setAccessible(true); BacktraceExceptionHandler exceptionHandler = constructor.newInstance(client); @@ -59,7 +57,8 @@ public void setUp() { } @Test() - public void testUncaughtException() throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, InstantiationException { + public void testUncaughtException() + throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, InstantiationException { // GIVEN final Waiter waiter = new Waiter(); final Exception exception = new IllegalArgumentException("Test message"); @@ -69,8 +68,7 @@ public void testUncaughtException() throws InvocationTargetException, NoSuchMeth client.setOnRequestHandler(data -> { testedAtomicReportData.set(data); waiter.resume(); - return new BacktraceResult(data.getReport(), data.getReport().message, - BacktraceResultStatus.Ok); + return new BacktraceResult(data.getReport(), data.getReport().message, BacktraceResultStatus.Ok); }); final BacktraceExceptionHandler handler = createBacktraceExceptionHandler(client); @@ -92,12 +90,14 @@ public void testUncaughtException() throws InvocationTargetException, NoSuchMeth assertNull(testedReportData.getReport().message); assertTrue(testedReportData.getReport().diagnosticStack.size() > 0); assertEquals("java.lang.IllegalArgumentException", testedReportData.getReport().classifier); - assertEquals("Unhandled exception", testedReportData.getReport().attributes.get("error.type")); + assertEquals( + "Unhandled exception", testedReportData.getReport().attributes.get("error.type")); assertTrue(testedReportData.getReport().exceptionTypeReport); } @Test - public void testUncaughtError() throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, InstantiationException { + public void testUncaughtError() + throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, InstantiationException { // GIVEN final Waiter waiter = new Waiter(); final Error error = new OutOfMemoryError(); @@ -107,8 +107,7 @@ public void testUncaughtError() throws InvocationTargetException, NoSuchMethodEx client.setOnRequestHandler(data -> { testedAtomicReportData.set(data); waiter.resume(); - return new BacktraceResult(data.getReport(), data.getReport().message, - BacktraceResultStatus.Ok); + return new BacktraceResult(data.getReport(), data.getReport().message, BacktraceResultStatus.Ok); }); final BacktraceExceptionHandler handler = createBacktraceExceptionHandler(client); @@ -129,12 +128,14 @@ public void testUncaughtError() throws InvocationTargetException, NoSuchMethodEx assertNull(testedReportData.getReport().message); assertTrue(testedReportData.getReport().diagnosticStack.size() > 0); assertEquals("java.lang.OutOfMemoryError", testedReportData.getReport().classifier); - assertEquals("Unhandled exception", testedReportData.getReport().attributes.get("error.type")); + assertEquals( + "Unhandled exception", testedReportData.getReport().attributes.get("error.type")); assertTrue(testedReportData.getReport().exceptionTypeReport); } @Test() - public void testUncaughtInnerExceptionsGeneration() throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, InstantiationException { + public void testUncaughtInnerExceptionsGeneration() + throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, InstantiationException { // GIVEN final int expectedNumberOfExceptions = 2; final Waiter waiter = new Waiter(); @@ -152,8 +153,7 @@ public void testUncaughtInnerExceptionsGeneration() throws InvocationTargetExcep if (unhandledExceptionData.size() == expectedNumberOfExceptions) { waiter.resume(); } - return new BacktraceResult(data.getReport(), data.getReport().message, - BacktraceResultStatus.Ok); + return new BacktraceResult(data.getReport(), data.getReport().message, BacktraceResultStatus.Ok); }); final BacktraceExceptionHandler handler = createBacktraceExceptionHandler(client); @@ -178,7 +178,8 @@ public void testUncaughtInnerExceptionsGeneration() throws InvocationTargetExcep } @Test() - public void testUncaughtInnerExceptionsErrorAttributes() throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, InstantiationException { + public void testUncaughtInnerExceptionsErrorAttributes() + throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, InstantiationException { // GIVEN final int expectedNumberOfExceptions = 2; final Waiter waiter = new Waiter(); @@ -189,15 +190,14 @@ public void testUncaughtInnerExceptionsErrorAttributes() throws InvocationTarget final BacktraceClient client = new BacktraceClient(context, credentials); client.sendInnerExceptions(true); client.sendSuppressedExceptions(true); - + final List unhandledExceptionData = new ArrayList<>(); client.setOnRequestHandler(data -> { unhandledExceptionData.add(data); if (unhandledExceptionData.size() == expectedNumberOfExceptions) { waiter.resume(); } - return new BacktraceResult(data.getReport(), data.getReport().message, - BacktraceResultStatus.Ok); + return new BacktraceResult(data.getReport(), data.getReport().message, BacktraceResultStatus.Ok); }); final BacktraceExceptionHandler handler = createBacktraceExceptionHandler(client); @@ -218,7 +218,9 @@ public void testUncaughtInnerExceptionsErrorAttributes() throws InvocationTarget assertEquals(outerException.attributes.get("error.trace"), innerException.attributes.get("error.trace")); assertEquals(outerException.uuid, innerException.attributes.get("error.parent")); assertNull(outerException.attributes.get("error.parent")); - assertEquals(BacktraceAttributeConsts.UnhandledExceptionAttributeType, outerException.attributes.get("error.type")); - assertEquals(BacktraceAttributeConsts.UnhandledExceptionAttributeType, innerException.attributes.get("error.type")); + assertEquals( + BacktraceAttributeConsts.UnhandledExceptionAttributeType, outerException.attributes.get("error.type")); + assertEquals( + BacktraceAttributeConsts.UnhandledExceptionAttributeType, innerException.attributes.get("error.type")); } } diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/watchdog/BacktraceAnrTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/watchdog/BacktraceAnrTest.java index 577fe77be..a2b66de9e 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/watchdog/BacktraceAnrTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/watchdog/BacktraceAnrTest.java @@ -3,24 +3,19 @@ import static org.junit.Assert.fail; import android.content.Context; - import androidx.test.annotation.UiThreadTest; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import net.jodah.concurrentunit.Waiter; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.concurrent.TimeUnit; - import backtraceio.library.BacktraceClient; import backtraceio.library.BacktraceCredentials; import backtraceio.library.logger.BacktraceInternalLogger; import backtraceio.library.logger.BacktraceLogger; import backtraceio.library.logger.LogLevel; +import java.util.concurrent.TimeUnit; +import net.jodah.concurrentunit.Waiter; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceAnrTest { diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/watchdog/BacktraceWatchdogSharedTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/watchdog/BacktraceWatchdogSharedTest.java index 26e17c30e..6bac08e58 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/watchdog/BacktraceWatchdogSharedTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/watchdog/BacktraceWatchdogSharedTest.java @@ -1,31 +1,26 @@ package backtraceio.library.watchdog; +import static backtraceio.library.models.BacktraceAttributeConsts.AnrAttributeType; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import static backtraceio.library.models.BacktraceAttributeConsts.AnrAttributeType; import android.content.Context; - import androidx.test.annotation.UiThreadTest; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import net.jodah.concurrentunit.Waiter; - -import org.json.JSONObject; -import org.junit.After; -import org.junit.Before; -import org.junit.runner.RunWith; - -import java.util.List; -import java.util.concurrent.TimeUnit; - import backtraceio.library.BacktraceClient; import backtraceio.library.BacktraceCredentials; import backtraceio.library.BacktraceDatabase; import backtraceio.library.breadcrumbs.BreadcrumbsReader; import backtraceio.library.logger.BacktraceLogger; +import java.util.List; +import java.util.concurrent.TimeUnit; +import net.jodah.concurrentunit.Waiter; +import org.json.JSONObject; +import org.junit.After; +import org.junit.Before; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceWatchdogSharedTest { @@ -70,8 +65,7 @@ public void checkAnrBreadcrumb() { }); // WHEN - BacktraceWatchdogShared.sendReportCauseBlockedThread( - backtraceClient, new Thread(), null, ""); + BacktraceWatchdogShared.sendReportCauseBlockedThread(backtraceClient, new Thread(), null, ""); // THEN try { @@ -87,8 +81,8 @@ public String getANRBreadcrumb() { JSONObject anrBreadcrumb = new JSONObject(breadcrumbs.get(1)); return anrBreadcrumb.getString("message"); } catch (Exception e) { - BacktraceLogger.e(BacktraceWatchdogSharedTest.class.getName(), - "Exception on looking for ANR breadcrumb", e); + BacktraceLogger.e( + BacktraceWatchdogSharedTest.class.getName(), "Exception on looking for ANR breadcrumb", e); return null; } } diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/watchdog/BacktraceWatchdogTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/watchdog/BacktraceWatchdogTest.java index 3add03e0f..5becbb614 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/watchdog/BacktraceWatchdogTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/watchdog/BacktraceWatchdogTest.java @@ -1,21 +1,17 @@ package backtraceio.library.watchdog; import android.content.Context; - import androidx.test.annotation.UiThreadTest; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - +import backtraceio.library.BacktraceClient; +import backtraceio.library.BacktraceCredentials; import net.jodah.concurrentunit.Waiter; - import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import backtraceio.library.BacktraceClient; -import backtraceio.library.BacktraceCredentials; - @RunWith(AndroidJUnit4.class) public class BacktraceWatchdogTest { private Context context; @@ -67,8 +63,7 @@ public void checkIfItCorrectlyDetectsBlockedThread() { final Waiter waiter = new Waiter(); Thread t = new Thread() { public void run() { - while (true) { - } + while (true) {} } }; watchdog.registerThread(t, 200, 50); @@ -78,7 +73,7 @@ public void run() { Thread.sleep(300); boolean result = watchdog.checkIsAnyThreadIsBlocked(); - //THEN + // THEN Assert.assertTrue(result); } catch (Exception e) { waiter.fail(e); @@ -93,8 +88,7 @@ public void checkIfUnregisterThreadWorksCorrectly() { final Waiter waiter = new Waiter(); Thread t = new Thread() { public void run() { - while (true) { - } + while (true) {} } }; watchdog.registerThread(t, 200, 50); @@ -120,8 +114,7 @@ public void checkIfDeactivateThreadWatcherWorksCorrectly() { final Waiter waiter = new Waiter(); Thread t = new Thread() { public void run() { - while (true) { - } + while (true) {} } }; t.start(); @@ -148,8 +141,7 @@ public void checkIfActivateThreadWatcherWorksCorrectly() { final BacktraceWatchdog watchdog = new BacktraceWatchdog(this.backtraceClient); Thread t = new Thread() { public void run() { - while (true) { - } + while (true) {} } }; t.start(); @@ -190,8 +182,7 @@ public void onEvent(BacktraceWatchdogTimeoutException exception) { }); Thread t = new Thread() { public void run() { - while (true) { - } + while (true) {} } }; t.start(); @@ -209,4 +200,4 @@ public void run() { waiter.fail(e); } } -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/BacktraceClient.java b/backtrace-library/src/main/java/backtraceio/library/BacktraceClient.java index 2cb8f812f..679eae93f 100644 --- a/backtrace-library/src/main/java/backtraceio/library/BacktraceClient.java +++ b/backtrace-library/src/main/java/backtraceio/library/BacktraceClient.java @@ -1,11 +1,6 @@ package backtraceio.library; import android.content.Context; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import backtraceio.library.anr.AnrType; import backtraceio.library.anr.BacktraceANRHandler; import backtraceio.library.anr.BacktraceANRSettings; @@ -17,6 +12,9 @@ import backtraceio.library.models.json.BacktraceReport; import backtraceio.library.watchdog.BacktraceANRHandlerWatchdog; import backtraceio.library.watchdog.OnApplicationNotRespondingEvent; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Backtrace Java Android Client @@ -70,7 +68,11 @@ public BacktraceClient(Context context, BacktraceCredentials credentials, Map attributes, List attachments) { + public BacktraceClient( + Context context, + BacktraceCredentials credentials, + Map attributes, + List attachments) { this(context, credentials, (BacktraceDatabase) null, attributes, attachments); } @@ -81,8 +83,8 @@ public BacktraceClient(Context context, BacktraceCredentials credentials, Map attachments) { + public BacktraceClient( + Context context, + BacktraceCredentials credentials, + BacktraceDatabaseSettings databaseSettings, + List attachments) { this(context, credentials, new BacktraceDatabase(context, databaseSettings), attachments); } @@ -107,8 +112,11 @@ public BacktraceClient(Context context, BacktraceCredentials credentials, * @param databaseSettings Backtrace database settings * @param attributes additional information about current application */ - public BacktraceClient(Context context, BacktraceCredentials credentials, - BacktraceDatabaseSettings databaseSettings, Map attributes) { + public BacktraceClient( + Context context, + BacktraceCredentials credentials, + BacktraceDatabaseSettings databaseSettings, + Map attributes) { this(context, credentials, new BacktraceDatabase(context, databaseSettings), attributes); } @@ -121,9 +129,12 @@ public BacktraceClient(Context context, BacktraceCredentials credentials, * @param attributes additional information about current application * @note Attachments for native crashes must be specified here, and cannot be changed during runtime */ - public BacktraceClient(Context context, BacktraceCredentials credentials, - BacktraceDatabaseSettings databaseSettings, Map attributes, - List attachments) { + public BacktraceClient( + Context context, + BacktraceCredentials credentials, + BacktraceDatabaseSettings databaseSettings, + Map attributes, + List attachments) { this(context, credentials, new BacktraceDatabase(context, databaseSettings), attributes, attachments); } @@ -134,8 +145,7 @@ public BacktraceClient(Context context, BacktraceCredentials credentials, * @param credentials Backtrace credentials to access Backtrace API * @param database Backtrace database */ - public BacktraceClient(Context context, BacktraceCredentials credentials, - Database database) { + public BacktraceClient(Context context, BacktraceCredentials credentials, Database database) { this(context, credentials, database, new HashMap()); } @@ -147,8 +157,8 @@ public BacktraceClient(Context context, BacktraceCredentials credentials, * @param database Backtrace database * @note Attachments for native crashes must be specified here, and cannot be changed during runtime */ - public BacktraceClient(Context context, BacktraceCredentials credentials, - Database database, List attachments) { + public BacktraceClient( + Context context, BacktraceCredentials credentials, Database database, List attachments) { this(context, credentials, database, null, attachments); } @@ -160,8 +170,8 @@ public BacktraceClient(Context context, BacktraceCredentials credentials, * @param database Backtrace database * @param attributes additional information about current application */ - public BacktraceClient(Context context, BacktraceCredentials credentials, - Database database, Map attributes) { + public BacktraceClient( + Context context, BacktraceCredentials credentials, Database database, Map attributes) { this(context, credentials, database, attributes, null); } @@ -175,9 +185,12 @@ public BacktraceClient(Context context, BacktraceCredentials credentials, * @param attachments File attachment paths to consider for reports * @note Attachments for native crashes must be specified here, and cannot be changed during runtime */ - public BacktraceClient(Context context, BacktraceCredentials credentials, - Database database, Map attributes, - List attachments) { + public BacktraceClient( + Context context, + BacktraceCredentials credentials, + Database database, + Map attributes, + List attachments) { super(context, credentials, database, attributes, attachments); } @@ -215,8 +228,7 @@ public void send(Throwable throwable) { * @param throwable current throwable * @param serverResponseEventListener event callback that will be executed after receiving a response from the server */ - public void send(Throwable throwable, OnServerResponseEventListener - serverResponseEventListener) { + public void send(Throwable throwable, OnServerResponseEventListener serverResponseEventListener) { this.send(throwable, null, serverResponseEventListener); } @@ -227,8 +239,10 @@ public void send(Throwable throwable, OnServerResponseEventListener * @param attributes throwable attributes * @param serverResponseEventListener event callback that will be executed after receiving a response from the server */ - public void send(Throwable throwable, Map attributes, OnServerResponseEventListener - serverResponseEventListener) { + public void send( + Throwable throwable, + Map attributes, + OnServerResponseEventListener serverResponseEventListener) { super.send(new BacktraceReport(throwable, attributes), serverResponseEventListener); } @@ -247,8 +261,7 @@ public void send(BacktraceReport report) { * @param report current BacktraceReport * @param serverResponseEventListener event callback that will be executed after receiving a response from the server */ - public void send(BacktraceReport report, OnServerResponseEventListener - serverResponseEventListener) { + public void send(BacktraceReport report, OnServerResponseEventListener serverResponseEventListener) { super.send(report, serverResponseEventListener); } @@ -258,6 +271,7 @@ public void send(BacktraceReport report, OnServerResponseEventListener public void enableAnr() { this.enableAnr(AnrType.Threshold); } + public void enableAnr(AnrType anrType) { this.enableAnr(anrType, new BacktraceANRSettings()); } @@ -330,10 +344,9 @@ public BacktraceANRHandler initAnrHandler(AnrType anrType, BacktraceANRSettings public BacktraceANRHandler createBacktraceAnrHandler(AnrType anrType, BacktraceANRSettings settings) { if (anrType == AnrType.ApplicationExit) { return new BacktraceAppExitInfoSenderHandler(this, context); - } else if (anrType == AnrType.Threshold){ + } else if (anrType == AnrType.Threshold) { return new BacktraceANRHandlerWatchdog(this, settings.getTimeout(), settings.isDebug()); } throw new IllegalArgumentException("Unsupported type of ANR: " + anrType.name()); } - } diff --git a/backtrace-library/src/main/java/backtraceio/library/BacktraceCredentials.java b/backtrace-library/src/main/java/backtraceio/library/BacktraceCredentials.java index f9c2a485c..7130b92b6 100644 --- a/backtrace-library/src/main/java/backtraceio/library/BacktraceCredentials.java +++ b/backtrace-library/src/main/java/backtraceio/library/BacktraceCredentials.java @@ -1,7 +1,6 @@ package backtraceio.library; import android.net.Uri; - import backtraceio.library.logger.BacktraceLogger; /** @@ -9,7 +8,7 @@ */ public class BacktraceCredentials { - private final static transient String LOG_TAG = BacktraceCredentials.class.getSimpleName(); + private static final transient String LOG_TAG = BacktraceCredentials.class.getSimpleName(); /** * Data format @@ -56,8 +55,8 @@ private Uri getBacktraceHostUri() { private Uri getServerUrl() { String serverUrl = this.getEndpointUrl(); String prefix = serverUrl.endsWith("/") ? "" : "/"; - String url = String.format("%s%spost?format=%s&token=%s", serverUrl, prefix, - this.format, this.getSubmissionToken()); + String url = + String.format("%s%spost?format=%s&token=%s", serverUrl, prefix, this.format, this.getSubmissionToken()); return Uri.parse(url); } @@ -119,8 +118,7 @@ public String getUniverseName() { * @return access token */ public String getSubmissionToken() { - if (submissionToken != null) - return submissionToken; + if (submissionToken != null) return submissionToken; final int tokenLength = 64; final String tokenQueryParam = "token="; @@ -140,4 +138,4 @@ public String getSubmissionToken() { final int tokenParamStartIndex = tokenQueryParamStartIndex + tokenQueryParam.length(); return submissionUrl.substring(tokenParamStartIndex, tokenParamStartIndex + tokenLength); } -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/BacktraceDatabase.java b/backtrace-library/src/main/java/backtraceio/library/BacktraceDatabase.java index 61332962e..a1742ef31 100644 --- a/backtrace-library/src/main/java/backtraceio/library/BacktraceDatabase.java +++ b/backtrace-library/src/main/java/backtraceio/library/BacktraceDatabase.java @@ -2,14 +2,6 @@ import android.content.Context; import android.content.pm.ApplicationInfo; - -import java.io.File; -import java.util.Calendar; -import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; -import java.util.concurrent.CountDownLatch; - import backtraceio.library.base.BacktraceBase; import backtraceio.library.breadcrumbs.BacktraceBreadcrumbs; import backtraceio.library.common.FileHelper; @@ -37,6 +29,12 @@ import backtraceio.library.nativeCalls.BacktraceCrashHandlerWrapper; import backtraceio.library.services.BacktraceDatabaseContext; import backtraceio.library.services.BacktraceDatabaseFileContext; +import java.io.File; +import java.util.Calendar; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.CountDownLatch; /** * Backtrace Database @@ -45,7 +43,7 @@ public class BacktraceDatabase implements Database { private static boolean _timerBackgroundWork = false; private static Timer _timer; - private transient final String LOG_TAG = BacktraceDatabase.class.getSimpleName(); + private final transient String LOG_TAG = BacktraceDatabase.class.getSimpleName(); private Api BacktraceApi; private Context _applicationContext; private DatabaseContext backtraceDatabaseContext; @@ -96,25 +94,26 @@ public BacktraceDatabase(Context context, BacktraceDatabaseSettings databaseSett throw new IllegalArgumentException("Database settings or application context is null"); } - if (databaseSettings.getDatabasePath() == null || databaseSettings.getDatabasePath() - .isEmpty()) { + if (databaseSettings.getDatabasePath() == null + || databaseSettings.getDatabasePath().isEmpty()) { throw new IllegalArgumentException("Database path is null or empty"); } if (!FileHelper.isFileExists(databaseSettings.getDatabasePath())) { boolean createDirs = new File(databaseSettings.getDatabasePath()).mkdirs(); if (!createDirs || !FileHelper.isFileExists(databaseSettings.getDatabasePath())) { - throw new IllegalArgumentException("Incorrect database path or application " + - "doesn't have permission to write to this path"); + throw new IllegalArgumentException( + "Incorrect database path or application " + "doesn't have permission to write to this path"); } } this._applicationContext = context; this.databaseSettings = databaseSettings; this.backtraceDatabaseContext = new BacktraceDatabaseContext(databaseSettings); - this.backtraceDatabaseFileContext = new BacktraceDatabaseFileContext(this.getDatabasePath(), - this.databaseSettings.getMaxDatabaseSize(), this.databaseSettings - .getMaxRecordCount()); + this.backtraceDatabaseFileContext = new BacktraceDatabaseFileContext( + this.getDatabasePath(), + this.databaseSettings.getMaxDatabaseSize(), + this.databaseSettings.getMaxRecordCount()); this.breadcrumbs = new BacktraceBreadcrumbs(getDatabasePath()); this.crashHandlerConfiguration = new CrashHandlerConfiguration(); } @@ -140,9 +139,10 @@ public Boolean setupNativeIntegration(BacktraceBase client, BacktraceCredentials * @param credentials Backtrace credentials * @param enableClientSideUnwinding Enable client side unwinding */ - public Boolean setupNativeIntegration(BacktraceBase client, BacktraceCredentials credentials, - boolean enableClientSideUnwinding) { - return setupNativeIntegration(client, credentials, enableClientSideUnwinding, UnwindingMode.REMOTE_DUMPWITHOUTCRASH); + public Boolean setupNativeIntegration( + BacktraceBase client, BacktraceCredentials credentials, boolean enableClientSideUnwinding) { + return setupNativeIntegration( + client, credentials, enableClientSideUnwinding, UnwindingMode.REMOTE_DUMPWITHOUTCRASH); } /** @@ -160,8 +160,11 @@ public void useNativeCommunication(NativeCommunication nativeCommunication) { * @param enableClientSideUnwinding Enable client side unwinding * @param unwindingMode Unwinding mode to use for client side unwinding */ - public Boolean setupNativeIntegration(BacktraceBase client, BacktraceCredentials credentials, - boolean enableClientSideUnwinding, UnwindingMode unwindingMode) { + public Boolean setupNativeIntegration( + BacktraceBase client, + BacktraceCredentials credentials, + boolean enableClientSideUnwinding, + UnwindingMode unwindingMode) { // avoid initialization when database doesn't exist if (_enable == false || getSettings() == null) { return false; @@ -178,11 +181,13 @@ public Boolean setupNativeIntegration(BacktraceBase client, BacktraceCredentials } // Create the crashpad directory if it doesn't exist - String crashpadDatabaseDirectory = this.crashHandlerConfiguration.useCrashpadDirectory(getSettings().getDatabasePath()); + String crashpadDatabaseDirectory = this.crashHandlerConfiguration.useCrashpadDirectory( + getSettings().getDatabasePath()); // setup default native attributes BacktraceAttributes crashpadAttributes = new BacktraceAttributes(_applicationContext, client.attributes); - crashpadAttributes.attributes.put(BacktraceAttributeConsts.ErrorType, BacktraceAttributeConsts.CrashAttributeType); + crashpadAttributes.attributes.put( + BacktraceAttributeConsts.ErrorType, BacktraceAttributeConsts.CrashAttributeType); String[] keys = crashpadAttributes.attributes.keySet().toArray(new String[0]); String[] values = crashpadAttributes.attributes.values().toArray(new String[0]); @@ -199,15 +204,16 @@ public Boolean setupNativeIntegration(BacktraceBase client, BacktraceCredentials ApplicationInfo applicationInfo = _applicationContext.getApplicationInfo(); - _enabledNativeIntegration = - nativeCommunication.initializeJavaCrashHandler(minidumpSubmissionUrl, - crashpadDatabaseDirectory, - this.crashHandlerConfiguration.getClassPath(), - keys, - values, - attachmentPaths, - this.crashHandlerConfiguration.getCrashHandlerEnvironmentVariables(applicationInfo).toArray(new String[0]) - ); + _enabledNativeIntegration = nativeCommunication.initializeJavaCrashHandler( + minidumpSubmissionUrl, + crashpadDatabaseDirectory, + this.crashHandlerConfiguration.getClassPath(), + keys, + values, + attachmentPaths, + this.crashHandlerConfiguration + .getCrashHandlerEnvironmentVariables(applicationInfo) + .toArray(new String[0])); if (_enabledNativeIntegration && this.breadcrumbs.isEnabled()) { this.breadcrumbs.setOnSuccessfulBreadcrumbAddEventListener(breadcrumbId -> { @@ -216,7 +222,10 @@ public Boolean setupNativeIntegration(BacktraceBase client, BacktraceCredentials } final long endSetupNativeIntegrationTime = DebugHelper.getCurrentTimeMillis(); - BacktraceLogger.d(LOG_TAG, "Setup native integration took " + (endSetupNativeIntegrationTime - startSetupNativeIntegrationTime) + " milliseconds"); + BacktraceLogger.d( + LOG_TAG, + "Setup native integration took " + (endSetupNativeIntegrationTime - startSetupNativeIntegrationTime) + + " milliseconds"); return _enabledNativeIntegration; } @@ -265,8 +274,7 @@ public void start() { this.removeOrphaned(); - if (databaseSettings.getRetryBehavior() == RetryBehavior.ByInterval || databaseSettings - .isAutoSendMode()) { + if (databaseSettings.getRetryBehavior() == RetryBehavior.ByInterval || databaseSettings.isAutoSendMode()) { setupTimer(); } @@ -284,83 +292,82 @@ public BacktraceDatabaseSettings getSettings() { private void setupTimer() { _timer = new Timer(); - _timer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - String dateTimeNow = Calendar.getInstance().getTime().toString(); - BacktraceLogger.d(LOG_TAG, "Timer - " + dateTimeNow); - if (backtraceDatabaseContext == null) { - BacktraceLogger.w(LOG_TAG, "Timer - database context is null: " + - dateTimeNow); - return; - } + _timer.scheduleAtFixedRate( + new TimerTask() { + @Override + public void run() { + String dateTimeNow = Calendar.getInstance().getTime().toString(); + BacktraceLogger.d(LOG_TAG, "Timer - " + dateTimeNow); + if (backtraceDatabaseContext == null) { + BacktraceLogger.w(LOG_TAG, "Timer - database context is null: " + dateTimeNow); + return; + } - if (backtraceDatabaseContext.isEmpty()) { - BacktraceLogger.d(LOG_TAG, "Timer - database is empty (no records): " + - dateTimeNow); - return; - } + if (backtraceDatabaseContext.isEmpty()) { + BacktraceLogger.d(LOG_TAG, "Timer - database is empty (no records): " + dateTimeNow); + return; + } - if (_timerBackgroundWork) { - BacktraceLogger.d(LOG_TAG, "Timer - another timer works now: " + dateTimeNow); - return; - } + if (_timerBackgroundWork) { + BacktraceLogger.d(LOG_TAG, "Timer - another timer works now: " + dateTimeNow); + return; + } - BacktraceLogger.d(LOG_TAG, "Timer - continue working: " + dateTimeNow); - _timerBackgroundWork = true; - _timer.cancel(); - _timer.purge(); - _timer = null; - - BacktraceDatabaseRecord record = backtraceDatabaseContext.first(); - while (record != null) { - final CountDownLatch threadWaiter = new CountDownLatch(1); - BacktraceData backtraceData = record.getBacktraceData(); - if (backtraceData == null || backtraceData.getReport() == null) { - BacktraceLogger.d(LOG_TAG, "Timer - backtrace data or report is null - " + - "deleting record"); - delete(record); - } else { - final BacktraceDatabaseRecord currentRecord = record; - BacktraceApi.send(backtraceData, new OnServerResponseEventListener() { - @Override - public void onEvent(BacktraceResult backtraceResult) { - if (backtraceResult.status == BacktraceResultStatus.Ok) { - BacktraceLogger.d(LOG_TAG, "Timer - deleting record"); - delete(currentRecord); - } else { - BacktraceLogger.d(LOG_TAG, "Timer - closing record"); - currentRecord.close(); - // backtraceDatabaseContext.incrementBatchRetry(); TODO: consider another way to remove some records after few retries + BacktraceLogger.d(LOG_TAG, "Timer - continue working: " + dateTimeNow); + _timerBackgroundWork = true; + _timer.cancel(); + _timer.purge(); + _timer = null; + + BacktraceDatabaseRecord record = backtraceDatabaseContext.first(); + while (record != null) { + final CountDownLatch threadWaiter = new CountDownLatch(1); + BacktraceData backtraceData = record.getBacktraceData(); + if (backtraceData == null || backtraceData.getReport() == null) { + BacktraceLogger.d( + LOG_TAG, "Timer - backtrace data or report is null - " + "deleting record"); + delete(record); + } else { + final BacktraceDatabaseRecord currentRecord = record; + BacktraceApi.send(backtraceData, new OnServerResponseEventListener() { + @Override + public void onEvent(BacktraceResult backtraceResult) { + if (backtraceResult.status == BacktraceResultStatus.Ok) { + BacktraceLogger.d(LOG_TAG, "Timer - deleting record"); + delete(currentRecord); + } else { + BacktraceLogger.d(LOG_TAG, "Timer - closing record"); + currentRecord.close(); + // backtraceDatabaseContext.incrementBatchRetry(); TODO: consider another + // way to remove some records after few retries + } + threadWaiter.countDown(); + } + }); + try { + threadWaiter.await(); + } catch (Exception ex) { + BacktraceLogger.e(LOG_TAG, "Error during waiting for result in Timer", ex); + } + if (currentRecord.valid() && !currentRecord.locked) { + BacktraceLogger.d(LOG_TAG, "Timer - record is valid and unlocked"); + break; } - threadWaiter.countDown(); } - }); - try { - threadWaiter.await(); - } catch (Exception ex) { - BacktraceLogger.e(LOG_TAG, - "Error during waiting for result in Timer", ex - ); - } - if (currentRecord.valid() && !currentRecord.locked) { - BacktraceLogger.d(LOG_TAG, "Timer - record is valid and unlocked"); - break; + record = backtraceDatabaseContext.first(); } + BacktraceLogger.d(LOG_TAG, "Setup new timer"); + _timerBackgroundWork = false; + setupTimer(); } - record = backtraceDatabaseContext.first(); - } - BacktraceLogger.d(LOG_TAG, "Setup new timer"); - _timerBackgroundWork = false; - setupTimer(); - } - }, databaseSettings.getRetryInterval() * 1000, databaseSettings.getRetryInterval() * 1000); + }, + databaseSettings.getRetryInterval() * 1000, + databaseSettings.getRetryInterval() * 1000); } public void flush() { if (this.BacktraceApi == null) { - throw new IllegalArgumentException("BacktraceApi is required " + - "if you want to use Flush method"); + throw new IllegalArgumentException("BacktraceApi is required " + "if you want to use Flush method"); } BacktraceDatabaseRecord record = backtraceDatabaseContext.first(); @@ -396,13 +403,12 @@ public boolean validConsistency() { return backtraceDatabaseFileContext.validFileConsistency(); } - public BacktraceDatabaseRecord add(BacktraceReport backtraceReport, Map - attributes) { + public BacktraceDatabaseRecord add(BacktraceReport backtraceReport, Map attributes) { return add(backtraceReport, attributes, false); } - public BacktraceDatabaseRecord add(BacktraceReport backtraceReport, Map - attributes, boolean isProguardEnabled) { + public BacktraceDatabaseRecord add( + BacktraceReport backtraceReport, Map attributes, boolean isProguardEnabled) { if (!this._enable || backtraceReport == null) { return null; } @@ -446,8 +452,10 @@ private void loadReports() { final long endLoadingReportsTime = System.currentTimeMillis(); - BacktraceLogger.d(LOG_TAG, "Loading " + backtraceDatabaseContext.count() + - " reports took " + (endLoadingReportsTime - startLoadingReportsTime) + " milliseconds"); + BacktraceLogger.d( + LOG_TAG, + "Loading " + backtraceDatabaseContext.count() + " reports took " + + (endLoadingReportsTime - startLoadingReportsTime) + " milliseconds"); } private void loadReportsToDbContext() { @@ -467,7 +475,6 @@ private void loadReportsToDbContext() { validateDatabaseSize(); record.close(); } - } /** @@ -482,19 +489,18 @@ private boolean validateDatabaseSize() { // Check how many records are stored in database // Remove in case when we want to store one more than expected number // If record count == 0 then we ignore this condition - if (backtraceDatabaseContext.count() + 1 > databaseSettings.getMaxRecordCount() && - databaseSettings.getMaxRecordCount() != 0) { + if (backtraceDatabaseContext.count() + 1 > databaseSettings.getMaxRecordCount() + && databaseSettings.getMaxRecordCount() != 0) { if (!backtraceDatabaseContext.removeOldestRecord()) { BacktraceLogger.e(LOG_TAG, "Can't remove last record. Database size is invalid"); return false; } } - if (databaseSettings.getMaxDatabaseSize() != 0 && backtraceDatabaseContext - .getDatabaseSize() > databaseSettings.getMaxDatabaseSize()) { + if (databaseSettings.getMaxDatabaseSize() != 0 + && backtraceDatabaseContext.getDatabaseSize() > databaseSettings.getMaxDatabaseSize()) { int deletePolicyRetry = 5; - while (backtraceDatabaseContext.getDatabaseSize() > databaseSettings - .getMaxDatabaseSize()) { + while (backtraceDatabaseContext.getDatabaseSize() > databaseSettings.getMaxDatabaseSize()) { backtraceDatabaseContext.removeOldestRecord(); deletePolicyRetry--; // avoid infinity loop if (deletePolicyRetry == 0) { diff --git a/backtrace-library/src/main/java/backtraceio/library/anr/ActivityManagerExitInfoProvider.java b/backtrace-library/src/main/java/backtraceio/library/anr/ActivityManagerExitInfoProvider.java index 5a35a57bb..96bea42d0 100644 --- a/backtrace-library/src/main/java/backtraceio/library/anr/ActivityManagerExitInfoProvider.java +++ b/backtrace-library/src/main/java/backtraceio/library/anr/ActivityManagerExitInfoProvider.java @@ -4,15 +4,14 @@ import android.app.ApplicationExitInfo; import android.content.Context; import android.os.Build; - import androidx.annotation.RequiresApi; - import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ActivityManagerExitInfoProvider implements ProcessExitInfoProvider { private final ActivityManager activityManager; + public ActivityManagerExitInfoProvider(Context context) { this.activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); } diff --git a/backtrace-library/src/main/java/backtraceio/library/anr/AnrExitInfoState.java b/backtrace-library/src/main/java/backtraceio/library/anr/AnrExitInfoState.java index 9cad0a146..5eca8fae3 100644 --- a/backtrace-library/src/main/java/backtraceio/library/anr/AnrExitInfoState.java +++ b/backtrace-library/src/main/java/backtraceio/library/anr/AnrExitInfoState.java @@ -1,7 +1,6 @@ package backtraceio.library.anr; import android.content.Context; - import backtraceio.library.common.SharedPreferencesManager; public class AnrExitInfoState { @@ -25,5 +24,4 @@ public long getLastTimestamp() { return this.sharedPreferencesManager.readLongFromSharedPreferences( PREFS_NAME, TIMESTAMP_PREF_KEY, TIMESTAMP_DEFAULT); } - } diff --git a/backtrace-library/src/main/java/backtraceio/library/anr/AppExitInfoDetailsExtractor.java b/backtrace-library/src/main/java/backtraceio/library/anr/AppExitInfoDetailsExtractor.java index 1bb65a0e8..450191815 100644 --- a/backtrace-library/src/main/java/backtraceio/library/anr/AppExitInfoDetailsExtractor.java +++ b/backtrace-library/src/main/java/backtraceio/library/anr/AppExitInfoDetailsExtractor.java @@ -2,9 +2,8 @@ import android.app.ApplicationExitInfo; import android.os.Build; - import androidx.annotation.RequiresApi; - +import backtraceio.library.logger.BacktraceLogger; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -14,11 +13,8 @@ import java.util.HashMap; import java.util.Locale; -import backtraceio.library.logger.BacktraceLogger; - - public class AppExitInfoDetailsExtractor { - private final static String LOG_TAG = AppExitInfoDetailsExtractor.class.getSimpleName(); + private static final String LOG_TAG = AppExitInfoDetailsExtractor.class.getSimpleName(); @RequiresApi(api = Build.VERSION_CODES.R) public static HashMap getANRAttributes(ExitInfo appExitInfo) { @@ -40,9 +36,9 @@ public static HashMap getANRAttributes(ExitInfo appExitInfo) { @RequiresApi(api = Build.VERSION_CODES.R) public static String getANRMessage(ExitInfo appExitInfo) { - return "Application Not Responding" + " | " + - "Description: " + appExitInfo.getDescription() + " | " + - "Timestamp: " + getANRTimestamp(appExitInfo); + return "Application Not Responding" + " | " + "Description: " + + appExitInfo.getDescription() + " | " + "Timestamp: " + + getANRTimestamp(appExitInfo); } @RequiresApi(api = Build.VERSION_CODES.R) diff --git a/backtrace-library/src/main/java/backtraceio/library/anr/BacktraceANRExitInfoException.java b/backtrace-library/src/main/java/backtraceio/library/anr/BacktraceANRExitInfoException.java index 97f819f52..deba45cca 100644 --- a/backtrace-library/src/main/java/backtraceio/library/anr/BacktraceANRExitInfoException.java +++ b/backtrace-library/src/main/java/backtraceio/library/anr/BacktraceANRExitInfoException.java @@ -1,7 +1,6 @@ package backtraceio.library.anr; import android.os.Build; - import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; diff --git a/backtrace-library/src/main/java/backtraceio/library/anr/BacktraceANRSettings.java b/backtrace-library/src/main/java/backtraceio/library/anr/BacktraceANRSettings.java index 75bc917ec..70f33e585 100644 --- a/backtrace-library/src/main/java/backtraceio/library/anr/BacktraceANRSettings.java +++ b/backtrace-library/src/main/java/backtraceio/library/anr/BacktraceANRSettings.java @@ -2,7 +2,6 @@ import backtraceio.library.watchdog.OnApplicationNotRespondingEvent; - /** * Configuration settings for Application Not Responding (ANR) detection. * This class allows customization of ANR monitoring behavior, such as the timeout duration @@ -12,7 +11,7 @@ public class BacktraceANRSettings { /** * Default timeout value in milliseconds */ - public final static int DEFAULT_ANR_TIMEOUT = 5000; + public static final int DEFAULT_ANR_TIMEOUT = 5000; /** * The timeout in milliseconds after which an ANR is reported if the main thread is blocked. @@ -47,7 +46,8 @@ public BacktraceANRSettings() { * Can be null if no custom callback is needed. * @param debug True to enable debug logging for ANR detection, false otherwise. */ - public BacktraceANRSettings(int timeout, OnApplicationNotRespondingEvent onApplicationNotRespondingEvent, boolean debug) { + public BacktraceANRSettings( + int timeout, OnApplicationNotRespondingEvent onApplicationNotRespondingEvent, boolean debug) { this.timeout = timeout; this.onApplicationNotRespondingEvent = onApplicationNotRespondingEvent; this.debug = debug; diff --git a/backtrace-library/src/main/java/backtraceio/library/anr/BacktraceAppExitInfoSenderHandler.java b/backtrace-library/src/main/java/backtraceio/library/anr/BacktraceAppExitInfoSenderHandler.java index 046d78b9c..2f328d381 100644 --- a/backtrace-library/src/main/java/backtraceio/library/anr/BacktraceAppExitInfoSenderHandler.java +++ b/backtrace-library/src/main/java/backtraceio/library/anr/BacktraceAppExitInfoSenderHandler.java @@ -4,14 +4,7 @@ import android.content.Context; import android.os.Build; - import androidx.annotation.RequiresApi; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import backtraceio.library.BacktraceClient; import backtraceio.library.common.ApplicationMetadataCache; import backtraceio.library.logger.BacktraceLogger; @@ -19,13 +12,17 @@ import backtraceio.library.models.json.BacktraceReport; import backtraceio.library.models.types.BacktraceResultStatus; import backtraceio.library.watchdog.OnApplicationNotRespondingEvent; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class BacktraceAppExitInfoSenderHandler extends Thread implements BacktraceANRHandler { - private final static String THREAD_NAME = "main-anr-appexit"; - private final static String LOG_TAG = BacktraceAppExitInfoSenderHandler.class.getSimpleName(); - private final static String ANR_COMPLEX_ATTR_KEY = "ANR annotations"; - private final static String ANR_STACKTRACE_PARSED_ATTR_KEY = "ANR parsed stacktrace"; - private final static String ANR_STACKTRACE_ATTR_KEY = "ANR stacktrace"; + private static final String THREAD_NAME = "main-anr-appexit"; + private static final String LOG_TAG = BacktraceAppExitInfoSenderHandler.class.getSimpleName(); + private static final String ANR_COMPLEX_ATTR_KEY = "ANR annotations"; + private static final String ANR_STACKTRACE_PARSED_ATTR_KEY = "ANR parsed stacktrace"; + private static final String ANR_STACKTRACE_ATTR_KEY = "ANR stacktrace"; private final BacktraceClient backtraceClient; private final String packageName; @@ -35,14 +32,18 @@ public class BacktraceAppExitInfoSenderHandler extends Thread implements Backtra private final AnrExitInfoState anrAppExitInfoState; public BacktraceAppExitInfoSenderHandler(BacktraceClient client, Context context) { - this(client, + this( + client, ApplicationMetadataCache.getInstance(context).getPackageName(), new AnrExitInfoState(context), - new ActivityManagerExitInfoProvider(context) - ); + new ActivityManagerExitInfoProvider(context)); } - protected BacktraceAppExitInfoSenderHandler(BacktraceClient client, String packageName, AnrExitInfoState anrAppExitInfoState, ProcessExitInfoProvider activityManager) { + protected BacktraceAppExitInfoSenderHandler( + BacktraceClient client, + String packageName, + AnrExitInfoState anrAppExitInfoState, + ProcessExitInfoProvider activityManager) { super(THREAD_NAME); this.backtraceClient = client; this.packageName = packageName; @@ -59,11 +60,15 @@ public void run() { private void send() { if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.R) { - BacktraceLogger.d(LOG_TAG, "Unsupported Android version " + android.os.Build.VERSION.SDK_INT + " to send ANR based on applicationExitInfoList"); + BacktraceLogger.d( + LOG_TAG, + "Unsupported Android version " + android.os.Build.VERSION.SDK_INT + + " to send ANR based on applicationExitInfoList"); return; } - final List applicationExitInfoList = this.activityManager.getHistoricalExitInfo(this.packageName, 0, 0); + final List applicationExitInfoList = + this.activityManager.getHistoricalExitInfo(this.packageName, 0, 0); Collections.reverse(applicationExitInfoList); for (ExitInfo appExitInfo : applicationExitInfoList) { @@ -99,7 +104,8 @@ private void sendApplicationExitInfoReport(ExitInfo appExitInfo) { } @RequiresApi(api = Build.VERSION_CODES.R) - private BacktraceReport generateBacktraceReport(ExitInfo appExitInfo) {; + private BacktraceReport generateBacktraceReport(ExitInfo appExitInfo) { + ; final Map anrAttributes = getANRAttributes(appExitInfo); final String stackTrace = AppExitInfoDetailsExtractor.getStackTraceInfo(appExitInfo); @@ -109,14 +115,17 @@ private void sendApplicationExitInfoReport(ExitInfo appExitInfo) { } final Map parsedStackTraceAttributes = this.getAttributesFromStacktrace(stackTrace); - final StackTraceElement[] anrStackTrace = ExitInfoStackTraceParser.parseMainThreadStackTrace(parsedStackTraceAttributes); - - final HashMap attributes = new HashMap(){{ - put(BacktraceAttributeConsts.ErrorType, BacktraceAttributeConsts.AnrAttributeType); - put(ANR_COMPLEX_ATTR_KEY, anrAttributes); - put(ANR_STACKTRACE_ATTR_KEY, stackTrace); - put(ANR_STACKTRACE_PARSED_ATTR_KEY, parsedStackTraceAttributes); - }}; + final StackTraceElement[] anrStackTrace = + ExitInfoStackTraceParser.parseMainThreadStackTrace(parsedStackTraceAttributes); + + final HashMap attributes = new HashMap() { + { + put(BacktraceAttributeConsts.ErrorType, BacktraceAttributeConsts.AnrAttributeType); + put(ANR_COMPLEX_ATTR_KEY, anrAttributes); + put(ANR_STACKTRACE_ATTR_KEY, stackTrace); + put(ANR_STACKTRACE_PARSED_ATTR_KEY, parsedStackTraceAttributes); + } + }; return new BacktraceReport(new BacktraceANRExitInfoException(appExitInfo, anrStackTrace), attributes); } @@ -154,9 +163,7 @@ private boolean shouldUpdateLastTimestamp(ExitInfo appExitInfo) { } @Override - public void setOnApplicationNotRespondingEvent( - OnApplicationNotRespondingEvent onApplicationNotRespondingEvent) { - } + public void setOnApplicationNotRespondingEvent(OnApplicationNotRespondingEvent onApplicationNotRespondingEvent) {} @Override public void stopMonitoringAnr() { diff --git a/backtrace-library/src/main/java/backtraceio/library/anr/ExitInfoAdapter.java b/backtrace-library/src/main/java/backtraceio/library/anr/ExitInfoAdapter.java index 61c78a9aa..2f8331e5f 100644 --- a/backtrace-library/src/main/java/backtraceio/library/anr/ExitInfoAdapter.java +++ b/backtrace-library/src/main/java/backtraceio/library/anr/ExitInfoAdapter.java @@ -2,9 +2,7 @@ import android.app.ApplicationExitInfo; import android.os.Build; - import androidx.annotation.RequiresApi; - import java.io.IOException; import java.io.InputStream; diff --git a/backtrace-library/src/main/java/backtraceio/library/anr/ExitInfoStackTraceParser.java b/backtrace-library/src/main/java/backtraceio/library/anr/ExitInfoStackTraceParser.java index 8002658d6..41340b104 100644 --- a/backtrace-library/src/main/java/backtraceio/library/anr/ExitInfoStackTraceParser.java +++ b/backtrace-library/src/main/java/backtraceio/library/anr/ExitInfoStackTraceParser.java @@ -2,7 +2,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -14,6 +13,7 @@ public class ExitInfoStackTraceParser { private static final Pattern JAVA_FRAME_PATTERN = Pattern.compile("\\s*at (.*?)\\((.*?):(\\d+)\\)"); private static final String MAIN_THREAD_NAME = "main"; private static final int NATIVE_STACK_ELEMENTS_NUMBER = 6; + static StackTraceElement parseFrame(String frame) { StackTraceElement javaFrame = parseJavaFrame(frame); if (javaFrame != null) { @@ -87,7 +87,7 @@ public static Map parseANRStackTrace(String stackTrace) { return parsedData; } - // Parse timestamp + // Parse timestamp parsedData.put("timestamp", parseTimestamp(stackTrace)); // Parse PID @@ -162,6 +162,7 @@ private static Map getMainThreadInfo(List> t } return mainThreadInfo; } + private static Map parseThreadInformation(String threadDump) { Map result = new HashMap<>(); diff --git a/backtrace-library/src/main/java/backtraceio/library/base/BacktraceBase.java b/backtrace-library/src/main/java/backtraceio/library/base/BacktraceBase.java index a7d454e02..3795a092b 100644 --- a/backtrace-library/src/main/java/backtraceio/library/base/BacktraceBase.java +++ b/backtrace-library/src/main/java/backtraceio/library/base/BacktraceBase.java @@ -1,11 +1,6 @@ package backtraceio.library.base; import android.content.Context; - -import java.util.EnumSet; -import java.util.List; -import java.util.Map; - import backtraceio.library.BacktraceCredentials; import backtraceio.library.BacktraceDatabase; import backtraceio.library.common.CollectionUtils; @@ -30,6 +25,9 @@ import backtraceio.library.services.BacktraceApi; import backtraceio.library.services.BacktraceMetrics; import backtraceio.library.services.ReportExceptionTransformer; +import java.util.EnumSet; +import java.util.List; +import java.util.Map; /** * Base Backtrace Android client @@ -59,6 +57,7 @@ public class BacktraceBase implements Client { * File attachments to attach to crashes and reports. */ public final List attachments; + private final BacktraceCredentials credentials; private final ReportExceptionTransformer reportExceptionTransformer = new ReportExceptionTransformer(); /** @@ -124,7 +123,11 @@ public BacktraceBase(Context context, BacktraceCredentials credentials, Map attributes, List attachments) { + public BacktraceBase( + Context context, + BacktraceCredentials credentials, + Map attributes, + List attachments) { this(context, credentials, (Database) null, attributes, attachments); } @@ -135,7 +138,8 @@ public BacktraceBase(Context context, BacktraceCredentials credentials, Map attachments) { + public BacktraceBase( + Context context, + BacktraceCredentials credentials, + BacktraceDatabaseSettings databaseSettings, + List attachments) { this(context, credentials, new BacktraceDatabase(context, databaseSettings), attachments); } @@ -160,7 +168,11 @@ public BacktraceBase(Context context, BacktraceCredentials credentials, Backtrac * @param databaseSettings Backtrace database settings * @param attributes additional information about current application */ - public BacktraceBase(Context context, BacktraceCredentials credentials, BacktraceDatabaseSettings databaseSettings, Map attributes) { + public BacktraceBase( + Context context, + BacktraceCredentials credentials, + BacktraceDatabaseSettings databaseSettings, + Map attributes) { this(context, credentials, new BacktraceDatabase(context, databaseSettings), attributes); } @@ -174,7 +186,12 @@ public BacktraceBase(Context context, BacktraceCredentials credentials, Backtrac * @param attachments File attachment paths to consider for reports * @note Attachments for native crashes must be specified here, and cannot be changed during runtime */ - public BacktraceBase(Context context, BacktraceCredentials credentials, BacktraceDatabaseSettings databaseSettings, Map attributes, List attachments) { + public BacktraceBase( + Context context, + BacktraceCredentials credentials, + BacktraceDatabaseSettings databaseSettings, + Map attributes, + List attachments) { this(context, credentials, new BacktraceDatabase(context, databaseSettings), attributes, attachments); } @@ -198,7 +215,8 @@ public BacktraceBase(Context context, BacktraceCredentials credentials, Database * @param attachments File attachment paths to consider for reports * @note Attachments for native crashes must be specified here, and cannot be changed during runtime */ - public BacktraceBase(Context context, BacktraceCredentials credentials, Database database, List attachments) { + public BacktraceBase( + Context context, BacktraceCredentials credentials, Database database, List attachments) { this(context, credentials, database, null, attachments); } @@ -210,7 +228,8 @@ public BacktraceBase(Context context, BacktraceCredentials credentials, Database * @param database Backtrace database * @param attributes additional information about current application */ - public BacktraceBase(Context context, BacktraceCredentials credentials, Database database, Map attributes) { + public BacktraceBase( + Context context, BacktraceCredentials credentials, Database database, Map attributes) { this(context, credentials, database, attributes, null); } @@ -224,7 +243,12 @@ public BacktraceBase(Context context, BacktraceCredentials credentials, Database * @param attachments File attachment paths to consider for reports * @note Attachments for native crashes must be specified here, and cannot be changed during runtime */ - public BacktraceBase(Context context, BacktraceCredentials credentials, Database database, Map attributes, List attachments) { + public BacktraceBase( + Context context, + BacktraceCredentials credentials, + Database database, + Map attributes, + List attachments) { this.context = context; this.credentials = credentials; this.attributes = CollectionUtils.copyMap(attributes); @@ -374,8 +398,7 @@ public boolean enableBreadcrumbs(Context context) { * @note breadcrumbTypesToEnable only affects automatic breadcrumb receivers. User created * breadcrumbs will always be enabled */ - public boolean enableBreadcrumbs(Context context, - int maxBreadcrumbLogSizeBytes) { + public boolean enableBreadcrumbs(Context context, int maxBreadcrumbLogSizeBytes) { if (!isBreadcrumbsAvailable()) { return false; } @@ -391,8 +414,7 @@ public boolean enableBreadcrumbs(Context context, * @note breadcrumbTypesToEnable only affects automatic breadcrumb receivers. User created * breadcrumbs will always be enabled */ - public boolean enableBreadcrumbs(Context context, - EnumSet breadcrumbTypesToEnable) { + public boolean enableBreadcrumbs(Context context, EnumSet breadcrumbTypesToEnable) { if (!isBreadcrumbsAvailable()) { return false; } @@ -409,9 +431,8 @@ public boolean enableBreadcrumbs(Context context, * @note breadcrumbTypesToEnable only affects automatic breadcrumb receivers. User created * breadcrumbs will always be enabled */ - public boolean enableBreadcrumbs(Context context, - EnumSet breadcrumbTypesToEnable, - int maxBreadcrumbLogSizeBytes) { + public boolean enableBreadcrumbs( + Context context, EnumSet breadcrumbTypesToEnable, int maxBreadcrumbLogSizeBytes) { if (!isBreadcrumbsAvailable()) { return false; } @@ -537,7 +558,11 @@ public boolean addBreadcrumb(String message, Map attributes, Bac * @param level the severity level of this breadcrumb * @return true if the breadcrumb was successfully added */ - public boolean addBreadcrumb(String message, Map attributes, BacktraceBreadcrumbType type, BacktraceBreadcrumbLevel level) { + public boolean addBreadcrumb( + String message, + Map attributes, + BacktraceBreadcrumbType type, + BacktraceBreadcrumbLevel level) { if (!isBreadcrumbsAvailable()) { return false; } @@ -593,7 +618,8 @@ public void send(BacktraceReport sourceReport, final OnServerResponseEventListen } } - private OnServerResponseEventListener getDatabaseCallback(final BacktraceDatabaseRecord record, final OnServerResponseEventListener customCallback) { + private OnServerResponseEventListener getDatabaseCallback( + final BacktraceDatabaseRecord record, final OnServerResponseEventListener customCallback) { return new OnServerResponseEventListener() { @Override public void onEvent(BacktraceResult backtraceResult) { @@ -622,7 +648,6 @@ private boolean isBreadcrumbsAvailable() { return database != null && database.getBreadcrumbs() != null; } - /** * Determine if Reports should be generated for inner exceptions. By default the value is set to false. * diff --git a/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceActivityLifecycleListener.java b/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceActivityLifecycleListener.java index 070e4c7a4..4a06609aa 100644 --- a/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceActivityLifecycleListener.java +++ b/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceActivityLifecycleListener.java @@ -3,7 +3,6 @@ import android.app.Activity; import android.app.Application; import android.os.Bundle; - import backtraceio.library.enums.BacktraceBreadcrumbType; public class BacktraceActivityLifecycleListener implements Application.ActivityLifecycleCallbacks { diff --git a/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceBreadcrumbs.java b/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceBreadcrumbs.java index 31a9f5ad9..ab049a173 100644 --- a/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceBreadcrumbs.java +++ b/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceBreadcrumbs.java @@ -5,11 +5,6 @@ import android.app.Application; import android.content.Context; import android.os.Build; - -import java.util.EnumSet; -import java.util.HashMap; -import java.util.Map; - import backtraceio.library.common.serialization.DebugHelper; import backtraceio.library.enums.BacktraceBreadcrumbLevel; import backtraceio.library.enums.BacktraceBreadcrumbType; @@ -17,6 +12,9 @@ import backtraceio.library.interfaces.Breadcrumbs; import backtraceio.library.logger.BacktraceLogger; import backtraceio.library.models.json.BacktraceReport; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; public class BacktraceBreadcrumbs implements Breadcrumbs { @@ -58,7 +56,7 @@ public class BacktraceBreadcrumbs implements Breadcrumbs { String breadcrumbLogDirectory; - final private static String breadcrumbLogFileName = "bt-breadcrumbs-0"; + private static final String breadcrumbLogFileName = "bt-breadcrumbs-0"; public BacktraceBreadcrumbs(String breadcrumbLogDirectory) { this.breadcrumbLogDirectory = breadcrumbLogDirectory; @@ -122,11 +120,10 @@ private void registerBroadcastReceiver() { backtraceBroadcastReceiver = new BacktraceBroadcastReceiver(this); if (Build.VERSION.SDK_INT >= 33) { - context.registerReceiver(backtraceBroadcastReceiver, - backtraceBroadcastReceiver.getIntentFilter(), RECEIVER_EXPORTED); + context.registerReceiver( + backtraceBroadcastReceiver, backtraceBroadcastReceiver.getIntentFilter(), RECEIVER_EXPORTED); } else { - context.registerReceiver(backtraceBroadcastReceiver, - backtraceBroadcastReceiver.getIntentFilter()); + context.registerReceiver(backtraceBroadcastReceiver, backtraceBroadcastReceiver.getIntentFilter()); } } @@ -146,7 +143,8 @@ public boolean enableBreadcrumbs(Context context, int maxBreadcrumbLogSizeBytes) } @Override - public boolean enableBreadcrumbs(Context context, EnumSet breadcrumbTypesToEnable, int maxBreadcrumbLogSizeBytes) { + public boolean enableBreadcrumbs( + Context context, EnumSet breadcrumbTypesToEnable, int maxBreadcrumbLogSizeBytes) { this.context = context; final long startEnablingReportsTime = DebugHelper.getCurrentTimeMillis(); @@ -155,17 +153,19 @@ public boolean enableBreadcrumbs(Context context, EnumSet breadcrumbTypesToEnable, int maxBreadcrumbLogSizeBytes) { + private boolean enableBreadcrumbs( + EnumSet breadcrumbTypesToEnable, int maxBreadcrumbLogSizeBytes) { if (backtraceBreadcrumbsLogManager == null) { try { backtraceBreadcrumbsLogManager = new BacktraceBreadcrumbsLogManager( - breadcrumbLogDirectory + "/" + breadcrumbLogFileName, - maxBreadcrumbLogSizeBytes); + breadcrumbLogDirectory + "/" + breadcrumbLogFileName, maxBreadcrumbLogSizeBytes); } catch (Exception ex) { BacktraceLogger.e(LOG_TAG, "Could not start the Breadcrumb logger due to: " + ex.getMessage()); return false; @@ -312,7 +312,11 @@ public boolean addBreadcrumb(String message, Map attributes, Bac * @return true if the breadcrumb was successfully added */ @Override - public boolean addBreadcrumb(String message, Map attributes, BacktraceBreadcrumbType type, BacktraceBreadcrumbLevel level) { + public boolean addBreadcrumb( + String message, + Map attributes, + BacktraceBreadcrumbType type, + BacktraceBreadcrumbLevel level) { if (!this.isEnabled() || backtraceBreadcrumbsLogManager == null) { return false; } @@ -359,13 +363,15 @@ private boolean addConfigurationBreadcrumb() { attributes.put(enabledType.toString(), "enabled"); } - String state = (enabledBreadcrumbTypes != null && - enabledBreadcrumbTypes.contains(enabledType)) ? "enabled" : "disabled"; + String state = (enabledBreadcrumbTypes != null && enabledBreadcrumbTypes.contains(enabledType)) + ? "enabled" + : "disabled"; attributes.put(enabledType.toString(), state); } - return backtraceBreadcrumbsLogManager.addBreadcrumb("Breadcrumbs configuration", + return backtraceBreadcrumbsLogManager.addBreadcrumb( + "Breadcrumbs configuration", attributes, BacktraceBreadcrumbType.CONFIGURATION, BacktraceBreadcrumbLevel.INFO); diff --git a/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceBreadcrumbsLogManager.java b/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceBreadcrumbsLogManager.java index ab2ca4a9a..431e9eebc 100644 --- a/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceBreadcrumbsLogManager.java +++ b/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceBreadcrumbsLogManager.java @@ -1,13 +1,11 @@ package backtraceio.library.breadcrumbs; -import org.json.JSONObject; - -import java.io.IOException; -import java.util.Map; - import backtraceio.library.enums.BacktraceBreadcrumbLevel; import backtraceio.library.enums.BacktraceBreadcrumbType; import backtraceio.library.logger.BacktraceLogger; +import java.io.IOException; +import java.util.Map; +import org.json.JSONObject; public class BacktraceBreadcrumbsLogManager { @@ -27,11 +25,16 @@ public class BacktraceBreadcrumbsLogManager { */ private final int maxAttributeSizeBytes = 1024; - public BacktraceBreadcrumbsLogManager(String breadcrumbLogPath, int maxQueueFileSizeBytes) throws IOException, NoSuchMethodException { + public BacktraceBreadcrumbsLogManager(String breadcrumbLogPath, int maxQueueFileSizeBytes) + throws IOException, NoSuchMethodException { this.backtraceQueueFileHelper = new BacktraceQueueFileHelper(breadcrumbLogPath, maxQueueFileSizeBytes); } - public boolean addBreadcrumb(String message, Map attributes, BacktraceBreadcrumbType type, BacktraceBreadcrumbLevel level) { + public boolean addBreadcrumb( + String message, + Map attributes, + BacktraceBreadcrumbType type, + BacktraceBreadcrumbLevel level) { // We use currentTimeMillis in the BacktraceReport too, so for consistency // we will use it here. long time = System.currentTimeMillis(); @@ -50,7 +53,8 @@ public boolean addBreadcrumb(String message, Map attributes, Bac JSONObject attributesJson = new JSONObject(); int currentAttributeSize = 0; for (Map.Entry entry : attributes.entrySet()) { - currentAttributeSize += entry.getKey().length() + entry.getValue().toString().length(); + currentAttributeSize += entry.getKey().length() + + entry.getValue().toString().length(); if (currentAttributeSize < maxAttributeSizeBytes) { attributesJson.put(entry.getKey(), entry.getValue()); } @@ -69,7 +73,8 @@ public boolean addBreadcrumb(String message, Map attributes, Bac breadcrumbSerializedString.append(breadcrumb.toString().replace("\\n", "")); breadcrumbSerializedString.append("\n"); - return backtraceQueueFileHelper.add(breadcrumbSerializedString.toString().getBytes()); + return backtraceQueueFileHelper.add( + breadcrumbSerializedString.toString().getBytes()); } public boolean clear() { diff --git a/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceBroadcastReceiver.java b/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceBroadcastReceiver.java index 5b4ae987e..329134fa6 100644 --- a/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceBroadcastReceiver.java +++ b/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceBroadcastReceiver.java @@ -5,16 +5,13 @@ import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; - -import org.jetbrains.annotations.NotNull; - +import backtraceio.library.enums.BacktraceBreadcrumbType; +import backtraceio.library.logger.BacktraceLogger; import java.util.EnumSet; import java.util.HashMap; import java.util.Map; import java.util.Set; - -import backtraceio.library.enums.BacktraceBreadcrumbType; -import backtraceio.library.logger.BacktraceLogger; +import org.jetbrains.annotations.NotNull; public class BacktraceBroadcastReceiver extends BroadcastReceiver { diff --git a/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceComponentListener.java b/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceComponentListener.java index 0f1d0a263..842e36fba 100644 --- a/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceComponentListener.java +++ b/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceComponentListener.java @@ -2,12 +2,10 @@ import android.content.ComponentCallbacks2; import android.content.res.Configuration; - -import java.util.HashMap; -import java.util.Map; - import backtraceio.library.enums.BacktraceBreadcrumbLevel; import backtraceio.library.enums.BacktraceBreadcrumbType; +import java.util.HashMap; +import java.util.Map; public class BacktraceComponentListener implements ComponentCallbacks2 { @@ -57,9 +55,7 @@ private BacktraceBreadcrumbLevel getMemoryWarningLevel(final int level) { public void onTrimMemory(int level) { String messageString = getMemoryWarningString(level); BacktraceBreadcrumbLevel breadcrumbLevel = getMemoryWarningLevel(level); - backtraceBreadcrumbs.addBreadcrumb(messageString, - BacktraceBreadcrumbType.SYSTEM, - breadcrumbLevel); + backtraceBreadcrumbs.addBreadcrumb(messageString, BacktraceBreadcrumbType.SYSTEM, breadcrumbLevel); } private String stringifyOrientation(final int orientation) { @@ -78,16 +74,13 @@ public void onConfigurationChanged(Configuration newConfig) { Map attributes = new HashMap(); String orientation = stringifyOrientation(newConfig.orientation); attributes.put("orientation", orientation); - backtraceBreadcrumbs.addBreadcrumb("Configuration changed", - attributes, - BacktraceBreadcrumbType.SYSTEM, - BacktraceBreadcrumbLevel.INFO); + backtraceBreadcrumbs.addBreadcrumb( + "Configuration changed", attributes, BacktraceBreadcrumbType.SYSTEM, BacktraceBreadcrumbLevel.INFO); } @Override public void onLowMemory() { - backtraceBreadcrumbs.addBreadcrumb("Critical low memory warning!", - BacktraceBreadcrumbType.SYSTEM, - BacktraceBreadcrumbLevel.FATAL); + backtraceBreadcrumbs.addBreadcrumb( + "Critical low memory warning!", BacktraceBreadcrumbType.SYSTEM, BacktraceBreadcrumbLevel.FATAL); } } diff --git a/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceQueueFileHelper.java b/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceQueueFileHelper.java index cadef1df8..57ad0be8d 100644 --- a/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceQueueFileHelper.java +++ b/backtrace-library/src/main/java/backtraceio/library/breadcrumbs/BacktraceQueueFileHelper.java @@ -1,14 +1,12 @@ package backtraceio.library.breadcrumbs; +import backtraceio.library.logger.BacktraceLogger; import com.squareup.tape.QueueFile; - import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; -import backtraceio.library.logger.BacktraceLogger; - public class BacktraceQueueFileHelper { /** * The base directory of the breadcrumb logs @@ -31,7 +29,8 @@ public class BacktraceQueueFileHelper { // Let our exceptions bubble all the way up to BacktraceBreadcrumbsLogManager constructor // We definitely cannot construct BacktraceBreadcrumbsLogManager without an open file log - public BacktraceQueueFileHelper(String breadcrumbLogDirectory, int maxQueueFileSizeBytes) throws IOException, NoSuchMethodException { + public BacktraceQueueFileHelper(String breadcrumbLogDirectory, int maxQueueFileSizeBytes) + throws IOException, NoSuchMethodException { this.breadcrumbLogDirectory = breadcrumbLogDirectory; breadcrumbStore = new QueueFile(new File(this.breadcrumbLogDirectory)); @@ -60,19 +59,22 @@ public boolean add(byte[] bytes) { // We clear the space we need from the QueueFile first to prevent // the QueueFile from expanding to accommodate the new breadcrumb // Note! - // In the 1.2.3 version we use, the usedBytes is int, not long, and the + // In the 1.2.3 version we use, the usedBytes is int, not long, and the // implementation is synchronized thus safe for multithreaded access. - // see https://github.com/square/tape/blob/tape-parent-1.2.3/tape/src/main/java/com/squareup/tape/QueueFile.java + // see + // https://github.com/square/tape/blob/tape-parent-1.2.3/tape/src/main/java/com/squareup/tape/QueueFile.java for (int usedBytes = (int) this.usedBytes.invoke(breadcrumbStore); - !breadcrumbStore.isEmpty() && (usedBytes + breadcrumbLength) > maxQueueFileSizeBytes; - usedBytes = (int) this.usedBytes.invoke(breadcrumbStore)) { + !breadcrumbStore.isEmpty() && (usedBytes + breadcrumbLength) > maxQueueFileSizeBytes; + usedBytes = (int) this.usedBytes.invoke(breadcrumbStore)) { breadcrumbStore.remove(); } breadcrumbStore.add(bytes); } catch (Exception ex) { - BacktraceLogger.w(LOG_TAG, "Exception: " + ex.getMessage() + - "\nWhen adding breadcrumb: " + new String(bytes, StandardCharsets.UTF_8)); + BacktraceLogger.w( + LOG_TAG, + "Exception: " + ex.getMessage() + "\nWhen adding breadcrumb: " + + new String(bytes, StandardCharsets.UTF_8)); return false; } @@ -83,8 +85,7 @@ public boolean clear() { try { breadcrumbStore.clear(); } catch (Exception ex) { - BacktraceLogger.w(LOG_TAG, "Exception: " + ex.getMessage() + - "\nWhen clearing breadcrumbs"); + BacktraceLogger.w(LOG_TAG, "Exception: " + ex.getMessage() + "\nWhen clearing breadcrumbs"); return false; } return true; diff --git a/backtrace-library/src/main/java/backtraceio/library/common/ApplicationMetadataCache.java b/backtrace-library/src/main/java/backtraceio/library/common/ApplicationMetadataCache.java index 346371803..f3d3a8687 100644 --- a/backtrace-library/src/main/java/backtraceio/library/common/ApplicationMetadataCache.java +++ b/backtrace-library/src/main/java/backtraceio/library/common/ApplicationMetadataCache.java @@ -3,7 +3,6 @@ import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; - import backtraceio.library.logger.BacktraceLogger; public class ApplicationMetadataCache { @@ -61,7 +60,9 @@ public String getApplicationName() { return applicationName; } - applicationName = context.getApplicationInfo().loadLabel(context.getPackageManager()).toString(); + applicationName = context.getApplicationInfo() + .loadLabel(context.getPackageManager()) + .toString(); return applicationName; } @@ -75,9 +76,10 @@ public String getApplicationVersion() { return applicationVersion; } try { - PackageInfo info = context.getPackageManager() - .getPackageInfo(context.getPackageName(), 0); - applicationVersion = BacktraceStringHelper.isNullOrEmpty(info.versionName) ? String.valueOf(info.versionCode) : info.versionName; + PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); + applicationVersion = BacktraceStringHelper.isNullOrEmpty(info.versionName) + ? String.valueOf(info.versionCode) + : info.versionName; return applicationVersion; } catch (PackageManager.NameNotFoundException e) { diff --git a/backtrace-library/src/main/java/backtraceio/library/common/BacktraceSerializeHelper.java b/backtrace-library/src/main/java/backtraceio/library/common/BacktraceSerializeHelper.java index ad3a9ee40..bba196d02 100644 --- a/backtrace-library/src/main/java/backtraceio/library/common/BacktraceSerializeHelper.java +++ b/backtrace-library/src/main/java/backtraceio/library/common/BacktraceSerializeHelper.java @@ -1,8 +1,7 @@ package backtraceio.library.common; -import com.google.gson.Gson; - import backtraceio.library.common.serialization.BacktraceGsonBuilder; +import com.google.gson.Gson; /** * Helper class for serialize and deserialize objects @@ -30,5 +29,4 @@ public static String toJson(Gson gson, Object object) { public static T fromJson(Gson gson, String json, Class type) { return gson.fromJson(json, type); } - -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/common/DeviceAttributesHelper.java b/backtrace-library/src/main/java/backtraceio/library/common/DeviceAttributesHelper.java index 8309d1f65..b8031f5c1 100644 --- a/backtrace-library/src/main/java/backtraceio/library/common/DeviceAttributesHelper.java +++ b/backtrace-library/src/main/java/backtraceio/library/common/DeviceAttributesHelper.java @@ -17,18 +17,16 @@ import android.os.PowerManager; import android.provider.Settings; import android.text.TextUtils; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.util.HashMap; -import java.util.UUID; - import backtraceio.library.enums.BatteryState; import backtraceio.library.enums.BluetoothStatus; import backtraceio.library.enums.GpsStatus; import backtraceio.library.enums.LocationStatus; import backtraceio.library.enums.NfcStatus; import backtraceio.library.enums.WifiStatus; +import java.io.BufferedReader; +import java.io.FileReader; +import java.util.HashMap; +import java.util.UUID; /** * Helper class for extract a device attributes @@ -69,9 +67,9 @@ public HashMap getDeviceAttributes(Boolean includeDynamicAttribu result.put("app.storage_used", getAppUsedStorageSize()); result.put("battery.level", String.valueOf(getBatteryLevel())); result.put("battery.state", getBatteryState().toString()); - result.put("cpu.boottime", String.valueOf(java.lang.System.currentTimeMillis() - android.os.SystemClock - .elapsedRealtime())); - + result.put( + "cpu.boottime", + String.valueOf(java.lang.System.currentTimeMillis() - android.os.SystemClock.elapsedRealtime())); ActivityManager.MemoryInfo memoryInfo = getMemoryInformation(); result.put("system.memory.total", Long.toString(memoryInfo.totalMem)); @@ -86,8 +84,7 @@ public HashMap getDeviceAttributes(Boolean includeDynamicAttribu * @return true if enabled. */ private boolean isAirplaneModeOn() { - return Settings.Global.getInt(context.getContentResolver(), - Settings.Global.AIRPLANE_MODE_ON, 0) != 0; + return Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; } /** @@ -96,9 +93,8 @@ private boolean isAirplaneModeOn() { * @return location status (enabled/disabled) */ private LocationStatus getLocationServiceStatus() { - int mode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure - .LOCATION_MODE, - Settings.Secure.LOCATION_MODE_OFF); + int mode = Settings.Secure.getInt( + context.getContentResolver(), Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF); if (mode != android.provider.Settings.Secure.LOCATION_MODE_OFF) { return LocationStatus.ENABLED; } @@ -133,7 +129,8 @@ private BluetoothStatus isBluetoothEnabled() { if (!PermissionHelper.isPermissionForBluetoothGranted(this.context)) { return BluetoothStatus.NOT_PERMITTED; } - BluetoothManager mBluetoothManager = (BluetoothManager) this.context.getSystemService(Context.BLUETOOTH_SERVICE); + BluetoothManager mBluetoothManager = + (BluetoothManager) this.context.getSystemService(Context.BLUETOOTH_SERVICE); if (mBluetoothManager != null) { BluetoothAdapter mBluetoothAdapter = mBluetoothManager.getAdapter(); if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) { @@ -171,10 +168,8 @@ private float getCpuTemperature() { * @return GPS status (enabled/disabled) */ private GpsStatus getGpsStatus() { - LocationManager manager = (LocationManager) this.context.getSystemService(Context - .LOCATION_SERVICE); - return manager.isProviderEnabled(LocationManager.GPS_PROVIDER) ? GpsStatus.ENABLED : - GpsStatus.DISABLED; + LocationManager manager = (LocationManager) this.context.getSystemService(Context.LOCATION_SERVICE); + return manager.isProviderEnabled(LocationManager.GPS_PROVIDER) ? GpsStatus.ENABLED : GpsStatus.DISABLED; } /** @@ -188,8 +183,7 @@ private WifiStatus getWifiStatus() { return WifiStatus.NOT_PERMITTED; } - WifiManager mng = (WifiManager) context.getApplicationContext().getSystemService(Context - .WIFI_SERVICE); + WifiManager mng = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); if (mng.isWifiEnabled()) { return WifiStatus.ENABLED; } @@ -205,8 +199,7 @@ private boolean isPowerSavingMode() { if (Build.VERSION.SDK_INT < 21) { return false; } - PowerManager powerManager = (PowerManager) this.context.getSystemService(Context - .POWER_SERVICE); + PowerManager powerManager = (PowerManager) this.context.getSystemService(Context.POWER_SERVICE); return powerManager.isPowerSaveMode(); } @@ -265,10 +258,9 @@ private String generateDeviceId() { return uuid; } - String androidId = Settings.Secure.getString(this.context.getContentResolver(), - Settings.Secure.ANDROID_ID); + String androidId = Settings.Secure.getString(this.context.getContentResolver(), Settings.Secure.ANDROID_ID); - // if the android id is not defined we want to cache at least guid + // if the android id is not defined we want to cache at least guid // for the current session uuid = TextUtils.isEmpty(androidId) ? UUID.randomUUID().toString() @@ -279,8 +271,7 @@ private String generateDeviceId() { private ActivityManager.MemoryInfo getMemoryInformation() { ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo(); - ActivityManager activityManager = (ActivityManager) this.context.getSystemService - (ACTIVITY_SERVICE); + ActivityManager activityManager = (ActivityManager) this.context.getSystemService(ACTIVITY_SERVICE); activityManager.getMemoryInfo(memInfo); return memInfo; } diff --git a/backtrace-library/src/main/java/backtraceio/library/common/FileHelper.java b/backtrace-library/src/main/java/backtraceio/library/common/FileHelper.java index 07462424c..3f838a272 100644 --- a/backtrace-library/src/main/java/backtraceio/library/common/FileHelper.java +++ b/backtrace-library/src/main/java/backtraceio/library/common/FileHelper.java @@ -2,16 +2,13 @@ import android.content.Context; import android.util.Log; - +import backtraceio.library.logger.BacktraceLogger; import java.io.File; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Scanner; -import backtraceio.library.logger.BacktraceLogger; - - /** * Helper class for access to files */ @@ -67,9 +64,13 @@ public static ArrayList filterOutFiles(Context context, List pat */ public static String getFileExtension(File file) { - String name = file.getName().substring(Math.max(file.getName().lastIndexOf('/'), - file.getName().lastIndexOf('\\')) < 0 ? 0 : Math.max(file.getName().lastIndexOf('/'), - file.getName().lastIndexOf('\\'))); + String name = file.getName() + .substring( + Math.max(file.getName().lastIndexOf('/'), file.getName().lastIndexOf('\\')) < 0 + ? 0 + : Math.max( + file.getName().lastIndexOf('/'), + file.getName().lastIndexOf('\\'))); int lastIndexOf = name.lastIndexOf("."); if (lastIndexOf == -1) { return ""; // empty extension @@ -109,7 +110,8 @@ private static boolean isPathToInternalStorage(Context context, String path) { String dataDir = context.getApplicationInfo().dataDir; String cacheDir = context.getCacheDir().getAbsolutePath(); String filesDir = context.getFilesDir().getPath(); - BacktraceLogger.d(LOG_TAG, String.format("Passed path %s, Internal paths %s, %s, %s", path, dataDir, cacheDir, filesDir)); + BacktraceLogger.d( + LOG_TAG, String.format("Passed path %s, Internal paths %s, %s, %s", path, dataDir, cacheDir, filesDir)); return path.startsWith(dataDir) || path.startsWith(cacheDir) || path.startsWith(filesDir); } diff --git a/backtrace-library/src/main/java/backtraceio/library/common/MultiFormRequestHelper.java b/backtrace-library/src/main/java/backtraceio/library/common/MultiFormRequestHelper.java index 9cfba625a..5993c8812 100644 --- a/backtrace-library/src/main/java/backtraceio/library/common/MultiFormRequestHelper.java +++ b/backtrace-library/src/main/java/backtraceio/library/common/MultiFormRequestHelper.java @@ -1,13 +1,12 @@ package backtraceio.library.common; +import backtraceio.library.logger.BacktraceLogger; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.URLConnection; import java.util.List; -import backtraceio.library.logger.BacktraceLogger; - /*** * Helper class for building multipart/form-data request */ @@ -40,8 +39,11 @@ public static void addEndOfRequest(OutputStream outputStream) throws IOException return; } - outputStream.write((MultiFormRequestHelper.TWO_HYPHENS + MultiFormRequestHelper.BOUNDARY + - MultiFormRequestHelper.TWO_HYPHENS + MultiFormRequestHelper.CRLF).getBytes()); + outputStream.write((MultiFormRequestHelper.TWO_HYPHENS + + MultiFormRequestHelper.BOUNDARY + + MultiFormRequestHelper.TWO_HYPHENS + + MultiFormRequestHelper.CRLF) + .getBytes()); } /** @@ -62,8 +64,9 @@ public static void addJson(OutputStream outputStream, String json) throws IOExce return; } - outputStream.write((MultiFormRequestHelper.TWO_HYPHENS + MultiFormRequestHelper.BOUNDARY + - MultiFormRequestHelper.CRLF).getBytes()); + outputStream.write( + (MultiFormRequestHelper.TWO_HYPHENS + MultiFormRequestHelper.BOUNDARY + MultiFormRequestHelper.CRLF) + .getBytes()); outputStream.write((MultiFormRequestHelper.getFileInfo("upload_file")).getBytes()); outputStream.write((MultiFormRequestHelper.CRLF).getBytes()); @@ -78,8 +81,7 @@ public static void addJson(OutputStream outputStream, String json) throws IOExce * @param attachments list of paths to files * @throws IOException */ - public static void addFiles(OutputStream outputStream, List attachments) throws - IOException { + public static void addFiles(OutputStream outputStream, List attachments) throws IOException { if (attachments == null || outputStream == null) { BacktraceLogger.w(LOG_TAG, "Attachments or output stream is null"); return; @@ -102,22 +104,18 @@ private static void addFile(OutputStream outputStream, String absolutePath) thro return; } - String fileContentType = URLConnection.guessContentTypeFromName(FileHelper - .getFileNameFromPath - (absolutePath)); - - outputStream.write((MultiFormRequestHelper.TWO_HYPHENS + MultiFormRequestHelper.BOUNDARY + - MultiFormRequestHelper.CRLF).getBytes()); - outputStream.write((MultiFormRequestHelper.getFileInfo("attachment_" + FileHelper - .getFileNameFromPath - (absolutePath))).getBytes()); - outputStream.write(("Content-Type: " + fileContentType + MultiFormRequestHelper.CRLF) - .getBytes - ()); + String fileContentType = URLConnection.guessContentTypeFromName(FileHelper.getFileNameFromPath(absolutePath)); + + outputStream.write( + (MultiFormRequestHelper.TWO_HYPHENS + MultiFormRequestHelper.BOUNDARY + MultiFormRequestHelper.CRLF) + .getBytes()); + outputStream.write( + (MultiFormRequestHelper.getFileInfo("attachment_" + FileHelper.getFileNameFromPath(absolutePath))) + .getBytes()); + outputStream.write(("Content-Type: " + fileContentType + MultiFormRequestHelper.CRLF).getBytes()); outputStream.write((MultiFormRequestHelper.CRLF).getBytes()); streamFile(outputStream, absolutePath); outputStream.write((MultiFormRequestHelper.CRLF).getBytes()); - } /*** @@ -126,8 +124,7 @@ private static void addFile(OutputStream outputStream, String absolutePath) thro * @param absolutePath absolute path to file * @throws IOException */ - public static void streamFile(OutputStream outputStream, String absolutePath) throws - IOException { + public static void streamFile(OutputStream outputStream, String absolutePath) throws IOException { if (outputStream == null || absolutePath == null) { BacktraceLogger.w(LOG_TAG, "Absolute path or output stream is null"); return; @@ -140,15 +137,14 @@ public static void streamFile(OutputStream outputStream, String absolutePath) th } } - /*** * Get string with information about file like content-disposition, name and filename * @param fileName filename with extension * @return string with file information for multiform data */ private static String getFileInfo(String fileName) { - return "Content-Disposition: form-data; name=\"" + - fileName + "\";filename=\"" + - fileName + "\"" + MultiFormRequestHelper.CRLF; + return "Content-Disposition: form-data; name=\"" + fileName + + "\";filename=\"" + fileName + + "\"" + MultiFormRequestHelper.CRLF; } } diff --git a/backtrace-library/src/main/java/backtraceio/library/common/PermissionHelper.java b/backtrace-library/src/main/java/backtraceio/library/common/PermissionHelper.java index c2c40ff48..16bed096b 100644 --- a/backtrace-library/src/main/java/backtraceio/library/common/PermissionHelper.java +++ b/backtrace-library/src/main/java/backtraceio/library/common/PermissionHelper.java @@ -46,7 +46,8 @@ public static boolean isPermissionForInternetGranted(Context context) { */ public static boolean isPermissionForAccessWifiStateGranted(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - return context.checkSelfPermission(Manifest.permission.ACCESS_WIFI_STATE) == PackageManager.PERMISSION_GRANTED; + return context.checkSelfPermission(Manifest.permission.ACCESS_WIFI_STATE) + == PackageManager.PERMISSION_GRANTED; } else { return true; } @@ -60,7 +61,8 @@ public static boolean isPermissionForAccessWifiStateGranted(Context context) { */ public static boolean isPermissionForReadExternalStorageGranted(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - return context.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; + return context.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) + == PackageManager.PERMISSION_GRANTED; } else { return true; } diff --git a/backtrace-library/src/main/java/backtraceio/library/common/RequestHelper.java b/backtrace-library/src/main/java/backtraceio/library/common/RequestHelper.java index 415d725b9..c5692bd99 100644 --- a/backtrace-library/src/main/java/backtraceio/library/common/RequestHelper.java +++ b/backtrace-library/src/main/java/backtraceio/library/common/RequestHelper.java @@ -1,10 +1,9 @@ package backtraceio.library.common; +import backtraceio.library.logger.BacktraceLogger; import java.io.IOException; import java.io.OutputStream; -import backtraceio.library.logger.BacktraceLogger; - public class RequestHelper { private static final transient String LOG_TAG = RequestHelper.class.getSimpleName(); diff --git a/backtrace-library/src/main/java/backtraceio/library/common/SharedPreferencesManager.java b/backtrace-library/src/main/java/backtraceio/library/common/SharedPreferencesManager.java index dd1b2b6ff..4dc5b01bc 100644 --- a/backtrace-library/src/main/java/backtraceio/library/common/SharedPreferencesManager.java +++ b/backtrace-library/src/main/java/backtraceio/library/common/SharedPreferencesManager.java @@ -5,6 +5,7 @@ public class SharedPreferencesManager { private final Context context; + public SharedPreferencesManager(Context context) { this.context = context; } diff --git a/backtrace-library/src/main/java/backtraceio/library/common/TypeHelper.java b/backtrace-library/src/main/java/backtraceio/library/common/TypeHelper.java index 7a3f2c1ce..5f7233d3e 100644 --- a/backtrace-library/src/main/java/backtraceio/library/common/TypeHelper.java +++ b/backtrace-library/src/main/java/backtraceio/library/common/TypeHelper.java @@ -1,19 +1,26 @@ -package backtraceio.library.common; - -/** - * Backtrace TypeHelper helps with common type comparision. - */ -public class TypeHelper { - /** - * Check if object type is primitive - for example: int or long. - * - * @param type object to check - * @return true, if an object is primitive. Otherwise false. - */ - public static boolean isPrimitiveOrPrimitiveWrapperOrString(Class type) { - return (type.isPrimitive() && type != void.class) || - type == Double.class || type == Float.class || type == Long.class || - type == Integer.class || type == Short.class || type == Character.class || - type == Byte.class || type == Boolean.class || type == String.class || type.isEnum(); - } -} \ No newline at end of file +package backtraceio.library.common; + +/** + * Backtrace TypeHelper helps with common type comparision. + */ +public class TypeHelper { + /** + * Check if object type is primitive - for example: int or long. + * + * @param type object to check + * @return true, if an object is primitive. Otherwise false. + */ + public static boolean isPrimitiveOrPrimitiveWrapperOrString(Class type) { + return (type.isPrimitive() && type != void.class) + || type == Double.class + || type == Float.class + || type == Long.class + || type == Integer.class + || type == Short.class + || type == Character.class + || type == Byte.class + || type == Boolean.class + || type == String.class + || type.isEnum(); + } +} diff --git a/backtrace-library/src/main/java/backtraceio/library/common/serialization/StackTraceElementTypeAdapter.java b/backtrace-library/src/main/java/backtraceio/library/common/serialization/StackTraceElementTypeAdapter.java index fd4f93285..0e7a322d9 100644 --- a/backtrace-library/src/main/java/backtraceio/library/common/serialization/StackTraceElementTypeAdapter.java +++ b/backtrace-library/src/main/java/backtraceio/library/common/serialization/StackTraceElementTypeAdapter.java @@ -4,7 +4,6 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; - import java.io.IOException; public class StackTraceElementTypeAdapter extends TypeAdapter { @@ -56,7 +55,7 @@ public StackTraceElement read(JsonReader in) throws IOException { case "line-number": lineNumber = in.nextInt(); break; - // Ignore any unknown fields (including classLoaderName) + // Ignore any unknown fields (including classLoaderName) default: in.skipValue(); } diff --git a/backtrace-library/src/main/java/backtraceio/library/common/serialization/ThrowableTypeAdapterFactory.java b/backtrace-library/src/main/java/backtraceio/library/common/serialization/ThrowableTypeAdapterFactory.java index 65f79f9e2..28617ab7a 100644 --- a/backtrace-library/src/main/java/backtraceio/library/common/serialization/ThrowableTypeAdapterFactory.java +++ b/backtrace-library/src/main/java/backtraceio/library/common/serialization/ThrowableTypeAdapterFactory.java @@ -1,5 +1,6 @@ package backtraceio.library.common.serialization; +import backtraceio.library.logger.BacktraceLogger; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -10,17 +11,12 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; - import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.function.Supplier; - -import backtraceio.library.BacktraceDatabase; -import backtraceio.library.logger.BacktraceLogger; public class ThrowableTypeAdapterFactory implements TypeAdapterFactory { @@ -34,7 +30,7 @@ private static class ConstructorSpec { } } - private transient final String LOG_TAG = ThrowableTypeAdapterFactory.class.getSimpleName(); + private final transient String LOG_TAG = ThrowableTypeAdapterFactory.class.getSimpleName(); @Override public TypeAdapter create(Gson gson, TypeToken typeToken) { @@ -64,7 +60,7 @@ public void write(JsonWriter out, T value) throws IOException { out.name("stack-trace"); out.beginArray(); - for (StackTraceElement element : throwable.getStackTrace()){ + for (StackTraceElement element : throwable.getStackTrace()) { stackTraceElementAdapter.write(out, element); } out.endArray(); @@ -101,7 +97,8 @@ public T read(JsonReader in) throws IOException { } List stackTraceList = new ArrayList<>(); - if (jsonObject.has("stack-trace") && jsonObject.get("stack-trace").isJsonArray()) { + if (jsonObject.has("stack-trace") + && jsonObject.get("stack-trace").isJsonArray()) { for (JsonElement elementJson : jsonObject.getAsJsonArray("stack-trace")) { stackTraceList.add(stackTraceElementAdapter.fromJsonTree(elementJson)); } @@ -118,7 +115,11 @@ public T read(JsonReader in) throws IOException { Throwable instance = tryInstantiateThrowable(throwableClassToInstantiate, message, cause); if (instance == null) { - BacktraceLogger.w(LOG_TAG, String.format("Could not instantiate specific Throwable type '%s'. Falling back by returning null.", throwableClassToInstantiate.getName())); + BacktraceLogger.w( + LOG_TAG, + String.format( + "Could not instantiate specific Throwable type '%s'. Falling back by returning null.", + throwableClassToInstantiate.getName())); return null; } @@ -150,7 +151,11 @@ private Class determineClassToInstantiate(String actualClas // e.g. if deserializing into `Exception.class` but `actualClass` was `Error`. } } catch (ClassNotFoundException ignored) { - BacktraceLogger.d(LOG_TAG, "Class "+ actualClassName +" not found, will fall back to using rawType (the type requested from Gson): " + rawType.getSimpleName()); + BacktraceLogger.d( + LOG_TAG, + "Class " + actualClassName + + " not found, will fall back to using rawType (the type requested from Gson): " + + rawType.getSimpleName()); } } return throwableClassToInstantiate; @@ -158,16 +163,14 @@ private Class determineClassToInstantiate(String actualClas @SuppressWarnings("unchecked") private T tryInstantiateThrowable( - Class exceptionClass, - String message, - Throwable cause - ) { - - ConstructorSpec[] specs = new ConstructorSpec[]{ - new ConstructorSpec(new Class[]{String.class, Throwable.class}, new Object[]{message, cause}), - new ConstructorSpec(new Class[]{Throwable.class}, new Object[]{cause}), - new ConstructorSpec(new Class[]{String.class}, new Object[]{message}), - new ConstructorSpec(new Class[]{}, new Object[]{}) + Class exceptionClass, String message, Throwable cause) { + + ConstructorSpec[] specs = new ConstructorSpec[] { + new ConstructorSpec( + new Class[] {String.class, Throwable.class}, new Object[] {message, cause}), + new ConstructorSpec(new Class[] {Throwable.class}, new Object[] {cause}), + new ConstructorSpec(new Class[] {String.class}, new Object[] {message}), + new ConstructorSpec(new Class[] {}, new Object[] {}) }; for (ConstructorSpec spec : specs) { @@ -179,13 +182,18 @@ private T tryInstantiateThrowable( try { instance.initCause(cause); } catch (Exception e) { - BacktraceLogger.d(LOG_TAG, "Could not initCause for " + exceptionClass.getName() + " after constructor with args: " + Arrays.toString(spec.paramTypes)); + BacktraceLogger.d( + LOG_TAG, + "Could not initCause for " + exceptionClass.getName() + + " after constructor with args: " + Arrays.toString(spec.paramTypes)); } } return instance; - } - catch (Exception e) { - BacktraceLogger.d(LOG_TAG, "Failed to instantiate " + exceptionClass.getName() + " with constructor with args: " + Arrays.toString(spec.paramTypes) + ", error message: " + e); + } catch (Exception e) { + BacktraceLogger.d( + LOG_TAG, + "Failed to instantiate " + exceptionClass.getName() + " with constructor with args: " + + Arrays.toString(spec.paramTypes) + ", error message: " + e); } } @@ -193,27 +201,29 @@ private T tryInstantiateThrowable( } @SuppressWarnings("unchecked") - private T createFallbackInstanceOrThrow(Throwable instance, String message, List stackTraceList) throws JsonParseException { + private T createFallbackInstanceOrThrow( + Throwable instance, String message, List stackTraceList) + throws JsonParseException { String errorMessage = String.format( "Deserialized to %s but expected assignable to %s. Message: %s", - (instance != null ? instance.getClass().getName() : "null"), - rawType.getName(), - message - ); + (instance != null ? instance.getClass().getName() : "null"), rawType.getName(), message); // Create a new instance of the originally requested type (T or rawType) with the info try { - Constructor tConstructor = ((Class) rawType).getDeclaredConstructor(String.class, Throwable.class); + Constructor tConstructor = ((Class) rawType) + .getDeclaredConstructor(String.class, Throwable.class); tConstructor.setAccessible(true); // 'instance' becomes the cause T fallbackT = (T) tConstructor.newInstance(errorMessage, instance); ((Throwable) fallbackT).setStackTrace(stackTraceList.toArray(new StackTraceElement[0])); return fallbackT; - } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | - InvocationTargetException e) { - throw new JsonParseException("Could not create fallback instance of " + rawType.getName() + ": " + e.getMessage(), e); + } catch (NoSuchMethodException + | IllegalAccessException + | InstantiationException + | InvocationTargetException e) { + throw new JsonParseException( + "Could not create fallback instance of " + rawType.getName() + ": " + e.getMessage(), e); } } - }; } } diff --git a/backtrace-library/src/main/java/backtraceio/library/enums/BatteryState.java b/backtrace-library/src/main/java/backtraceio/library/enums/BatteryState.java index dacfe1891..42d450299 100644 --- a/backtrace-library/src/main/java/backtraceio/library/enums/BatteryState.java +++ b/backtrace-library/src/main/java/backtraceio/library/enums/BatteryState.java @@ -22,4 +22,4 @@ public enum BatteryState { public String toString() { return text; } -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/enums/database/RetryOrder.java b/backtrace-library/src/main/java/backtraceio/library/enums/database/RetryOrder.java index 0790b4d37..64b84e701 100644 --- a/backtrace-library/src/main/java/backtraceio/library/enums/database/RetryOrder.java +++ b/backtrace-library/src/main/java/backtraceio/library/enums/database/RetryOrder.java @@ -1,5 +1,6 @@ package backtraceio.library.enums.database; public enum RetryOrder { - Stack, Queue + Stack, + Queue } diff --git a/backtrace-library/src/main/java/backtraceio/library/events/EventsOnServerResponseEventListener.java b/backtrace-library/src/main/java/backtraceio/library/events/EventsOnServerResponseEventListener.java index 3a0f093f6..d6e433186 100644 --- a/backtrace-library/src/main/java/backtraceio/library/events/EventsOnServerResponseEventListener.java +++ b/backtrace-library/src/main/java/backtraceio/library/events/EventsOnServerResponseEventListener.java @@ -13,4 +13,4 @@ public interface EventsOnServerResponseEventListener { * @param result server response */ void onEvent(EventsResult result); -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/events/OnBeforeSendEventListener.java b/backtrace-library/src/main/java/backtraceio/library/events/OnBeforeSendEventListener.java index 1b8933456..6cbb17a9d 100644 --- a/backtrace-library/src/main/java/backtraceio/library/events/OnBeforeSendEventListener.java +++ b/backtrace-library/src/main/java/backtraceio/library/events/OnBeforeSendEventListener.java @@ -13,4 +13,4 @@ public interface OnBeforeSendEventListener { * @return data which should be send to Backtrace API */ BacktraceData onEvent(BacktraceData data); -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/events/OnServerErrorEventListener.java b/backtrace-library/src/main/java/backtraceio/library/events/OnServerErrorEventListener.java index 0f07c7fca..902fbd89b 100644 --- a/backtrace-library/src/main/java/backtraceio/library/events/OnServerErrorEventListener.java +++ b/backtrace-library/src/main/java/backtraceio/library/events/OnServerErrorEventListener.java @@ -11,4 +11,4 @@ public interface OnServerErrorEventListener { * @param exception exception that has been reported */ void onEvent(Exception exception); -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/events/OnServerResponseEventListener.java b/backtrace-library/src/main/java/backtraceio/library/events/OnServerResponseEventListener.java index 51c99dc76..828f14fa9 100644 --- a/backtrace-library/src/main/java/backtraceio/library/events/OnServerResponseEventListener.java +++ b/backtrace-library/src/main/java/backtraceio/library/events/OnServerResponseEventListener.java @@ -12,4 +12,4 @@ public interface OnServerResponseEventListener { * @param backtraceResult server response */ void onEvent(BacktraceResult backtraceResult); -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/http/HttpHelper.java b/backtrace-library/src/main/java/backtraceio/library/http/HttpHelper.java index a275bce2c..374b653c2 100644 --- a/backtrace-library/src/main/java/backtraceio/library/http/HttpHelper.java +++ b/backtrace-library/src/main/java/backtraceio/library/http/HttpHelper.java @@ -1,13 +1,12 @@ package backtraceio.library.http; +import backtraceio.library.logger.BacktraceLogger; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; -import backtraceio.library.logger.BacktraceLogger; - public class HttpHelper { private static final String LOG_TAG = HttpHelper.class.getSimpleName(); @@ -28,8 +27,7 @@ public static String getResponseMessage(HttpURLConnection urlConnection) throws inputStream = urlConnection.getErrorStream(); } - BufferedReader br = new BufferedReader(new InputStreamReader( - inputStream)); + BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder responseStringBuilder = new StringBuilder(); String line; diff --git a/backtrace-library/src/main/java/backtraceio/library/interfaces/Api.java b/backtrace-library/src/main/java/backtraceio/library/interfaces/Api.java index 88655f3fd..14b73f657 100644 --- a/backtrace-library/src/main/java/backtraceio/library/interfaces/Api.java +++ b/backtrace-library/src/main/java/backtraceio/library/interfaces/Api.java @@ -94,4 +94,4 @@ public interface Api { * @param callback The custom event to trigger on an API response for a unique events request */ void setSummedEventsOnServerResponse(EventsOnServerResponseEventListener callback); -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/interfaces/Breadcrumbs.java b/backtrace-library/src/main/java/backtraceio/library/interfaces/Breadcrumbs.java index bc56fe5ac..90a6d7d30 100644 --- a/backtrace-library/src/main/java/backtraceio/library/interfaces/Breadcrumbs.java +++ b/backtrace-library/src/main/java/backtraceio/library/interfaces/Breadcrumbs.java @@ -1,14 +1,12 @@ package backtraceio.library.interfaces; import android.content.Context; - -import java.util.EnumSet; -import java.util.Map; - import backtraceio.library.enums.BacktraceBreadcrumbLevel; import backtraceio.library.enums.BacktraceBreadcrumbType; import backtraceio.library.events.OnSuccessfulBreadcrumbAddEventListener; import backtraceio.library.models.json.BacktraceReport; +import java.util.EnumSet; +import java.util.Map; public interface Breadcrumbs { /** @@ -28,8 +26,7 @@ public interface Breadcrumbs { * @note breadcrumbTypesToEnable only affects automatic breadcrumb receivers. User created * breadcrumbs will always be enabled */ - boolean enableBreadcrumbs(Context context, - EnumSet breadcrumbTypesToEnable); + boolean enableBreadcrumbs(Context context, EnumSet breadcrumbTypesToEnable); /** * Enable logging of breadcrumbs and submission with crash reports @@ -50,9 +47,8 @@ boolean enableBreadcrumbs(Context context, * @note breadcrumbTypesToEnable only affects automatic breadcrumb receivers. User created * breadcrumbs will always be enabled */ - boolean enableBreadcrumbs(Context context, - EnumSet breadcrumbTypesToEnable, - int maxBreadcrumbLogSizeBytes); + boolean enableBreadcrumbs( + Context context, EnumSet breadcrumbTypesToEnable, int maxBreadcrumbLogSizeBytes); /** * Gets the enabled breadcrumb types @@ -142,7 +138,11 @@ boolean enableBreadcrumbs(Context context, * @param level the severity level of this breadcrumb * @return true if the breadcrumb was successfully added */ - boolean addBreadcrumb(String message, Map attributes, BacktraceBreadcrumbType type, BacktraceBreadcrumbLevel level); + boolean addBreadcrumb( + String message, + Map attributes, + BacktraceBreadcrumbType type, + BacktraceBreadcrumbLevel level); /** * Process a Backtrace Report to add breadcrumbs, if breadcrumbs is enabled @@ -181,7 +181,7 @@ boolean enableBreadcrumbs(Context context, * @return true if breadcrumbs are enabled. */ boolean isEnabled(); - + /** * Set event executed after adding a breadcrumb to the breadcrumb storage. * diff --git a/backtrace-library/src/main/java/backtraceio/library/interfaces/Client.java b/backtrace-library/src/main/java/backtraceio/library/interfaces/Client.java index 3b639bf1d..2ac3095f3 100644 --- a/backtrace-library/src/main/java/backtraceio/library/interfaces/Client.java +++ b/backtrace-library/src/main/java/backtraceio/library/interfaces/Client.java @@ -1,8 +1,7 @@ package backtraceio.library.interfaces; -import java.util.Map; - import backtraceio.library.models.json.BacktraceReport; +import java.util.Map; /** * Client interface. diff --git a/backtrace-library/src/main/java/backtraceio/library/interfaces/Database.java b/backtrace-library/src/main/java/backtraceio/library/interfaces/Database.java index 751567d3c..05aaf0db6 100644 --- a/backtrace-library/src/main/java/backtraceio/library/interfaces/Database.java +++ b/backtrace-library/src/main/java/backtraceio/library/interfaces/Database.java @@ -1,13 +1,12 @@ package backtraceio.library.interfaces; -import java.util.Map; - import backtraceio.library.BacktraceCredentials; import backtraceio.library.base.BacktraceBase; import backtraceio.library.enums.UnwindingMode; import backtraceio.library.models.database.BacktraceDatabaseRecord; import backtraceio.library.models.database.BacktraceDatabaseSettings; import backtraceio.library.models.json.BacktraceReport; +import java.util.Map; public interface Database { /** @@ -54,7 +53,8 @@ public interface Database { * @param isProguardEnabled * @return */ - BacktraceDatabaseRecord add(BacktraceReport backtraceReport, Map attributes, boolean isProguardEnabled); + BacktraceDatabaseRecord add( + BacktraceReport backtraceReport, Map attributes, boolean isProguardEnabled); /** * @return @@ -95,8 +95,8 @@ public interface Database { * @param credentials Backtrace credentials * @param enableClientSideUnwinding Enable client side unwinding */ - Boolean setupNativeIntegration(BacktraceBase client, BacktraceCredentials credentials, - boolean enableClientSideUnwinding); + Boolean setupNativeIntegration( + BacktraceBase client, BacktraceCredentials credentials, boolean enableClientSideUnwinding); /** * Setup native crash handler @@ -106,8 +106,11 @@ Boolean setupNativeIntegration(BacktraceBase client, BacktraceCredentials creden * @param enableClientSideUnwinding Enable client side unwinding * @param unwindingMode Unwinding mode to use for client side unwinding */ - Boolean setupNativeIntegration(BacktraceBase client, BacktraceCredentials credentials, - boolean enableClientSideUnwinding, UnwindingMode unwindingMode); + Boolean setupNativeIntegration( + BacktraceBase client, + BacktraceCredentials credentials, + boolean enableClientSideUnwinding, + UnwindingMode unwindingMode); /** * Disable native crash handler diff --git a/backtrace-library/src/main/java/backtraceio/library/interfaces/DatabaseContext.java b/backtrace-library/src/main/java/backtraceio/library/interfaces/DatabaseContext.java index 669af23da..9d3aa4064 100644 --- a/backtrace-library/src/main/java/backtraceio/library/interfaces/DatabaseContext.java +++ b/backtrace-library/src/main/java/backtraceio/library/interfaces/DatabaseContext.java @@ -49,7 +49,6 @@ public interface DatabaseContext { */ boolean delete(BacktraceDatabaseRecord record); - /** * Check if any similar record exists * diff --git a/backtrace-library/src/main/java/backtraceio/library/interfaces/DatabaseFileContext.java b/backtrace-library/src/main/java/backtraceio/library/interfaces/DatabaseFileContext.java index f30c79df7..3023cab66 100644 --- a/backtrace-library/src/main/java/backtraceio/library/interfaces/DatabaseFileContext.java +++ b/backtrace-library/src/main/java/backtraceio/library/interfaces/DatabaseFileContext.java @@ -1,8 +1,7 @@ package backtraceio.library.interfaces; -import java.io.File; - import backtraceio.library.models.database.BacktraceDatabaseRecord; +import java.io.File; public interface DatabaseFileContext { @@ -20,7 +19,6 @@ public interface DatabaseFileContext { */ Iterable getAll(); - /** * Valid all database files consistency * @@ -28,7 +26,6 @@ public interface DatabaseFileContext { */ boolean validFileConsistency(); - /** * Remove orphaned files existing in database directory * @@ -41,4 +38,3 @@ public interface DatabaseFileContext { */ void clear(); } - diff --git a/backtrace-library/src/main/java/backtraceio/library/interfaces/Metrics.java b/backtrace-library/src/main/java/backtraceio/library/interfaces/Metrics.java index 2f98854f2..513fdc6f8 100644 --- a/backtrace-library/src/main/java/backtraceio/library/interfaces/Metrics.java +++ b/backtrace-library/src/main/java/backtraceio/library/interfaces/Metrics.java @@ -1,14 +1,13 @@ package backtraceio.library.interfaces; -import java.util.Map; -import java.util.concurrent.ConcurrentLinkedDeque; - import backtraceio.library.events.EventsOnServerResponseEventListener; import backtraceio.library.events.EventsRequestHandler; import backtraceio.library.models.BacktraceMetricsSettings; import backtraceio.library.models.metrics.SummedEvent; import backtraceio.library.models.metrics.UniqueEvent; import backtraceio.library.services.BacktraceMetrics; +import java.util.Map; +import java.util.concurrent.ConcurrentLinkedDeque; public interface Metrics { @@ -22,7 +21,7 @@ public interface Metrics { * @param defaultUniqueEventName custom session user identifier */ void enable(String defaultUniqueEventName); - + /** * Enable metrics * @@ -37,7 +36,7 @@ public interface Metrics { * @param defaultUniqueEventName custom session user identifier */ void enable(BacktraceMetricsSettings settings, String defaultUniqueEventName); - + /** * Send all outgoing messages (unique and summed) currently queued */ diff --git a/backtrace-library/src/main/java/backtraceio/library/interfaces/NativeCommunication.java b/backtrace-library/src/main/java/backtraceio/library/interfaces/NativeCommunication.java index 233da04da..234f80ae8 100644 --- a/backtrace-library/src/main/java/backtraceio/library/interfaces/NativeCommunication.java +++ b/backtrace-library/src/main/java/backtraceio/library/interfaces/NativeCommunication.java @@ -5,11 +5,22 @@ public interface NativeCommunication { boolean handleCrash(String[] args); - boolean initializeJavaCrashHandler(String url, String databasePath, String classPath, String[] attributeKeys, String[] attributeValues, - String[] attachmentPaths, String[] environmentVariables); + boolean initializeJavaCrashHandler( + String url, + String databasePath, + String classPath, + String[] attributeKeys, + String[] attributeValues, + String[] attachmentPaths, + String[] environmentVariables); - boolean initializeCrashHandler(String url, String databasePath, String handlerPath, - String[] attributeKeys, String[] attributeValues, - String[] attachmentPaths, boolean enableClientSideUnwinding, - UnwindingMode unwindingMode); + boolean initializeCrashHandler( + String url, + String databasePath, + String handlerPath, + String[] attributeKeys, + String[] attributeValues, + String[] attachmentPaths, + boolean enableClientSideUnwinding, + UnwindingMode unwindingMode); } diff --git a/backtrace-library/src/main/java/backtraceio/library/logger/BacktraceInternalLogger.java b/backtrace-library/src/main/java/backtraceio/library/logger/BacktraceInternalLogger.java index 7d2ef1af0..063037fa9 100644 --- a/backtrace-library/src/main/java/backtraceio/library/logger/BacktraceInternalLogger.java +++ b/backtrace-library/src/main/java/backtraceio/library/logger/BacktraceInternalLogger.java @@ -1,7 +1,6 @@ package backtraceio.library.logger; import android.util.Log; - import org.jetbrains.annotations.NotNull; /** @@ -100,4 +99,4 @@ public int e(String tag, String message, Throwable tr) { private String getTag(String tag) { return BacktraceInternalLogger.BASE_TAG + tag; } -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/logger/BacktraceLogger.java b/backtrace-library/src/main/java/backtraceio/library/logger/BacktraceLogger.java index c42eebadb..9d857ca4d 100644 --- a/backtrace-library/src/main/java/backtraceio/library/logger/BacktraceLogger.java +++ b/backtrace-library/src/main/java/backtraceio/library/logger/BacktraceLogger.java @@ -26,7 +26,7 @@ public static Logger getLogger() { public static void setLogger(@NotNull Logger logger) { if (logger == null) { - throw new IllegalArgumentException("Passed custom logger implementation can`t be null"); + throw new IllegalArgumentException("Passed custom logger implementation can`t be null"); } BacktraceLogger.logger = logger; } @@ -89,4 +89,4 @@ public static void setLevel(@NotNull LogLevel level) { ((BacktraceInternalLogger) logger).setLevel(level); } } -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/logger/Logger.java b/backtrace-library/src/main/java/backtraceio/library/logger/Logger.java index 2d2e24c5b..bc1f2d1d8 100644 --- a/backtrace-library/src/main/java/backtraceio/library/logger/Logger.java +++ b/backtrace-library/src/main/java/backtraceio/library/logger/Logger.java @@ -10,7 +10,10 @@ */ public interface Logger { int d(String tag, String message); + int w(String tag, String message); + int e(String tag, String message); + int e(String tag, String message, Throwable tr); -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceApiResult.java b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceApiResult.java index 68aea851e..4b967eebe 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceApiResult.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceApiResult.java @@ -31,4 +31,4 @@ public String getRxId() { public String getResponse() { return response; } -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceData.java b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceData.java index bbdcc46dd..004fc2441 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceData.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceData.java @@ -1,12 +1,6 @@ package backtraceio.library.models; import android.content.Context; - -import com.google.gson.annotations.SerializedName; - -import java.util.List; -import java.util.Map; - import backtraceio.library.BacktraceClient; import backtraceio.library.logger.BacktraceLogger; import backtraceio.library.models.json.Annotations; @@ -16,6 +10,9 @@ import backtraceio.library.models.json.SourceCodeData; import backtraceio.library.models.json.ThreadData; import backtraceio.library.models.json.ThreadInformation; +import com.google.gson.annotations.SerializedName; +import java.util.List; +import java.util.Map; /** * Serializable Backtrace API data object @@ -105,7 +102,6 @@ public class BacktraceData { @SerializedName("threads") Map threadInformationMap; - /** * Create new instance of BacktraceData * @deprecated @@ -132,11 +128,19 @@ public BacktraceData(Context context, BacktraceReport report, Map attributes, String mainThread, - String[] classifiers, BacktraceReport report, Map annotations, - Map sourceCode, - Map threadInformationMap) { + public BacktraceData( + String uuid, + String symbolication, + long timestamp, + String langVersion, + String agentVersion, + Map attributes, + String mainThread, + String[] classifiers, + BacktraceReport report, + Map annotations, + Map sourceCode, + Map threadInformationMap) { this.uuid = uuid; this.symbolication = symbolication; this.timestamp = timestamp; @@ -229,7 +233,6 @@ public BacktraceReport getReport() { return report; } - public static class Builder { private final BacktraceReport report; @@ -271,8 +274,7 @@ public BacktraceData build() { this.report, this.annotations, this.sourceCode, - this.threadInformationMap - ); + this.threadInformationMap); } public Builder setSymbolication(String symbolication) { @@ -286,15 +288,15 @@ public Builder setSymbolication(String symbolication) { private Builder setDefaultReportInformation(BacktraceReport report) { this.uuid = report.uuid.toString(); this.timestamp = report.timestamp; - this.classifiers = report.exceptionTypeReport ? new String[]{report.classifier} : null; + this.classifiers = report.exceptionTypeReport ? new String[] {report.classifier} : null; this.langVersion = System.getProperty("java.version"); this.agentVersion = BacktraceClient.version; return this; } /** - * Set information about all threads - */ + * Set information about all threads + */ private Builder setDefaultThreadsInformation() { BacktraceLogger.d(LOG_TAG, "Setting threads information"); @@ -309,10 +311,7 @@ private Builder setDefaultThreadsInformation() { public Builder setAttributes(Context context, Map clientAttributes) { BacktraceLogger.d(LOG_TAG, "Setting attributes"); - BacktraceAttributes backtraceAttributes = new BacktraceAttributes( - context, - this.report, - clientAttributes); + BacktraceAttributes backtraceAttributes = new BacktraceAttributes(context, this.report, clientAttributes); this.attributes = backtraceAttributes.attributes; setAnnotations(backtraceAttributes.getComplexAttributes()); @@ -323,12 +322,11 @@ private Builder setAnnotations(Map complexAttributes) { BacktraceLogger.d(LOG_TAG, "Setting annotations"); Object exceptionMessage = null; - if (this.attributes != null && - this.attributes.containsKey("error.message")) { + if (this.attributes != null && this.attributes.containsKey("error.message")) { exceptionMessage = this.attributes.get("error.message"); } this.annotations = Annotations.getAnnotations(exceptionMessage, complexAttributes); return this; } } -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceDataAttachmentsFileHelper.java b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceDataAttachmentsFileHelper.java index 59927d0c2..03b941d46 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceDataAttachmentsFileHelper.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceDataAttachmentsFileHelper.java @@ -1,10 +1,8 @@ package backtraceio.library.models; import android.content.Context; - -import java.util.List; - import backtraceio.library.common.FileHelper; +import java.util.List; public class BacktraceDataAttachmentsFileHelper { diff --git a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceExceptionHandler.java b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceExceptionHandler.java index eb796eb45..b85f7bbe3 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceExceptionHandler.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceExceptionHandler.java @@ -1,12 +1,11 @@ package backtraceio.library.models; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.CountDownLatch; - import backtraceio.library.BacktraceClient; import backtraceio.library.events.OnServerResponseEventListener; import backtraceio.library.logger.BacktraceLogger; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CountDownLatch; /** * Backtrace UncaughtExceptionHandler which will be invoked when a Thread abruptly terminates due @@ -15,9 +14,11 @@ public class BacktraceExceptionHandler implements Thread.UncaughtExceptionHandler { private static final String LOG_TAG = BacktraceExceptionHandler.class.getSimpleName(); - private static final Map customAttributes = new HashMap() {{ - put(BacktraceAttributeConsts.ErrorType, BacktraceAttributeConsts.UnhandledExceptionAttributeType); - }}; + private static final Map customAttributes = new HashMap() { + { + put(BacktraceAttributeConsts.ErrorType, BacktraceAttributeConsts.UnhandledExceptionAttributeType); + } + }; private final Thread.UncaughtExceptionHandler rootHandler; private final CountDownLatch signal = new CountDownLatch(1); private final BacktraceClient client; diff --git a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceMetricsSettings.java b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceMetricsSettings.java index 272023b1f..b60e67d9d 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceMetricsSettings.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceMetricsSettings.java @@ -16,7 +16,11 @@ public class BacktraceMetricsSettings { * @param credentials Backtrace API credentials */ public BacktraceMetricsSettings(BacktraceCredentials credentials) { - this(credentials, BacktraceMetrics.defaultBaseUrl, BacktraceMetrics.defaultTimeIntervalMs, BacktraceMetrics.defaultTimeBetweenRetriesMs); + this( + credentials, + BacktraceMetrics.defaultBaseUrl, + BacktraceMetrics.defaultTimeIntervalMs, + BacktraceMetrics.defaultTimeBetweenRetriesMs); } /** @@ -26,7 +30,11 @@ public BacktraceMetricsSettings(BacktraceCredentials credentials) { * @param baseUrl Base URL to send metrics */ public BacktraceMetricsSettings(BacktraceCredentials credentials, String baseUrl) { - this(credentials, baseUrl, BacktraceMetrics.defaultTimeIntervalMs, BacktraceMetrics.defaultTimeBetweenRetriesMs); + this( + credentials, + baseUrl, + BacktraceMetrics.defaultTimeIntervalMs, + BacktraceMetrics.defaultTimeBetweenRetriesMs); } /** @@ -36,7 +44,11 @@ public BacktraceMetricsSettings(BacktraceCredentials credentials, String baseUrl * @param timeIntervalMillis Time interval between metrics auto-send events, 0 disables auto-send */ public BacktraceMetricsSettings(BacktraceCredentials credentials, long timeIntervalMillis) { - this(credentials, BacktraceMetrics.defaultBaseUrl, timeIntervalMillis, BacktraceMetrics.defaultTimeBetweenRetriesMs); + this( + credentials, + BacktraceMetrics.defaultBaseUrl, + timeIntervalMillis, + BacktraceMetrics.defaultTimeBetweenRetriesMs); } /** @@ -58,7 +70,8 @@ public BacktraceMetricsSettings(BacktraceCredentials credentials, String baseUrl * @param timeIntervalMillis Time interval between metrics auto-send events, 0 disables auto-send * @param timeBetweenRetriesMillis Maximum time between retries in milliseconds */ - public BacktraceMetricsSettings(BacktraceCredentials credentials, String baseUrl, long timeIntervalMillis, int timeBetweenRetriesMillis) { + public BacktraceMetricsSettings( + BacktraceCredentials credentials, String baseUrl, long timeIntervalMillis, int timeBetweenRetriesMillis) { this.universe = credentials.getUniverseName(); this.token = credentials.getSubmissionToken(); this.baseUrl = baseUrl; @@ -87,7 +100,8 @@ public int getTimeBetweenRetriesMillis() { } public String getSubmissionUrl(String urlPrefix) { - return this.getBaseUrl() + "/" + urlPrefix + "/submit?token=" + this.getToken() + "&universe=" + this.getUniverseName(); + return this.getBaseUrl() + "/" + urlPrefix + "/submit?token=" + this.getToken() + "&universe=" + + this.getUniverseName(); } public boolean isBacktraceServer() { diff --git a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceResult.java b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceResult.java index 8e8924dfc..fabf472ca 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceResult.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceResult.java @@ -1,9 +1,8 @@ package backtraceio.library.models; -import com.google.gson.annotations.SerializedName; - import backtraceio.library.models.json.BacktraceReport; import backtraceio.library.models.types.BacktraceResultStatus; +import com.google.gson.annotations.SerializedName; /** * Send method result @@ -34,8 +33,7 @@ public class BacktraceResult { /** * Create new instance of BacktraceResult */ - public BacktraceResult() { - } + public BacktraceResult() {} public BacktraceResult(BacktraceApiResult apiResult) { this(apiResult.rxId, apiResult.getResponse()); @@ -91,9 +89,7 @@ public BacktraceResultStatus getStatus() { * @return BacktraceResult with exception information */ public static BacktraceResult OnError(BacktraceReport report, Exception exception) { - return new BacktraceResult( - report, exception.getMessage(), - BacktraceResultStatus.ServerError); + return new BacktraceResult(report, exception.getMessage(), BacktraceResultStatus.ServerError); } @SuppressWarnings({"UnusedDeclaration"}) @@ -104,4 +100,4 @@ public BacktraceReport getBacktraceReport() { public void setBacktraceReport(BacktraceReport backtraceReport) { this.backtraceReport = backtraceReport; } -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceStackFrame.java b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceStackFrame.java index bed1f1d9e..42af1b4cb 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceStackFrame.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceStackFrame.java @@ -1,12 +1,9 @@ package backtraceio.library.models; - +import backtraceio.library.logger.BacktraceLogger; import com.google.gson.annotations.SerializedName; - import java.util.UUID; -import backtraceio.library.logger.BacktraceLogger; - /** * Backtrace stack frame */ @@ -91,4 +88,4 @@ public BacktraceStackFrame(String functionName, String sourceCodeFileName, Integ this.sourceCode = sourceCodeUuid; this.line = line; } -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceStackTrace.java b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceStackTrace.java index 91a1b9a51..4553e17f9 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceStackTrace.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceStackTrace.java @@ -1,8 +1,7 @@ package backtraceio.library.models; -import java.util.ArrayList; - import backtraceio.library.logger.BacktraceLogger; +import java.util.ArrayList; /** * Backtrace stack trace @@ -40,8 +39,9 @@ public Exception getException() { } private void initialize() { - StackTraceElement[] stackTraceElements = this.exception != null ? - this.exception.getStackTrace() : Thread.currentThread().getStackTrace(); + StackTraceElement[] stackTraceElements = this.exception != null + ? this.exception.getStackTrace() + : Thread.currentThread().getStackTrace(); if (stackTraceElements == null || stackTraceElements.length == 0) { BacktraceLogger.w(LOG_TAG, "StackTraceElements are null or empty"); return; @@ -56,8 +56,9 @@ private void setStacktraceInformation(StackTraceElement[] frames) { } for (StackTraceElement frame : frames) { - if (frame != null && frame.getFileName() != null && - frame.getFileName().startsWith("Backtrace")) { + if (frame != null + && frame.getFileName() != null + && frame.getFileName().startsWith("Backtrace")) { BacktraceLogger.d(LOG_TAG, "Skipping frame because it comes from inside the Backtrace library"); continue; } diff --git a/backtrace-library/src/main/java/backtraceio/library/models/attributes/ReportDataAttributes.java b/backtrace-library/src/main/java/backtraceio/library/models/attributes/ReportDataAttributes.java index 889c82d1d..dd9f28da6 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/attributes/ReportDataAttributes.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/attributes/ReportDataAttributes.java @@ -8,7 +8,6 @@ public class ReportDataAttributes { private final Map reportAnnotations = new HashMap<>(); - public void addAnnotation(String key, Object value) { reportAnnotations.put(key, value); } diff --git a/backtrace-library/src/main/java/backtraceio/library/models/attributes/ReportDataBuilder.java b/backtrace-library/src/main/java/backtraceio/library/models/attributes/ReportDataBuilder.java index b6922ce2f..c782cd35e 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/attributes/ReportDataBuilder.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/attributes/ReportDataBuilder.java @@ -1,8 +1,7 @@ package backtraceio.library.models.attributes; -import java.util.Map; - import backtraceio.library.common.TypeHelper; +import java.util.Map; public class ReportDataBuilder { diff --git a/backtrace-library/src/main/java/backtraceio/library/models/database/BacktraceDatabaseRecord.java b/backtrace-library/src/main/java/backtraceio/library/models/database/BacktraceDatabaseRecord.java index 3ffd74151..3e7c611c5 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/database/BacktraceDatabaseRecord.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/database/BacktraceDatabaseRecord.java @@ -1,13 +1,6 @@ package backtraceio.library.models.database; import android.content.Context; - -import com.google.gson.annotations.SerializedName; - -import java.io.File; -import java.nio.charset.StandardCharsets; -import java.util.UUID; - import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.common.BacktraceStringHelper; import backtraceio.library.common.FileHelper; @@ -15,10 +8,14 @@ import backtraceio.library.logger.BacktraceLogger; import backtraceio.library.models.BacktraceData; import backtraceio.library.models.json.BacktraceReport; +import com.google.gson.annotations.SerializedName; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.util.UUID; public class BacktraceDatabaseRecord { - private static transient final String LOG_TAG = BacktraceDatabaseRecord.class.getSimpleName(); + private static final transient String LOG_TAG = BacktraceDatabaseRecord.class.getSimpleName(); /** * Path to database directory @@ -41,7 +38,6 @@ public class BacktraceDatabaseRecord { */ private final transient DatabaseRecordWriter recordWriter; - /** * Path to json stored all information about current record */ @@ -78,12 +74,8 @@ public BacktraceDatabaseRecord(BacktraceData data, String path) { this.recordWriter = new BacktraceDatabaseRecordWriter(path); } - public BacktraceDatabaseRecord(String id, - String path, - String recordPath, - String diagnosticDataPath, - String reportPath, - long size) { + public BacktraceDatabaseRecord( + String id, String path, String recordPath, String diagnosticDataPath, String reportPath, long size) { this.id = UUID.fromString(id); this.recordPath = recordPath; this.diagnosticDataPath = diagnosticDataPath; @@ -161,15 +153,13 @@ public BacktraceData getBacktraceData() { // deserialize data - if deserialize fails, we receive invalid entry try { BacktraceLogger.d(LOG_TAG, "Deserialization diagnostic data"); - BacktraceData diagnosticData = BacktraceSerializeHelper.fromJson(jsonData, - BacktraceData.class); + BacktraceData diagnosticData = BacktraceSerializeHelper.fromJson(jsonData, BacktraceData.class); // add report to diagnostic data // we don't store report with diagnostic data in the same json // because we have easier way to serialize and deserialize data // and no problem/condition with serialization when BacktraceApi want to send // diagnostic data to API - diagnosticData.report = BacktraceSerializeHelper.fromJson(jsonReport, - BacktraceReport.class); + diagnosticData.report = BacktraceSerializeHelper.fromJson(jsonReport, BacktraceReport.class); return diagnosticData; } catch (Exception ex) { BacktraceLogger.e(LOG_TAG, "Exception occurs on deserialization of diagnostic data", ex); @@ -188,8 +178,7 @@ public boolean save() { this.diagnosticDataPath = save(record, String.format("%s-attachment", id)); this.reportPath = save(record.getReport(), String.format("%s-report", id)); - this.recordPath = new File(this.path, - String.format("%s-record.json", this.id)).getAbsolutePath(); + this.recordPath = new File(this.path, String.format("%s-record.json", this.id)).getAbsolutePath(); String json = BacktraceSerializeHelper.toJson(this); byte[] file = json.getBytes(StandardCharsets.UTF_8); @@ -232,8 +221,7 @@ private String save(Object data, String prefix) { * @return is record valid */ public boolean valid() { - return FileHelper.isFileExists(this.diagnosticDataPath) && - FileHelper.isFileExists(this.reportPath); + return FileHelper.isFileExists(this.diagnosticDataPath) && FileHelper.isFileExists(this.reportPath); } /** @@ -274,4 +262,4 @@ public boolean close() { } return false; } -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/models/database/BacktraceDatabaseRecordWriter.java b/backtrace-library/src/main/java/backtraceio/library/models/database/BacktraceDatabaseRecordWriter.java index bce30d6a2..9675b4407 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/database/BacktraceDatabaseRecordWriter.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/database/BacktraceDatabaseRecordWriter.java @@ -1,17 +1,16 @@ package backtraceio.library.models.database; +import backtraceio.library.common.BacktraceSerializeHelper; +import backtraceio.library.interfaces.DatabaseRecordWriter; +import backtraceio.library.logger.BacktraceLogger; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; -import backtraceio.library.common.BacktraceSerializeHelper; -import backtraceio.library.interfaces.DatabaseRecordWriter; -import backtraceio.library.logger.BacktraceLogger; - public class BacktraceDatabaseRecordWriter implements DatabaseRecordWriter { - private static transient final String LOG_TAG = BacktraceDatabaseRecordWriter.class.getSimpleName(); + private static final transient String LOG_TAG = BacktraceDatabaseRecordWriter.class.getSimpleName(); /** * Path to destination directory @@ -71,7 +70,8 @@ private void saveValidRecord(String sourcePath, String destinationPath) throws I boolean renameResult = fromFile.renameTo(toFile); if (!renameResult) { BacktraceLogger.e(LOG_TAG, "Can not rename file"); - throw new IOException(String.format("Can not rename file. Source path: %s, destination path: %s", sourcePath, destinationPath)); + throw new IOException(String.format( + "Can not rename file. Source path: %s, destination path: %s", sourcePath, destinationPath)); } } diff --git a/backtrace-library/src/main/java/backtraceio/library/models/database/BacktraceDatabaseSettings.java b/backtrace-library/src/main/java/backtraceio/library/models/database/BacktraceDatabaseSettings.java index 14b5cf1fe..475981332 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/database/BacktraceDatabaseSettings.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/database/BacktraceDatabaseSettings.java @@ -56,7 +56,6 @@ public BacktraceDatabaseSettings(String path, RetryOrder retryOrder) { /** * Maximum database size in MB. If value is equal to zero, then size is unlimited */ - public long getMaxDatabaseSize() { return _maxDatabaseSize * 1000 * 1000; } @@ -126,6 +125,4 @@ public RetryOrder getRetryOrder() { public void setRetryOrder(RetryOrder retryOrder) { this.retryOrder = retryOrder; } - - } diff --git a/backtrace-library/src/main/java/backtraceio/library/models/json/Annotations.java b/backtrace-library/src/main/java/backtraceio/library/models/json/Annotations.java index d8a315db8..0af87f2b6 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/json/Annotations.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/json/Annotations.java @@ -31,5 +31,4 @@ class AnnotationException { public Object getMessage() { return message; } - -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/models/json/BacktraceAttributes.java b/backtrace-library/src/main/java/backtraceio/library/models/json/BacktraceAttributes.java index 93d13993e..c4d168f2f 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/json/BacktraceAttributes.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/json/BacktraceAttributes.java @@ -7,12 +7,6 @@ import android.util.DisplayMetrics; import android.view.Display; import android.view.WindowManager; - -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.UUID; - import backtraceio.library.BacktraceClient; import backtraceio.library.common.ApplicationMetadataCache; import backtraceio.library.common.BacktraceStringHelper; @@ -20,6 +14,10 @@ import backtraceio.library.enums.ScreenOrientation; import backtraceio.library.models.attributes.ReportDataAttributes; import backtraceio.library.models.attributes.ReportDataBuilder; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.UUID; /** * Class instance to get a built-in attributes from current application @@ -52,8 +50,7 @@ public class BacktraceAttributes { * @param report received Backtrace report * @param clientAttributes client's attributes (report and client) */ - public BacktraceAttributes(Context context, BacktraceReport report, Map - clientAttributes) { + public BacktraceAttributes(Context context, BacktraceReport report, Map clientAttributes) { this(context, report, clientAttributes, true); } @@ -61,8 +58,11 @@ public BacktraceAttributes(Context context, Map clientAttributes this(context, null, clientAttributes, false); } - public BacktraceAttributes(Context context, BacktraceReport report, Map - clientAttributes, Boolean includeDynamicAttributes) { + public BacktraceAttributes( + Context context, + BacktraceReport report, + Map clientAttributes, + Boolean includeDynamicAttributes) { this.context = context; if (report != null) { this.convertReportAttributes(report); @@ -142,7 +142,7 @@ private void setScreenInformation(Boolean includeDynamicAttributes) { * @param report received report */ private void setExceptionAttributes(BacktraceReport report) { - //there is no information to analyse + // there is no information to analyse if (report == null) { return; } @@ -175,10 +175,7 @@ private ScreenOrientation getScreenOrientation() { * @return screen backlight brightness between 0 and 255 */ private int getScreenBrightness() { - return Settings.System.getInt( - this.context.getContentResolver(), - Settings.System.SCREEN_BRIGHTNESS, - 0); + return Settings.System.getInt(this.context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 0); } /** @@ -204,7 +201,6 @@ private void convertAttributes(Map clientAttributes) { this.complexAttributes.putAll(data.getAnnotations()); } - public Map getAllAttributes() { Map attributes = new HashMap(); attributes.putAll(this.attributes); diff --git a/backtrace-library/src/main/java/backtraceio/library/models/json/BacktraceReport.java b/backtrace-library/src/main/java/backtraceio/library/models/json/BacktraceReport.java index fe9963944..a38195541 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/json/BacktraceReport.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/json/BacktraceReport.java @@ -1,19 +1,17 @@ package backtraceio.library.models.json; import android.content.Context; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - import backtraceio.library.common.BacktraceTimeHelper; import backtraceio.library.common.CollectionUtils; import backtraceio.library.models.BacktraceAttributeConsts; import backtraceio.library.models.BacktraceData; import backtraceio.library.models.BacktraceStackFrame; import backtraceio.library.models.BacktraceStackTrace; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; /** * Captured application error @@ -67,9 +65,7 @@ public class BacktraceReport { * * @param message custom client message */ - public BacktraceReport( - String message - ) { + public BacktraceReport(String message) { this((Exception) null, null, null); this.message = message; } @@ -81,10 +77,7 @@ public BacktraceReport( * @param message custom client message * @param attributes additional information about application state */ - public BacktraceReport( - String message, - Map attributes - ) { + public BacktraceReport(String message, Map attributes) { this((Exception) null, attributes, null); this.message = message; } @@ -96,14 +89,10 @@ public BacktraceReport( * @param message custom client message * @param attachmentPaths path to all report attachments */ - public BacktraceReport( - String message, - List attachmentPaths - ) { + public BacktraceReport(String message, List attachmentPaths) { this(message, null, attachmentPaths); } - /** * Create new instance of Backtrace report to send a report * with custom client message, attributes and attachments @@ -112,11 +101,7 @@ public BacktraceReport( * @param attributes additional information about application state * @param attachmentPaths path to all report attachments */ - public BacktraceReport( - String message, - Map attributes, - List attachmentPaths - ) { + public BacktraceReport(String message, Map attributes, List attachmentPaths) { this((Exception) null, attributes, attachmentPaths); this.message = message; } @@ -127,8 +112,7 @@ public BacktraceReport( * * @param exception current exception */ - public BacktraceReport( - Throwable exception) { + public BacktraceReport(Throwable exception) { this(exception, null, null); } @@ -139,9 +123,7 @@ public BacktraceReport( * @param exception current exception * @param attributes additional information about application state */ - public BacktraceReport( - Throwable exception, - Map attributes) { + public BacktraceReport(Throwable exception, Map attributes) { this(exception, attributes, null); } @@ -152,9 +134,7 @@ public BacktraceReport( * @param exception current exception * @param attachmentPaths path to all report attachments */ - public BacktraceReport( - Exception exception, - List attachmentPaths) { + public BacktraceReport(Exception exception, List attachmentPaths) { this(exception, null, attachmentPaths); } @@ -181,12 +161,16 @@ public BacktraceReport(Throwable throwable, Map attributes, List this.setDefaultErrorTypeAttribute(); } - public BacktraceReport(UUID uuid, long timestamp, - boolean exceptionTypeReport, String classifier, - Map attributes, - String message, Exception exception, - List attachmentPaths, - List diagnosticStack) { + public BacktraceReport( + UUID uuid, + long timestamp, + boolean exceptionTypeReport, + String classifier, + Map attributes, + String message, + Exception exception, + List attachmentPaths, + List diagnosticStack) { this.uuid = uuid; this.timestamp = timestamp; this.exceptionTypeReport = exceptionTypeReport; @@ -205,10 +189,8 @@ public BacktraceReport(UUID uuid, long timestamp, * @param attributes attributes to concatenate * @return concatenated map of attributes from report and from passed attributes */ - public static Map concatAttributes( - BacktraceReport report, Map attributes) { - Map reportAttributes = report.attributes != null ? report.attributes : - new HashMap<>(); + public static Map concatAttributes(BacktraceReport report, Map attributes) { + Map reportAttributes = report.attributes != null ? report.attributes : new HashMap<>(); if (attributes == null) { return reportAttributes; } @@ -266,9 +248,12 @@ public BacktraceData toBacktraceData(Context context, Map client return toBacktraceData(context, clientAttributes, false); } - public BacktraceData toBacktraceData(Context context, Map clientAttributes, boolean isProguardEnabled) { + public BacktraceData toBacktraceData( + Context context, Map clientAttributes, boolean isProguardEnabled) { final String symbolication = isProguardEnabled ? "proguard" : null; - return new BacktraceData.Builder(this).setAttributes(context, clientAttributes).setSymbolication(symbolication).build(); + return new BacktraceData.Builder(this) + .setAttributes(context, clientAttributes) + .setSymbolication(symbolication) + .build(); } } - diff --git a/backtrace-library/src/main/java/backtraceio/library/models/json/SourceCode.java b/backtrace-library/src/main/java/backtraceio/library/models/json/SourceCode.java index 7ff04dce5..3a70da038 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/json/SourceCode.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/json/SourceCode.java @@ -1,8 +1,7 @@ package backtraceio.library.models.json; -import com.google.gson.annotations.SerializedName; - import backtraceio.library.models.BacktraceStackFrame; +import com.google.gson.annotations.SerializedName; /** * Single instance of source data frame @@ -20,7 +19,6 @@ public class SourceCode { @SerializedName("path") public String sourceCodeFileName; - public SourceCode(BacktraceStackFrame stackFrame) { this(stackFrame.line, stackFrame.sourceCodeFileName); } diff --git a/backtrace-library/src/main/java/backtraceio/library/models/json/SourceCodeData.java b/backtrace-library/src/main/java/backtraceio/library/models/json/SourceCodeData.java index 640a7188a..95d7ec3b5 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/json/SourceCodeData.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/json/SourceCodeData.java @@ -1,17 +1,16 @@ package backtraceio.library.models.json; +import backtraceio.library.logger.BacktraceLogger; +import backtraceio.library.models.BacktraceStackFrame; import java.util.HashMap; import java.util.List; import java.util.Map; -import backtraceio.library.logger.BacktraceLogger; -import backtraceio.library.models.BacktraceStackFrame; - /** * Collect all source data information about current program */ public class SourceCodeData { - private static transient final String LOG_TAG = SourceCodeData.class.getSimpleName(); + private static final transient String LOG_TAG = SourceCodeData.class.getSimpleName(); /** * Source code information about current executed program @@ -35,4 +34,4 @@ public SourceCodeData(List exceptionStack) { data.put(id, value); } } -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/models/json/ThreadData.java b/backtrace-library/src/main/java/backtraceio/library/models/json/ThreadData.java index 14d9064f3..540d09ab6 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/json/ThreadData.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/json/ThreadData.java @@ -1,12 +1,11 @@ package backtraceio.library.models.json; +import backtraceio.library.models.BacktraceStackFrame; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import backtraceio.library.models.BacktraceStackFrame; - /** * Generate information about application threads */ @@ -50,9 +49,7 @@ public String getMainThread() { private void generateCurrentThreadInformation(List exceptionStack) { Thread currThread = Thread.currentThread(); mainThread = currThread.getName().toLowerCase(); - this.threadInformation.put(mainThread, - new ThreadInformation(currThread, exceptionStack, true) - ); + this.threadInformation.put(mainThread, new ThreadInformation(currThread, exceptionStack, true)); } /** @@ -77,8 +74,7 @@ private void processThreads() { stackFrame.add(BacktraceStackFrame.fromStackTraceElement(stackTraceElement)); } } - this.threadInformation.put(threadName, new ThreadInformation(thread, stackFrame, - false)); + this.threadInformation.put(threadName, new ThreadInformation(thread, stackFrame, false)); } } } diff --git a/backtrace-library/src/main/java/backtraceio/library/models/json/ThreadInformation.java b/backtrace-library/src/main/java/backtraceio/library/models/json/ThreadInformation.java index 8dbf19443..e5903783c 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/json/ThreadInformation.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/json/ThreadInformation.java @@ -1,12 +1,10 @@ package backtraceio.library.models.json; +import backtraceio.library.models.BacktraceStackFrame; import com.google.gson.annotations.SerializedName; - import java.util.ArrayList; import java.util.List; -import backtraceio.library.models.BacktraceStackFrame; - /** * Get an information about single thread passed in constructor */ @@ -38,8 +36,7 @@ public class ThreadInformation { * @param fault denotes whether a thread is a faulting thread - in most cases main thread * @param stack exception stack information */ - public ThreadInformation(String threadName, Boolean fault, List - stack) { + public ThreadInformation(String threadName, Boolean fault, List stack) { this.stack = stack == null ? new ArrayList<>() : stack; this.name = threadName; this.fault = fault; diff --git a/backtrace-library/src/main/java/backtraceio/library/models/metrics/Event.java b/backtrace-library/src/main/java/backtraceio/library/models/metrics/Event.java index 6c475a5fd..9182d6b0a 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/metrics/Event.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/metrics/Event.java @@ -1,12 +1,9 @@ package backtraceio.library.models.metrics; import com.google.gson.annotations.SerializedName; - import java.util.HashMap; import java.util.Map; -import backtraceio.library.common.BacktraceStringHelper; - public abstract class Event { @SerializedName("timestamp") diff --git a/backtrace-library/src/main/java/backtraceio/library/models/metrics/EventsPayload.java b/backtrace-library/src/main/java/backtraceio/library/models/metrics/EventsPayload.java index f07d9241c..21e2c4a7e 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/metrics/EventsPayload.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/metrics/EventsPayload.java @@ -1,7 +1,6 @@ package backtraceio.library.models.metrics; import com.google.gson.annotations.SerializedName; - import java.util.concurrent.ConcurrentLinkedDeque; public abstract class EventsPayload { diff --git a/backtrace-library/src/main/java/backtraceio/library/models/metrics/EventsResult.java b/backtrace-library/src/main/java/backtraceio/library/models/metrics/EventsResult.java index f828368a7..3eff9fd7d 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/metrics/EventsResult.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/metrics/EventsResult.java @@ -50,10 +50,7 @@ public EventsResult(EventsPayload payload, String message, BacktraceResultStatus * @return BacktraceResult with exception information */ public static EventsResult OnError(EventsPayload payload, Exception exception, int statusCode) { - return new EventsResult( - payload, exception.getMessage(), - BacktraceResultStatus.ServerError, - statusCode); + return new EventsResult(payload, exception.getMessage(), BacktraceResultStatus.ServerError, statusCode); } public EventsPayload getEventsPayload() { diff --git a/backtrace-library/src/main/java/backtraceio/library/models/metrics/SummedEvent.java b/backtrace-library/src/main/java/backtraceio/library/models/metrics/SummedEvent.java index bcd8efb8c..f5d163374 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/metrics/SummedEvent.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/metrics/SummedEvent.java @@ -1,12 +1,9 @@ package backtraceio.library.models.metrics; +import backtraceio.library.common.BacktraceTimeHelper; import com.google.gson.annotations.SerializedName; - -import java.util.HashMap; import java.util.Map; -import backtraceio.library.common.BacktraceTimeHelper; - public final class SummedEvent extends Event { @SerializedName("metric_group") diff --git a/backtrace-library/src/main/java/backtraceio/library/models/metrics/SummedEventsPayload.java b/backtrace-library/src/main/java/backtraceio/library/models/metrics/SummedEventsPayload.java index fe4838033..1e50ef5d6 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/metrics/SummedEventsPayload.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/metrics/SummedEventsPayload.java @@ -1,7 +1,6 @@ package backtraceio.library.models.metrics; import com.google.gson.annotations.SerializedName; - import java.util.concurrent.ConcurrentLinkedDeque; public class SummedEventsPayload extends EventsPayload { diff --git a/backtrace-library/src/main/java/backtraceio/library/models/metrics/UniqueEvent.java b/backtrace-library/src/main/java/backtraceio/library/models/metrics/UniqueEvent.java index 151bbe930..826b73804 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/metrics/UniqueEvent.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/metrics/UniqueEvent.java @@ -1,19 +1,16 @@ package backtraceio.library.models.metrics; +import backtraceio.library.common.BacktraceStringHelper; +import backtraceio.library.common.BacktraceTimeHelper; +import backtraceio.library.logger.BacktraceLogger; import com.google.gson.annotations.SerializedName; - import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; -import backtraceio.library.common.BacktraceStringHelper; -import backtraceio.library.common.BacktraceTimeHelper; -import backtraceio.library.logger.BacktraceLogger; - public class UniqueEvent extends Event { - private final static transient String LOG_TAG = UniqueEvent.class.getSimpleName(); + private static final transient String LOG_TAG = UniqueEvent.class.getSimpleName(); /** * Unique events API spec requires unique events to be a JSON array, but we still treat it as a single string @@ -31,9 +28,11 @@ public UniqueEvent(String name, Map attributes) { public UniqueEvent(String name, long timestamp, Map attributes) { super(timestamp); - this.name = new ArrayList() {{ - add(name); - }}; + this.name = new ArrayList() { + { + add(name); + } + }; addAttributesImpl(attributes); } diff --git a/backtrace-library/src/main/java/backtraceio/library/models/metrics/UniqueEventsPayload.java b/backtrace-library/src/main/java/backtraceio/library/models/metrics/UniqueEventsPayload.java index 1f1b06efc..edd13860f 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/metrics/UniqueEventsPayload.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/metrics/UniqueEventsPayload.java @@ -1,7 +1,6 @@ package backtraceio.library.models.metrics; import com.google.gson.annotations.SerializedName; - import java.util.concurrent.ConcurrentLinkedDeque; public final class UniqueEventsPayload extends EventsPayload { diff --git a/backtrace-library/src/main/java/backtraceio/library/models/nativeHandler/CrashHandlerConfiguration.java b/backtrace-library/src/main/java/backtraceio/library/models/nativeHandler/CrashHandlerConfiguration.java index ad9bcff61..67195bd1f 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/nativeHandler/CrashHandlerConfiguration.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/nativeHandler/CrashHandlerConfiguration.java @@ -2,7 +2,8 @@ import android.content.pm.ApplicationInfo; import android.text.TextUtils; - +import backtraceio.library.common.AbiHelper; +import backtraceio.library.services.BacktraceCrashHandlerRunner; import java.io.File; import java.util.ArrayList; import java.util.Arrays; @@ -11,18 +12,14 @@ import java.util.Map; import java.util.Set; -import backtraceio.library.common.AbiHelper; -import backtraceio.library.services.BacktraceCrashHandlerRunner; - public class CrashHandlerConfiguration { public static final String BACKTRACE_CRASH_HANDLER = "BACKTRACE_CRASH_HANDLER"; - public static final Set UNSUPPORTED_ABIS = new HashSet(Arrays.asList(new String[]{"x86"})); + public static final Set UNSUPPORTED_ABIS = new HashSet(Arrays.asList(new String[] {"x86"})); private static final String CRASHPAD_DIRECTORY_PATH = "/crashpad"; private static final String BACKTRACE_NATIVE_LIBRARY_NAME = "libbacktrace-native.so"; - public Boolean isSupportedAbi() { return isSupportedAbi(AbiHelper.getCurrentAbi()); } @@ -36,15 +33,15 @@ public String getClassPath() { } public List getCrashHandlerEnvironmentVariables(ApplicationInfo applicationInfo) { - return getCrashHandlerEnvironmentVariables(applicationInfo.sourceDir, applicationInfo.nativeLibraryDir, AbiHelper.getCurrentAbi()); + return getCrashHandlerEnvironmentVariables( + applicationInfo.sourceDir, applicationInfo.nativeLibraryDir, AbiHelper.getCurrentAbi()); } public List getCrashHandlerEnvironmentVariables(String apkPath, String nativeLibraryDirPath, String arch) { final List environmentVariables = new ArrayList<>(); // convert available in the system environment variables - for (Map.Entry variable : - System.getenv().entrySet()) { + for (Map.Entry variable : System.getenv().entrySet()) { environmentVariables.add(String.format("%s=%s", variable.getKey(), variable.getValue())); } // extend system-specific environment variables, with variables needed to properly run app_process via crashpad @@ -52,11 +49,12 @@ public List getCrashHandlerEnvironmentVariables(String apkPath, String n String backtraceNativeLibraryPath = getBacktraceNativeLibraryPath(nativeLibraryDirPath, apkPath, arch); File allNativeLibrariesDirectory = nativeLibraryDirectory.getParentFile(); - String allPossibleLibrarySearchPaths = TextUtils.join(File.pathSeparator, new String[]{ - nativeLibraryDirPath, - allNativeLibrariesDirectory.getPath(), - System.getProperty("java.library.path"), - "/data/local"}); + String allPossibleLibrarySearchPaths = TextUtils.join(File.pathSeparator, new String[] { + nativeLibraryDirPath, + allNativeLibrariesDirectory.getPath(), + System.getProperty("java.library.path"), + "/data/local" + }); environmentVariables.add(String.format("CLASSPATH=%s", apkPath)); environmentVariables.add(String.format("%s=%s", BACKTRACE_CRASH_HANDLER, backtraceNativeLibraryPath)); diff --git a/backtrace-library/src/main/java/backtraceio/library/models/types/BacktraceResultStatus.java b/backtrace-library/src/main/java/backtraceio/library/models/types/BacktraceResultStatus.java index dd570907a..114065fbd 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/types/BacktraceResultStatus.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/types/BacktraceResultStatus.java @@ -26,4 +26,4 @@ public static BacktraceResultStatus enumOf(String val) { throw new IllegalArgumentException("Invalid BacktraceResultStatus enum value"); } } -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/models/types/HttpException.java b/backtrace-library/src/main/java/backtraceio/library/models/types/HttpException.java index ea775c009..140aa3e0b 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/types/HttpException.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/types/HttpException.java @@ -59,4 +59,4 @@ public int getHttpStatus() { private void setHttpStatus(int httpStatus) { this.httpStatus = httpStatus; } -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/nativeCalls/BacktraceCrashHandler.java b/backtrace-library/src/main/java/backtraceio/library/nativeCalls/BacktraceCrashHandler.java index f97200f0c..afc5a4aa7 100644 --- a/backtrace-library/src/main/java/backtraceio/library/nativeCalls/BacktraceCrashHandler.java +++ b/backtrace-library/src/main/java/backtraceio/library/nativeCalls/BacktraceCrashHandler.java @@ -5,11 +5,22 @@ public class BacktraceCrashHandler { public static native boolean handleCrash(String[] args); - public static native boolean initializeJavaCrashHandler(String url, String databasePath, String classPath, String[] attributeKeys, String[] attributeValues, - String[] attachmentPaths, String[] environmentVariables); - - public static native boolean initializeCrashHandler(String url, String databasePath, String handlerPath, - String[] attributeKeys, String[] attributeValues, - String[] attachmentPaths, boolean enableClientSideUnwinding, - UnwindingMode unwindingMode); -} \ No newline at end of file + public static native boolean initializeJavaCrashHandler( + String url, + String databasePath, + String classPath, + String[] attributeKeys, + String[] attributeValues, + String[] attachmentPaths, + String[] environmentVariables); + + public static native boolean initializeCrashHandler( + String url, + String databasePath, + String handlerPath, + String[] attributeKeys, + String[] attributeValues, + String[] attachmentPaths, + boolean enableClientSideUnwinding, + UnwindingMode unwindingMode); +} diff --git a/backtrace-library/src/main/java/backtraceio/library/nativeCalls/BacktraceCrashHandlerWrapper.java b/backtrace-library/src/main/java/backtraceio/library/nativeCalls/BacktraceCrashHandlerWrapper.java index 730380a1b..945843553 100644 --- a/backtrace-library/src/main/java/backtraceio/library/nativeCalls/BacktraceCrashHandlerWrapper.java +++ b/backtrace-library/src/main/java/backtraceio/library/nativeCalls/BacktraceCrashHandlerWrapper.java @@ -8,15 +8,35 @@ public boolean handleCrash(String[] args) { return BacktraceCrashHandler.handleCrash(args); } - public boolean initializeJavaCrashHandler(String url, String databasePath, String classPath, String[] attributeKeys, String[] attributeValues, - String[] attachmentPaths, String[] environmentVariables) { - return BacktraceCrashHandler.initializeJavaCrashHandler(url, databasePath, classPath, attributeKeys, attributeValues, attachmentPaths, environmentVariables); + public boolean initializeJavaCrashHandler( + String url, + String databasePath, + String classPath, + String[] attributeKeys, + String[] attributeValues, + String[] attachmentPaths, + String[] environmentVariables) { + return BacktraceCrashHandler.initializeJavaCrashHandler( + url, databasePath, classPath, attributeKeys, attributeValues, attachmentPaths, environmentVariables); } - public boolean initializeCrashHandler(String url, String databasePath, String handlerPath, - String[] attributeKeys, String[] attributeValues, - String[] attachmentPaths, boolean enableClientSideUnwinding, - UnwindingMode unwindingMode) { - return BacktraceCrashHandler.initializeCrashHandler(url, databasePath, handlerPath, attributeKeys, attributeValues, attachmentPaths, enableClientSideUnwinding, unwindingMode); + public boolean initializeCrashHandler( + String url, + String databasePath, + String handlerPath, + String[] attributeKeys, + String[] attributeValues, + String[] attachmentPaths, + boolean enableClientSideUnwinding, + UnwindingMode unwindingMode) { + return BacktraceCrashHandler.initializeCrashHandler( + url, + databasePath, + handlerPath, + attributeKeys, + attributeValues, + attachmentPaths, + enableClientSideUnwinding, + unwindingMode); } } diff --git a/backtrace-library/src/main/java/backtraceio/library/nativeCalls/SystemLoader.java b/backtrace-library/src/main/java/backtraceio/library/nativeCalls/SystemLoader.java index c6104368e..ce9283d69 100644 --- a/backtrace-library/src/main/java/backtraceio/library/nativeCalls/SystemLoader.java +++ b/backtrace-library/src/main/java/backtraceio/library/nativeCalls/SystemLoader.java @@ -4,5 +4,4 @@ public class SystemLoader { public void loadLibrary(String path) { System.load(path); } - } diff --git a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceApi.java b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceApi.java index 4e3bc6081..bb026bf53 100644 --- a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceApi.java +++ b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceApi.java @@ -1,7 +1,6 @@ package backtraceio.library.services; import android.content.Context; - import backtraceio.library.BacktraceCredentials; import backtraceio.library.events.EventsOnServerResponseEventListener; import backtraceio.library.events.EventsRequestHandler; @@ -19,8 +18,7 @@ */ public class BacktraceApi implements Api { - private final static transient String LOG_TAG = BacktraceApi.class.getSimpleName(); - + private static final transient String LOG_TAG = BacktraceApi.class.getSimpleName(); private final transient BacktraceHandlerThread threadSender; @@ -66,14 +64,14 @@ public class BacktraceApi implements Api { */ public BacktraceApi(Context context, BacktraceCredentials credentials) { if (credentials == null) { - BacktraceLogger.e(LOG_TAG, "BacktraceCredentials parameter passed to BacktraceApi " + - "constructor is null"); + BacktraceLogger.e( + LOG_TAG, "BacktraceCredentials parameter passed to BacktraceApi " + "constructor is null"); throw new IllegalArgumentException("BacktraceCredentials cannot be null"); } this.reportSubmissionUrl = credentials.getSubmissionUrl().toString(); - threadSender = new BacktraceHandlerThread(context, BacktraceHandlerThread.class.getSimpleName(), - this.reportSubmissionUrl); + threadSender = new BacktraceHandlerThread( + context, BacktraceHandlerThread.class.getSimpleName(), this.reportSubmissionUrl); } @Override @@ -118,22 +116,22 @@ public SummedEventsHandler enableSummedEvents(BacktraceMetrics backtraceMetrics) */ @Override public void send(BacktraceData data, OnServerResponseEventListener callback) { - BacktraceHandlerInputReport input = new BacktraceHandlerInputReport(data, callback, - this.onServerError, this.requestHandler); + BacktraceHandlerInputReport input = + new BacktraceHandlerInputReport(data, callback, this.onServerError, this.requestHandler); threadSender.sendReport(input); } @Override public void sendEventsPayload(UniqueEventsPayload payload) { - BacktraceHandlerInputEvents input = new BacktraceHandlerInputEvents(payload, this.uniqueEventsServerResponse, - this.onServerError, this.uniqueEventsRequestHandler); + BacktraceHandlerInputEvents input = new BacktraceHandlerInputEvents( + payload, this.uniqueEventsServerResponse, this.onServerError, this.uniqueEventsRequestHandler); threadSender.sendUniqueEvents(input); } @Override public void sendEventsPayload(SummedEventsPayload payload) { - BacktraceHandlerInputEvents input = new BacktraceHandlerInputEvents(payload, this.summedEventsServerResponse, - this.onServerError, this.summedEventsRequestHandler); + BacktraceHandlerInputEvents input = new BacktraceHandlerInputEvents( + payload, this.summedEventsServerResponse, this.onServerError, this.summedEventsRequestHandler); threadSender.sendSummedEvents(input); } } diff --git a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceCrashHandlerRunner.java b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceCrashHandlerRunner.java index fabd6b0c8..ad5b8fd61 100644 --- a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceCrashHandlerRunner.java +++ b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceCrashHandlerRunner.java @@ -1,12 +1,10 @@ package backtraceio.library.services; import android.util.Log; - -import java.util.Map; - import backtraceio.library.models.nativeHandler.CrashHandlerConfiguration; import backtraceio.library.nativeCalls.BacktraceCrashHandlerWrapper; import backtraceio.library.nativeCalls.SystemLoader; +import java.util.Map; public class BacktraceCrashHandlerRunner { private static final String LOG_TAG = BacktraceCrashHandlerRunner.class.getSimpleName(); @@ -35,16 +33,21 @@ public boolean run(String[] args, Map environmentVariables) { String crashHandlerLibrary = environmentVariables.get(CrashHandlerConfiguration.BACKTRACE_CRASH_HANDLER); if (crashHandlerLibrary == null) { - Log.e(LOG_TAG, String.format("Cannot capture crash dump. Cannot find %s environment variable", CrashHandlerConfiguration.BACKTRACE_CRASH_HANDLER)); + Log.e( + LOG_TAG, + String.format( + "Cannot capture crash dump. Cannot find %s environment variable", + CrashHandlerConfiguration.BACKTRACE_CRASH_HANDLER)); return false; } - loader.loadLibrary(crashHandlerLibrary); boolean result = crashHandler.handleCrash(args); if (!result) { - Log.e(LOG_TAG, String.format("Cannot capture crash dump. Invocation parameters: %s", String.join(" ", args))); + Log.e( + LOG_TAG, + String.format("Cannot capture crash dump. Invocation parameters: %s", String.join(" ", args))); return false; } diff --git a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceDatabaseContext.java b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceDatabaseContext.java index 499720bff..fcc6f03f0 100644 --- a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceDatabaseContext.java +++ b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceDatabaseContext.java @@ -1,7 +1,12 @@ package backtraceio.library.services; import android.content.Context; - +import backtraceio.library.enums.database.RetryOrder; +import backtraceio.library.interfaces.DatabaseContext; +import backtraceio.library.logger.BacktraceLogger; +import backtraceio.library.models.BacktraceData; +import backtraceio.library.models.database.BacktraceDatabaseRecord; +import backtraceio.library.models.database.BacktraceDatabaseSettings; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; @@ -13,13 +18,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import backtraceio.library.enums.database.RetryOrder; -import backtraceio.library.interfaces.DatabaseContext; -import backtraceio.library.logger.BacktraceLogger; -import backtraceio.library.models.BacktraceData; -import backtraceio.library.models.database.BacktraceDatabaseRecord; -import backtraceio.library.models.database.BacktraceDatabaseSettings; - public class BacktraceDatabaseContext implements DatabaseContext { private static final transient String LOG_TAG = BacktraceDatabaseContext.class.getSimpleName(); @@ -150,9 +148,7 @@ public BacktraceDatabaseRecord add(BacktraceDatabaseRecord backtraceDatabaseReco * @return first Backtrace database record */ public BacktraceDatabaseRecord first() { - return retryOrder == RetryOrder.Queue - ? getFirstRecord() - : getLastRecord(); + return retryOrder == RetryOrder.Queue ? getFirstRecord() : getLastRecord(); } /** @@ -164,7 +160,6 @@ public BacktraceDatabaseRecord last() { return this.retryOrder == RetryOrder.Queue ? getLastRecord() : getFirstRecord(); } - /** * Get all database records * @@ -187,7 +182,6 @@ public long getDatabaseSize() { return this.totalSize.get(); } - /** * Delete existing record from database * @@ -219,8 +213,10 @@ public boolean delete(BacktraceDatabaseRecord record) { this.totalSize.addAndGet(-databaseRecord.getSize()); return true; } catch (Exception e) { - BacktraceLogger.d(LOG_TAG, "Exception on removing record " - + databaseRecord.id + " from db context: " + e.getMessage()); + BacktraceLogger.d( + LOG_TAG, + "Exception on removing record " + databaseRecord.id + " from db context: " + + e.getMessage()); } } } @@ -288,7 +284,7 @@ public void clear() { } } - /** + /** * Delete the oldest file * * @return is deletion was successful diff --git a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceDatabaseFileContext.java b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceDatabaseFileContext.java index 8b10dbe2e..12e199973 100644 --- a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceDatabaseFileContext.java +++ b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceDatabaseFileContext.java @@ -1,5 +1,9 @@ package backtraceio.library.services; +import backtraceio.library.common.FileHelper; +import backtraceio.library.interfaces.DatabaseFileContext; +import backtraceio.library.logger.BacktraceLogger; +import backtraceio.library.models.database.BacktraceDatabaseRecord; import java.io.File; import java.util.ArrayList; import java.util.Arrays; @@ -7,11 +11,6 @@ import java.util.List; import java.util.regex.Pattern; -import backtraceio.library.common.FileHelper; -import backtraceio.library.interfaces.DatabaseFileContext; -import backtraceio.library.logger.BacktraceLogger; -import backtraceio.library.models.database.BacktraceDatabaseRecord; - public class BacktraceDatabaseFileContext implements DatabaseFileContext { private static final transient String LOG_TAG = BacktraceDatabaseFileContext.class.getSimpleName(); @@ -51,7 +50,8 @@ public Iterable getAll() { public Iterable getRecords() { BacktraceLogger.d(LOG_TAG, "Getting files from file context"); final Pattern p = Pattern.compile(this.recordFilterRegex); - File[] pagesTemplates = this._databaseDirectory.listFiles(f -> p.matcher(f.getName()).matches()); + File[] pagesTemplates = + this._databaseDirectory.listFiles(f -> p.matcher(f.getName()).matches()); if (pagesTemplates == null) { return Collections.emptyList(); } @@ -139,4 +139,4 @@ public void clear() { file.delete(); } } -} \ No newline at end of file +} diff --git a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceEventsHandler.java b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceEventsHandler.java index 6d0ad44d4..599841f15 100644 --- a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceEventsHandler.java +++ b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceEventsHandler.java @@ -2,10 +2,6 @@ import android.os.Handler; import android.os.Message; - -import java.net.HttpURLConnection; -import java.util.concurrent.ConcurrentLinkedDeque; - import backtraceio.library.common.BacktraceMathHelper; import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.interfaces.Api; @@ -13,10 +9,12 @@ import backtraceio.library.models.metrics.Event; import backtraceio.library.models.metrics.EventsPayload; import backtraceio.library.models.metrics.EventsResult; +import java.net.HttpURLConnection; +import java.util.concurrent.ConcurrentLinkedDeque; abstract class BacktraceEventsHandler extends Handler { - private final static transient String LOG_TAG = BacktraceEventsHandler.class.getSimpleName(); + private static final transient String LOG_TAG = BacktraceEventsHandler.class.getSimpleName(); protected final BacktraceHandlerThread backtraceHandlerThread; @@ -59,10 +57,11 @@ abstract class BacktraceEventsHandler extends Handler { * @param backtraceHandlerThread Backtrace handler thread object * @param urlPrefix Url routing prefix for metrics */ - public BacktraceEventsHandler(BacktraceMetrics backtraceMetrics, - Api api, - final BacktraceHandlerThread backtraceHandlerThread, - String urlPrefix) { + public BacktraceEventsHandler( + BacktraceMetrics backtraceMetrics, + Api api, + final BacktraceHandlerThread backtraceHandlerThread, + String urlPrefix) { // This should always have a nonnull looper because BacktraceHandlerThread starts in the // constructor and getLooper blocks until the looper is ready if the thread is started // @@ -79,16 +78,18 @@ public BacktraceEventsHandler(BacktraceMetrics backtraceMetrics, this.timeBetweenRetriesMillis = backtraceMetrics.settings.getTimeBetweenRetriesMillis(); long timeIntervalMillis = backtraceMetrics.settings.getTimeIntervalMillis(); - + if (timeIntervalMillis != 0) { final BacktraceEventsHandler handler = this; - handler.postDelayed(new Runnable() { - @Override - public void run() { - handler.send(); - handler.postDelayed(this, timeIntervalMillis); - } - }, timeIntervalMillis); + handler.postDelayed( + new Runnable() { + @Override + public void run() { + handler.send(); + handler.postDelayed(this, timeIntervalMillis); + } + }, + timeIntervalMillis); } } @@ -155,7 +156,8 @@ private EventsResult getEventsResult(BacktraceHandlerInputEvents input) { } else { BacktraceLogger.d(LOG_TAG, "Sending report using default request handler"); String json = BacktraceSerializeHelper.toJson(input.payload); - result = BacktraceReportSender.sendEvents(submissionUrl, json, input.payload, input.serverErrorEventListener); + result = BacktraceReportSender.sendEvents( + submissionUrl, json, input.payload, input.serverErrorEventListener); } return result; @@ -169,14 +171,16 @@ private void retrySendEvents(BacktraceHandlerInputEvents input, int statusCode) return; } final BacktraceEventsHandler handler = this; - handler.postDelayed(new Runnable() { - @Override - public void run() { - EventsPayload payload = input.payload; - payload.setDroppedEvents(numRetries); - sendEventsPayload(payload); - } - }, calculateNextRetryTime(numRetries)); + handler.postDelayed( + new Runnable() { + @Override + public void run() { + EventsPayload payload = input.payload; + payload.setDroppedEvents(numRetries); + sendEventsPayload(payload); + } + }, + calculateNextRetryTime(numRetries)); } } } diff --git a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceHandlerInputEvents.java b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceHandlerInputEvents.java index afa506b8d..333be7a05 100644 --- a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceHandlerInputEvents.java +++ b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceHandlerInputEvents.java @@ -32,10 +32,11 @@ public class BacktraceHandlerInputEvents extends BacktraceHandlerInput { * @param serverErrorEventListener event callback that will be executed after receiving an error from the server * @param eventsRequestHandler event callback which will be executed instead of default sending report to Backtrace server */ - public BacktraceHandlerInputEvents(EventsPayload payload, - EventsOnServerResponseEventListener eventsOnServerResponseEventListener, - OnServerErrorEventListener serverErrorEventListener, - EventsRequestHandler eventsRequestHandler) { + public BacktraceHandlerInputEvents( + EventsPayload payload, + EventsOnServerResponseEventListener eventsOnServerResponseEventListener, + OnServerErrorEventListener serverErrorEventListener, + EventsRequestHandler eventsRequestHandler) { super(serverErrorEventListener); this.payload = payload; this.eventsOnServerResponseEventListener = eventsOnServerResponseEventListener; diff --git a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceHandlerInputReport.java b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceHandlerInputReport.java index c54ebe13e..5d21b038a 100644 --- a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceHandlerInputReport.java +++ b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceHandlerInputReport.java @@ -29,10 +29,11 @@ public class BacktraceHandlerInputReport extends BacktraceHandlerInput { * @param serverErrorEventListener event callback that will be executed after receiving an error from the server * @param requestHandler event callback which will be executed instead of default sending report to Backtrace server */ - BacktraceHandlerInputReport(BacktraceData data, - OnServerResponseEventListener serverResponseEventListener, - OnServerErrorEventListener serverErrorEventListener, - RequestHandler requestHandler) { + BacktraceHandlerInputReport( + BacktraceData data, + OnServerResponseEventListener serverResponseEventListener, + OnServerErrorEventListener serverErrorEventListener, + RequestHandler requestHandler) { super(serverErrorEventListener); this.data = data; this.serverResponseEventListener = serverResponseEventListener; diff --git a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceHandlerThread.java b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceHandlerThread.java index 900959a9c..875e9e881 100644 --- a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceHandlerThread.java +++ b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceHandlerThread.java @@ -5,14 +5,12 @@ import android.os.HandlerThread; import android.os.Looper; import android.os.Message; - -import java.util.List; - import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.interfaces.Api; import backtraceio.library.logger.BacktraceLogger; import backtraceio.library.models.BacktraceDataAttachmentsFileHelper; import backtraceio.library.models.BacktraceResult; +import java.util.List; public class BacktraceHandlerThread extends HandlerThread { @@ -57,7 +55,8 @@ Message createMessage(BacktraceHandlerInput data) { void sendReport(BacktraceHandlerInputReport data) { // Sometimes, sendReport gets called before the Looper is ready. - // getLooper will wait for the Looper to be ready: https://stackoverflow.com/questions/30300555/android-what-happens-after-a-handlerthread-is-started + // getLooper will wait for the Looper to be ready: + // https://stackoverflow.com/questions/30300555/android-what-happens-after-a-handlerthread-is-started if (mHandler == null) { mHandler = new BacktraceHandler(this.context, this.getLooper(), this.url); } @@ -94,9 +93,10 @@ public void handleMessage(Message msg) { } else { BacktraceLogger.d(LOG_TAG, "Sending report using default request handler"); String json = BacktraceSerializeHelper.toJson(mInput.data); - List attachments = BacktraceDataAttachmentsFileHelper.getValidAttachments(this.context, mInput.data); - result = BacktraceReportSender.sendReport(url, json, attachments, mInput.data.getReport(), - mInput.serverErrorEventListener); + List attachments = + BacktraceDataAttachmentsFileHelper.getValidAttachments(this.context, mInput.data); + result = BacktraceReportSender.sendReport( + url, json, attachments, mInput.data.getReport(), mInput.serverErrorEventListener); } if (mInput.serverResponseEventListener != null) { diff --git a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceMetrics.java b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceMetrics.java index 980c6f847..8ee6e7d63 100644 --- a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceMetrics.java +++ b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceMetrics.java @@ -1,12 +1,6 @@ package backtraceio.library.services; import android.content.Context; - -import org.jetbrains.annotations.NotNull; - -import java.util.Map; -import java.util.concurrent.ConcurrentLinkedDeque; - import backtraceio.library.BacktraceCredentials; import backtraceio.library.common.ApplicationMetadataCache; import backtraceio.library.common.BacktraceStringHelper; @@ -18,42 +12,45 @@ import backtraceio.library.interfaces.Metrics; import backtraceio.library.logger.BacktraceLogger; import backtraceio.library.models.BacktraceMetricsSettings; -import backtraceio.library.models.json.BacktraceAttributes; import backtraceio.library.models.attributes.ReportDataBuilder; +import backtraceio.library.models.json.BacktraceAttributes; import backtraceio.library.models.metrics.SummedEvent; import backtraceio.library.models.metrics.UniqueEvent; +import java.util.Map; +import java.util.concurrent.ConcurrentLinkedDeque; +import org.jetbrains.annotations.NotNull; public final class BacktraceMetrics implements Metrics { /** * Default time interval in min */ - public final static int defaultTimeIntervalInMin = 30; + public static final int defaultTimeIntervalInMin = 30; /** * Default time interval in milliseconds */ - public final static long defaultTimeIntervalMs = defaultTimeIntervalInMin * 60 * 1000; + public static final long defaultTimeIntervalMs = defaultTimeIntervalInMin * 60 * 1000; /** * Maximum number of attempts */ - public final static int maxNumberOfAttempts = 3; + public static final int maxNumberOfAttempts = 3; /** * Default time between retries in milliseconds */ - public final static int defaultTimeBetweenRetriesMs = 10000; + public static final int defaultTimeBetweenRetriesMs = 10000; /** * Maximum time between requests in milliseconds */ - public final static int maxTimeBetweenRetriesMs = 5 * 60 * 1000; + public static final int maxTimeBetweenRetriesMs = 5 * 60 * 1000; /** * Default submission url */ - public final static String defaultBaseUrl = "https://events.backtrace.io/api"; + public static final String defaultBaseUrl = "https://events.backtrace.io/api"; private static final transient String LOG_TAG = BacktraceMetrics.class.getSimpleName(); @@ -135,7 +132,11 @@ public final class BacktraceMetrics implements Metrics { * @param customReportAttributes Backtrace client custom report attributes (must be nonnull) * @param backtraceApi Backtrace API for metrics sending */ - public BacktraceMetrics(Context context, @NotNull Map customReportAttributes, Api backtraceApi, BacktraceCredentials credentials) { + public BacktraceMetrics( + Context context, + @NotNull Map customReportAttributes, + Api backtraceApi, + BacktraceCredentials credentials) { this.context = context; this.customReportAttributes = customReportAttributes; this.backtraceApi = backtraceApi; @@ -185,7 +186,7 @@ public void enable(BacktraceMetricsSettings settings, String uniqueEventName) { ApplicationMetadataCache applicationMetadata = ApplicationMetadataCache.getInstance(this.getContext()); this.applicationName = applicationMetadata.getApplicationName(); this.applicationVersion = applicationMetadata.getApplicationVersion(); - + final long startMetricsSetup = DebugHelper.getCurrentTimeMillis(); setStartupUniqueEventName(uniqueEventName); @@ -199,7 +200,8 @@ public void enable(BacktraceMetricsSettings settings, String uniqueEventName) { BacktraceLogger.e(LOG_TAG, "Could not enable metrics, exception " + e.getMessage()); } final long endMetricsSetup = DebugHelper.getCurrentTimeMillis(); - BacktraceLogger.d(LOG_TAG, "Setup metrics integration took " + (endMetricsSetup - startMetricsSetup) + " milliseconds"); + BacktraceLogger.d( + LOG_TAG, "Setup metrics integration took " + (endMetricsSetup - startMetricsSetup) + " milliseconds"); } /** @@ -209,10 +211,10 @@ public void enable(BacktraceMetricsSettings settings, String uniqueEventName) { * Due to that, we need to have a getter that will always transform attributes to a simple format. */ private Map getClientMetricsAttributes() { - return ReportDataBuilder.getReportAttributes(customReportAttributes, true).getAttributes(); + return ReportDataBuilder.getReportAttributes(customReportAttributes, true) + .getAttributes(); } - private void verifyIfMetricsAvailable() { if (!enabled) { throw new IllegalArgumentException("Metrics are not available!"); @@ -279,7 +281,8 @@ public boolean addUniqueEvent(String attributeName, Map attribut return false; } - Map metricsAttributes = ReportDataBuilder.getReportAttributes(attributes, true).getAttributes(); + Map metricsAttributes = + ReportDataBuilder.getReportAttributes(attributes, true).getAttributes(); Map localAttributes = createLocalAttributes(metricsAttributes); @@ -298,7 +301,8 @@ public boolean addUniqueEvent(String attributeName, Map attribut } } - UniqueEvent uniqueEvent = new UniqueEvent(attributeName, BacktraceTimeHelper.getTimestampSeconds(), localAttributes); + UniqueEvent uniqueEvent = + new UniqueEvent(attributeName, BacktraceTimeHelper.getTimestampSeconds(), localAttributes); uniqueEventsHandler.events.addLast(uniqueEvent); if (count() == maximumNumberOfEvents) { @@ -356,7 +360,8 @@ public boolean addSummedEvent(String metricGroupName, Map attrib return false; } - Map metricsAttributes = ReportDataBuilder.getReportAttributes(attributes, true).getAttributes(); + Map metricsAttributes = + ReportDataBuilder.getReportAttributes(attributes, true).getAttributes(); SummedEvent summedEvent = new SummedEvent(metricGroupName); summedEvent.addAttributes(metricsAttributes); @@ -407,7 +412,10 @@ private boolean shouldProcessEvent(String name) { return false; } if (maximumNumberOfEvents > 0 && (count() + 1 > maximumNumberOfEvents)) { - BacktraceLogger.e(LOG_TAG, "Cannot process event, reached maximum number of events: " + maximumNumberOfEvents + " events count: " + count()); + BacktraceLogger.e( + LOG_TAG, + "Cannot process event, reached maximum number of events: " + maximumNumberOfEvents + + " events count: " + count()); return false; } diff --git a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceReportSender.java b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceReportSender.java index 3049f0dba..6249e1ffe 100644 --- a/backtrace-library/src/main/java/backtraceio/library/services/BacktraceReportSender.java +++ b/backtrace-library/src/main/java/backtraceio/library/services/BacktraceReportSender.java @@ -1,10 +1,5 @@ package backtraceio.library.services; -import java.io.DataOutputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.List; - import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.common.BacktraceStringHelper; import backtraceio.library.common.MultiFormRequestHelper; @@ -19,6 +14,10 @@ import backtraceio.library.models.metrics.EventsResult; import backtraceio.library.models.types.BacktraceResultStatus; import backtraceio.library.models.types.HttpException; +import java.io.DataOutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.List; /** * Class for sending and processing HTTP request @@ -39,7 +38,12 @@ class BacktraceReportSender { * @param errorCallback event that will be executed after receiving an error from the server * @return information from the server about the result of processing the request */ - static BacktraceResult sendReport(String serverUrl, String json, List attachments, BacktraceReport report, OnServerErrorEventListener errorCallback) { + static BacktraceResult sendReport( + String serverUrl, + String json, + List attachments, + BacktraceReport report, + OnServerErrorEventListener errorCallback) { HttpURLConnection urlConnection = null; BacktraceResult result; @@ -57,8 +61,7 @@ static BacktraceResult sendReport(String serverUrl, String json, List at urlConnection.setRequestProperty("Connection", "Keep-Alive"); urlConnection.setRequestProperty("Cache-Control", "no-cache"); - urlConnection.setRequestProperty("Content-Type", - MultiFormRequestHelper.getContentType()); + urlConnection.setRequestProperty("Content-Type", MultiFormRequestHelper.getContentType()); BacktraceLogger.d(LOG_TAG, "HttpURLConnection successfully initialized"); DataOutputStream request = new DataOutputStream(urlConnection.getOutputStream()); @@ -71,18 +74,19 @@ static BacktraceResult sendReport(String serverUrl, String json, List at request.close(); int statusCode = urlConnection.getResponseCode(); - BacktraceLogger.d(LOG_TAG, "Received response status from Backtrace API for HTTP request is: " + statusCode); + BacktraceLogger.d( + LOG_TAG, "Received response status from Backtrace API for HTTP request is: " + statusCode); if (statusCode == HttpURLConnection.HTTP_OK) { final String responseJson = HttpHelper.getResponseMessage(urlConnection); - final BacktraceApiResult apiResult = BacktraceSerializeHelper.fromJson(responseJson, BacktraceApiResult.class); - + final BacktraceApiResult apiResult = + BacktraceSerializeHelper.fromJson(responseJson, BacktraceApiResult.class); + result = new BacktraceResult(apiResult); result.setBacktraceReport(report); } else { String message = HttpHelper.getResponseMessage(urlConnection); - message = (BacktraceStringHelper.isNullOrEmpty(message)) ? - urlConnection.getResponseMessage() : message; + message = (BacktraceStringHelper.isNullOrEmpty(message)) ? urlConnection.getResponseMessage() : message; throw new HttpException(statusCode, String.format("%s: %s", statusCode, message)); } @@ -116,7 +120,8 @@ static BacktraceResult sendReport(String serverUrl, String json, List at * @param errorCallback event that will be executed after receiving an error from the server * @return information from the server about the result of processing the request */ - public static EventsResult sendEvents(String serverUrl, String json, EventsPayload payload, OnServerErrorEventListener errorCallback) { + public static EventsResult sendEvents( + String serverUrl, String json, EventsPayload payload, OnServerErrorEventListener errorCallback) { HttpURLConnection urlConnection = null; EventsResult result; int statusCode = -1; @@ -144,14 +149,15 @@ public static EventsResult sendEvents(String serverUrl, String json, EventsPaylo request.close(); statusCode = urlConnection.getResponseCode(); - BacktraceLogger.d(LOG_TAG, "Received response status from Backtrace API for HTTP request is: " + statusCode); + BacktraceLogger.d( + LOG_TAG, "Received response status from Backtrace API for HTTP request is: " + statusCode); if (statusCode == HttpURLConnection.HTTP_OK) { - result = new EventsResult(payload, urlConnection.getResponseMessage(), BacktraceResultStatus.Ok, statusCode); + result = new EventsResult( + payload, urlConnection.getResponseMessage(), BacktraceResultStatus.Ok, statusCode); } else { String message = HttpHelper.getResponseMessage(urlConnection); - message = (BacktraceStringHelper.isNullOrEmpty(message)) ? - urlConnection.getResponseMessage() : message; + message = (BacktraceStringHelper.isNullOrEmpty(message)) ? urlConnection.getResponseMessage() : message; throw new HttpException(statusCode, String.format("%s: %s", statusCode, message)); } } catch (Exception e) { diff --git a/backtrace-library/src/main/java/backtraceio/library/services/ReportExceptionTransformer.java b/backtrace-library/src/main/java/backtraceio/library/services/ReportExceptionTransformer.java index 0aa07d155..d4cbbdce4 100644 --- a/backtrace-library/src/main/java/backtraceio/library/services/ReportExceptionTransformer.java +++ b/backtrace-library/src/main/java/backtraceio/library/services/ReportExceptionTransformer.java @@ -1,12 +1,11 @@ package backtraceio.library.services; +import backtraceio.library.models.json.BacktraceReport; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.UUID; -import backtraceio.library.models.json.BacktraceReport; - public class ReportExceptionTransformer { /** @@ -97,23 +96,18 @@ public List transformReportWithInnerExceptions(BacktraceReport } private List getSuppressedReports( - Throwable throwable, - Map attributes, - String exceptionTrace, - String parentId) { + Throwable throwable, Map attributes, String exceptionTrace, String parentId) { List reports = new ArrayList<>(); if (!this.sendSuppressedExceptions) { return reports; } - for (Throwable suppressedException : - throwable.getSuppressed()) { + for (Throwable suppressedException : throwable.getSuppressed()) { BacktraceReport suppressedExceptionReport = new BacktraceReport(suppressedException, attributes); this.extendReportWithNestedExceptionAttributes(suppressedExceptionReport, exceptionTrace, parentId); reports.add(suppressedExceptionReport); } - return reports; } @@ -124,7 +118,8 @@ private List getSuppressedReports( * @param exceptionTrace trace id * @param parentId parent id */ - private void extendReportWithNestedExceptionAttributes(BacktraceReport report, String exceptionTrace, String parentId) { + private void extendReportWithNestedExceptionAttributes( + BacktraceReport report, String exceptionTrace, String parentId) { report.attributes.put(errorTraceAttribute, exceptionTrace); report.attributes.put(errorIdAttribute, report.uuid.toString()); report.attributes.put(errorParentIdAttribute, parentId); diff --git a/backtrace-library/src/main/java/backtraceio/library/services/SummedEventsHandler.java b/backtrace-library/src/main/java/backtraceio/library/services/SummedEventsHandler.java index 85b27ade2..b7cb7aa54 100644 --- a/backtrace-library/src/main/java/backtraceio/library/services/SummedEventsHandler.java +++ b/backtrace-library/src/main/java/backtraceio/library/services/SummedEventsHandler.java @@ -1,30 +1,27 @@ package backtraceio.library.services; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.ConcurrentLinkedDeque; - import backtraceio.library.interfaces.Api; import backtraceio.library.models.metrics.EventsPayload; import backtraceio.library.models.metrics.SummedEvent; import backtraceio.library.models.metrics.SummedEventsPayload; +import java.util.Map; +import java.util.concurrent.ConcurrentLinkedDeque; public class SummedEventsHandler extends BacktraceEventsHandler { - private final static transient String LOG_TAG = SummedEventsHandler.class.getSimpleName(); + private static final transient String LOG_TAG = SummedEventsHandler.class.getSimpleName(); - private final static String urlPrefix = "summed-events"; + private static final String urlPrefix = "summed-events"; - public SummedEventsHandler(BacktraceMetrics backtraceMetrics, - Api api, final BacktraceHandlerThread backtraceHandlerThread) { + public SummedEventsHandler( + BacktraceMetrics backtraceMetrics, Api api, final BacktraceHandlerThread backtraceHandlerThread) { super(backtraceMetrics, api, backtraceHandlerThread, urlPrefix); } @Override protected SummedEventsPayload getEventsPayload() { Map attributes = backtraceMetrics.createLocalAttributes(null); - for (SummedEvent event: events) { + for (SummedEvent event : events) { event.addAttributes(attributes); } SummedEventsPayload payload = new SummedEventsPayload( diff --git a/backtrace-library/src/main/java/backtraceio/library/services/UniqueEventsHandler.java b/backtrace-library/src/main/java/backtraceio/library/services/UniqueEventsHandler.java index 6b7199f72..cd1dd61e4 100644 --- a/backtrace-library/src/main/java/backtraceio/library/services/UniqueEventsHandler.java +++ b/backtrace-library/src/main/java/backtraceio/library/services/UniqueEventsHandler.java @@ -1,22 +1,21 @@ package backtraceio.library.services; -import java.util.Map; -import java.util.concurrent.ConcurrentLinkedDeque; - import backtraceio.library.common.BacktraceTimeHelper; import backtraceio.library.interfaces.Api; import backtraceio.library.models.metrics.EventsPayload; import backtraceio.library.models.metrics.UniqueEvent; import backtraceio.library.models.metrics.UniqueEventsPayload; +import java.util.Map; +import java.util.concurrent.ConcurrentLinkedDeque; public class UniqueEventsHandler extends BacktraceEventsHandler { - private final static transient String LOG_TAG = UniqueEventsHandler.class.getSimpleName(); + private static final transient String LOG_TAG = UniqueEventsHandler.class.getSimpleName(); - private final static String urlPrefix = "unique-events"; + private static final String urlPrefix = "unique-events"; - public UniqueEventsHandler(BacktraceMetrics backtraceMetrics, - Api api, final BacktraceHandlerThread backtraceHandlerThread) { + public UniqueEventsHandler( + BacktraceMetrics backtraceMetrics, Api api, final BacktraceHandlerThread backtraceHandlerThread) { super(backtraceMetrics, api, backtraceHandlerThread, urlPrefix); } @@ -28,7 +27,8 @@ protected UniqueEventsPayload getEventsPayload() { event.update(BacktraceTimeHelper.getTimestampSeconds(), attributes); } - return new UniqueEventsPayload(events, backtraceMetrics.getApplicationName(), backtraceMetrics.getApplicationVersion()); + return new UniqueEventsPayload( + events, backtraceMetrics.getApplicationName(), backtraceMetrics.getApplicationVersion()); } @Override diff --git a/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceANRHandlerWatchdog.java b/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceANRHandlerWatchdog.java index e7856df76..49113bed0 100644 --- a/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceANRHandlerWatchdog.java +++ b/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceANRHandlerWatchdog.java @@ -3,14 +3,11 @@ import android.os.Debug; import android.os.Handler; import android.os.Looper; - -import java.util.Calendar; - import backtraceio.library.BacktraceClient; import backtraceio.library.anr.BacktraceANRHandler; import backtraceio.library.anr.BacktraceANRSettings; import backtraceio.library.logger.BacktraceLogger; - +import java.util.Calendar; /** * This is the class that is responsible for monitoring the @@ -18,7 +15,7 @@ */ public class BacktraceANRHandlerWatchdog extends Thread implements BacktraceANRHandler { - private final static String LOG_TAG = BacktraceANRHandlerWatchdog.class.getSimpleName(); + private static final String LOG_TAG = BacktraceANRHandlerWatchdog.class.getSimpleName(); /** * Current Backtrace client instance which will be used to send information about exception @@ -84,8 +81,7 @@ public BacktraceANRHandlerWatchdog(BacktraceClient client, int timeout, boolean this.start(); } - public void setOnApplicationNotRespondingEvent(OnApplicationNotRespondingEvent - onApplicationNotRespondingEvent) { + public void setOnApplicationNotRespondingEvent(OnApplicationNotRespondingEvent onApplicationNotRespondingEvent) { this.onApplicationNotRespondingEvent = onApplicationNotRespondingEvent; } @@ -129,8 +125,8 @@ public void run() { continue; } reported = true; - BacktraceWatchdogShared.sendReportCauseBlockedThread(backtraceClient, - Looper.getMainLooper().getThread(), onApplicationNotRespondingEvent, LOG_TAG); + BacktraceWatchdogShared.sendReportCauseBlockedThread( + backtraceClient, Looper.getMainLooper().getThread(), onApplicationNotRespondingEvent, LOG_TAG); } } diff --git a/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceWatchdog.java b/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceWatchdog.java index 063e6467f..be1939cd1 100644 --- a/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceWatchdog.java +++ b/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceWatchdog.java @@ -1,17 +1,16 @@ package backtraceio.library.watchdog; -import java.util.HashMap; -import java.util.Map; - import backtraceio.library.BacktraceClient; import backtraceio.library.logger.BacktraceLogger; +import java.util.HashMap; +import java.util.Map; /** * Watchdog to monitor that any thread has blocked */ public class BacktraceWatchdog { - private final static transient String LOG_TAG = BacktraceWatchdog.class.getSimpleName(); + private static final transient String LOG_TAG = BacktraceWatchdog.class.getSimpleName(); private final BacktraceClient backtraceClient; private final boolean sendException; private final Map threadsIdWatcher = new HashMap<>(); @@ -41,8 +40,7 @@ public BacktraceWatchdog(BacktraceClient client) { * * @param onApplicationNotRespondingEvent event that will be executed instead of the default sending of the error information to the Backtrace console */ - public void setOnApplicationNotRespondingEvent(OnApplicationNotRespondingEvent - onApplicationNotRespondingEvent) { + public void setOnApplicationNotRespondingEvent(OnApplicationNotRespondingEvent onApplicationNotRespondingEvent) { this.onApplicationNotRespondingEvent = onApplicationNotRespondingEvent; } @@ -60,8 +58,7 @@ public boolean checkIsAnyThreadIsBlocked() { final Thread currentThread = entry.getKey(); final BacktraceThreadWatcher currentWatcher = entry.getValue(); - if (currentThread == null || currentWatcher == null || - currentThread == Thread.currentThread()) { + if (currentThread == null || currentWatcher == null || currentThread == Thread.currentThread()) { continue; } @@ -75,19 +72,23 @@ public boolean checkIsAnyThreadIsBlocked() { continue; } - BacktraceLogger.w(LOG_TAG, String.format("Thread %d %s might be hung, timestamp: %s", - currentThread.getId(), currentThread.getName(), now_str)); + BacktraceLogger.w( + LOG_TAG, + String.format( + "Thread %d %s might be hung, timestamp: %s", + currentThread.getId(), currentThread.getName(), now_str)); // Otherwise, the thread has not made forward progress. // Determine whether the timeout has been exceeded. long timestamp = currentWatcher.getLastTimestamp(); - long timeout = timestamp == 0 ? currentWatcher.getTimeout() : - currentWatcher.getTimeout() + currentWatcher.getDelay(); + long timeout = timestamp == 0 + ? currentWatcher.getTimeout() + : currentWatcher.getTimeout() + currentWatcher.getDelay(); if (now - timestamp > timeout) { if (this.sendException) { - BacktraceWatchdogShared.sendReportCauseBlockedThread(backtraceClient, - currentThread, onApplicationNotRespondingEvent, LOG_TAG); + BacktraceWatchdogShared.sendReportCauseBlockedThread( + backtraceClient, currentThread, onApplicationNotRespondingEvent, LOG_TAG); } return true; } diff --git a/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceWatchdogShared.java b/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceWatchdogShared.java index 3c30051b7..396aec266 100644 --- a/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceWatchdogShared.java +++ b/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceWatchdogShared.java @@ -1,11 +1,10 @@ package backtraceio.library.watchdog; -import java.util.HashMap; - import backtraceio.library.BacktraceClient; import backtraceio.library.logger.BacktraceLogger; import backtraceio.library.models.BacktraceAttributeConsts; import backtraceio.library.models.json.BacktraceReport; +import java.util.HashMap; /** * Used to share code used by objects that detect different types of blocked threads @@ -20,7 +19,11 @@ class BacktraceWatchdogShared { * @param onApplicationNotRespondingEvent Event which will be executed instead of default handling ANR error * @param LOG_TAG log tag that facilitates analysis during debugging */ - static void sendReportCauseBlockedThread(BacktraceClient backtraceClient, Thread thread, OnApplicationNotRespondingEvent onApplicationNotRespondingEvent, String LOG_TAG) { + static void sendReportCauseBlockedThread( + BacktraceClient backtraceClient, + Thread thread, + OnApplicationNotRespondingEvent onApplicationNotRespondingEvent, + String LOG_TAG) { BacktraceWatchdogTimeoutException exception = new BacktraceWatchdogTimeoutException(); exception.setStackTrace(thread.getStackTrace()); BacktraceLogger.e(LOG_TAG, "Blocked thread detected, sending a report", exception); @@ -28,9 +31,11 @@ static void sendReportCauseBlockedThread(BacktraceClient backtraceClient, Thread onApplicationNotRespondingEvent.onEvent(exception); } else if (backtraceClient != null) { backtraceClient.addBreadcrumb("ANR detected - thread is blocked"); - BacktraceReport report = new BacktraceReport(exception, new HashMap() {{ - put(BacktraceAttributeConsts.ErrorType, BacktraceAttributeConsts.AnrAttributeType); - }}); + BacktraceReport report = new BacktraceReport(exception, new HashMap() { + { + put(BacktraceAttributeConsts.ErrorType, BacktraceAttributeConsts.AnrAttributeType); + } + }); backtraceClient.send(report); } } diff --git a/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceWatchdogTimeoutException.java b/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceWatchdogTimeoutException.java index 219caca26..a27c2098a 100644 --- a/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceWatchdogTimeoutException.java +++ b/backtrace-library/src/main/java/backtraceio/library/watchdog/BacktraceWatchdogTimeoutException.java @@ -1,4 +1,3 @@ package backtraceio.library.watchdog; -public class BacktraceWatchdogTimeoutException extends Exception { -} +public class BacktraceWatchdogTimeoutException extends Exception {} diff --git a/backtrace-library/src/test/java/backtraceio/library/BacktraceSerializeHelperTest.java b/backtrace-library/src/test/java/backtraceio/library/BacktraceSerializeHelperTest.java index 994e522a7..ff5d43941 100644 --- a/backtrace-library/src/test/java/backtraceio/library/BacktraceSerializeHelperTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/BacktraceSerializeHelperTest.java @@ -5,11 +5,10 @@ import static junit.framework.TestCase.assertNull; import static junit.framework.TestCase.assertTrue; -import org.junit.Test; - import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.models.BacktraceResult; import backtraceio.library.models.types.BacktraceResultStatus; +import org.junit.Test; public class BacktraceSerializeHelperTest { static class MyCustomException extends Exception { @@ -23,9 +22,8 @@ public MyCustomException(String message, Throwable cause) { public void testSerializeAndDeserializeException() { // GIVEN IllegalArgumentException illegalArgumentException = new IllegalArgumentException("test-exception-1"); - illegalArgumentException.setStackTrace(new StackTraceElement[]{ - new StackTraceElement("test-1", "test-2", "test-3", 1) - }); + illegalArgumentException.setStackTrace( + new StackTraceElement[] {new StackTraceElement("test-1", "test-2", "test-3", 1)}); MyCustomException exception = new MyCustomException("test-exception-2", illegalArgumentException); @@ -55,16 +53,16 @@ public void testSerializeAndDeserializeException() { public void testSerializeAndDeserializeError() { // GIVEN OutOfMemoryError outOfMemoryError = new OutOfMemoryError("test-error-1"); - outOfMemoryError.setStackTrace(new StackTraceElement[]{ - new StackTraceElement("test-1", "test-2", "test-3", 1) - }); + outOfMemoryError.setStackTrace( + new StackTraceElement[] {new StackTraceElement("test-1", "test-2", "test-3", 1)}); ExceptionInInitializerError error = new ExceptionInInitializerError(outOfMemoryError); // WHEN String json = BacktraceSerializeHelper.toJson(error); - ExceptionInInitializerError deserializedError = BacktraceSerializeHelper.fromJson(json, ExceptionInInitializerError.class); + ExceptionInInitializerError deserializedError = + BacktraceSerializeHelper.fromJson(json, ExceptionInInitializerError.class); // THEN assertNotNull(deserializedError); @@ -98,7 +96,7 @@ public void testDeserialization() { String json = "{\"_rxid\": \"12345\", \"message\":\"result-message\",\"status\":\"Ok\"}"; // WHEN - BacktraceResult result = BacktraceSerializeHelper.fromJson(json ,BacktraceResult.class); + BacktraceResult result = BacktraceSerializeHelper.fromJson(json, BacktraceResult.class); // THEN assertNotNull(result); diff --git a/backtrace-library/src/test/java/backtraceio/library/BacktraceStackTraceTest.java b/backtrace-library/src/test/java/backtraceio/library/BacktraceStackTraceTest.java index 82dec57f7..41404d914 100644 --- a/backtrace-library/src/test/java/backtraceio/library/BacktraceStackTraceTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/BacktraceStackTraceTest.java @@ -4,9 +4,8 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import org.junit.Test; - import backtraceio.library.models.BacktraceStackTrace; +import org.junit.Test; public class BacktraceStackTraceTest { @@ -15,8 +14,7 @@ public void initialize() { // GIVEN Exception e = new Exception(); StackTraceElement[] stackTraceElements = new StackTraceElement[2]; - stackTraceElements[0] = new StackTraceElement("BacktraceExampleClass", "exampleMethod", - "exampleFile", 1); + stackTraceElements[0] = new StackTraceElement("BacktraceExampleClass", "exampleMethod", "exampleFile", 1); stackTraceElements[1] = new StackTraceElement("ExampleClass", "", "", 2); e.setStackTrace(stackTraceElements); @@ -32,10 +30,8 @@ public void initializeFilterBacktraceClasses() { // GIVEN Exception e = new Exception(); StackTraceElement[] stackTraceElements = new StackTraceElement[2]; - stackTraceElements[0] = new StackTraceElement("BacktraceExampleClass", "exampleMethod", - "BacktraceFile", 1); - stackTraceElements[1] = new StackTraceElement("ExampleClass", "exampleMethod", - "exampleFile", 2); + stackTraceElements[0] = new StackTraceElement("BacktraceExampleClass", "exampleMethod", "BacktraceFile", 1); + stackTraceElements[1] = new StackTraceElement("ExampleClass", "exampleMethod", "exampleFile", 2); e.setStackTrace(stackTraceElements); // WHEN diff --git a/backtrace-library/src/test/java/backtraceio/library/ConcatAttributesUnitTest.java b/backtrace-library/src/test/java/backtraceio/library/ConcatAttributesUnitTest.java index b56d3d1f2..f608d79f2 100644 --- a/backtrace-library/src/test/java/backtraceio/library/ConcatAttributesUnitTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/ConcatAttributesUnitTest.java @@ -2,25 +2,26 @@ import static org.junit.Assert.assertEquals; -import org.junit.Test; - +import backtraceio.library.models.json.BacktraceReport; import java.util.HashMap; import java.util.Map; - -import backtraceio.library.models.json.BacktraceReport; - +import org.junit.Test; public class ConcatAttributesUnitTest { - private final Map attributesReport = new HashMap() {{ - put("1", "1"); - put("2", "2"); - }}; + private final Map attributesReport = new HashMap() { + { + put("1", "1"); + put("2", "2"); + } + }; - private final Map attributes = new HashMap() {{ - put("3", "3"); - put("4", "4"); - }}; + private final Map attributes = new HashMap() { + { + put("3", "3"); + put("4", "4"); + } + }; @Test public void concatAttributes_isCorrect() { @@ -61,4 +62,4 @@ public void concatAttributesNullAttributes_isCorrect() { assertEquals(expectedAttributesSize, result.size()); assertEquals(result.get("4"), "4"); } -} \ No newline at end of file +} diff --git a/backtrace-library/src/test/java/backtraceio/library/GsonThrowableDeserializationTest.java b/backtrace-library/src/test/java/backtraceio/library/GsonThrowableDeserializationTest.java index cc6c9ff76..191d2d577 100644 --- a/backtrace-library/src/test/java/backtraceio/library/GsonThrowableDeserializationTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/GsonThrowableDeserializationTest.java @@ -5,17 +5,12 @@ import static org.junit.Assert.assertNull; import androidx.annotation.NonNull; - +import backtraceio.library.common.BacktraceSerializeHelper; import com.google.gson.JsonParseException; - -import org.junit.Test; - import java.util.ArrayList; import java.util.List; import java.util.Objects; - -import backtraceio.library.common.BacktraceSerializeHelper; - +import org.junit.Test; public class GsonThrowableDeserializationTest { @Test @@ -24,7 +19,8 @@ public void testDeserializeException() { String json = TestUtils.readFileAsString(this, "serializedException.json"); // WHEN - IllegalArgumentException deserializedException = BacktraceSerializeHelper.fromJson(json, IllegalArgumentException.class); + IllegalArgumentException deserializedException = + BacktraceSerializeHelper.fromJson(json, IllegalArgumentException.class); // THEN assertNotNull(deserializedException); @@ -78,10 +74,12 @@ public void testDeserializeThrowableWithCause() { @NonNull private static StackTraceElement[] generateStackTraceElements() { - List elements = new ArrayList() {{ - add(new StackTraceElement("sample-class-1", "method-1", "file-name1", 100)); - add(new StackTraceElement("sample-class-2", "method-2", "file-name2", 200)); - }}; + List elements = new ArrayList() { + { + add(new StackTraceElement("sample-class-1", "method-1", "file-name1", 100)); + add(new StackTraceElement("sample-class-2", "method-2", "file-name2", 200)); + } + }; return elements.toArray(new StackTraceElement[0]); } @@ -89,14 +87,14 @@ private static StackTraceElement[] generateStackTraceElements() { public void testDeserializeThrowableNoCause() { // GIVEN // We reuse serializedThrowable.json but for this test, we are interested in a Throwable without a cause. - // The BacktraceSerializeHelper.fromJson for Throwable will create a generic Throwable if specific exception type is not known + // The BacktraceSerializeHelper.fromJson for Throwable will create a generic Throwable if specific exception + // type is not known // It might not reconstruct the exact original type (e.g. if it was an Exception originally) // For this test, let's create a JSON that represents a simple Throwable without a cause. Throwable originalThrowable = new Throwable("Simple throwable message"); originalThrowable.setStackTrace(generateStackTraceElements()); String json = BacktraceSerializeHelper.toJson(originalThrowable); - // WHEN Throwable deserializedThrowable = BacktraceSerializeHelper.fromJson(json, Throwable.class); @@ -109,7 +107,6 @@ public void testDeserializeThrowableNoCause() { assertEquals("method-2", deserializedThrowable.getStackTrace()[1].getMethodName()); } - @Test public void testDeserializeError() { // GIVEN @@ -136,11 +133,15 @@ public void testDeserializeExceptionWithCause() { // THEN assertNotNull(deserializedException); - assertEquals("test-msg", deserializedException.getMessage()); // Gson might serialize the cause's message into the main message + assertEquals( + "test-msg", + deserializedException.getMessage()); // Gson might serialize the cause's message into the main message assertNotNull(deserializedException.getCause()); assertEquals("test-msg", deserializedException.getCause().getMessage()); assertEquals(2, Objects.requireNonNull(deserializedException.getCause()).getStackTrace().length); - assertEquals("sample-class-1", deserializedException.getCause().getStackTrace()[0].getClassName()); + assertEquals( + "sample-class-1", + deserializedException.getCause().getStackTrace()[0].getClassName()); } @Test(expected = JsonParseException.class) diff --git a/backtrace-library/src/test/java/backtraceio/library/GsonThrowableSerializationTest.java b/backtrace-library/src/test/java/backtraceio/library/GsonThrowableSerializationTest.java index c8eb72111..71b9c05b6 100644 --- a/backtrace-library/src/test/java/backtraceio/library/GsonThrowableSerializationTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/GsonThrowableSerializationTest.java @@ -3,14 +3,11 @@ import static org.junit.Assert.assertTrue; import androidx.annotation.NonNull; - -import org.json.JSONException; -import org.junit.Test; - +import backtraceio.library.common.BacktraceSerializeHelper; import java.util.ArrayList; import java.util.List; - -import backtraceio.library.common.BacktraceSerializeHelper; +import org.json.JSONException; +import org.junit.Test; public class GsonThrowableSerializationTest { @Test @@ -22,9 +19,7 @@ public void testSerializeException() throws JSONException { String json = BacktraceSerializeHelper.toJson(exception); // THEN - String expectedJson = TestUtils.minifyJsonString( - TestUtils.readFileAsString(this, "serializedException.json") - ); + String expectedJson = TestUtils.minifyJsonString(TestUtils.readFileAsString(this, "serializedException.json")); assertTrue(TestUtils.compareJson(json, expectedJson)); } @@ -40,9 +35,8 @@ public void testSerializeThrowableWithCause() throws JSONException { String json = BacktraceSerializeHelper.toJson(throwable); // THEN - String expectedJson = TestUtils.minifyJsonString( - TestUtils.readFileAsString(this, "serializedThrowableWithCause.json") - ); + String expectedJson = + TestUtils.minifyJsonString(TestUtils.readFileAsString(this, "serializedThrowableWithCause.json")); assertTrue(TestUtils.compareJson(json, expectedJson)); } @@ -57,9 +51,7 @@ public void testSerializeThrowable() throws JSONException { String json = BacktraceSerializeHelper.toJson(throwable); // THEN - String expectedJson = TestUtils.minifyJsonString( - TestUtils.readFileAsString(this, "serializedThrowable.json") - ); + String expectedJson = TestUtils.minifyJsonString(TestUtils.readFileAsString(this, "serializedThrowable.json")); assertTrue(TestUtils.compareJson(json, expectedJson)); } @@ -74,9 +66,7 @@ public void testSerializeError() throws JSONException { String json = BacktraceSerializeHelper.toJson(error); // THEN - String expectedJson = TestUtils.minifyJsonString( - TestUtils.readFileAsString(this, "serializedError.json") - ); + String expectedJson = TestUtils.minifyJsonString(TestUtils.readFileAsString(this, "serializedError.json")); assertTrue(TestUtils.compareJson(json, expectedJson)); } @@ -84,14 +74,14 @@ public void testSerializeError() throws JSONException { @Test public void serializeMultiCauseException() throws JSONException { // GIVEN - IllegalArgumentException e1 = new IllegalArgumentException("1"); + IllegalArgumentException e1 = new IllegalArgumentException("1"); JSONException e2 = new JSONException("2", e1); RuntimeException e3 = new RuntimeException("3", e2); AssertionError e4 = new AssertionError("4", e3); Throwable[] throwableArray = {e1, e2, e3, e4}; - for (Throwable t : throwableArray){ + for (Throwable t : throwableArray) { t.setStackTrace(generateStackTraceElements()); } @@ -99,9 +89,8 @@ public void serializeMultiCauseException() throws JSONException { String json = BacktraceSerializeHelper.toJson(e4); // THEN - String expectedJson = TestUtils.minifyJsonString( - TestUtils.readFileAsString(this, "serializedMultiCauseException.json") - ); + String expectedJson = + TestUtils.minifyJsonString(TestUtils.readFileAsString(this, "serializedMultiCauseException.json")); assertTrue(TestUtils.compareJson(json, expectedJson)); } @@ -122,9 +111,8 @@ public void serializeExceptionWithException() throws JSONException { String json = BacktraceSerializeHelper.toJson(e2); // THEN - String expectedJson = TestUtils.minifyJsonString( - TestUtils.readFileAsString(this, "serializedExceptionWithCause.json") - ); + String expectedJson = + TestUtils.minifyJsonString(TestUtils.readFileAsString(this, "serializedExceptionWithCause.json")); assertTrue(TestUtils.compareJson(json, expectedJson)); } @@ -139,10 +127,12 @@ private static Exception generateException() { @NonNull private static StackTraceElement[] generateStackTraceElements() { - List elements = new ArrayList() {{ - add(new StackTraceElement("sample-class-1", "method-1", "file-name1", 100)); - add(new StackTraceElement("sample-class-2", "method-2", "file-name2", 200)); - }}; + List elements = new ArrayList() { + { + add(new StackTraceElement("sample-class-1", "method-1", "file-name1", 100)); + add(new StackTraceElement("sample-class-2", "method-2", "file-name2", 200)); + } + }; return elements.toArray(new StackTraceElement[0]); } } diff --git a/backtrace-library/src/test/java/backtraceio/library/ReportDataAnnotationBuilderTest.java b/backtrace-library/src/test/java/backtraceio/library/ReportDataAnnotationBuilderTest.java index a0259ee94..dd49c30fa 100644 --- a/backtrace-library/src/test/java/backtraceio/library/ReportDataAnnotationBuilderTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/ReportDataAnnotationBuilderTest.java @@ -1,32 +1,38 @@ package backtraceio.library; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import static org.junit.Assert.assertEquals; +import backtraceio.library.models.attributes.ReportDataAttributes; +import backtraceio.library.models.attributes.ReportDataBuilder; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; - -import static org.junit.Assert.assertEquals; - -import backtraceio.library.models.attributes.ReportDataAttributes; -import backtraceio.library.models.attributes.ReportDataBuilder; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; @RunWith(Parameterized.class) public class ReportDataAnnotationBuilderTest { @Parameterized.Parameters public static Collection data() { - return Arrays.asList(new Object[][]{ - {new HashMap() {{ - put("add", "value"); - }}}, - {new HashSet() {{ - add("value"); - }}}, - {new Object()}, + return Arrays.asList(new Object[][] { + { + new HashMap() { + { + put("add", "value"); + } + } + }, + { + new HashSet() { + { + add("value"); + } + } + }, + {new Object()}, }); } diff --git a/backtrace-library/src/test/java/backtraceio/library/ReportDataAttributeBuilderTest.java b/backtrace-library/src/test/java/backtraceio/library/ReportDataAttributeBuilderTest.java index dd0cd75d5..e9e6a08f0 100644 --- a/backtrace-library/src/test/java/backtraceio/library/ReportDataAttributeBuilderTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/ReportDataAttributeBuilderTest.java @@ -1,18 +1,16 @@ package backtraceio.library; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import backtraceio.library.models.attributes.ReportDataAttributes; import backtraceio.library.models.attributes.ReportDataBuilder; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; @RunWith(Parameterized.class) public class ReportDataAttributeBuilderTest { @@ -21,11 +19,8 @@ public class ReportDataAttributeBuilderTest { @Parameterized.Parameters public static Collection data() { - return Arrays.asList(new Object[][]{ - {"String value"}, - {123}, - {45.67}, - {true}, + return Arrays.asList(new Object[][] { + {"String value"}, {123}, {45.67}, {true}, }); } @@ -57,11 +52,13 @@ public void shouldSetNullableValueAsAttribute() { @Test public void shouldSkipNullableValue() { - ReportDataAttributes data = ReportDataBuilder.getReportAttributes(new HashMap() { - { - put(key, null); - } - }, true); + ReportDataAttributes data = ReportDataBuilder.getReportAttributes( + new HashMap() { + { + put(key, null); + } + }, + true); assertNull(data.getAttributes().get(key)); } } diff --git a/backtrace-library/src/test/java/backtraceio/library/ReportExceptionTransformerTest.java b/backtrace-library/src/test/java/backtraceio/library/ReportExceptionTransformerTest.java index afec8958b..b511d1631 100644 --- a/backtrace-library/src/test/java/backtraceio/library/ReportExceptionTransformerTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/ReportExceptionTransformerTest.java @@ -4,14 +4,12 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import org.junit.Test; - +import backtraceio.library.models.json.BacktraceReport; +import backtraceio.library.services.ReportExceptionTransformer; import java.util.HashMap; import java.util.List; import java.util.Map; - -import backtraceio.library.models.json.BacktraceReport; -import backtraceio.library.services.ReportExceptionTransformer; +import org.junit.Test; public class ReportExceptionTransformerTest { @@ -19,21 +17,26 @@ public class ReportExceptionTransformerTest { final String outerExceptionMessage = "Outer exception message"; final String suppressedExceptionMessage = "Outer exception message"; final String attributeKey = "attribute-key"; - final Map attributes = new HashMap() {{ - put(attributeKey, "test"); - }}; + final Map attributes = new HashMap() { + { + put(attributeKey, "test"); + } + }; @Test public void generateReportOnlyForExceptionWithoutInnerExceptions() { final Exception exception = new Exception("Exception without inner or suppressed exceptions"); ReportExceptionTransformer reportExceptionTransformer = new ReportExceptionTransformer(); - List reports = reportExceptionTransformer.transformReportWithInnerExceptions(new BacktraceReport(exception, attributes)); + List reports = reportExceptionTransformer.transformReportWithInnerExceptions( + new BacktraceReport(exception, attributes)); BacktraceReport exceptionReport = reports.get(0); assertEquals(exception.getMessage(), exceptionReport.exception.getMessage()); assertNull(exceptionReport.attributes.get(ReportExceptionTransformer.errorParentIdAttribute)); - assertEquals(exceptionReport.uuid.toString(), exceptionReport.attributes.get(ReportExceptionTransformer.errorIdAttribute)); + assertEquals( + exceptionReport.uuid.toString(), + exceptionReport.attributes.get(ReportExceptionTransformer.errorIdAttribute)); assertNotNull(exceptionReport.attributes.get(ReportExceptionTransformer.errorTraceAttribute)); } @@ -45,7 +48,8 @@ public void generateReportForInnerAndOuterException() { ReportExceptionTransformer reportExceptionTransformer = new ReportExceptionTransformer(); reportExceptionTransformer.sendInnerExceptions(true); - List reports = reportExceptionTransformer.transformReportWithInnerExceptions(new BacktraceReport(outerException, attributes)); + List reports = reportExceptionTransformer.transformReportWithInnerExceptions( + new BacktraceReport(outerException, attributes)); assertEquals(expectedNumberOfReports, reports.size()); BacktraceReport outerExceptionReport = reports.get(0); @@ -69,7 +73,8 @@ public void doNotGenerateInnerExceptionIfDisabled() { ReportExceptionTransformer reportExceptionTransformer = new ReportExceptionTransformer(); reportExceptionTransformer.sendInnerExceptions(false); - List reports = reportExceptionTransformer.transformReportWithInnerExceptions(new BacktraceReport(outerException, attributes)); + List reports = reportExceptionTransformer.transformReportWithInnerExceptions( + new BacktraceReport(outerException, attributes)); assertEquals(1, reports.size()); BacktraceReport outerExceptionReport = reports.get(0); @@ -85,7 +90,8 @@ public void generateReportForSuppressedException() { ReportExceptionTransformer reportExceptionTransformer = new ReportExceptionTransformer(); reportExceptionTransformer.sendSuppressedExceptions(true); - List reports = reportExceptionTransformer.transformReportWithInnerExceptions(new BacktraceReport(exception, attributes)); + List reports = reportExceptionTransformer.transformReportWithInnerExceptions( + new BacktraceReport(exception, attributes)); assertEquals(expectedNumberOfReports, reports.size()); BacktraceReport outerExceptionReport = reports.get(0); @@ -111,7 +117,8 @@ public void doNotGenerateSuppressedExceptionIfDisabled() { ReportExceptionTransformer reportExceptionTransformer = new ReportExceptionTransformer(); reportExceptionTransformer.sendSuppressedExceptions(false); - List reports = reportExceptionTransformer.transformReportWithInnerExceptions(new BacktraceReport(exception, attributes)); + List reports = reportExceptionTransformer.transformReportWithInnerExceptions( + new BacktraceReport(exception, attributes)); assertEquals(1, reports.size()); BacktraceReport exceptionReport = reports.get(0); @@ -129,7 +136,8 @@ public void generateReportForInnerSuppressedAndOuterException() { reportExceptionTransformer.sendInnerExceptions(true); reportExceptionTransformer.sendSuppressedExceptions(true); - List reports = reportExceptionTransformer.transformReportWithInnerExceptions(new BacktraceReport(outerException, attributes)); + List reports = reportExceptionTransformer.transformReportWithInnerExceptions( + new BacktraceReport(outerException, attributes)); assertEquals(expectedNumberOfReports, reports.size()); BacktraceReport outerExceptionReport = reports.get(0); @@ -151,7 +159,8 @@ public void reportsHasCorrectlySetAttributes() { reportExceptionTransformer.sendInnerExceptions(true); reportExceptionTransformer.sendSuppressedExceptions(true); - List reports = reportExceptionTransformer.transformReportWithInnerExceptions(new BacktraceReport(outerException, attributes)); + List reports = reportExceptionTransformer.transformReportWithInnerExceptions( + new BacktraceReport(outerException, attributes)); assertEquals(expectedNumberOfReports, reports.size()); BacktraceReport outerExceptionReport = reports.get(0); diff --git a/backtrace-library/src/test/java/backtraceio/library/TestUtils.java b/backtrace-library/src/test/java/backtraceio/library/TestUtils.java index 944a1409c..523c143b5 100644 --- a/backtrace-library/src/test/java/backtraceio/library/TestUtils.java +++ b/backtrace-library/src/test/java/backtraceio/library/TestUtils.java @@ -6,16 +6,14 @@ import com.google.gson.JsonElement; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; - -import org.json.JSONException; -import org.json.JSONObject; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Type; import java.util.Map; +import org.json.JSONException; +import org.json.JSONObject; public class TestUtils { @@ -56,11 +54,11 @@ public static boolean compareJson(String json1, String json2) { if (!compareResult) { Gson g = new Gson(); - Type mapType = new TypeToken>(){}.getType(); + Type mapType = new TypeToken>() {}.getType(); Map json1Map = g.fromJson(json1, mapType); Map json2Map = g.fromJson(json2, mapType); MapDifference x = Maps.difference(json1Map, json2Map); - + System.out.println(Maps.difference(json1Map, json2Map)); return false; } diff --git a/backtrace-library/src/test/java/backtraceio/library/anr/BacktraceANRSettingsTest.java b/backtrace-library/src/test/java/backtraceio/library/anr/BacktraceANRSettingsTest.java index 5852dca8a..1d59ad13e 100644 --- a/backtrace-library/src/test/java/backtraceio/library/anr/BacktraceANRSettingsTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/anr/BacktraceANRSettingsTest.java @@ -4,10 +4,8 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; -import org.junit.Test; - -import backtraceio.library.watchdog.BacktraceWatchdogTimeoutException; import backtraceio.library.watchdog.OnApplicationNotRespondingEvent; +import org.junit.Test; public class BacktraceANRSettingsTest { @@ -26,9 +24,8 @@ public void paramsConstructor() { // GIVEN int timeout = 2000; boolean debug = true; - OnApplicationNotRespondingEvent event = exception -> { + OnApplicationNotRespondingEvent event = exception -> {}; - }; // WHEN BacktraceANRSettings settings = new BacktraceANRSettings(timeout, event, debug); @@ -37,5 +34,4 @@ public void paramsConstructor() { assertEquals(event, settings.getOnApplicationNotRespondingEvent()); assertEquals(debug, settings.isDebug()); } - } diff --git a/backtrace-library/src/test/java/backtraceio/library/anr/ExitInfoStackTraceParserTest.java b/backtrace-library/src/test/java/backtraceio/library/anr/ExitInfoStackTraceParserTest.java index a5d3cba08..551bb997b 100644 --- a/backtrace-library/src/test/java/backtraceio/library/anr/ExitInfoStackTraceParserTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/anr/ExitInfoStackTraceParserTest.java @@ -4,13 +4,11 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import org.junit.Test; - +import backtraceio.library.TestUtils; import java.util.ArrayList; import java.util.List; import java.util.Map; - -import backtraceio.library.TestUtils; +import org.junit.Test; public class ExitInfoStackTraceParserTest { private final String ANR_APPEXIT_STACKTRACE_FILE = "anrAppExitInfoStacktrace.txt"; @@ -31,14 +29,17 @@ public void parseFrameJava() { @Test public void parseFrameNative() { // GIVEN - String frame = "native: #19 pc 00630008 /apex/com.android.art/lib/libart.so (art::InvokeMethod(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jobject*, _jobject*, unsigned int)+1464)"; + String frame = + "native: #19 pc 00630008 /apex/com.android.art/lib/libart.so (art::InvokeMethod(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jobject*, _jobject*, unsigned int)+1464)"; // WHEN StackTraceElement stackTraceElement = ExitInfoStackTraceParser.parseFrame(frame); // THEN assertEquals("/apex/com.android.art/lib/libart.so", stackTraceElement.getClassName()); assertEquals("address: 00630008", stackTraceElement.getFileName()); assertEquals(0, stackTraceElement.getLineNumber()); - assertEquals("(art::InvokeMethod(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jobject*, _jobject*, unsigned int)+1464)", stackTraceElement.getMethodName()); + assertEquals( + "(art::InvokeMethod(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jobject*, _jobject*, unsigned int)+1464)", + stackTraceElement.getMethodName()); } @Test @@ -54,7 +55,9 @@ public void parseAnrStackTrace() { assertNotNull(anrStacktrace.get("main_thread")); assertEquals("x86", anrStacktrace.get("abi")); assertEquals("74% free, 6892KB/25MB; 138095 objects", anrStacktrace.get("heap_info")); - assertEquals("google/sdk_gphone_x86/generic_x86_arm:11/RSR1.201013.001/6903271:user/release-keys", anrStacktrace.get("build_fingerprint")); + assertEquals( + "google/sdk_gphone_x86/generic_x86_arm:11/RSR1.201013.001/6903271:user/release-keys", + anrStacktrace.get("build_fingerprint")); assertEquals("optimized", anrStacktrace.get("build_type")); assertEquals("backtraceio.backtraceio", anrStacktrace.get("command_line")); assertEquals("2025-03-27 21:02:38", anrStacktrace.get("timestamp")); @@ -71,7 +74,9 @@ public void parseAnrStackTrace() { assertEquals("at java.lang.Thread.sleep(Native method)", thread4StackTrace.get(0)); assertEquals("at java.lang.Thread.sleep(Thread.java:442)", thread4StackTrace.get(1)); assertEquals("at java.lang.Thread.sleep(Thread.java:358)", thread4StackTrace.get(2)); - assertEquals("at backtraceio.library.watchdog.BacktraceANRHandlerWatchdog.run(BacktraceANRHandlerWatchdog.java:118)", thread4StackTrace.get(3)); + assertEquals( + "at backtraceio.library.watchdog.BacktraceANRHandlerWatchdog.run(BacktraceANRHandlerWatchdog.java:118)", + thread4StackTrace.get(3)); // THEN MAIN THREAD Map mainThread = (Map) anrStacktrace.get("main_thread"); @@ -82,9 +87,14 @@ public void parseAnrStackTrace() { ArrayList stackTrace = (ArrayList) mainThread.get("stack_trace"); assertEquals(36, stackTrace.size()); - assertEquals("native: #20 pc 005886a0 /apex/com.android.art/lib/libart.so (art::Method_invoke(_JNIEnv*, _jobject*, _jobject*, _jobjectArray*)+80)", stackTrace.get(20)); - assertEquals("at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:468)", stackTrace.get(24)); + assertEquals( + "native: #20 pc 005886a0 /apex/com.android.art/lib/libart.so (art::Method_invoke(_JNIEnv*, _jobject*, _jobject*, _jobjectArray*)+80)", + stackTrace.get(20)); + assertEquals( + "at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:468)", + stackTrace.get(24)); } + @Test public void parseAnrMainThreadStackTrace() { // GIVEN @@ -102,7 +112,9 @@ public void parseAnrMainThreadStackTrace() { assertEquals("address: 00000b97", anrMainThreadStacktrace[0].getFileName()); assertEquals("[vdso]", anrMainThreadStacktrace[0].getClassName()); - assertEquals("(art::interpreter::EnterInterpreterFromEntryPoint(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*)+176)", anrMainThreadStacktrace[14].getMethodName()); + assertEquals( + "(art::interpreter::EnterInterpreterFromEntryPoint(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*)+176)", + anrMainThreadStacktrace[14].getMethodName()); assertEquals(0, anrMainThreadStacktrace[14].getLineNumber()); assertEquals("address: 00379b00", anrMainThreadStacktrace[14].getFileName()); assertEquals("/apex/com.android.art/lib/libart.so", anrMainThreadStacktrace[14].getClassName()); @@ -110,7 +122,9 @@ public void parseAnrMainThreadStackTrace() { assertEquals("onClick", anrMainThreadStacktrace[22].getMethodName()); assertEquals(468, anrMainThreadStacktrace[22].getLineNumber()); assertEquals("AppCompatViewInflater.java", anrMainThreadStacktrace[22].getFileName()); - assertEquals("androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener", anrMainThreadStacktrace[22].getClassName()); + assertEquals( + "androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener", + anrMainThreadStacktrace[22].getClassName()); assertEquals("main", anrMainThreadStacktrace[32].getMethodName()); assertEquals(947, anrMainThreadStacktrace[32].getLineNumber()); diff --git a/backtrace-library/src/test/java/backtraceio/library/common/CollectionUtilsTest.java b/backtrace-library/src/test/java/backtraceio/library/common/CollectionUtilsTest.java index 3b807859d..f05b90d5f 100644 --- a/backtrace-library/src/test/java/backtraceio/library/common/CollectionUtilsTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/common/CollectionUtilsTest.java @@ -4,13 +4,12 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import org.junit.Test; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.junit.Test; public class CollectionUtilsTest { diff --git a/backtrace-library/src/test/java/backtraceio/library/common/anr/AppExitInfoDetailsExtractorTest.java b/backtrace-library/src/test/java/backtraceio/library/common/anr/AppExitInfoDetailsExtractorTest.java index d232b3158..9b5b4c8c2 100644 --- a/backtrace-library/src/test/java/backtraceio/library/common/anr/AppExitInfoDetailsExtractorTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/common/anr/AppExitInfoDetailsExtractorTest.java @@ -8,22 +8,19 @@ import static org.mockito.Mockito.when; import android.app.ApplicationExitInfo; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; - +import backtraceio.library.anr.AppExitInfoDetailsExtractor; +import backtraceio.library.anr.ExitInfo; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.Locale; - -import backtraceio.library.anr.AppExitInfoDetailsExtractor; -import backtraceio.library.anr.ExitInfo; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) public class AppExitInfoDetailsExtractorTest { @@ -105,7 +102,8 @@ public void testGetStackTraceInfoValidStream() throws IOException { @Test public void testGetStackTraceInfoNullStream() { // WHEN - Object stackTrace = AppExitInfoDetailsExtractor.getANRAttributes(mockAppExitInfo).get("stackTrace"); + Object stackTrace = + AppExitInfoDetailsExtractor.getANRAttributes(mockAppExitInfo).get("stackTrace"); // THEN assertNull(stackTrace); diff --git a/backtrace-library/src/test/java/backtraceio/library/database/BacktraceDatabaseRecordTest.java b/backtrace-library/src/test/java/backtraceio/library/database/BacktraceDatabaseRecordTest.java index e2a0064de..fde16985e 100644 --- a/backtrace-library/src/test/java/backtraceio/library/database/BacktraceDatabaseRecordTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/database/BacktraceDatabaseRecordTest.java @@ -3,11 +3,12 @@ import static junit.framework.TestCase.assertEquals; import static org.junit.Assert.assertNull; -import org.junit.Test; +import static backtraceio.library.TestUtils.compareJson; import backtraceio.library.TestUtils; import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.models.database.BacktraceDatabaseRecord; +import org.junit.Test; public class BacktraceDatabaseRecordTest { private final String JSON_FILE = "backtraceDatabaseRecord.json"; @@ -15,6 +16,7 @@ public class BacktraceDatabaseRecordTest { private final String dbPath = "/data/user/0/backtraceio.library.test/files/"; private final int expectedSize = 25362; + @Test public void serialize() { // GIVEN @@ -22,17 +24,16 @@ public void serialize() { uuid, dbPath + uuid + "-report.json", dbPath + uuid + "-record.json", - dbPath+ uuid + "-attachment.json", + dbPath + uuid + "-attachment.json", dbPath + uuid + "-report.json", - expectedSize - ); + expectedSize); // WHEN String json = BacktraceSerializeHelper.toJson(obj); // THEN String expectedJson = TestUtils.readFileAsString(this, JSON_FILE); - assertEquals(expectedJson, json); + compareJson(expectedJson, json); } @Test @@ -44,7 +45,7 @@ public void deserialize() { // THEN assertEquals(dbPath + uuid + "-record.json", obj.getRecordPath()); assertEquals(expectedSize, obj.getSize()); - assertEquals(dbPath+ uuid + "-attachment.json", obj.getDiagnosticDataPath()); + assertEquals(dbPath + uuid + "-attachment.json", obj.getDiagnosticDataPath()); assertNull(obj.getBacktraceData()); } @@ -55,10 +56,9 @@ public void serializeAndDeserialize() { uuid, dbPath + uuid + "-report.json", dbPath + uuid + "-record.json", - dbPath+ uuid + "-attachment.json", + dbPath + uuid + "-attachment.json", dbPath + uuid + "-report.json", - expectedSize - ); + expectedSize); String json = BacktraceSerializeHelper.toJson(obj); // WHEN @@ -67,7 +67,7 @@ public void serializeAndDeserialize() { // THEN assertEquals(dbPath + uuid + "-record.json", output.getRecordPath()); assertEquals(expectedSize, output.getSize()); - assertEquals(dbPath+ uuid + "-attachment.json", output.getDiagnosticDataPath()); + assertEquals(dbPath + uuid + "-attachment.json", output.getDiagnosticDataPath()); assertNull(output.getBacktraceData()); } } diff --git a/backtrace-library/src/test/java/backtraceio/library/logger/BacktraceInternalLoggerTest.java b/backtrace-library/src/test/java/backtraceio/library/logger/BacktraceInternalLoggerTest.java index d17be1965..e059f2b20 100644 --- a/backtrace-library/src/test/java/backtraceio/library/logger/BacktraceInternalLoggerTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/logger/BacktraceInternalLoggerTest.java @@ -3,11 +3,10 @@ import static org.mockito.Mockito.mockStatic; import android.util.Log; - import org.junit.AfterClass; -import org.junit.BeforeClass; import org.junit.Assert; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockedStatic; @@ -24,11 +23,14 @@ public class BacktraceInternalLoggerTest { public class LogMockAnswer implements Answer { @Override - public Integer answer(InvocationOnMock invocation) { return LOG_ENABLED; } + public Integer answer(InvocationOnMock invocation) { + return LOG_ENABLED; + } } @Mock private static MockedStatic mockLog; + private BacktraceInternalLogger logger; @BeforeClass @@ -49,20 +51,12 @@ public void setUp() { private void mockLogMethods() { try { - mockLog.when(() -> Log.d(Mockito.any(), Mockito.any())).thenAnswer( - new LogMockAnswer() - ); - mockLog.when(() -> Log.w(Mockito.any(), Mockito.anyString())).thenAnswer( - new LogMockAnswer() - ); - mockLog.when(() -> Log.e(Mockito.any(), Mockito.any())).thenAnswer( - new LogMockAnswer() - ); - mockLog.when(() -> Log.e(Mockito.any(), Mockito.any(), Mockito.any())).thenAnswer( - new LogMockAnswer() - ); - } - catch (Exception e) { + mockLog.when(() -> Log.d(Mockito.any(), Mockito.any())).thenAnswer(new LogMockAnswer()); + mockLog.when(() -> Log.w(Mockito.any(), Mockito.anyString())).thenAnswer(new LogMockAnswer()); + mockLog.when(() -> Log.e(Mockito.any(), Mockito.any())).thenAnswer(new LogMockAnswer()); + mockLog.when(() -> Log.e(Mockito.any(), Mockito.any(), Mockito.any())) + .thenAnswer(new LogMockAnswer()); + } catch (Exception e) { Assert.fail(e.toString()); } } @@ -138,4 +132,4 @@ public void testLogOff() { Assert.assertEquals(LOG_DISABLED, errorResult); Assert.assertEquals(LOG_DISABLED, errorResult2); } -} \ No newline at end of file +} diff --git a/backtrace-library/src/test/java/backtraceio/library/logger/BacktraceMockLogger.java b/backtrace-library/src/test/java/backtraceio/library/logger/BacktraceMockLogger.java index 58efd203d..fa46130d3 100644 --- a/backtrace-library/src/test/java/backtraceio/library/logger/BacktraceMockLogger.java +++ b/backtrace-library/src/test/java/backtraceio/library/logger/BacktraceMockLogger.java @@ -1,7 +1,8 @@ package backtraceio.library.logger; public class BacktraceMockLogger implements Logger { - public final static int MOCK_VALUE = 123456789; + public static final int MOCK_VALUE = 123456789; + @Override public int d(String tag, String message) { return MOCK_VALUE; @@ -21,5 +22,4 @@ public int e(String tag, String message) { public int e(String tag, String message, Throwable tr) { return MOCK_VALUE; } - } diff --git a/backtrace-library/src/test/java/backtraceio/library/models/BacktraceApiResultTest.java b/backtrace-library/src/test/java/backtraceio/library/models/BacktraceApiResultTest.java index 608676bc3..8fe0dae8c 100644 --- a/backtrace-library/src/test/java/backtraceio/library/models/BacktraceApiResultTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/models/BacktraceApiResultTest.java @@ -3,10 +3,11 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import org.junit.Test; +import static backtraceio.library.TestUtils.compareJson; import backtraceio.library.TestUtils; import backtraceio.library.common.BacktraceSerializeHelper; +import org.junit.Test; public class BacktraceApiResultTest { @@ -18,7 +19,7 @@ public void serialize() { String result = BacktraceSerializeHelper.toJson(example); // THEN String expectedJson = TestUtils.readFileAsString(this, "backtraceApiResult.json"); - assertEquals(expectedJson, result); + compareJson(expectedJson, result); } @Test diff --git a/backtrace-library/src/test/java/backtraceio/library/models/BacktraceDataJsonTest.java b/backtrace-library/src/test/java/backtraceio/library/models/BacktraceDataJsonTest.java index 3b9411c84..b5b2c48d8 100644 --- a/backtrace-library/src/test/java/backtraceio/library/models/BacktraceDataJsonTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/models/BacktraceDataJsonTest.java @@ -6,22 +6,19 @@ import static org.junit.Assert.assertTrue; import androidx.annotation.NonNull; - -import com.google.common.collect.ImmutableMap; - -import org.junit.Test; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - import backtraceio.library.TestUtils; import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.models.json.SourceCode; import backtraceio.library.models.json.ThreadInformation; +import com.google.common.collect.ImmutableMap; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import org.junit.Test; public class BacktraceDataJsonTest { private final String JSON_FILE = "backtraceData.json"; + @Test public void serialize() { // GIVEN @@ -38,26 +35,32 @@ public void serialize() { @NonNull private static BacktraceData createTestBacktraceDataObject() { - final Map attributes = ImmutableMap.of("application.session", "4b965773-539e-4dd3-be1b-f8ab017c2c9f"); + final Map attributes = + ImmutableMap.of("application.session", "4b965773-539e-4dd3-be1b-f8ab017c2c9f"); // GIVEN annotations final Map annotations = ImmutableMap.of( - "Environment Variables", ImmutableMap.of("SYSTEMSERVERCLASSPATH", "/system/framework/com.android.location.provider.jar:/system/framework/services.jar:/system/framework/ethernet-service.jar:/apex/com.android.permission/javalib/service-permission.jar:/apex/com.android.wifi/javalib/service-wifi.jar:/apex/com.android.ipsec/javalib/android.net.ipsec.ike.jar"), - "Exception", ImmutableMap.of("message", "Example test string") - ); + "Environment Variables", + ImmutableMap.of( + "SYSTEMSERVERCLASSPATH", + "/system/framework/com.android.location.provider.jar:/system/framework/services.jar:/system/framework/ethernet-service.jar:/apex/com.android.permission/javalib/service-permission.jar:/apex/com.android.wifi/javalib/service-wifi.jar:/apex/com.android.ipsec/javalib/android.net.ipsec.ike.jar"), + "Exception", ImmutableMap.of("message", "Example test string")); // GIVEN other final Map sourceCode = ImmutableMap.of( - "8751bea6-d6f6-48f4-9f96-1355c3408a9a", new SourceCode(null, "VMStack.java"), - "27948842-7c2b-4898-a74a-ba3ca4afe814", new SourceCode(17, "InvokeMethod.java") - ); + "8751bea6-d6f6-48f4-9f96-1355c3408a9a", new SourceCode(null, "VMStack.java"), + "27948842-7c2b-4898-a74a-ba3ca4afe814", new SourceCode(17, "InvokeMethod.java")); final Map threadInformationMap = new HashMap<>(); threadInformationMap.put("profile saver", new ThreadInformation("profile saver", false, new ArrayList<>())); - threadInformationMap.put("main", new ThreadInformation("main", false, new ArrayList() {{ - add(new BacktraceStackFrame("android.os.MessageQueue.nativePollOnce", null, null, "b1a3d84a-fcf3-4d10-90d5-994f1e397607" )); - add(new BacktraceStackFrame("android.os.MessageQueue.next", null, 335, "868c2d50-b00a-42a5-9aa0-e82cdea07bcd")); - }})); + threadInformationMap.put("main", new ThreadInformation("main", false, new ArrayList() { + { + add(new BacktraceStackFrame( + "android.os.MessageQueue.nativePollOnce", null, null, "b1a3d84a-fcf3-4d10-90d5-994f1e397607")); + add(new BacktraceStackFrame( + "android.os.MessageQueue.next", null, 335, "868c2d50-b00a-42a5-9aa0-e82cdea07bcd")); + } + })); // GIVEN BacktraceData return new BacktraceData( @@ -72,8 +75,7 @@ private static BacktraceData createTestBacktraceDataObject() { null, annotations, sourceCode, - threadInformationMap - ); + threadInformationMap); } @Test @@ -96,43 +98,60 @@ public void deserialize() { assertEquals("instr: androidx.test.runner.androidjunitrunner", obj.getMainThread()); assertNull(obj.classifiers); assertEquals(2, obj.getAnnotations().size()); - assertEquals("/system/framework/com.android.location.provider.jar:/system/framework/services.jar:/system/framework/ethernet-service.jar:/apex/com.android.permission/javalib/service-permission.jar:/apex/com.android.wifi/javalib/service-wifi.jar:/apex/com.android.ipsec/javalib/android.net.ipsec.ike.jar", ((Map)obj.getAnnotations().get("Environment Variables")).get("SYSTEMSERVERCLASSPATH")); - assertEquals("Example test string", ((Map)obj.getAnnotations().get("Exception")).get("message")); + assertEquals( + "/system/framework/com.android.location.provider.jar:/system/framework/services.jar:/system/framework/ethernet-service.jar:/apex/com.android.permission/javalib/service-permission.jar:/apex/com.android.wifi/javalib/service-wifi.jar:/apex/com.android.ipsec/javalib/android.net.ipsec.ike.jar", + ((Map) obj.getAnnotations().get("Environment Variables")).get("SYSTEMSERVERCLASSPATH")); + assertEquals( + "Example test string", + ((Map) obj.getAnnotations().get("Exception")).get("message")); assertEquals(1, obj.getAttributes().size()); assertEquals("4b965773-539e-4dd3-be1b-f8ab017c2c9f", obj.getAttributes().get("application.session")); assertNull(obj.getReport()); // THEN source-code assertEquals(2, obj.getSourceCode().size()); - assertNull(obj.getSourceCode().get("8751bea6-d6f6-48f4-9f96-1355c3408a9a").getStartLine()); - assertEquals("VMStack.java", obj.getSourceCode().get("8751bea6-d6f6-48f4-9f96-1355c3408a9a").getSourceCodeFileName()); - assertEquals(new Integer(17), obj.getSourceCode().get("27948842-7c2b-4898-a74a-ba3ca4afe814").getStartLine()); - assertEquals("InvokeMethod.java", obj.getSourceCode().get("27948842-7c2b-4898-a74a-ba3ca4afe814").getSourceCodeFileName()); + assertNull( + obj.getSourceCode().get("8751bea6-d6f6-48f4-9f96-1355c3408a9a").getStartLine()); + assertEquals( + "VMStack.java", + obj.getSourceCode().get("8751bea6-d6f6-48f4-9f96-1355c3408a9a").getSourceCodeFileName()); + assertEquals( + new Integer(17), + obj.getSourceCode().get("27948842-7c2b-4898-a74a-ba3ca4afe814").getStartLine()); + assertEquals( + "InvokeMethod.java", + obj.getSourceCode().get("27948842-7c2b-4898-a74a-ba3ca4afe814").getSourceCodeFileName()); assertEquals(2, obj.getThreadInformationMap().size()); // THEN 'profile saver' thread - ThreadInformation resultProfileSaverThread = obj.getThreadInformationMap().get("profile saver"); + ThreadInformation resultProfileSaverThread = + obj.getThreadInformationMap().get("profile saver"); assertEquals(false, resultProfileSaverThread.getFault()); assertEquals("profile saver", resultProfileSaverThread.getName()); assertEquals(0, resultProfileSaverThread.getStack().size()); // THEN 'main' thread ThreadInformation resultMainThread = obj.getThreadInformationMap().get("main"); - assertEquals(false,resultMainThread.getFault()); + assertEquals(false, resultMainThread.getFault()); assertEquals("main", resultMainThread.getName()); assertEquals(2, resultMainThread.getStack().size()); assertEquals(null, resultMainThread.getStack().get(0).sourceCodeFileName); assertEquals(null, resultMainThread.getStack().get(0).line); - assertEquals("b1a3d84a-fcf3-4d10-90d5-994f1e397607", resultMainThread.getStack().get(0).sourceCode); - assertEquals("android.os.MessageQueue.nativePollOnce", resultMainThread.getStack().get(0).functionName); + assertEquals( + "b1a3d84a-fcf3-4d10-90d5-994f1e397607", + resultMainThread.getStack().get(0).sourceCode); + assertEquals( + "android.os.MessageQueue.nativePollOnce", + resultMainThread.getStack().get(0).functionName); assertEquals(null, resultMainThread.getStack().get(1).sourceCodeFileName); assertEquals(new Integer(335), resultMainThread.getStack().get(1).line); - assertEquals("868c2d50-b00a-42a5-9aa0-e82cdea07bcd", resultMainThread.getStack().get(1).sourceCode); + assertEquals( + "868c2d50-b00a-42a5-9aa0-e82cdea07bcd", + resultMainThread.getStack().get(1).sourceCode); assertEquals("android.os.MessageQueue.next", resultMainThread.getStack().get(1).functionName); } - @Test public void serializeAndDeserialize() { // GIVEN @@ -154,39 +173,57 @@ public void serializeAndDeserialize() { assertEquals("instr: androidx.test.runner.androidjunitrunner", obj.getMainThread()); assertNull(obj.classifiers); assertEquals(2, obj.getAnnotations().size()); - assertEquals("/system/framework/com.android.location.provider.jar:/system/framework/services.jar:/system/framework/ethernet-service.jar:/apex/com.android.permission/javalib/service-permission.jar:/apex/com.android.wifi/javalib/service-wifi.jar:/apex/com.android.ipsec/javalib/android.net.ipsec.ike.jar", ((Map)obj.getAnnotations().get("Environment Variables")).get("SYSTEMSERVERCLASSPATH")); - assertEquals("Example test string", ((Map)obj.getAnnotations().get("Exception")).get("message")); + assertEquals( + "/system/framework/com.android.location.provider.jar:/system/framework/services.jar:/system/framework/ethernet-service.jar:/apex/com.android.permission/javalib/service-permission.jar:/apex/com.android.wifi/javalib/service-wifi.jar:/apex/com.android.ipsec/javalib/android.net.ipsec.ike.jar", + ((Map) obj.getAnnotations().get("Environment Variables")).get("SYSTEMSERVERCLASSPATH")); + assertEquals( + "Example test string", + ((Map) obj.getAnnotations().get("Exception")).get("message")); assertEquals(1, obj.getAttributes().size()); assertEquals("4b965773-539e-4dd3-be1b-f8ab017c2c9f", obj.getAttributes().get("application.session")); assertNull(obj.getReport()); // THEN source-code assertEquals(2, obj.getSourceCode().size()); - assertNull(obj.getSourceCode().get("8751bea6-d6f6-48f4-9f96-1355c3408a9a").getStartLine()); - assertEquals("VMStack.java", obj.getSourceCode().get("8751bea6-d6f6-48f4-9f96-1355c3408a9a").getSourceCodeFileName()); - assertEquals(new Integer(17), obj.getSourceCode().get("27948842-7c2b-4898-a74a-ba3ca4afe814").getStartLine()); - assertEquals("InvokeMethod.java", obj.getSourceCode().get("27948842-7c2b-4898-a74a-ba3ca4afe814").getSourceCodeFileName()); + assertNull( + obj.getSourceCode().get("8751bea6-d6f6-48f4-9f96-1355c3408a9a").getStartLine()); + assertEquals( + "VMStack.java", + obj.getSourceCode().get("8751bea6-d6f6-48f4-9f96-1355c3408a9a").getSourceCodeFileName()); + assertEquals( + new Integer(17), + obj.getSourceCode().get("27948842-7c2b-4898-a74a-ba3ca4afe814").getStartLine()); + assertEquals( + "InvokeMethod.java", + obj.getSourceCode().get("27948842-7c2b-4898-a74a-ba3ca4afe814").getSourceCodeFileName()); assertEquals(2, obj.getThreadInformationMap().size()); // THEN 'profile saver' thread - ThreadInformation resultProfileSaverThread = obj.getThreadInformationMap().get("profile saver"); + ThreadInformation resultProfileSaverThread = + obj.getThreadInformationMap().get("profile saver"); assertEquals(false, resultProfileSaverThread.getFault()); assertEquals("profile saver", resultProfileSaverThread.getName()); assertEquals(0, resultProfileSaverThread.getStack().size()); // THEN 'main' thread ThreadInformation resultMainThread = obj.getThreadInformationMap().get("main"); - assertEquals(false,resultMainThread.getFault()); + assertEquals(false, resultMainThread.getFault()); assertEquals("main", resultMainThread.getName()); assertEquals(2, resultMainThread.getStack().size()); assertEquals(null, resultMainThread.getStack().get(0).sourceCodeFileName); assertEquals(null, resultMainThread.getStack().get(0).line); - assertEquals("b1a3d84a-fcf3-4d10-90d5-994f1e397607", resultMainThread.getStack().get(0).sourceCode); - assertEquals("android.os.MessageQueue.nativePollOnce", resultMainThread.getStack().get(0).functionName); + assertEquals( + "b1a3d84a-fcf3-4d10-90d5-994f1e397607", + resultMainThread.getStack().get(0).sourceCode); + assertEquals( + "android.os.MessageQueue.nativePollOnce", + resultMainThread.getStack().get(0).functionName); assertEquals(null, resultMainThread.getStack().get(1).sourceCodeFileName); assertEquals(new Integer(335), resultMainThread.getStack().get(1).line); - assertEquals("868c2d50-b00a-42a5-9aa0-e82cdea07bcd", resultMainThread.getStack().get(1).sourceCode); + assertEquals( + "868c2d50-b00a-42a5-9aa0-e82cdea07bcd", + resultMainThread.getStack().get(1).sourceCode); assertEquals("android.os.MessageQueue.next", resultMainThread.getStack().get(1).functionName); } } diff --git a/backtrace-library/src/test/java/backtraceio/library/models/BacktraceResultTest.java b/backtrace-library/src/test/java/backtraceio/library/models/BacktraceResultTest.java index aae1262f4..967f5f97c 100644 --- a/backtrace-library/src/test/java/backtraceio/library/models/BacktraceResultTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/models/BacktraceResultTest.java @@ -4,12 +4,13 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import org.junit.Test; +import static backtraceio.library.TestUtils.compareJson; import backtraceio.library.TestUtils; import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.models.json.BacktraceReport; import backtraceio.library.models.types.BacktraceResultStatus; +import org.junit.Test; public class BacktraceResultTest { @@ -43,7 +44,7 @@ public void serialize() { String result = BacktraceSerializeHelper.toJson(example); // THEN String expectedJson = TestUtils.readFileAsString(this, "backtraceResult.json"); - assertEquals(expectedJson, result); + compareJson(expectedJson, result); } @Test diff --git a/backtrace-library/src/test/java/backtraceio/library/models/BacktraceStackFrameTest.java b/backtrace-library/src/test/java/backtraceio/library/models/BacktraceStackFrameTest.java index 6639cc141..ab145ae1a 100644 --- a/backtrace-library/src/test/java/backtraceio/library/models/BacktraceStackFrameTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/models/BacktraceStackFrameTest.java @@ -3,25 +3,27 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -import org.json.JSONException; -import org.junit.Before; -import org.junit.Test; - import backtraceio.library.TestUtils; import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.logger.BacktraceLogger; import backtraceio.library.logger.BacktraceMockLogger; +import org.json.JSONException; +import org.junit.Before; +import org.junit.Test; public class BacktraceStackFrameTest { @Before public void setUp() { BacktraceLogger.setLogger(new BacktraceMockLogger()); } + private final String JSON_FILE = "backtraceStackFrame.json"; + @Test public void serialize() throws JSONException { // GIVEN - BacktraceStackFrame obj = new BacktraceStackFrame("java.util.TimerThread.run", "TimerThread", 512, "85c0915f-3b99-4942-91c8-221e23846ded"); + BacktraceStackFrame obj = new BacktraceStackFrame( + "java.util.TimerThread.run", "TimerThread", 512, "85c0915f-3b99-4942-91c8-221e23846ded"); // WHEN String json = TestUtils.minifyJsonString(BacktraceSerializeHelper.toJson(obj)); // THEN @@ -34,12 +36,13 @@ public void serialize() throws JSONException { public void serializeFromStackTraceElement() throws JSONException { // GIVEN String sourceCodeUuid = "85c0915f-3b99-4942-91c8-221e23846ded"; - BacktraceStackFrame obj = BacktraceStackFrame.fromStackTraceElement(new StackTraceElement("java.util.TimerThread", "run", "", 512)); + BacktraceStackFrame obj = BacktraceStackFrame.fromStackTraceElement( + new StackTraceElement("java.util.TimerThread", "run", "", 512)); // WHEN String json = TestUtils.minifyJsonString(BacktraceSerializeHelper.toJson(obj)); // THEN - String expectedJson = TestUtils.minifyJsonString(TestUtils.readFileAsString(this, JSON_FILE)). - replace(sourceCodeUuid, obj.sourceCode); + String expectedJson = TestUtils.minifyJsonString(TestUtils.readFileAsString(this, JSON_FILE)) + .replace(sourceCodeUuid, obj.sourceCode); assertEquals(expectedJson, json); } @@ -66,7 +69,8 @@ public void deserialize() throws JSONException { @Test public void serializeAndDeserialize() { // GIVEN - BacktraceStackFrame obj = new BacktraceStackFrame("java.util.TimerThread.run", "TimerThread", 512, "85c0915f-3b99-4942-91c8-221e23846ded"); + BacktraceStackFrame obj = new BacktraceStackFrame( + "java.util.TimerThread.run", "TimerThread", 512, "85c0915f-3b99-4942-91c8-221e23846ded"); // WHEN String json = BacktraceSerializeHelper.toJson(obj); BacktraceStackFrame result = BacktraceSerializeHelper.fromJson(json, BacktraceStackFrame.class); diff --git a/backtrace-library/src/test/java/backtraceio/library/models/json/BacktraceReportTest.java b/backtrace-library/src/test/java/backtraceio/library/models/json/BacktraceReportTest.java index 49d769f74..8abce4a9a 100644 --- a/backtrace-library/src/test/java/backtraceio/library/models/json/BacktraceReportTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/models/json/BacktraceReportTest.java @@ -5,45 +5,61 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import org.json.JSONException; -import org.junit.Test; - +import backtraceio.library.TestUtils; +import backtraceio.library.common.BacktraceSerializeHelper; +import backtraceio.library.models.BacktraceStackFrame; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; -import java.lang.StackTraceElement; -import backtraceio.library.TestUtils; -import backtraceio.library.common.BacktraceSerializeHelper; -import backtraceio.library.models.BacktraceStackFrame; +import org.json.JSONException; +import org.junit.Test; public class BacktraceReportTest { private final String JSON_FILE = "backtraceReport.json"; + @Test public void serialize() throws JSONException { // GIVEN final List diagnosticStack = new ArrayList<>(); - diagnosticStack.add(new BacktraceStackFrame("backtraceio.library.SettingAttributesTest.tmpGsonTest", null, 75, "c37b9ae3-eab1-4928-9533-f1c14b6149f5")); - diagnosticStack.add(new BacktraceStackFrame("java.lang.reflect.Method.invoke", null, null, "6f280747-feee-4f4b-9eff-dda0d8eaa535")); + diagnosticStack.add(new BacktraceStackFrame( + "backtraceio.library.SettingAttributesTest.tmpGsonTest", + null, + 75, + "c37b9ae3-eab1-4928-9533-f1c14b6149f5")); + diagnosticStack.add(new BacktraceStackFrame( + "java.lang.reflect.Method.invoke", null, null, "6f280747-feee-4f4b-9eff-dda0d8eaa535")); final Exception exception = new IllegalAccessException(); final StackTraceElement[] stackTraceElements = new StackTraceElement[1]; - stackTraceElements[0] = new StackTraceElement("backtraceio.library.SettingAttributesTest", "tmpGsonTest", "SettingAttributesTest.java", 75); + stackTraceElements[0] = new StackTraceElement( + "backtraceio.library.SettingAttributesTest", "tmpGsonTest", "SettingAttributesTest.java", 75); exception.setStackTrace(stackTraceElements); final Map attributes = new HashMap<>(); attributes.put("error.type", "Exception"); - final BacktraceReport report = new BacktraceReport(UUID.fromString("a62a533a-a7b8-415c-9a99-253c51f00827"), 1709680251, true, "java.lang.IllegalAccessException", attributes, null, exception, new ArrayList() {{ add("abc.txt"); }}, diagnosticStack); + final BacktraceReport report = new BacktraceReport( + UUID.fromString("a62a533a-a7b8-415c-9a99-253c51f00827"), + 1709680251, + true, + "java.lang.IllegalAccessException", + attributes, + null, + exception, + new ArrayList() { + { + add("abc.txt"); + } + }, + diagnosticStack); // WHEN String json = BacktraceSerializeHelper.toJson(report); // THEN - String expectedJson = TestUtils.minifyJsonString( - TestUtils.readFileAsString(this, JSON_FILE) - ); + String expectedJson = TestUtils.minifyJsonString(TestUtils.readFileAsString(this, JSON_FILE)); assertTrue(TestUtils.compareJson(json, expectedJson)); } @@ -71,7 +87,6 @@ public void deserialize() { assertEquals(1, obj.attachmentPaths.size()); assertEquals("abc.txt", obj.attachmentPaths.get(0)); - // THEN diagnostic stack assertNotNull(obj.diagnosticStack); assertEquals(2, obj.diagnosticStack.size()); @@ -92,17 +107,36 @@ public void serializeAndDeserialize() { // GIVEN final List diagnosticStack = new ArrayList<>(); - diagnosticStack.add(new BacktraceStackFrame("backtraceio.library.SettingAttributesTest.tmpGsonTest", null, 75, "c37b9ae3-eab1-4928-9533-f1c14b6149f5")); - diagnosticStack.add(new BacktraceStackFrame("java.lang.reflect.Method.invoke", null, null, "6f280747-feee-4f4b-9eff-dda0d8eaa535")); + diagnosticStack.add(new BacktraceStackFrame( + "backtraceio.library.SettingAttributesTest.tmpGsonTest", + null, + 75, + "c37b9ae3-eab1-4928-9533-f1c14b6149f5")); + diagnosticStack.add(new BacktraceStackFrame( + "java.lang.reflect.Method.invoke", null, null, "6f280747-feee-4f4b-9eff-dda0d8eaa535")); final Exception exception = new IllegalAccessException(); final StackTraceElement[] stackTraceElements = new StackTraceElement[1]; - stackTraceElements[0] = new StackTraceElement("backtraceio.library.SettingAttributesTest", "tmpGsonTest", "SettingAttributesTest.java", 75); + stackTraceElements[0] = new StackTraceElement( + "backtraceio.library.SettingAttributesTest", "tmpGsonTest", "SettingAttributesTest.java", 75); exception.setStackTrace(stackTraceElements); final Map attributes = new HashMap<>(); attributes.put("error.type", "Exception"); - final BacktraceReport report = new BacktraceReport(UUID.fromString("a62a533a-a7b8-415c-9a99-253c51f00827"), 1709680251, true, "java.lang.IllegalAccessException", attributes, null, exception, new ArrayList() {{ add("abc.txt"); }}, diagnosticStack); + final BacktraceReport report = new BacktraceReport( + UUID.fromString("a62a533a-a7b8-415c-9a99-253c51f00827"), + 1709680251, + true, + "java.lang.IllegalAccessException", + attributes, + null, + exception, + new ArrayList() { + { + add("abc.txt"); + } + }, + diagnosticStack); // WHEN String json = BacktraceSerializeHelper.toJson(report); @@ -123,7 +157,6 @@ public void serializeAndDeserialize() { assertEquals(1, obj.attachmentPaths.size()); assertEquals("abc.txt", obj.attachmentPaths.get(0)); - // THEN diagnostic stack assertNotNull(obj.diagnosticStack); assertEquals(2, obj.diagnosticStack.size()); diff --git a/backtrace-library/src/test/java/backtraceio/library/models/json/SourceCodeDataTest.java b/backtrace-library/src/test/java/backtraceio/library/models/json/SourceCodeDataTest.java index 6c695a1d2..d09fa0452 100644 --- a/backtrace-library/src/test/java/backtraceio/library/models/json/SourceCodeDataTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/models/json/SourceCodeDataTest.java @@ -3,34 +3,33 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -import org.json.JSONException; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.List; - import backtraceio.library.TestUtils; import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.models.BacktraceStackFrame; +import java.util.ArrayList; +import java.util.List; +import org.json.JSONException; +import org.junit.Test; public class SourceCodeDataTest { private final String JSON_FILE = "sourceCodeData.json"; + @Test public void serialize() throws JSONException { // GIVEN - List frames = new ArrayList() {{ - add(new BacktraceStackFrame(null, "VMStack.java", null, "8751bea6-d6f6-48f4-9f96-1355c3408a9a")); - add(new BacktraceStackFrame(null, "InvokeMethod.java", 17, "27948842-7c2b-4898-a74a-ba3ca4afe814")); - }}; + List frames = new ArrayList() { + { + add(new BacktraceStackFrame(null, "VMStack.java", null, "8751bea6-d6f6-48f4-9f96-1355c3408a9a")); + add(new BacktraceStackFrame(null, "InvokeMethod.java", 17, "27948842-7c2b-4898-a74a-ba3ca4afe814")); + } + }; SourceCodeData obj = new SourceCodeData(frames); // WHEN String json = TestUtils.minifyJsonString(BacktraceSerializeHelper.toJson(obj)); // THEN - String expectedJson = TestUtils.minifyJsonString( - TestUtils.readFileAsString(this, JSON_FILE) - ); + String expectedJson = TestUtils.minifyJsonString(TestUtils.readFileAsString(this, JSON_FILE)); assertEquals(expectedJson, json); } @@ -43,19 +42,30 @@ public void deserialize() { final SourceCodeData obj = BacktraceSerializeHelper.fromJson(json, SourceCodeData.class); // THEN assertEquals(2, obj.data.size()); - assertEquals("VMStack.java", obj.data.get("8751bea6-d6f6-48f4-9f96-1355c3408a9a").getSourceCodeFileName()); + assertEquals( + "VMStack.java", + obj.data.get("8751bea6-d6f6-48f4-9f96-1355c3408a9a").getSourceCodeFileName()); assertNull(obj.data.get("8751bea6-d6f6-48f4-9f96-1355c3408a9a").getStartLine()); - assertEquals("InvokeMethod.java", obj.data.get("27948842-7c2b-4898-a74a-ba3ca4afe814").getSourceCodeFileName()); - assertEquals(17, obj.data.get("27948842-7c2b-4898-a74a-ba3ca4afe814").getStartLine().intValue()); + assertEquals( + "InvokeMethod.java", + obj.data.get("27948842-7c2b-4898-a74a-ba3ca4afe814").getSourceCodeFileName()); + assertEquals( + 17, + obj.data + .get("27948842-7c2b-4898-a74a-ba3ca4afe814") + .getStartLine() + .intValue()); } @Test public void serializeAndDeserialize() { // GIVEN - List frames = new ArrayList() {{ - add(new BacktraceStackFrame(null, "VMStack.java", null, "8751bea6-d6f6-48f4-9f96-1355c3408a9a")); - add(new BacktraceStackFrame(null, "InvokeMethod.java", 17, "27948842-7c2b-4898-a74a-ba3ca4afe814")); - }}; + List frames = new ArrayList() { + { + add(new BacktraceStackFrame(null, "VMStack.java", null, "8751bea6-d6f6-48f4-9f96-1355c3408a9a")); + add(new BacktraceStackFrame(null, "InvokeMethod.java", 17, "27948842-7c2b-4898-a74a-ba3ca4afe814")); + } + }; SourceCodeData obj = new SourceCodeData(frames); // WHEN @@ -66,9 +76,18 @@ public void serializeAndDeserialize() { // THEN assertEquals(2, result.data.size()); - assertEquals("VMStack.java", result.data.get("8751bea6-d6f6-48f4-9f96-1355c3408a9a").getSourceCodeFileName()); + assertEquals( + "VMStack.java", + result.data.get("8751bea6-d6f6-48f4-9f96-1355c3408a9a").getSourceCodeFileName()); assertNull(result.data.get("8751bea6-d6f6-48f4-9f96-1355c3408a9a").getStartLine()); - assertEquals("InvokeMethod.java", result.data.get("27948842-7c2b-4898-a74a-ba3ca4afe814").getSourceCodeFileName()); - assertEquals(17, result.data.get("27948842-7c2b-4898-a74a-ba3ca4afe814").getStartLine().intValue()); + assertEquals( + "InvokeMethod.java", + result.data.get("27948842-7c2b-4898-a74a-ba3ca4afe814").getSourceCodeFileName()); + assertEquals( + 17, + result.data + .get("27948842-7c2b-4898-a74a-ba3ca4afe814") + .getStartLine() + .intValue()); } } diff --git a/backtrace-library/src/test/java/backtraceio/library/models/json/SourceCodeTest.java b/backtrace-library/src/test/java/backtraceio/library/models/json/SourceCodeTest.java index 30c3edab1..970bb5dc6 100644 --- a/backtrace-library/src/test/java/backtraceio/library/models/json/SourceCodeTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/models/json/SourceCodeTest.java @@ -2,15 +2,15 @@ import static org.junit.Assert.assertEquals; -import org.json.JSONException; -import org.junit.Test; - import backtraceio.library.TestUtils; import backtraceio.library.common.BacktraceSerializeHelper; +import org.json.JSONException; +import org.junit.Test; public class SourceCodeTest { private final String JSON_FILE = "sourceCode.json"; + @Test public void serialize() throws JSONException { // GIVEN @@ -20,9 +20,7 @@ public void serialize() throws JSONException { String json = TestUtils.minifyJsonString(BacktraceSerializeHelper.toJson(obj)); // THEN - String expectedJson = TestUtils.minifyJsonString( - TestUtils.readFileAsString(this, JSON_FILE) - ); + String expectedJson = TestUtils.minifyJsonString(TestUtils.readFileAsString(this, JSON_FILE)); assertEquals(expectedJson, json); } diff --git a/backtrace-library/src/test/java/backtraceio/library/models/json/ThreadInformationTest.java b/backtrace-library/src/test/java/backtraceio/library/models/json/ThreadInformationTest.java index a31a24cbc..f44bf0913 100644 --- a/backtrace-library/src/test/java/backtraceio/library/models/json/ThreadInformationTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/models/json/ThreadInformationTest.java @@ -5,15 +5,13 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import org.json.JSONException; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.List; - import backtraceio.library.TestUtils; import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.models.BacktraceStackFrame; +import java.util.ArrayList; +import java.util.List; +import org.json.JSONException; +import org.junit.Test; public class ThreadInformationTest { @@ -21,17 +19,20 @@ public class ThreadInformationTest { public void serialize() throws JSONException { // GIVEN List frames = new ArrayList<>(); - frames.add(new BacktraceStackFrame("backtraceio.backtraceio.MainActivity.handledException", null, 150, "cde23509-3dcc-494d-af1f-4b4e2af4cc5e")); - frames.add(new BacktraceStackFrame("java.lang.reflect.Method.invoke", null, null, "7fc374ec-e276-46da-8d1a-05b37425927e")); + frames.add(new BacktraceStackFrame( + "backtraceio.backtraceio.MainActivity.handledException", + null, + 150, + "cde23509-3dcc-494d-af1f-4b4e2af4cc5e")); + frames.add(new BacktraceStackFrame( + "java.lang.reflect.Method.invoke", null, null, "7fc374ec-e276-46da-8d1a-05b37425927e")); ThreadInformation obj = new ThreadInformation("main", true, frames); // WHEN String json = TestUtils.minifyJsonString(BacktraceSerializeHelper.toJson(obj)); // THEN - String expectedJson = TestUtils.minifyJsonString( - TestUtils.readFileAsString(this, "threadInformation.json") - ); + String expectedJson = TestUtils.minifyJsonString(TestUtils.readFileAsString(this, "threadInformation.json")); assertEquals(expectedJson, json); } @@ -51,7 +52,9 @@ public void deserialize() { // THEN Frame 1 assertEquals(Integer.valueOf(150), result.getStack().get(0).line); - assertEquals("backtraceio.backtraceio.MainActivity.handledException", result.getStack().get(0).functionName); + assertEquals( + "backtraceio.backtraceio.MainActivity.handledException", + result.getStack().get(0).functionName); assertEquals("cde23509-3dcc-494d-af1f-4b4e2af4cc5e", result.getStack().get(0).sourceCode); assertNull(result.getStack().get(0).sourceCodeFileName); @@ -65,8 +68,13 @@ public void deserialize() { @Test public void serializeAndDeserialize() { List frames = new ArrayList<>(); - frames.add(new BacktraceStackFrame("backtraceio.backtraceio.MainActivity.handledException", null, 150, "cde23509-3dcc-494d-af1f-4b4e2af4cc5e")); - frames.add(new BacktraceStackFrame("java.lang.reflect.Method.invoke", null, null, "7fc374ec-e276-46da-8d1a-05b37425927e")); + frames.add(new BacktraceStackFrame( + "backtraceio.backtraceio.MainActivity.handledException", + null, + 150, + "cde23509-3dcc-494d-af1f-4b4e2af4cc5e")); + frames.add(new BacktraceStackFrame( + "java.lang.reflect.Method.invoke", null, null, "7fc374ec-e276-46da-8d1a-05b37425927e")); ThreadInformation obj = new ThreadInformation("main", true, frames); // WHEN @@ -83,7 +91,9 @@ public void serializeAndDeserialize() { // THEN Frame 1 assertEquals(Integer.valueOf(150), result.getStack().get(0).line); - assertEquals("backtraceio.backtraceio.MainActivity.handledException", result.getStack().get(0).functionName); + assertEquals( + "backtraceio.backtraceio.MainActivity.handledException", + result.getStack().get(0).functionName); assertEquals("cde23509-3dcc-494d-af1f-4b4e2af4cc5e", result.getStack().get(0).sourceCode); assertNull(result.getStack().get(0).sourceCodeFileName); diff --git a/backtrace-library/src/test/java/backtraceio/library/models/types/BacktraceResultStatusTest.java b/backtrace-library/src/test/java/backtraceio/library/models/types/BacktraceResultStatusTest.java index 850523c22..090a6a04a 100644 --- a/backtrace-library/src/test/java/backtraceio/library/models/types/BacktraceResultStatusTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/models/types/BacktraceResultStatusTest.java @@ -2,14 +2,13 @@ import static org.junit.Assert.assertEquals; +import java.util.Arrays; +import java.util.Collection; import org.junit.Test; import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.Collection; - @RunWith(Enclosed.class) public class BacktraceResultStatusTest { @RunWith(Parameterized.class) @@ -24,25 +23,24 @@ public BacktraceResultStatusParametrizedTests(String apiStatus, BacktraceResultS @Parameterized.Parameters public static Collection apiStringStatus() { - return Arrays.asList(new Object[][]{ - {"ok", BacktraceResultStatus.Ok}, - {"Ok", BacktraceResultStatus.Ok}, - {"OK", BacktraceResultStatus.Ok}, - {"oK", BacktraceResultStatus.Ok}, - {"servererror", BacktraceResultStatus.ServerError}, - {"serverError", BacktraceResultStatus.ServerError}, - {"ServerError", BacktraceResultStatus.ServerError}, - {"SERVERERROR", BacktraceResultStatus.ServerError} + return Arrays.asList(new Object[][] { + {"ok", BacktraceResultStatus.Ok}, + {"Ok", BacktraceResultStatus.Ok}, + {"OK", BacktraceResultStatus.Ok}, + {"oK", BacktraceResultStatus.Ok}, + {"servererror", BacktraceResultStatus.ServerError}, + {"serverError", BacktraceResultStatus.ServerError}, + {"ServerError", BacktraceResultStatus.ServerError}, + {"SERVERERROR", BacktraceResultStatus.ServerError} }); } @Test public void testMappingStatusStringToEnum() { - assertEquals(this.expectedApiStatusEnum, - BacktraceResultStatus.enumOf(this.apiStatus)); + assertEquals(this.expectedApiStatusEnum, BacktraceResultStatus.enumOf(this.apiStatus)); } - } + public static class BacktraceResultStatusSingleTests { @Test(expected = IllegalArgumentException.class) diff --git a/backtrace-library/src/test/resources/backtraceApiResult.error.json b/backtrace-library/src/test/resources/backtraceApiResult.error.json index 9928ff97c..8559f10cf 100644 --- a/backtrace-library/src/test/resources/backtraceApiResult.error.json +++ b/backtrace-library/src/test/resources/backtraceApiResult.error.json @@ -1 +1,4 @@ -{"error":{"code":32768, "message":"no root object supplied"}} \ No newline at end of file +{"error": { + "code": 32768, + "message": "no root object supplied" +}} diff --git a/backtrace-library/src/test/resources/backtraceApiResult.json b/backtrace-library/src/test/resources/backtraceApiResult.json index 9ef4b2d6c..42a9df056 100644 --- a/backtrace-library/src/test/resources/backtraceApiResult.json +++ b/backtrace-library/src/test/resources/backtraceApiResult.json @@ -1 +1,4 @@ -{"_rxid":"95000000-eb43-390b-0000-000000000000","response":"ok"} \ No newline at end of file +{ + "_rxid": "95000000-eb43-390b-0000-000000000000", + "response": "ok" +} diff --git a/backtrace-library/src/test/resources/backtraceData.json b/backtrace-library/src/test/resources/backtraceData.json index 09e181130..660d55b9b 100644 --- a/backtrace-library/src/test/resources/backtraceData.json +++ b/backtrace-library/src/test/resources/backtraceData.json @@ -1,51 +1,43 @@ { - "agent": "backtrace-android", - "agentVersion": "3.8.3", - "annotations": { - "Environment Variables": { - "SYSTEMSERVERCLASSPATH": "/system/framework/com.android.location.provider.jar:/system/framework/services.jar:/system/framework/ethernet-service.jar:/apex/com.android.permission/javalib/service-permission.jar:/apex/com.android.wifi/javalib/service-wifi.jar:/apex/com.android.ipsec/javalib/android.net.ipsec.ike.jar" - }, - "Exception": { - "message": "Example test string" - } - }, - "attributes": { - "application.session": "4b965773-539e-4dd3-be1b-f8ab017c2c9f" - }, - "lang": "java", - "langVersion": "0", - "mainThread": "instr: androidx.test.runner.androidjunitrunner", - "sourceCode": { - "8751bea6-d6f6-48f4-9f96-1355c3408a9a": { - "path": "VMStack.java" + "mainThread": "instr: androidx.test.runner.androidjunitrunner", + "sourceCode": { + "8751bea6-d6f6-48f4-9f96-1355c3408a9a": {"path": "VMStack.java"}, + "27948842-7c2b-4898-a74a-ba3ca4afe814": { + "path": "InvokeMethod.java", + "startLine": 17 + } }, - "27948842-7c2b-4898-a74a-ba3ca4afe814": { - "path": "InvokeMethod.java", - "startLine": 17 - } - }, - "threads": { - "profile saver": { - "fault": false, - "name": "profile saver", - "stack": [] + "agent": "backtrace-android", + "langVersion": "0", + "agentVersion": "3.8.3", + "annotations": { + "Environment Variables": {"SYSTEMSERVERCLASSPATH": "/system/framework/com.android.location.provider.jar:/system/framework/services.jar:/system/framework/ethernet-service.jar:/apex/com.android.permission/javalib/service-permission.jar:/apex/com.android.wifi/javalib/service-wifi.jar:/apex/com.android.ipsec/javalib/android.net.ipsec.ike.jar"}, + "Exception": {"message": "Example test string"} }, - "main": { - "fault": false, - "name": "main", - "stack": [ - { - "funcName": "android.os.MessageQueue.nativePollOnce", - "sourceCode": "b1a3d84a-fcf3-4d10-90d5-994f1e397607" + "threads": { + "profile saver": { + "stack": [], + "name": "profile saver", + "fault": false }, - { - "funcName": "android.os.MessageQueue.next", - "line": 335, - "sourceCode": "868c2d50-b00a-42a5-9aa0-e82cdea07bcd" + "main": { + "stack": [ + { + "funcName": "android.os.MessageQueue.nativePollOnce", + "sourceCode": "b1a3d84a-fcf3-4d10-90d5-994f1e397607" + }, + { + "funcName": "android.os.MessageQueue.next", + "sourceCode": "868c2d50-b00a-42a5-9aa0-e82cdea07bcd", + "line": 335 + } + ], + "name": "main", + "fault": false } - ] - } - }, - "timestamp": 1720419610, - "uuid": "ecdf418b-3e22-4c7c-8011-c85dc2b4386f" -} \ No newline at end of file + }, + "attributes": {"application.session": "4b965773-539e-4dd3-be1b-f8ab017c2c9f"}, + "lang": "java", + "uuid": "ecdf418b-3e22-4c7c-8011-c85dc2b4386f", + "timestamp": 1720419610 +} diff --git a/backtrace-library/src/test/resources/backtraceDatabaseRecord.json b/backtrace-library/src/test/resources/backtraceDatabaseRecord.json index afdccdeb1..0d735d249 100644 --- a/backtrace-library/src/test/resources/backtraceDatabaseRecord.json +++ b/backtrace-library/src/test/resources/backtraceDatabaseRecord.json @@ -1 +1,7 @@ -{"Id":"ecdf418b-3e22-4c7c-8011-c85dc2b4386f","RecordName":"/data/user/0/backtraceio.library.test/files/ecdf418b-3e22-4c7c-8011-c85dc2b4386f-record.json","DataPath":"/data/user/0/backtraceio.library.test/files/ecdf418b-3e22-4c7c-8011-c85dc2b4386f-attachment.json","ReportPath":"/data/user/0/backtraceio.library.test/files/ecdf418b-3e22-4c7c-8011-c85dc2b4386f-report.json","Size":25362} \ No newline at end of file +{ + "RecordName": "/data/user/0/backtraceio.library.test/files/ecdf418b-3e22-4c7c-8011-c85dc2b4386f-record.json", + "DataPath": "/data/user/0/backtraceio.library.test/files/ecdf418b-3e22-4c7c-8011-c85dc2b4386f-attachment.json", + "Size": 25362, + "ReportPath": "/data/user/0/backtraceio.library.test/files/ecdf418b-3e22-4c7c-8011-c85dc2b4386f-report.json", + "Id": "ecdf418b-3e22-4c7c-8011-c85dc2b4386f" +} diff --git a/backtrace-library/src/test/resources/backtraceReport-tmp.json b/backtrace-library/src/test/resources/backtraceReport-tmp.json index 0213f8283..89f8533eb 100644 --- a/backtrace-library/src/test/resources/backtraceReport-tmp.json +++ b/backtrace-library/src/test/resources/backtraceReport-tmp.json @@ -1,238 +1,234 @@ { - "attachment-paths": [ - "abc.txt" - ], - "attributes": { - "error.type": "Exception" - }, - "classifier": "java.lang.IllegalAccessException", - "diagnostic-stack": [ - { - "funcName": "backtraceio.library.SettingAttributesTest.tmpGsonTest", - "line": 75, - "sourceCode": "c37b9ae3-eab1-4928-9533-f1c14b6149f5" - }, - { - "funcName": "java.lang.reflect.Method.invoke", - "sourceCode": "6f280747-feee-4f4b-9eff-dda0d8eaa535" - } - ], - "exception": { - "stack-trace": [ - { - "declaring-class": "backtraceio.library.SettingAttributesTest", - "file-name": "SettingAttributesTest.java", - "line-number": 75, - "method-name": "tmpGsonTest" - }, - { - "declaring-class": "java.lang.reflect.Method", - "file-name": "Method.java", - "line-number": -2, - "method-name": "invoke" - }, - { - "declaring-class": "org.junit.runners.model.FrameworkMethod$1", - "file-name": "FrameworkMethod.java", - "line-number": 59, - "method-name": "runReflectiveCall" - }, - { - "declaring-class": "org.junit.internal.runners.model.ReflectiveCallable", - "file-name": "ReflectiveCallable.java", - "line-number": 12, - "method-name": "run" - }, - { - "declaring-class": "org.junit.runners.model.FrameworkMethod", - "file-name": "FrameworkMethod.java", - "line-number": 56, - "method-name": "invokeExplosively" - }, - { - "declaring-class": "org.junit.internal.runners.statements.InvokeMethod", - "file-name": "InvokeMethod.java", - "line-number": 17, - "method-name": "evaluate" - }, - { - "declaring-class": "androidx.test.internal.runner.junit4.statement.RunBefores", - "file-name": "RunBefores.java", - "line-number": 80, - "method-name": "evaluate" - }, - { - "declaring-class": "org.junit.runners.ParentRunner$3", - "file-name": "ParentRunner.java", - "line-number": 306, - "method-name": "evaluate" - }, - { - "declaring-class": "org.junit.runners.BlockJUnit4ClassRunner$1", - "file-name": "BlockJUnit4ClassRunner.java", - "line-number": 100, - "method-name": "evaluate" - }, - { - "declaring-class": "org.junit.runners.ParentRunner", - "file-name": "ParentRunner.java", - "line-number": 366, - "method-name": "runLeaf" - }, - { - "declaring-class": "org.junit.runners.BlockJUnit4ClassRunner", - "file-name": "BlockJUnit4ClassRunner.java", - "line-number": 103, - "method-name": "runChild" - }, - { - "declaring-class": "org.junit.runners.BlockJUnit4ClassRunner", - "file-name": "BlockJUnit4ClassRunner.java", - "line-number": 63, - "method-name": "runChild" - }, - { - "declaring-class": "org.junit.runners.ParentRunner$4", - "file-name": "ParentRunner.java", - "line-number": 331, - "method-name": "run" - }, - { - "declaring-class": "org.junit.runners.ParentRunner$1", - "file-name": "ParentRunner.java", - "line-number": 79, - "method-name": "schedule" - }, - { - "declaring-class": "org.junit.runners.ParentRunner", - "file-name": "ParentRunner.java", - "line-number": 329, - "method-name": "runChildren" - }, - { - "declaring-class": "org.junit.runners.ParentRunner", - "file-name": "ParentRunner.java", - "line-number": 66, - "method-name": "access$100" - }, - { - "declaring-class": "org.junit.runners.ParentRunner$2", - "file-name": "ParentRunner.java", - "line-number": 293, - "method-name": "evaluate" - }, - { - "declaring-class": "org.junit.runners.ParentRunner$3", - "file-name": "ParentRunner.java", - "line-number": 306, - "method-name": "evaluate" - }, - { - "declaring-class": "org.junit.runners.ParentRunner", - "file-name": "ParentRunner.java", - "line-number": 413, - "method-name": "run" - }, - { - "declaring-class": "androidx.test.ext.junit.runners.AndroidJUnit4", - "file-name": "AndroidJUnit4.java", - "line-number": 162, - "method-name": "run" - }, - { - "declaring-class": "org.junit.runners.Suite", - "file-name": "Suite.java", - "line-number": 128, - "method-name": "runChild" - }, - { - "declaring-class": "org.junit.runners.Suite", - "file-name": "Suite.java", - "line-number": 27, - "method-name": "runChild" - }, - { - "declaring-class": "org.junit.runners.ParentRunner$4", - "file-name": "ParentRunner.java", - "line-number": 331, - "method-name": "run" - }, - { - "declaring-class": "org.junit.runners.ParentRunner$1", - "file-name": "ParentRunner.java", - "line-number": 79, - "method-name": "schedule" - }, - { - "declaring-class": "org.junit.runners.ParentRunner", - "file-name": "ParentRunner.java", - "line-number": 329, - "method-name": "runChildren" - }, - { - "declaring-class": "org.junit.runners.ParentRunner", - "file-name": "ParentRunner.java", - "line-number": 66, - "method-name": "access$100" - }, - { - "declaring-class": "org.junit.runners.ParentRunner$2", - "file-name": "ParentRunner.java", - "line-number": 293, - "method-name": "evaluate" - }, - { - "declaring-class": "org.junit.runners.ParentRunner$3", - "file-name": "ParentRunner.java", - "line-number": 306, - "method-name": "evaluate" - }, - { - "declaring-class": "org.junit.runners.ParentRunner", - "file-name": "ParentRunner.java", - "line-number": 413, - "method-name": "run" - }, - { - "declaring-class": "org.junit.runner.JUnitCore", - "file-name": "JUnitCore.java", - "line-number": 137, - "method-name": "run" - }, - { - "declaring-class": "org.junit.runner.JUnitCore", - "file-name": "JUnitCore.java", - "line-number": 115, - "method-name": "run" - }, - { - "declaring-class": "androidx.test.internal.runner.TestExecutor", - "file-name": "TestExecutor.java", - "line-number": 67, - "method-name": "execute" - }, - { - "declaring-class": "androidx.test.internal.runner.TestExecutor", - "file-name": "TestExecutor.java", - "line-number": 58, - "method-name": "execute" - }, - { - "declaring-class": "androidx.test.runner.AndroidJUnitRunner", - "file-name": "AndroidJUnitRunner.java", - "line-number": 446, - "method-name": "onStart" - }, - { - "declaring-class": "android.app.Instrumentation$InstrumentationThread", - "file-name": "Instrumentation.java", - "line-number": 2205, - "method-name": "run" - } + "diagnostic-stack": [ + { + "funcName": "backtraceio.library.SettingAttributesTest.tmpGsonTest", + "sourceCode": "c37b9ae3-eab1-4928-9533-f1c14b6149f5", + "line": 75 + }, + { + "funcName": "java.lang.reflect.Method.invoke", + "sourceCode": "6f280747-feee-4f4b-9eff-dda0d8eaa535" + } ], - "suppressed-exceptions": [] - }, - "exception-type-report": true, - "timestamp": 1709680251, - "uuid": "a62a533a-a7b8-415c-9a99-253c51f00827" -} \ No newline at end of file + "exception": { + "stack-trace": [ + { + "declaring-class": "backtraceio.library.SettingAttributesTest", + "line-number": 75, + "file-name": "SettingAttributesTest.java", + "method-name": "tmpGsonTest" + }, + { + "declaring-class": "java.lang.reflect.Method", + "line-number": -2, + "file-name": "Method.java", + "method-name": "invoke" + }, + { + "declaring-class": "org.junit.runners.model.FrameworkMethod$1", + "line-number": 59, + "file-name": "FrameworkMethod.java", + "method-name": "runReflectiveCall" + }, + { + "declaring-class": "org.junit.internal.runners.model.ReflectiveCallable", + "line-number": 12, + "file-name": "ReflectiveCallable.java", + "method-name": "run" + }, + { + "declaring-class": "org.junit.runners.model.FrameworkMethod", + "line-number": 56, + "file-name": "FrameworkMethod.java", + "method-name": "invokeExplosively" + }, + { + "declaring-class": "org.junit.internal.runners.statements.InvokeMethod", + "line-number": 17, + "file-name": "InvokeMethod.java", + "method-name": "evaluate" + }, + { + "declaring-class": "androidx.test.internal.runner.junit4.statement.RunBefores", + "line-number": 80, + "file-name": "RunBefores.java", + "method-name": "evaluate" + }, + { + "declaring-class": "org.junit.runners.ParentRunner$3", + "line-number": 306, + "file-name": "ParentRunner.java", + "method-name": "evaluate" + }, + { + "declaring-class": "org.junit.runners.BlockJUnit4ClassRunner$1", + "line-number": 100, + "file-name": "BlockJUnit4ClassRunner.java", + "method-name": "evaluate" + }, + { + "declaring-class": "org.junit.runners.ParentRunner", + "line-number": 366, + "file-name": "ParentRunner.java", + "method-name": "runLeaf" + }, + { + "declaring-class": "org.junit.runners.BlockJUnit4ClassRunner", + "line-number": 103, + "file-name": "BlockJUnit4ClassRunner.java", + "method-name": "runChild" + }, + { + "declaring-class": "org.junit.runners.BlockJUnit4ClassRunner", + "line-number": 63, + "file-name": "BlockJUnit4ClassRunner.java", + "method-name": "runChild" + }, + { + "declaring-class": "org.junit.runners.ParentRunner$4", + "line-number": 331, + "file-name": "ParentRunner.java", + "method-name": "run" + }, + { + "declaring-class": "org.junit.runners.ParentRunner$1", + "line-number": 79, + "file-name": "ParentRunner.java", + "method-name": "schedule" + }, + { + "declaring-class": "org.junit.runners.ParentRunner", + "line-number": 329, + "file-name": "ParentRunner.java", + "method-name": "runChildren" + }, + { + "declaring-class": "org.junit.runners.ParentRunner", + "line-number": 66, + "file-name": "ParentRunner.java", + "method-name": "access$100" + }, + { + "declaring-class": "org.junit.runners.ParentRunner$2", + "line-number": 293, + "file-name": "ParentRunner.java", + "method-name": "evaluate" + }, + { + "declaring-class": "org.junit.runners.ParentRunner$3", + "line-number": 306, + "file-name": "ParentRunner.java", + "method-name": "evaluate" + }, + { + "declaring-class": "org.junit.runners.ParentRunner", + "line-number": 413, + "file-name": "ParentRunner.java", + "method-name": "run" + }, + { + "declaring-class": "androidx.test.ext.junit.runners.AndroidJUnit4", + "line-number": 162, + "file-name": "AndroidJUnit4.java", + "method-name": "run" + }, + { + "declaring-class": "org.junit.runners.Suite", + "line-number": 128, + "file-name": "Suite.java", + "method-name": "runChild" + }, + { + "declaring-class": "org.junit.runners.Suite", + "line-number": 27, + "file-name": "Suite.java", + "method-name": "runChild" + }, + { + "declaring-class": "org.junit.runners.ParentRunner$4", + "line-number": 331, + "file-name": "ParentRunner.java", + "method-name": "run" + }, + { + "declaring-class": "org.junit.runners.ParentRunner$1", + "line-number": 79, + "file-name": "ParentRunner.java", + "method-name": "schedule" + }, + { + "declaring-class": "org.junit.runners.ParentRunner", + "line-number": 329, + "file-name": "ParentRunner.java", + "method-name": "runChildren" + }, + { + "declaring-class": "org.junit.runners.ParentRunner", + "line-number": 66, + "file-name": "ParentRunner.java", + "method-name": "access$100" + }, + { + "declaring-class": "org.junit.runners.ParentRunner$2", + "line-number": 293, + "file-name": "ParentRunner.java", + "method-name": "evaluate" + }, + { + "declaring-class": "org.junit.runners.ParentRunner$3", + "line-number": 306, + "file-name": "ParentRunner.java", + "method-name": "evaluate" + }, + { + "declaring-class": "org.junit.runners.ParentRunner", + "line-number": 413, + "file-name": "ParentRunner.java", + "method-name": "run" + }, + { + "declaring-class": "org.junit.runner.JUnitCore", + "line-number": 137, + "file-name": "JUnitCore.java", + "method-name": "run" + }, + { + "declaring-class": "org.junit.runner.JUnitCore", + "line-number": 115, + "file-name": "JUnitCore.java", + "method-name": "run" + }, + { + "declaring-class": "androidx.test.internal.runner.TestExecutor", + "line-number": 67, + "file-name": "TestExecutor.java", + "method-name": "execute" + }, + { + "declaring-class": "androidx.test.internal.runner.TestExecutor", + "line-number": 58, + "file-name": "TestExecutor.java", + "method-name": "execute" + }, + { + "declaring-class": "androidx.test.runner.AndroidJUnitRunner", + "line-number": 446, + "file-name": "AndroidJUnitRunner.java", + "method-name": "onStart" + }, + { + "declaring-class": "android.app.Instrumentation$InstrumentationThread", + "line-number": 2205, + "file-name": "Instrumentation.java", + "method-name": "run" + } + ], + "suppressed-exceptions": [] + }, + "attachment-paths": ["abc.txt"], + "classifier": "java.lang.IllegalAccessException", + "attributes": {"error.type": "Exception"}, + "exception-type-report": true, + "uuid": "a62a533a-a7b8-415c-9a99-253c51f00827", + "timestamp": 1709680251 +} diff --git a/backtrace-library/src/test/resources/backtraceReport.json b/backtrace-library/src/test/resources/backtraceReport.json index ec4d705c9..2c144bc7c 100644 --- a/backtrace-library/src/test/resources/backtraceReport.json +++ b/backtrace-library/src/test/resources/backtraceReport.json @@ -1,34 +1,28 @@ { - "attachment-paths": [ - "abc.txt" - ], - "attributes": { - "error.type": "Exception" - }, - "classifier": "java.lang.IllegalAccessException", - "diagnostic-stack": [ - { - "funcName": "backtraceio.library.SettingAttributesTest.tmpGsonTest", - "line": 75, - "sourceCode": "c37b9ae3-eab1-4928-9533-f1c14b6149f5" + "diagnostic-stack": [ + { + "funcName": "backtraceio.library.SettingAttributesTest.tmpGsonTest", + "sourceCode": "c37b9ae3-eab1-4928-9533-f1c14b6149f5", + "line": 75 + }, + { + "funcName": "java.lang.reflect.Method.invoke", + "sourceCode": "6f280747-feee-4f4b-9eff-dda0d8eaa535" + } + ], + "exception": { + "stack-trace": [{ + "declaring-class": "backtraceio.library.SettingAttributesTest", + "line-number": 75, + "file-name": "SettingAttributesTest.java", + "method-name": "tmpGsonTest" + }], + "class": "java.lang.IllegalAccessException" }, - { - "funcName": "java.lang.reflect.Method.invoke", - "sourceCode": "6f280747-feee-4f4b-9eff-dda0d8eaa535" - } - ], - "exception": { - "class": "java.lang.IllegalAccessException", - "stack-trace": [ - { - "declaring-class": "backtraceio.library.SettingAttributesTest", - "file-name": "SettingAttributesTest.java", - "line-number": 75, - "method-name": "tmpGsonTest" - } - ] - }, - "exception-type-report": true, - "timestamp": 1709680251, - "uuid": "a62a533a-a7b8-415c-9a99-253c51f00827" + "attachment-paths": ["abc.txt"], + "classifier": "java.lang.IllegalAccessException", + "attributes": {"error.type": "Exception"}, + "exception-type-report": true, + "uuid": "a62a533a-a7b8-415c-9a99-253c51f00827", + "timestamp": 1709680251 } diff --git a/backtrace-library/src/test/resources/backtraceResult.json b/backtrace-library/src/test/resources/backtraceResult.json index 041811cc8..4814fd91e 100644 --- a/backtrace-library/src/test/resources/backtraceResult.json +++ b/backtrace-library/src/test/resources/backtraceResult.json @@ -1 +1,4 @@ -{"_rxid":"95000000-eb43-390b-0000-000000000000","status":"Ok"} \ No newline at end of file +{ + "_rxid": "95000000-eb43-390b-0000-000000000000", + "status": "Ok" +} diff --git a/backtrace-library/src/test/resources/backtraceStackFrame.json b/backtrace-library/src/test/resources/backtraceStackFrame.json index 1031ca57f..1672ee3e4 100644 --- a/backtrace-library/src/test/resources/backtraceStackFrame.json +++ b/backtrace-library/src/test/resources/backtraceStackFrame.json @@ -1,5 +1,5 @@ { - "funcName": "java.util.TimerThread.run", - "line": 512, - "sourceCode": "85c0915f-3b99-4942-91c8-221e23846ded" -} \ No newline at end of file + "funcName": "java.util.TimerThread.run", + "sourceCode": "85c0915f-3b99-4942-91c8-221e23846ded", + "line": 512 +} diff --git a/backtrace-library/src/test/resources/serializedError.json b/backtrace-library/src/test/resources/serializedError.json index 297e85ab5..ec065c1bc 100644 --- a/backtrace-library/src/test/resources/serializedError.json +++ b/backtrace-library/src/test/resources/serializedError.json @@ -1,15 +1,18 @@ { - "message" : "Critical system error", - "stack-trace" : [ { - "declaring-class" : "sample-class-1", - "method-name" : "method-1", - "file-name" : "file-name1", - "line-number" : 100 - }, { - "declaring-class" : "sample-class-2", - "method-name" : "method-2", - "file-name" : "file-name2", - "line-number" : 200 - } ], - "class": "java.lang.Error" + "stack-trace": [ + { + "declaring-class": "sample-class-1", + "line-number": 100, + "method-name": "method-1", + "file-name": "file-name1" + }, + { + "declaring-class": "sample-class-2", + "line-number": 200, + "method-name": "method-2", + "file-name": "file-name2" + } + ], + "message": "Critical system error", + "class": "java.lang.Error" } diff --git a/backtrace-library/src/test/resources/serializedException.json b/backtrace-library/src/test/resources/serializedException.json index 4059c3ff0..cd8d7a8db 100644 --- a/backtrace-library/src/test/resources/serializedException.json +++ b/backtrace-library/src/test/resources/serializedException.json @@ -1,15 +1,18 @@ { - "message" : "test-msg", - "stack-trace" : [ { - "declaring-class" : "sample-class-1", - "method-name" : "method-1", - "file-name" : "file-name1", - "line-number" : 100 - }, { - "declaring-class" : "sample-class-2", - "method-name" : "method-2", - "file-name" : "file-name2", - "line-number" : 200 - } ], - "class": "java.lang.Exception" + "stack-trace": [ + { + "declaring-class": "sample-class-1", + "line-number": 100, + "method-name": "method-1", + "file-name": "file-name1" + }, + { + "declaring-class": "sample-class-2", + "line-number": 200, + "method-name": "method-2", + "file-name": "file-name2" + } + ], + "message": "test-msg", + "class": "java.lang.Exception" } diff --git a/backtrace-library/src/test/resources/serializedExceptionWithCause.json b/backtrace-library/src/test/resources/serializedExceptionWithCause.json index dd1c9cb1a..7d1ba0ec1 100644 --- a/backtrace-library/src/test/resources/serializedExceptionWithCause.json +++ b/backtrace-library/src/test/resources/serializedExceptionWithCause.json @@ -1,30 +1,36 @@ { - "message" : "test-msg", - "class": "org.json.JSONException", - "cause" : { - "class": "java.lang.Exception", - "message" : "test-msg", - "stack-trace" : [ { - "declaring-class" : "sample-class-1", - "method-name" : "method-1", - "file-name" : "file-name1", - "line-number" : 100 - }, { - "declaring-class" : "sample-class-2", - "method-name" : "method-2", - "file-name" : "file-name2", - "line-number" : 200 - } ] - }, - "stack-trace" : [ { - "declaring-class" : "sample-class-1", - "method-name" : "method-1", - "file-name" : "file-name1", - "line-number" : 100 - }, { - "declaring-class" : "sample-class-2", - "method-name" : "method-2", - "file-name" : "file-name2", - "line-number" : 200 - } ] + "stack-trace": [ + { + "declaring-class": "sample-class-1", + "line-number": 100, + "method-name": "method-1", + "file-name": "file-name1" + }, + { + "declaring-class": "sample-class-2", + "line-number": 200, + "method-name": "method-2", + "file-name": "file-name2" + } + ], + "cause": { + "stack-trace": [ + { + "declaring-class": "sample-class-1", + "line-number": 100, + "method-name": "method-1", + "file-name": "file-name1" + }, + { + "declaring-class": "sample-class-2", + "line-number": 200, + "method-name": "method-2", + "file-name": "file-name2" + } + ], + "message": "test-msg", + "class": "java.lang.Exception" + }, + "message": "test-msg", + "class": "org.json.JSONException" } diff --git a/backtrace-library/src/test/resources/serializedMultiCauseException.json b/backtrace-library/src/test/resources/serializedMultiCauseException.json index d69142030..0fd86fe57 100644 --- a/backtrace-library/src/test/resources/serializedMultiCauseException.json +++ b/backtrace-library/src/test/resources/serializedMultiCauseException.json @@ -1,60 +1,72 @@ { - "message" : "4", - "class" : "java.lang.AssertionError", - "stack-trace" : [ { - "declaring-class" : "sample-class-1", - "method-name" : "method-1", - "file-name" : "file-name1", - "line-number" : 100 - }, { - "declaring-class" : "sample-class-2", - "method-name" : "method-2", - "file-name" : "file-name2", - "line-number" : 200 - } ], - "cause" : { - "message" : "3", - "class" : "java.lang.RuntimeException", - "stack-trace" : [ { - "declaring-class" : "sample-class-1", - "method-name" : "method-1", - "file-name" : "file-name1", - "line-number" : 100 - }, { - "declaring-class" : "sample-class-2", - "method-name" : "method-2", - "file-name" : "file-name2", - "line-number" : 200 - } ], - "cause" : { - "message" : "2", - "class" : "org.json.JSONException", - "stack-trace" : [ { - "declaring-class" : "sample-class-1", - "method-name" : "method-1", - "file-name" : "file-name1", - "line-number" : 100 - }, { - "declaring-class" : "sample-class-2", - "method-name" : "method-2", - "file-name" : "file-name2", - "line-number" : 200 - } ], - "cause" : { - "message" : "1", - "class" : "java.lang.IllegalArgumentException", - "stack-trace" : [ { - "declaring-class" : "sample-class-1", - "method-name" : "method-1", - "file-name" : "file-name1", - "line-number" : 100 - }, { - "declaring-class" : "sample-class-2", - "method-name" : "method-2", - "file-name" : "file-name2", - "line-number" : 200 - } ] - } - } - } + "stack-trace": [ + { + "declaring-class": "sample-class-1", + "line-number": 100, + "method-name": "method-1", + "file-name": "file-name1" + }, + { + "declaring-class": "sample-class-2", + "line-number": 200, + "method-name": "method-2", + "file-name": "file-name2" + } + ], + "cause": { + "stack-trace": [ + { + "declaring-class": "sample-class-1", + "line-number": 100, + "method-name": "method-1", + "file-name": "file-name1" + }, + { + "declaring-class": "sample-class-2", + "line-number": 200, + "method-name": "method-2", + "file-name": "file-name2" + } + ], + "cause": { + "stack-trace": [ + { + "declaring-class": "sample-class-1", + "line-number": 100, + "method-name": "method-1", + "file-name": "file-name1" + }, + { + "declaring-class": "sample-class-2", + "line-number": 200, + "method-name": "method-2", + "file-name": "file-name2" + } + ], + "cause": { + "stack-trace": [ + { + "declaring-class": "sample-class-1", + "line-number": 100, + "method-name": "method-1", + "file-name": "file-name1" + }, + { + "declaring-class": "sample-class-2", + "line-number": 200, + "method-name": "method-2", + "file-name": "file-name2" + } + ], + "message": "1", + "class": "java.lang.IllegalArgumentException" + }, + "message": "2", + "class": "org.json.JSONException" + }, + "message": "3", + "class": "java.lang.RuntimeException" + }, + "message": "4", + "class": "java.lang.AssertionError" } diff --git a/backtrace-library/src/test/resources/serializedThrowable.json b/backtrace-library/src/test/resources/serializedThrowable.json index a9576b7dc..c67ead623 100644 --- a/backtrace-library/src/test/resources/serializedThrowable.json +++ b/backtrace-library/src/test/resources/serializedThrowable.json @@ -1,15 +1,18 @@ { - "message" : "Something went wrong", - "class": "java.lang.Throwable", - "stack-trace" : [ { - "declaring-class" : "sample-class-1", - "method-name" : "method-1", - "file-name" : "file-name1", - "line-number" : 100 - }, { - "declaring-class" : "sample-class-2", - "method-name" : "method-2", - "file-name" : "file-name2", - "line-number" : 200 - } ] + "stack-trace": [ + { + "declaring-class": "sample-class-1", + "line-number": 100, + "method-name": "method-1", + "file-name": "file-name1" + }, + { + "declaring-class": "sample-class-2", + "line-number": 200, + "method-name": "method-2", + "file-name": "file-name2" + } + ], + "message": "Something went wrong", + "class": "java.lang.Throwable" } diff --git a/backtrace-library/src/test/resources/serializedThrowableWithCause.json b/backtrace-library/src/test/resources/serializedThrowableWithCause.json index d9ebb77a1..aad442ba6 100644 --- a/backtrace-library/src/test/resources/serializedThrowableWithCause.json +++ b/backtrace-library/src/test/resources/serializedThrowableWithCause.json @@ -1,30 +1,36 @@ { - "message" : "Something went wrong", - "class": "java.lang.Throwable", - "cause" : { - "message" : "test-msg", - "class": "java.lang.Exception", - "stack-trace" : [ { - "declaring-class" : "sample-class-1", - "method-name" : "method-1", - "file-name" : "file-name1", - "line-number" : 100 - }, { - "declaring-class" : "sample-class-2", - "method-name" : "method-2", - "file-name" : "file-name2", - "line-number" : 200 - } ] - }, - "stack-trace" : [ { - "declaring-class" : "sample-class-1", - "method-name" : "method-1", - "file-name" : "file-name1", - "line-number" : 100 - }, { - "declaring-class" : "sample-class-2", - "method-name" : "method-2", - "file-name" : "file-name2", - "line-number" : 200 - } ] + "stack-trace": [ + { + "declaring-class": "sample-class-1", + "line-number": 100, + "method-name": "method-1", + "file-name": "file-name1" + }, + { + "declaring-class": "sample-class-2", + "line-number": 200, + "method-name": "method-2", + "file-name": "file-name2" + } + ], + "cause": { + "stack-trace": [ + { + "declaring-class": "sample-class-1", + "line-number": 100, + "method-name": "method-1", + "file-name": "file-name1" + }, + { + "declaring-class": "sample-class-2", + "line-number": 200, + "method-name": "method-2", + "file-name": "file-name2" + } + ], + "message": "test-msg", + "class": "java.lang.Exception" + }, + "message": "Something went wrong", + "class": "java.lang.Throwable" } diff --git a/backtrace-library/src/test/resources/sourceCode.json b/backtrace-library/src/test/resources/sourceCode.json index a543e6447..77630f545 100644 --- a/backtrace-library/src/test/resources/sourceCode.json +++ b/backtrace-library/src/test/resources/sourceCode.json @@ -1,4 +1,4 @@ { - "startLine": 17, - "path": "InvokeMethod.java" -} \ No newline at end of file + "path": "InvokeMethod.java", + "startLine": 17 +} diff --git a/backtrace-library/src/test/resources/sourceCodeData.json b/backtrace-library/src/test/resources/sourceCodeData.json index 5b1f3d758..a7aac8e1b 100644 --- a/backtrace-library/src/test/resources/sourceCodeData.json +++ b/backtrace-library/src/test/resources/sourceCodeData.json @@ -1,11 +1,7 @@ -{ - "data": { - "8751bea6-d6f6-48f4-9f96-1355c3408a9a": { - "path": "VMStack.java" - }, +{"data": { + "8751bea6-d6f6-48f4-9f96-1355c3408a9a": {"path": "VMStack.java"}, "27948842-7c2b-4898-a74a-ba3ca4afe814": { - "startLine": 17, - "path": "InvokeMethod.java" + "path": "InvokeMethod.java", + "startLine": 17 } - } -} \ No newline at end of file +}} diff --git a/backtrace-library/src/test/resources/threadInformation.json b/backtrace-library/src/test/resources/threadInformation.json index ac02fb0a8..457e6bed7 100644 --- a/backtrace-library/src/test/resources/threadInformation.json +++ b/backtrace-library/src/test/resources/threadInformation.json @@ -1,15 +1,15 @@ { - "name": "main", - "fault": true, - "stack": [ - { - "funcName": "backtraceio.backtraceio.MainActivity.handledException", - "line": 150, - "sourceCode": "cde23509-3dcc-494d-af1f-4b4e2af4cc5e" - }, - { - "funcName": "java.lang.reflect.Method.invoke", - "sourceCode": "7fc374ec-e276-46da-8d1a-05b37425927e" - } - ] -} \ No newline at end of file + "stack": [ + { + "funcName": "backtraceio.backtraceio.MainActivity.handledException", + "sourceCode": "cde23509-3dcc-494d-af1f-4b4e2af4cc5e", + "line": 150 + }, + { + "funcName": "java.lang.reflect.Method.invoke", + "sourceCode": "7fc374ec-e276-46da-8d1a-05b37425927e" + } + ], + "name": "main", + "fault": true +} diff --git a/build.gradle b/build.gradle index 0f0477b0f..2fa2823dd 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,4 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. - buildscript { repositories { @@ -22,12 +21,15 @@ def spotlessExcludes = [ '.gradle/**', '.idea/**', 'build/**', - '**/cpp/**', - '**/jniLibs/**', '**/build/**', '**/build-*/**', '**/.cxx/**', - '**/generated/**' + '**/generated/**', + '**/jniLibs/**', + '**/libbun/**', + '**/breakpad-builds/**', + '**/crashpad/**', + '**/cpp/**', ] subprojects { diff --git a/coroner-client/src/main/java/backtraceio/coroner/CoronerClient.java b/coroner-client/src/main/java/backtraceio/coroner/CoronerClient.java index 3f5ce9cc4..d1788b329 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/CoronerClient.java +++ b/coroner-client/src/main/java/backtraceio/coroner/CoronerClient.java @@ -1,12 +1,5 @@ package backtraceio.coroner; -import com.google.gson.JsonObject; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import backtraceio.coroner.common.HttpClient; import backtraceio.coroner.query.CoronerQueries; import backtraceio.coroner.query.CoronerQueryFields; @@ -14,15 +7,17 @@ import backtraceio.coroner.response.CoronerHttpException; import backtraceio.coroner.response.CoronerResponse; import backtraceio.coroner.response.CoronerResponseException; +import com.google.gson.JsonObject; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; public class CoronerClient { private final HttpClient coronerHttpClient; private final CoronerQueries coronerQueries; private final List DEFAULT_ATTRIBUTES = Arrays.asList( - CoronerQueryFields.FOLD_CALLSTACK, - CoronerQueryFields.FOLD_GUID, - CoronerQueryFields.FOLD_CLASSIFIERS - ); + CoronerQueryFields.FOLD_CALLSTACK, CoronerQueryFields.FOLD_GUID, CoronerQueryFields.FOLD_CLASSIFIERS); public CoronerClient(final String apiUrl, final String coronerToken) { this(new CoronerHttpClient(apiUrl, coronerToken)); @@ -33,11 +28,13 @@ public CoronerClient(HttpClient httpClient) { this.coronerQueries = new CoronerQueries(); } - public CoronerResponse rxIdFilter(final String rxId) throws CoronerResponseException, CoronerHttpException, IOException { + public CoronerResponse rxIdFilter(final String rxId) + throws CoronerResponseException, CoronerHttpException, IOException { return this.rxIdFilter(rxId, new ArrayList<>()); } - public CoronerResponse rxIdFilter(final String rxId, final List customAttributes) throws CoronerResponseException, CoronerHttpException, IOException { + public CoronerResponse rxIdFilter(final String rxId, final List customAttributes) + throws CoronerResponseException, CoronerHttpException, IOException { final List attributes = concatAttributes(customAttributes); final JsonObject coronerQuery = this.coronerQueries.filterByRxId(rxId, attributes); @@ -45,10 +42,16 @@ public CoronerResponse rxIdFilter(final String rxId, final List customAt return makeRequest(coronerQuery); } - public CoronerResponse errorTypeTimestampFilter(final String errorType, final String timestampLeast, final String timestampMost, final List customAttributes) throws CoronerResponseException, IOException, CoronerHttpException { + public CoronerResponse errorTypeTimestampFilter( + final String errorType, + final String timestampLeast, + final String timestampMost, + final List customAttributes) + throws CoronerResponseException, IOException, CoronerHttpException { final List attributes = concatAttributes(customAttributes); - final JsonObject coronerQuery = this.coronerQueries.filterByErrorTypeAndTimestamp(errorType, timestampLeast, timestampMost, attributes); + final JsonObject coronerQuery = + this.coronerQueries.filterByErrorTypeAndTimestamp(errorType, timestampLeast, timestampMost, attributes); return makeRequest(coronerQuery); } @@ -59,9 +62,10 @@ private List concatAttributes(final List customAttributes) { return result; } - private CoronerResponse makeRequest(final JsonObject coronerQuery) throws CoronerResponseException, IOException, CoronerHttpException { + private CoronerResponse makeRequest(final JsonObject coronerQuery) + throws CoronerResponseException, IOException, CoronerHttpException { final CoronerApiResponse response = this.coronerHttpClient.get(coronerQuery.toString()); - + if (response.error != null) { throw new CoronerResponseException(response.getError()); } diff --git a/coroner-client/src/main/java/backtraceio/coroner/CoronerError.java b/coroner-client/src/main/java/backtraceio/coroner/CoronerError.java index 2b05c65c9..8656fed6e 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/CoronerError.java +++ b/coroner-client/src/main/java/backtraceio/coroner/CoronerError.java @@ -5,9 +5,7 @@ public class CoronerError { public int code; @SuppressWarnings("unused") - public CoronerError() { - - } + public CoronerError() {} @SuppressWarnings("unused") public CoronerError(final String message, final int code) { diff --git a/coroner-client/src/main/java/backtraceio/coroner/CoronerHttpClient.java b/coroner-client/src/main/java/backtraceio/coroner/CoronerHttpClient.java index 1f2690022..28bf4f0ba 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/CoronerHttpClient.java +++ b/coroner-client/src/main/java/backtraceio/coroner/CoronerHttpClient.java @@ -1,5 +1,11 @@ package backtraceio.coroner; +import backtraceio.coroner.common.Common; +import backtraceio.coroner.common.HttpClient; +import backtraceio.coroner.response.CoronerApiResponse; +import backtraceio.coroner.response.CoronerHttpException; +import backtraceio.coroner.serialization.CoronerResponseGroupDeserializer; +import backtraceio.coroner.serialization.GsonWrapper; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; @@ -10,38 +16,30 @@ import java.util.logging.Level; import java.util.logging.Logger; -import backtraceio.coroner.common.Common; -import backtraceio.coroner.common.HttpClient; -import backtraceio.coroner.response.CoronerApiResponse; -import backtraceio.coroner.response.CoronerHttpException; -import backtraceio.coroner.serialization.CoronerResponseGroupDeserializer; -import backtraceio.coroner.serialization.GsonWrapper; - class CoronerHttpClient implements HttpClient { private static final Logger LOGGER = Logger.getLogger(CoronerResponseGroupDeserializer.class.getName()); private final String apiUrl; private final String coronerToken; private final String ENCODING = "utf-8"; + public CoronerHttpClient(final String apiUrl, final String coronerToken) { this.apiUrl = apiUrl; this.coronerToken = coronerToken; } + public CoronerApiResponse get(final String requestJson) throws CoronerHttpException, IOException { final HttpURLConnection urlConnection = prepareHttpRequest(requestJson); final int statusCode = urlConnection.getResponseCode(); if (statusCode != HttpURLConnection.HTTP_OK) { String message = getResponseMessage(urlConnection); - message = (Common.isNullOrEmpty(message)) ? - urlConnection.getResponseMessage() : message; + message = (Common.isNullOrEmpty(message)) ? urlConnection.getResponseMessage() : message; throw new CoronerHttpException(statusCode, String.format("%s: %s", statusCode, message)); } final String resultJson = getResponseMessage(urlConnection); - return GsonWrapper.fromJson( - resultJson, - CoronerApiResponse.class); + return GsonWrapper.fromJson(resultJson, CoronerApiResponse.class); } private static String getResponseMessage(final HttpURLConnection urlConnection) throws IOException { @@ -49,8 +47,7 @@ private static String getResponseMessage(final HttpURLConnection urlConnection) final InputStream inputStream = getInputStream(urlConnection); - final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader( - inputStream)); + final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); final StringBuilder responseStringBuilder = new StringBuilder(); String line; diff --git a/coroner-client/src/main/java/backtraceio/coroner/common/HttpClient.java b/coroner-client/src/main/java/backtraceio/coroner/common/HttpClient.java index 310603a06..3d8625a76 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/common/HttpClient.java +++ b/coroner-client/src/main/java/backtraceio/coroner/common/HttpClient.java @@ -1,9 +1,8 @@ package backtraceio.coroner.common; -import java.io.IOException; - import backtraceio.coroner.response.CoronerApiResponse; import backtraceio.coroner.response.CoronerHttpException; +import java.io.IOException; public interface HttpClient { CoronerApiResponse get(final String requestJson) throws CoronerHttpException, IOException; diff --git a/coroner-client/src/main/java/backtraceio/coroner/query/Constants.java b/coroner-client/src/main/java/backtraceio/coroner/query/Constants.java index 2b10b9427..066f87069 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/query/Constants.java +++ b/coroner-client/src/main/java/backtraceio/coroner/query/Constants.java @@ -1,9 +1,9 @@ package backtraceio.coroner.query; public class Constants { - public final static String FOLD = "fold"; - public final static String GROUP = "group"; - public final static String OFFSET = "offset"; - public final static String LIMIT = "limit"; - public final static String FILTER = "filter"; + public static final String FOLD = "fold"; + public static final String GROUP = "group"; + public static final String OFFSET = "offset"; + public static final String LIMIT = "limit"; + public static final String FILTER = "filter"; } diff --git a/coroner-client/src/main/java/backtraceio/coroner/query/CoronerFieldFilter.java b/coroner-client/src/main/java/backtraceio/coroner/query/CoronerFieldFilter.java index a03629aa3..11816400f 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/query/CoronerFieldFilter.java +++ b/coroner-client/src/main/java/backtraceio/coroner/query/CoronerFieldFilter.java @@ -2,7 +2,6 @@ import com.google.gson.JsonArray; import com.google.gson.JsonPrimitive; - import java.util.ArrayList; import java.util.List; diff --git a/coroner-client/src/main/java/backtraceio/coroner/query/CoronerFiltersBuilder.java b/coroner-client/src/main/java/backtraceio/coroner/query/CoronerFiltersBuilder.java index 9f60b6712..125dfe8a6 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/query/CoronerFiltersBuilder.java +++ b/coroner-client/src/main/java/backtraceio/coroner/query/CoronerFiltersBuilder.java @@ -2,7 +2,6 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; - import java.util.ArrayList; import java.util.List; @@ -43,5 +42,4 @@ public JsonArray getJson() { return result; } - } diff --git a/coroner-client/src/main/java/backtraceio/coroner/query/CoronerQueries.java b/coroner-client/src/main/java/backtraceio/coroner/query/CoronerQueries.java index 091414527..51cc12cff 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/query/CoronerQueries.java +++ b/coroner-client/src/main/java/backtraceio/coroner/query/CoronerQueries.java @@ -1,7 +1,6 @@ package backtraceio.coroner.query; import com.google.gson.JsonObject; - import java.util.ArrayList; import java.util.List; @@ -23,7 +22,11 @@ public JsonObject filterByRxId(final String rxId, final List attributes) return this.builder.buildRxIdGroup(filtersBuilder.getJson(), attributes); } - public JsonObject filterByErrorTypeAndTimestamp(final String errorType, final String timestampLeast, final String timestampMost, final List attributes) { + public JsonObject filterByErrorTypeAndTimestamp( + final String errorType, + final String timestampLeast, + final String timestampMost, + final List attributes) { final CoronerFiltersBuilder filtersBuilder = new CoronerFiltersBuilder(); filtersBuilder.addFilter(CoronerQueryFields.ERROR_TYPE, FilterOperator.EQUAL, errorType); filtersBuilder.addFilter(CoronerQueryFields.TIMESTAMP, FilterOperator.AT_LEAST, timestampLeast + "."); diff --git a/coroner-client/src/main/java/backtraceio/coroner/query/CoronerQueryBuilder.java b/coroner-client/src/main/java/backtraceio/coroner/query/CoronerQueryBuilder.java index 1b9455835..c6a503019 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/query/CoronerQueryBuilder.java +++ b/coroner-client/src/main/java/backtraceio/coroner/query/CoronerQueryBuilder.java @@ -3,7 +3,6 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; - import java.util.List; class CoronerQueryBuilder { @@ -34,6 +33,7 @@ private JsonObject build(final String groupName, final JsonArray filters, final return result; } + private JsonObject joinHeadFolds(final List folds) { final JsonObject result = new JsonObject(); @@ -43,6 +43,7 @@ private JsonObject joinHeadFolds(final List folds) { return result; } + private JsonArray foldHead() { final JsonArray foldValue = new JsonArray(); final JsonArray foldInnerValue = new JsonArray(); diff --git a/coroner-client/src/main/java/backtraceio/coroner/query/FilterOperator.java b/coroner-client/src/main/java/backtraceio/coroner/query/FilterOperator.java index 694ddd120..0c64d9659 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/query/FilterOperator.java +++ b/coroner-client/src/main/java/backtraceio/coroner/query/FilterOperator.java @@ -21,4 +21,4 @@ public enum FilterOperator { public String toString() { return text; } -} \ No newline at end of file +} diff --git a/coroner-client/src/main/java/backtraceio/coroner/response/ColumnDescElement.java b/coroner-client/src/main/java/backtraceio/coroner/response/ColumnDescElement.java index acc64273e..cd18f0a64 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/response/ColumnDescElement.java +++ b/coroner-client/src/main/java/backtraceio/coroner/response/ColumnDescElement.java @@ -7,9 +7,7 @@ public class ColumnDescElement { public String op; @SuppressWarnings("unused") - public ColumnDescElement() { - - } + public ColumnDescElement() {} @SuppressWarnings("unused") public ColumnDescElement(String name, String format, String type, String op) { diff --git a/coroner-client/src/main/java/backtraceio/coroner/response/CoronerApiResponse.java b/coroner-client/src/main/java/backtraceio/coroner/response/CoronerApiResponse.java index fa67486dd..6f6eb959d 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/response/CoronerApiResponse.java +++ b/coroner-client/src/main/java/backtraceio/coroner/response/CoronerApiResponse.java @@ -6,11 +6,8 @@ public class CoronerApiResponse { public CoronerResponse response; public CoronerError error; - @SuppressWarnings("unused") - public CoronerApiResponse() { - - } + public CoronerApiResponse() {} @SuppressWarnings("unused") public CoronerApiResponse(final CoronerResponse response, final CoronerError error) { @@ -35,6 +32,4 @@ public CoronerError getError() { public void setError(CoronerError error) { this.error = error; } - } - diff --git a/coroner-client/src/main/java/backtraceio/coroner/response/CoronerHttpException.java b/coroner-client/src/main/java/backtraceio/coroner/response/CoronerHttpException.java index e43d074ac..9bbfdf21b 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/response/CoronerHttpException.java +++ b/coroner-client/src/main/java/backtraceio/coroner/response/CoronerHttpException.java @@ -59,4 +59,4 @@ public int getHttpStatus() { private void setHttpStatus(final int httpStatus) { this.httpStatus = httpStatus; } -} \ No newline at end of file +} diff --git a/coroner-client/src/main/java/backtraceio/coroner/response/CoronerResponse.java b/coroner-client/src/main/java/backtraceio/coroner/response/CoronerResponse.java index 29deb9fdb..c494fb6e1 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/response/CoronerResponse.java +++ b/coroner-client/src/main/java/backtraceio/coroner/response/CoronerResponse.java @@ -1,7 +1,6 @@ package backtraceio.coroner.response; import com.google.gson.annotations.SerializedName; - import java.util.ArrayList; import java.util.List; import java.util.logging.Level; @@ -18,8 +17,7 @@ public class CoronerResponse { public List values; @SuppressWarnings("unused") - public CoronerResponse() { - } + public CoronerResponse() {} @SuppressWarnings("unused") public CoronerResponse(final List columnsDesc, final List values) { @@ -27,12 +25,14 @@ public CoronerResponse(final List columnsDesc, final List T getAttribute(final int elementIndex, final String name, final Class clazz) throws CoronerResponseProcessingException { + public T getAttribute(final int elementIndex, final String name, final Class clazz) + throws CoronerResponseProcessingException { if (this.values == null) { throw new CoronerResponseProcessingException("Values property from response is null"); } if (elementIndex < 0 || elementIndex > this.values.size()) { - throw new CoronerResponseProcessingException("Incorrect element index, value should be between 0 and " + this.values.size()); + throw new CoronerResponseProcessingException( + "Incorrect element index, value should be between 0 and " + this.values.size()); } final CoronerResponseGroup responseGroup = values.get(elementIndex); @@ -42,7 +42,8 @@ public T getAttribute(final int elementIndex, final String name, final Class return clazz.cast(results.get(0)); } catch (ClassCastException e) { LOGGER.log(Level.SEVERE, e.getMessage()); - throw new CoronerResponseProcessingException("Error on getting attribute from response group for attribute index: " + attributeIndex); + throw new CoronerResponseProcessingException( + "Error on getting attribute from response group for attribute index: " + attributeIndex); } } @@ -58,5 +59,4 @@ private int getAttributeIndex(final String attributeName) throws CoronerResponse } throw new CoronerResponseProcessingException("Attribute not found for name " + attributeName); } - } diff --git a/coroner-client/src/main/java/backtraceio/coroner/response/CoronerResponseGroup.java b/coroner-client/src/main/java/backtraceio/coroner/response/CoronerResponseGroup.java index 401632f91..3b02d23b2 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/response/CoronerResponseGroup.java +++ b/coroner-client/src/main/java/backtraceio/coroner/response/CoronerResponseGroup.java @@ -4,14 +4,16 @@ public class CoronerResponseGroup { private static final Integer EXPECTED_NUMBER_OF_ELEMENTS = 3; + @SuppressWarnings("unused") private final String groupIdentifier; + private final List values; public CoronerResponseGroup(final List obj) throws IllegalArgumentException { if (obj == null || obj.size() != EXPECTED_NUMBER_OF_ELEMENTS) { - throw new IllegalArgumentException("Wrong number of elements, expected number of elements: " + EXPECTED_NUMBER_OF_ELEMENTS - + ", current value: " + (obj != null ? obj.size() : "null")); + throw new IllegalArgumentException("Wrong number of elements, expected number of elements: " + + EXPECTED_NUMBER_OF_ELEMENTS + ", current value: " + (obj != null ? obj.size() : "null")); } this.groupIdentifier = obj.get(0).toString(); @@ -21,5 +23,4 @@ public CoronerResponseGroup(final List obj) throws IllegalArgumentExcept public Object getAttribute(final int index) { return values.get(index); } - } diff --git a/coroner-client/src/main/java/backtraceio/coroner/serialization/CoronerResponseGroupDeserializer.java b/coroner-client/src/main/java/backtraceio/coroner/serialization/CoronerResponseGroupDeserializer.java index 8826575c1..39b9a52a0 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/serialization/CoronerResponseGroupDeserializer.java +++ b/coroner-client/src/main/java/backtraceio/coroner/serialization/CoronerResponseGroupDeserializer.java @@ -1,25 +1,24 @@ package backtraceio.coroner.serialization; +import backtraceio.coroner.response.CoronerResponseGroup; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; - import java.lang.reflect.Type; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import backtraceio.coroner.response.CoronerResponseGroup; - - public class CoronerResponseGroupDeserializer implements JsonDeserializer { private static final Logger LOGGER = Logger.getLogger(CoronerResponseGroupDeserializer.class.getName()); @Override - public CoronerResponseGroup deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException { + public CoronerResponseGroup deserialize( + final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) + throws JsonParseException { final JsonArray jsonArray = json.getAsJsonArray(); final List obj = new Gson().fromJson(jsonArray, (Type) Object.class); try { diff --git a/coroner-client/src/main/java/backtraceio/coroner/serialization/GsonWrapper.java b/coroner-client/src/main/java/backtraceio/coroner/serialization/GsonWrapper.java index 3b805f485..a49ee6e2f 100644 --- a/coroner-client/src/main/java/backtraceio/coroner/serialization/GsonWrapper.java +++ b/coroner-client/src/main/java/backtraceio/coroner/serialization/GsonWrapper.java @@ -1,11 +1,10 @@ package backtraceio.coroner.serialization; +import backtraceio.coroner.response.CoronerResponseGroup; import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import backtraceio.coroner.response.CoronerResponseGroup; - public class GsonWrapper { public static T fromJson(final String json, final Class type) { @@ -16,5 +15,4 @@ public static T fromJson(final String json, final Class type) { return gson.fromJson(json, type); } - } diff --git a/coroner-client/src/test/java/backtraceio/coroner/CoronerClientTest.java b/coroner-client/src/test/java/backtraceio/coroner/CoronerClientTest.java index 1bec23755..07ccef66f 100644 --- a/coroner-client/src/test/java/backtraceio/coroner/CoronerClientTest.java +++ b/coroner-client/src/test/java/backtraceio/coroner/CoronerClientTest.java @@ -1,9 +1,5 @@ package backtraceio.coroner; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; import static backtraceio.coroner.utils.ResourceUtils.QUERY_CORONER_RXID_123; import static backtraceio.coroner.utils.ResourceUtils.QUERY_CORONER_RXID_123_ATTR_ERR_MSG; import static backtraceio.coroner.utils.ResourceUtils.QUERY_CORONER_TIMESTAMP_ERR_TYPE; @@ -11,14 +7,11 @@ import static backtraceio.coroner.utils.ResourceUtils.RESPONSE_RX_FILTER_CORONER_JSON; import static backtraceio.coroner.utils.ResourceUtils.RESPONSE_TIMESTAMP_ERR_TYPE_CORONER_JSON; import static backtraceio.coroner.utils.ResourceUtils.readResourceFile; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; - -import java.io.IOException; -import java.util.Arrays; -import java.util.List; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import backtraceio.coroner.response.CoronerApiResponse; import backtraceio.coroner.response.CoronerHttpException; @@ -26,10 +19,17 @@ import backtraceio.coroner.response.CoronerResponseException; import backtraceio.coroner.response.CoronerResponseProcessingException; import backtraceio.coroner.serialization.GsonWrapper; +import backtraceio.coroner.utils.JsonMatchers; import backtraceio.coroner.utils.MockHttpClient; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; public class CoronerClientTest { - private final static String rxId = "12345"; + private static final String rxId = "12345"; private MockHttpClient mockHttpClient; private CoronerClient client; @@ -40,7 +40,8 @@ public void init() { } @Test - public void rxIdFilter() throws CoronerResponseException, IOException, CoronerHttpException, CoronerResponseProcessingException { + public void rxIdFilter() + throws CoronerResponseException, IOException, CoronerHttpException, CoronerResponseProcessingException { // GIVEN final String expectedJsonQuery = readResourceFile(QUERY_CORONER_RXID_123); final String jsonResponse = readResourceFile(RESPONSE_RX_FILTER_CORONER_JSON); @@ -48,7 +49,8 @@ public void rxIdFilter() throws CoronerResponseException, IOException, CoronerHt final CoronerApiResponse expectedResponse = GsonWrapper.fromJson(jsonResponse, CoronerApiResponse.class); // MOCK - when(mockHttpClient.get(Mockito.contains(expectedJsonQuery))).thenReturn(expectedResponse); + when(mockHttpClient.get(argThat(JsonMatchers.jsonEquals(expectedJsonQuery)))) + .thenReturn(expectedResponse); // WHEN final CoronerResponse result = client.rxIdFilter(rxId); @@ -60,7 +62,8 @@ public void rxIdFilter() throws CoronerResponseException, IOException, CoronerHt } @Test - public void rxIdFilterAttributes() throws CoronerResponseException, IOException, CoronerHttpException, CoronerResponseProcessingException { + public void rxIdFilterAttributes() + throws CoronerResponseException, IOException, CoronerHttpException, CoronerResponseProcessingException { // GIVEN final String expectedJsonQuery = readResourceFile(QUERY_CORONER_RXID_123_ATTR_ERR_MSG); final String jsonResponse = readResourceFile(RESPONSE_RX_FILTER_CORONER_JSON); @@ -68,7 +71,8 @@ public void rxIdFilterAttributes() throws CoronerResponseException, IOException, final CoronerApiResponse expectedResponse = GsonWrapper.fromJson(jsonResponse, CoronerApiResponse.class); // MOCK - when(mockHttpClient.get(Mockito.contains(expectedJsonQuery))).thenReturn(expectedResponse); + when(mockHttpClient.get(argThat(JsonMatchers.jsonEquals(expectedJsonQuery)))) + .thenReturn(expectedResponse); // WHEN final CoronerResponse result = client.rxIdFilter(rxId, customAttributes); @@ -80,7 +84,8 @@ public void rxIdFilterAttributes() throws CoronerResponseException, IOException, } @Test - public void errorTypeTimestampFilter() throws CoronerResponseException, IOException, CoronerHttpException, CoronerResponseProcessingException { + public void errorTypeTimestampFilter() + throws CoronerResponseException, IOException, CoronerHttpException, CoronerResponseProcessingException { // GIVEN final String expectedJsonQuery = readResourceFile(QUERY_CORONER_TIMESTAMP_ERR_TYPE); final String jsonResponse = readResourceFile(RESPONSE_TIMESTAMP_ERR_TYPE_CORONER_JSON); @@ -92,13 +97,12 @@ public void errorTypeTimestampFilter() throws CoronerResponseException, IOExcept final List customAttributes = Arrays.asList("error.message"); // MOCK - when(mockHttpClient.get(Mockito.contains(expectedJsonQuery))).thenReturn(expectedResponse); + when(mockHttpClient.get(argThat(JsonMatchers.jsonEquals(expectedJsonQuery)))) + .thenReturn(expectedResponse); // WHEN - final CoronerResponse result = client.errorTypeTimestampFilter(errorType, - Long.toString(timestampStart), - Long.toString(timestampEnd), - customAttributes); + final CoronerResponse result = client.errorTypeTimestampFilter( + errorType, Long.toString(timestampStart), Long.toString(timestampEnd), customAttributes); // THEN assertNotNull(result); @@ -120,8 +124,7 @@ public void errorResponseTest() throws IOException, CoronerHttpException, Corone // WHEN try { client.rxIdFilter(rxId); - } - catch (CoronerResponseException exception) { + } catch (CoronerResponseException exception) { // THEN assertEquals(errorMessage, exception.getMessage()); assertNotNull(exception.getCoronerError()); diff --git a/coroner-client/src/test/java/backtraceio/coroner/query/CoronerFieldFilterTest.java b/coroner-client/src/test/java/backtraceio/coroner/query/CoronerFieldFilterTest.java index 197a81d0c..2121a6bb4 100644 --- a/coroner-client/src/test/java/backtraceio/coroner/query/CoronerFieldFilterTest.java +++ b/coroner-client/src/test/java/backtraceio/coroner/query/CoronerFieldFilterTest.java @@ -3,7 +3,6 @@ import static org.junit.Assert.assertEquals; import com.google.gson.JsonArray; - import org.junit.Test; public class CoronerFieldFilterTest { @@ -39,7 +38,8 @@ public void multipleFilters() { final JsonArray result = coronerFieldFilter.getFilterValues(); // THEN - final String expectedResult = "[[\"equal\",\"03000000-4f0a-fd08-0000-000000000000\"],[\"at-least\",\"4f0a0000-4f0a-fd08-0000-999000999000\"]]"; + final String expectedResult = + "[[\"equal\",\"03000000-4f0a-fd08-0000-000000000000\"],[\"at-least\",\"4f0a0000-4f0a-fd08-0000-999000999000\"]]"; assertEquals(expectedResult, result.toString()); } } diff --git a/coroner-client/src/test/java/backtraceio/coroner/query/CoronerFiltersBuilderTest.java b/coroner-client/src/test/java/backtraceio/coroner/query/CoronerFiltersBuilderTest.java index 3651c97fc..7023589f8 100644 --- a/coroner-client/src/test/java/backtraceio/coroner/query/CoronerFiltersBuilderTest.java +++ b/coroner-client/src/test/java/backtraceio/coroner/query/CoronerFiltersBuilderTest.java @@ -2,12 +2,10 @@ import static org.junit.Assert.assertEquals; +import backtraceio.coroner.utils.StringUtils; import com.google.gson.JsonArray; - import org.junit.Test; -import backtraceio.coroner.utils.StringUtils; - public class CoronerFiltersBuilderTest { @Test @@ -64,7 +62,8 @@ public void multipleFilters() { final String result = filtersBuilder.getJson().toString(); // THEN - final String expectedResult = "[{\"_rxid\":[[\"equal\",\"03000000-4f0a-fd08-0000-000000000000\"],[\"at-least\",\"4f0a0000-4f0a-fd08-0000-999000999000\"]],\"example_field\":[[\"at-most\",\"12345678-4f0b-fdp2-0001-000094000000\"]]}]"; + final String expectedResult = + "[{\"_rxid\":[[\"equal\",\"03000000-4f0a-fd08-0000-000000000000\"],[\"at-least\",\"4f0a0000-4f0a-fd08-0000-999000999000\"]],\"example_field\":[[\"at-most\",\"12345678-4f0b-fdp2-0001-000094000000\"]]}]"; assertEquals(expectedResult, result); } } diff --git a/coroner-client/src/test/java/backtraceio/coroner/query/CoronerQueriesTest.java b/coroner-client/src/test/java/backtraceio/coroner/query/CoronerQueriesTest.java index fab171251..9602c3dc3 100644 --- a/coroner-client/src/test/java/backtraceio/coroner/query/CoronerQueriesTest.java +++ b/coroner-client/src/test/java/backtraceio/coroner/query/CoronerQueriesTest.java @@ -2,15 +2,12 @@ import static org.junit.Assert.assertEquals; +import backtraceio.coroner.utils.StringUtils; import com.google.gson.JsonObject; - -import org.junit.Before; -import org.junit.Test; - import java.util.Arrays; import java.util.List; - -import backtraceio.coroner.utils.StringUtils; +import org.junit.Before; +import org.junit.Test; public class CoronerQueriesTest { public CoronerQueries coronerQueries; @@ -29,7 +26,8 @@ public void filterByRxIdWithoutAttributesTest() { JsonObject result = coronerQueries.filterByRxId(rxId); // THEN - String expectedResult = "{\"fold\":{},\"group\":[[\"_rxid\"]],\"offset\":0,\"limit\":1,\"filter\":[{\"_rxid\":[[\"equal\",\"03000000-4f0a-fd08-0000-000000000000\"]]}]}"; + String expectedResult = + "{\"fold\":{},\"group\":[[\"_rxid\"]],\"offset\":0,\"limit\":1,\"filter\":[{\"_rxid\":[[\"equal\",\"03000000-4f0a-fd08-0000-000000000000\"]]}]}"; assertEquals(expectedResult, StringUtils.normalizeSpace(result.toString())); } @@ -43,7 +41,8 @@ public void filterByRxIdTest() { JsonObject result = coronerQueries.filterByRxId(rxId, attributes); // THEN - String expectedResult = "{\"fold\":{\"value1\":[[\"head\"]],\"value2\":[[\"head\"]]},\"group\":[[\"_rxid\"]],\"offset\":0,\"limit\":1,\"filter\":[{\"_rxid\":[[\"equal\",\"03000000-4f0a-fd08-0000-000000000000\"]]}]}"; + String expectedResult = + "{\"fold\":{\"value1\":[[\"head\"]],\"value2\":[[\"head\"]]},\"group\":[[\"_rxid\"]],\"offset\":0,\"limit\":1,\"filter\":[{\"_rxid\":[[\"equal\",\"03000000-4f0a-fd08-0000-000000000000\"]]}]}"; assertEquals(expectedResult, StringUtils.normalizeSpace(result.toString())); } @@ -57,10 +56,12 @@ public void filterByErrorTypeAndTimestampTest() { final String timestampEnd = "1681943692"; // WHEN - JsonObject result = coronerQueries.filterByErrorTypeAndTimestamp(errorType, timestampStart, timestampEnd, attributes); + JsonObject result = + coronerQueries.filterByErrorTypeAndTimestamp(errorType, timestampStart, timestampEnd, attributes); // THEN - String expectedResult = "{\"fold\":{\"error.message\":[[\"head\"]],\"example-attribute\":[[\"head\"]]},\"group\":[[\"_rxid\"]],\"offset\":0,\"limit\":1,\"filter\":[{\"error.type\":[[\"equal\",\"Crash\"]],\"timestamp\":[[\"at-least\",\"1680943692.\"],[\"at-most\",\"1681943692.\"]]}]}"; + String expectedResult = + "{\"fold\":{\"error.message\":[[\"head\"]],\"example-attribute\":[[\"head\"]]},\"group\":[[\"_rxid\"]],\"offset\":0,\"limit\":1,\"filter\":[{\"error.type\":[[\"equal\",\"Crash\"]],\"timestamp\":[[\"at-least\",\"1680943692.\"],[\"at-most\",\"1681943692.\"]]}]}"; assertEquals(expectedResult, StringUtils.normalizeSpace(result.toString())); } } diff --git a/coroner-client/src/test/java/backtraceio/coroner/query/CoronerQueryBuilderTest.java b/coroner-client/src/test/java/backtraceio/coroner/query/CoronerQueryBuilderTest.java index f06ea518e..691e25aed 100644 --- a/coroner-client/src/test/java/backtraceio/coroner/query/CoronerQueryBuilderTest.java +++ b/coroner-client/src/test/java/backtraceio/coroner/query/CoronerQueryBuilderTest.java @@ -2,16 +2,13 @@ import static org.junit.Assert.assertEquals; +import backtraceio.coroner.serialization.GsonWrapper; +import backtraceio.coroner.utils.StringUtils; import com.google.gson.JsonArray; import com.google.gson.JsonObject; - -import org.junit.Test; - import java.util.Arrays; import java.util.List; - -import backtraceio.coroner.serialization.GsonWrapper; -import backtraceio.coroner.utils.StringUtils; +import org.junit.Test; public class CoronerQueryBuilderTest { @@ -19,14 +16,16 @@ public class CoronerQueryBuilderTest { public void testBuildRxIdGroup() { // GIVEN final CoronerQueryBuilder coronerQueryBuilder = new CoronerQueryBuilder(); - final JsonArray filters = GsonWrapper.fromJson("[{\"_rxid\":[[\"equal\",\"03000000-4f0a-fd08-0000-000000000000\"]]}]", JsonArray.class); + final JsonArray filters = GsonWrapper.fromJson( + "[{\"_rxid\":[[\"equal\",\"03000000-4f0a-fd08-0000-000000000000\"]]}]", JsonArray.class); final List headFolds = Arrays.asList("error.type", "callstack"); // WHEN final JsonObject result = coronerQueryBuilder.buildRxIdGroup(filters, headFolds); // THEN - final String expectedResult = "{\"fold\":{\"error.type\":[[\"head\"]],\"callstack\":[[\"head\"]]},\"group\":[[\"_rxid\"]],\"offset\":0,\"limit\":1,\"filter\":[{\"_rxid\":[[\"equal\",\"03000000-4f0a-fd08-0000-000000000000\"]]}]}"; + final String expectedResult = + "{\"fold\":{\"error.type\":[[\"head\"]],\"callstack\":[[\"head\"]]},\"group\":[[\"_rxid\"]],\"offset\":0,\"limit\":1,\"filter\":[{\"_rxid\":[[\"equal\",\"03000000-4f0a-fd08-0000-000000000000\"]]}]}"; assertEquals(expectedResult, StringUtils.normalizeSpace(result.toString())); } } diff --git a/coroner-client/src/test/java/backtraceio/coroner/query/CoronerValueFilterTest.java b/coroner-client/src/test/java/backtraceio/coroner/query/CoronerValueFilterTest.java index b0eceaa85..2ee7814c3 100644 --- a/coroner-client/src/test/java/backtraceio/coroner/query/CoronerValueFilterTest.java +++ b/coroner-client/src/test/java/backtraceio/coroner/query/CoronerValueFilterTest.java @@ -3,7 +3,6 @@ import static org.junit.Assert.assertEquals; import com.google.gson.JsonElement; - import org.junit.Test; public class CoronerValueFilterTest { diff --git a/coroner-client/src/test/java/backtraceio/coroner/serialization/CoronerResponseGroupDeserializerTest.java b/coroner-client/src/test/java/backtraceio/coroner/serialization/CoronerResponseGroupDeserializerTest.java index 4f4ec1002..849a6096a 100644 --- a/coroner-client/src/test/java/backtraceio/coroner/serialization/CoronerResponseGroupDeserializerTest.java +++ b/coroner-client/src/test/java/backtraceio/coroner/serialization/CoronerResponseGroupDeserializerTest.java @@ -2,13 +2,11 @@ import static org.junit.Assert.assertNull; +import backtraceio.coroner.response.CoronerResponseGroup; import com.google.gson.JsonElement; import com.google.gson.JsonParser; - import org.junit.Test; -import backtraceio.coroner.response.CoronerResponseGroup; - public class CoronerResponseGroupDeserializerTest { @Test diff --git a/coroner-client/src/test/java/backtraceio/coroner/serialization/GsonWrapperTest.java b/coroner-client/src/test/java/backtraceio/coroner/serialization/GsonWrapperTest.java index f2ca1adc0..6861f148c 100644 --- a/coroner-client/src/test/java/backtraceio/coroner/serialization/GsonWrapperTest.java +++ b/coroner-client/src/test/java/backtraceio/coroner/serialization/GsonWrapperTest.java @@ -1,20 +1,18 @@ package backtraceio.coroner.serialization; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static backtraceio.coroner.utils.ResourceUtils.EXPECTED_FRAMES; import static backtraceio.coroner.utils.ResourceUtils.RESPONSE_RX_FILTER_CORONER_JSON; import static backtraceio.coroner.utils.ResourceUtils.readResourceFile; - -import org.junit.Test; - -import java.io.IOException; -import java.util.List; +import static backtraceio.coroner.utils.StringUtils.assertJson; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import backtraceio.coroner.response.CoronerApiResponse; import backtraceio.coroner.response.CoronerResponseGroup; - +import java.io.IOException; +import java.util.List; +import org.junit.Test; public class GsonWrapperTest { @@ -23,7 +21,7 @@ private Object getResponseGroupAttributeValue(Object attribute) { } @Test - public void deserializeApiResponse() throws IOException{ + public void deserializeApiResponse() throws IOException { // GIVEN final String json = readResourceFile(RESPONSE_RX_FILTER_CORONER_JSON); final String expectedFrames = readResourceFile(EXPECTED_FRAMES); @@ -38,9 +36,14 @@ public void deserializeApiResponse() throws IOException{ assertEquals(1, result.getResponse().getResultsNumber()); CoronerResponseGroup responseGroup = result.getResponse().values.get(0); - assertEquals("Invalid index of selected element!", getResponseGroupAttributeValue(responseGroup.getAttribute(0))); - assertEquals(expectedFrames, getResponseGroupAttributeValue(responseGroup.getAttribute(1))); - assertEquals("e4c57699-0dc9-35e2-b4a0-2ffff1925ca7", getResponseGroupAttributeValue(responseGroup.getAttribute(2))); - assertEquals("java.lang.IndexOutOfBoundsException", getResponseGroupAttributeValue(responseGroup.getAttribute(3))); + assertEquals( + "Invalid index of selected element!", getResponseGroupAttributeValue(responseGroup.getAttribute(0))); + assertJson( + expectedFrames, + getResponseGroupAttributeValue(responseGroup.getAttribute(1)).toString()); + assertEquals( + "e4c57699-0dc9-35e2-b4a0-2ffff1925ca7", getResponseGroupAttributeValue(responseGroup.getAttribute(2))); + assertEquals( + "java.lang.IndexOutOfBoundsException", getResponseGroupAttributeValue(responseGroup.getAttribute(3))); } } diff --git a/coroner-client/src/test/java/backtraceio/coroner/utils/JsonMatchers.java b/coroner-client/src/test/java/backtraceio/coroner/utils/JsonMatchers.java new file mode 100644 index 000000000..b9234fd1f --- /dev/null +++ b/coroner-client/src/test/java/backtraceio/coroner/utils/JsonMatchers.java @@ -0,0 +1,20 @@ +package backtraceio.coroner.utils; + +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import org.mockito.ArgumentMatcher; + +public class JsonMatchers { + + public static ArgumentMatcher jsonEquals(String expectedJson) { + return actualJson -> { + try { + JsonElement expected = JsonParser.parseString(expectedJson); + JsonElement actual = JsonParser.parseString(actualJson); + return expected.equals(actual); + } catch (Exception e) { + return false; + } + }; + } +} diff --git a/coroner-client/src/test/java/backtraceio/coroner/utils/MockHttpClient.java b/coroner-client/src/test/java/backtraceio/coroner/utils/MockHttpClient.java index 264562b4c..2903286a2 100644 --- a/coroner-client/src/test/java/backtraceio/coroner/utils/MockHttpClient.java +++ b/coroner-client/src/test/java/backtraceio/coroner/utils/MockHttpClient.java @@ -1,10 +1,9 @@ package backtraceio.coroner.utils; -import java.io.IOException; - import backtraceio.coroner.common.HttpClient; import backtraceio.coroner.response.CoronerApiResponse; import backtraceio.coroner.response.CoronerHttpException; +import java.io.IOException; public class MockHttpClient implements HttpClient { diff --git a/coroner-client/src/test/java/backtraceio/coroner/utils/ResourceUtils.java b/coroner-client/src/test/java/backtraceio/coroner/utils/ResourceUtils.java index 53fc94127..a883dd65d 100644 --- a/coroner-client/src/test/java/backtraceio/coroner/utils/ResourceUtils.java +++ b/coroner-client/src/test/java/backtraceio/coroner/utils/ResourceUtils.java @@ -7,11 +7,13 @@ public class ResourceUtils { private static final String MAIN_PATH = "src/test/resources/backtraceio/coroner"; public static final String QUERY_CORONER_RXID_123 = MAIN_PATH + "/queries/rxid-12345.json"; - public static final String QUERY_CORONER_RXID_123_ATTR_ERR_MSG = MAIN_PATH + "/queries/rxid-12345-custom-attr-err-msg.json"; - public static final String QUERY_CORONER_TIMESTAMP_ERR_TYPE= MAIN_PATH + "/queries/timestamp-err-type-filter.json"; + public static final String QUERY_CORONER_RXID_123_ATTR_ERR_MSG = + MAIN_PATH + "/queries/rxid-12345-custom-attr-err-msg.json"; + public static final String QUERY_CORONER_TIMESTAMP_ERR_TYPE = MAIN_PATH + "/queries/timestamp-err-type-filter.json"; public static final String RESPONSE_RX_FILTER_CORONER_JSON = MAIN_PATH + "/responses/rx-filter-response.json"; public static final String EXPECTED_FRAMES = MAIN_PATH + "/frames.json"; - public static final String RESPONSE_TIMESTAMP_ERR_TYPE_CORONER_JSON = MAIN_PATH + "/responses/timestamp-err-type-filter.json"; + public static final String RESPONSE_TIMESTAMP_ERR_TYPE_CORONER_JSON = + MAIN_PATH + "/responses/timestamp-err-type-filter.json"; public static final String RESPONSE_OPERATION_ERROR_JSON = MAIN_PATH + "/responses/operation-error.json"; @@ -19,5 +21,4 @@ public static String readResourceFile(String path) throws IOException { byte[] bytes = Files.readAllBytes(Paths.get(path)); return new String(bytes); } - } diff --git a/coroner-client/src/test/java/backtraceio/coroner/utils/StringUtils.java b/coroner-client/src/test/java/backtraceio/coroner/utils/StringUtils.java index b0ac4b2e3..517686014 100644 --- a/coroner-client/src/test/java/backtraceio/coroner/utils/StringUtils.java +++ b/coroner-client/src/test/java/backtraceio/coroner/utils/StringUtils.java @@ -1,7 +1,32 @@ package backtraceio.coroner.utils; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; + public class StringUtils { public static String normalizeSpace(String input) { - return input.trim().replaceAll("\\s+"," "); + return input.trim().replaceAll("\\s+", " "); + } + + /** + * Compares two JSON strings for structural equality using Gson. + * + * @param json1 First JSON string + * @param json2 Second JSON string + * @return true if both represent the same JSON structure, false otherwise + */ + public static boolean assertJson(String json1, String json2) { + try { + Gson gson = new Gson(); + + JsonElement element1 = JsonParser.parseString(json1); + JsonElement element2 = JsonParser.parseString(json2); + + return element1.equals(element2); + } catch (Exception e) { + // Invalid JSON or parsing error + return false; + } } } diff --git a/coroner-client/src/test/resources/backtraceio/coroner/frames.json b/coroner-client/src/test/resources/backtraceio/coroner/frames.json index 416a58953..451577820 100644 --- a/coroner-client/src/test/resources/backtraceio/coroner/frames.json +++ b/coroner-client/src/test/resources/backtraceio/coroner/frames.json @@ -1 +1,28 @@ -{"frame":["backtraceio.backtraceio.MainActivity.handledException","androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick","android.view.View.performClick","android.view.View.performClickInternal","android.view.View.access$3600","android.view.View$PerformClick.run","androidx.test.espresso.base.Interrogator.loopAndInterrogate","androidx.test.espresso.base.UiControllerImpl.loopUntil","androidx.test.espresso.base.UiControllerImpl.injectMotionEvent","androidx.test.espresso.action.MotionEvents.sendUp","androidx.test.espresso.action.Tap.sendSingleTap","androidx.test.espresso.action.Tap.-$$Nest$smsendSingleTap","androidx.test.espresso.action.Tap$1.sendTap","androidx.test.espresso.action.GeneralClickAction.perform","androidx.test.espresso.ViewInteraction$SingleExecutionViewAction.perform","androidx.test.espresso.ViewInteraction.doPerform","androidx.test.espresso.ViewInteraction.-$$Nest$mdoPerform","androidx.test.espresso.ViewInteraction$1.call","java.util.concurrent.FutureTask.run","android.os.Handler.handleCallback","android.os.Handler.dispatchMessage","android.os.Looper.loop","android.app.ActivityThread.main","java.lang.reflect.Method.invoke","com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run","com.android.internal.os.ZygoteInit.main"]} \ No newline at end of file +{"frame": [ + "backtraceio.backtraceio.MainActivity.handledException", + "androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick", + "android.view.View.performClick", + "android.view.View.performClickInternal", + "android.view.View.access$3600", + "android.view.View$PerformClick.run", + "androidx.test.espresso.base.Interrogator.loopAndInterrogate", + "androidx.test.espresso.base.UiControllerImpl.loopUntil", + "androidx.test.espresso.base.UiControllerImpl.injectMotionEvent", + "androidx.test.espresso.action.MotionEvents.sendUp", + "androidx.test.espresso.action.Tap.sendSingleTap", + "androidx.test.espresso.action.Tap.-$$Nest$smsendSingleTap", + "androidx.test.espresso.action.Tap$1.sendTap", + "androidx.test.espresso.action.GeneralClickAction.perform", + "androidx.test.espresso.ViewInteraction$SingleExecutionViewAction.perform", + "androidx.test.espresso.ViewInteraction.doPerform", + "androidx.test.espresso.ViewInteraction.-$$Nest$mdoPerform", + "androidx.test.espresso.ViewInteraction$1.call", + "java.util.concurrent.FutureTask.run", + "android.os.Handler.handleCallback", + "android.os.Handler.dispatchMessage", + "android.os.Looper.loop", + "android.app.ActivityThread.main", + "java.lang.reflect.Method.invoke", + "com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run", + "com.android.internal.os.ZygoteInit.main" +]} diff --git a/coroner-client/src/test/resources/backtraceio/coroner/queries/rxid-12345-custom-attr-err-msg.json b/coroner-client/src/test/resources/backtraceio/coroner/queries/rxid-12345-custom-attr-err-msg.json index 8f0cf132b..a077383b7 100644 --- a/coroner-client/src/test/resources/backtraceio/coroner/queries/rxid-12345-custom-attr-err-msg.json +++ b/coroner-client/src/test/resources/backtraceio/coroner/queries/rxid-12345-custom-attr-err-msg.json @@ -1 +1,15 @@ -{"fold":{"error.message":[["head"]],"callstack":[["head"]],"guid":[["head"]],"classifiers":[["head"]]},"group":[["_rxid"]],"offset":0,"limit":1,"filter":[{"_rxid":[["equal","12345"]]}]} \ No newline at end of file +{ + "filter": [{"_rxid": [[ + "equal", + "12345" + ]]}], + "fold": { + "error.message": [["head"]], + "classifiers": [["head"]], + "guid": [["head"]], + "callstack": [["head"]] + }, + "offset": 0, + "limit": 1, + "group": [["_rxid"]] +} diff --git a/coroner-client/src/test/resources/backtraceio/coroner/queries/rxid-12345.json b/coroner-client/src/test/resources/backtraceio/coroner/queries/rxid-12345.json index 6a465e901..098aa3ffe 100644 --- a/coroner-client/src/test/resources/backtraceio/coroner/queries/rxid-12345.json +++ b/coroner-client/src/test/resources/backtraceio/coroner/queries/rxid-12345.json @@ -1 +1,14 @@ -{"fold":{"callstack":[["head"]],"guid":[["head"]],"classifiers":[["head"]]},"group":[["_rxid"]],"offset":0,"limit":1,"filter":[{"_rxid":[["equal","12345"]]}]} \ No newline at end of file +{ + "filter": [{"_rxid": [[ + "equal", + "12345" + ]]}], + "fold": { + "classifiers": [["head"]], + "guid": [["head"]], + "callstack": [["head"]] + }, + "offset": 0, + "limit": 1, + "group": [["_rxid"]] +} diff --git a/coroner-client/src/test/resources/backtraceio/coroner/queries/timestamp-err-type-filter.json b/coroner-client/src/test/resources/backtraceio/coroner/queries/timestamp-err-type-filter.json index c9b554b13..44321387a 100644 --- a/coroner-client/src/test/resources/backtraceio/coroner/queries/timestamp-err-type-filter.json +++ b/coroner-client/src/test/resources/backtraceio/coroner/queries/timestamp-err-type-filter.json @@ -1 +1,27 @@ -{"fold":{"error.message":[["head"]],"callstack":[["head"]],"guid":[["head"]],"classifiers":[["head"]]},"group":[["_rxid"]],"offset":0,"limit":1,"filter":[{"error.type":[["equal","Crash"]],"timestamp":[["at-least","0."],["at-most","10000000000."]]}]} \ No newline at end of file +{ + "filter": [{ + "error.type": [[ + "equal", + "Crash" + ]], + "timestamp": [ + [ + "at-least", + "0." + ], + [ + "at-most", + "10000000000." + ] + ] + }], + "fold": { + "error.message": [["head"]], + "classifiers": [["head"]], + "guid": [["head"]], + "callstack": [["head"]] + }, + "offset": 0, + "limit": 1, + "group": [["_rxid"]] +} diff --git a/coroner-client/src/test/resources/backtraceio/coroner/responses/operation-error.json b/coroner-client/src/test/resources/backtraceio/coroner/responses/operation-error.json index a8b78d7bc..bda1fee2a 100644 --- a/coroner-client/src/test/resources/backtraceio/coroner/responses/operation-error.json +++ b/coroner-client/src/test/resources/backtraceio/coroner/responses/operation-error.json @@ -1,6 +1,4 @@ -{ - "error": { +{"error": { "code": 32769, "message": "empty body" - } -} \ No newline at end of file +}} diff --git a/coroner-client/src/test/resources/backtraceio/coroner/responses/rx-filter-response.json b/coroner-client/src/test/resources/backtraceio/coroner/responses/rx-filter-response.json index 2d88b22ed..a99ded056 100644 --- a/coroner-client/src/test/resources/backtraceio/coroner/responses/rx-filter-response.json +++ b/coroner-client/src/test/resources/backtraceio/coroner/responses/rx-filter-response.json @@ -1,157 +1,139 @@ { - "_": { - "user": "test", - "project": "test", - "tx": 9444, - "universe": "", - "latency": "306 us", - "runtime": { - "filter": { - "time": 78, - "rows": 1, - "n_filters": 1, - "breakdown": [ - 71 - ] - }, - "group_by": { - "time": 3, - "groups": 1, - "rows": 1 - }, - "having": { - "time": 0, - "ungroup": 0, - "groups": 1, - "rows": 1 - }, - "aggregate": { - "pre_having": 0, - "pre_sort": 1, - "post_sort": 28, - "n_aggregates": 4, - "breakdown": [ - 12, - 3, - 2, - 2 - ] - }, - "sort": { - "time": 1, - "groups": 1, - "rows": 1 - }, - "render": { - "time": 37 - }, - "set": { - "time": 0 - }, - "merge": { - "time": 0 - }, - "ungrouped": { - "time": 0, - "having": 0, - "subqueries": [] - }, - "total_time": 111, - "toplevel": { - "parse_end": 31, - "execute_begin": 32, - "execute_end": 184, - "print_begin": 185, - "print_end": 222 - } - }, - "navigation": [] - }, - "response": { - "version": "1.2.0", - "seq": 12, - "encoding": "rle", - "columns": [ - [ - "head(error.message)", - "" - ], - [ - "head(callstack)", - "callstack" - ], - [ - "head(guid)", - "uuid" - ], - [ - "head(classifiers)", - "labels" - ] - ], - "columns_desc": [ - { - "name": "error.message", - "format": "", - "type": "dictionary", - "op": "head" - }, - { - "name": "callstack", - "format": "callstack", - "type": "dictionary", - "op": "head" - }, - { - "name": "guid", - "format": "uuid", - "type": "uuid", - "op": "head" - }, - { - "name": "classifiers", - "format": "labels", - "type": "dictionary", - "op": "head" - } - ], - "pagination": { - "limit": 1, - "offset": 0 - }, - "values": [ - [ - "*", - [ - [ - "Invalid index of selected element!" - ], - [ - "{\"frame\":[\"backtraceio.backtraceio.MainActivity.handledException\",\"androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick\",\"android.view.View.performClick\",\"android.view.View.performClickInternal\",\"android.view.View.access$3600\",\"android.view.View$PerformClick.run\",\"androidx.test.espresso.base.Interrogator.loopAndInterrogate\",\"androidx.test.espresso.base.UiControllerImpl.loopUntil\",\"androidx.test.espresso.base.UiControllerImpl.injectMotionEvent\",\"androidx.test.espresso.action.MotionEvents.sendUp\",\"androidx.test.espresso.action.Tap.sendSingleTap\",\"androidx.test.espresso.action.Tap.-$$Nest$smsendSingleTap\",\"androidx.test.espresso.action.Tap$1.sendTap\",\"androidx.test.espresso.action.GeneralClickAction.perform\",\"androidx.test.espresso.ViewInteraction$SingleExecutionViewAction.perform\",\"androidx.test.espresso.ViewInteraction.doPerform\",\"androidx.test.espresso.ViewInteraction.-$$Nest$mdoPerform\",\"androidx.test.espresso.ViewInteraction$1.call\",\"java.util.concurrent.FutureTask.run\",\"android.os.Handler.handleCallback\",\"android.os.Handler.dispatchMessage\",\"android.os.Looper.loop\",\"android.app.ActivityThread.main\",\"java.lang.reflect.Method.invoke\",\"com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run\",\"com.android.internal.os.ZygoteInit.main\"]}" - ], - [ - "e4c57699-0dc9-35e2-b4a0-2ffff1925ca7" - ], - [ - "java.lang.IndexOutOfBoundsException" - ] + "response": { + "columns_desc": [ + { + "op": "head", + "name": "error.message", + "format": "", + "type": "dictionary" + }, + { + "op": "head", + "name": "callstack", + "format": "callstack", + "type": "dictionary" + }, + { + "op": "head", + "name": "guid", + "format": "uuid", + "type": "uuid" + }, + { + "op": "head", + "name": "classifiers", + "format": "labels", + "type": "dictionary" + } ], - 1 - ] - ], - "cardinalities": { - "initial": { - "rows": 1, - "groups": 1 - }, - "having": { - "rows": 1, - "groups": 1 - }, - "pagination": { - "rows": 1, - "groups": 1 - } + "pagination": { + "offset": 0, + "limit": 1 + }, + "columns": [ + [ + "head(error.message)", + "" + ], + [ + "head(callstack)", + "callstack" + ], + [ + "head(guid)", + "uuid" + ], + [ + "head(classifiers)", + "labels" + ] + ], + "values": [[ + "*", + [ + ["Invalid index of selected element!"], + ["{\"frame\":[\"backtraceio.backtraceio.MainActivity.handledException\",\"androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick\",\"android.view.View.performClick\",\"android.view.View.performClickInternal\",\"android.view.View.access$3600\",\"android.view.View$PerformClick.run\",\"androidx.test.espresso.base.Interrogator.loopAndInterrogate\",\"androidx.test.espresso.base.UiControllerImpl.loopUntil\",\"androidx.test.espresso.base.UiControllerImpl.injectMotionEvent\",\"androidx.test.espresso.action.MotionEvents.sendUp\",\"androidx.test.espresso.action.Tap.sendSingleTap\",\"androidx.test.espresso.action.Tap.-$$Nest$smsendSingleTap\",\"androidx.test.espresso.action.Tap$1.sendTap\",\"androidx.test.espresso.action.GeneralClickAction.perform\",\"androidx.test.espresso.ViewInteraction$SingleExecutionViewAction.perform\",\"androidx.test.espresso.ViewInteraction.doPerform\",\"androidx.test.espresso.ViewInteraction.-$$Nest$mdoPerform\",\"androidx.test.espresso.ViewInteraction$1.call\",\"java.util.concurrent.FutureTask.run\",\"android.os.Handler.handleCallback\",\"android.os.Handler.dispatchMessage\",\"android.os.Looper.loop\",\"android.app.ActivityThread.main\",\"java.lang.reflect.Method.invoke\",\"com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run\",\"com.android.internal.os.ZygoteInit.main\"]}"], + ["e4c57699-0dc9-35e2-b4a0-2ffff1925ca7"], + ["java.lang.IndexOutOfBoundsException"] + ], + 1 + ]], + "cardinalities": { + "having": { + "groups": 1, + "rows": 1 + }, + "pagination": { + "groups": 1, + "rows": 1 + }, + "initial": { + "groups": 1, + "rows": 1 + } + }, + "encoding": "rle", + "version": "1.2.0", + "seq": 12 + }, + "_": { + "navigation": [], + "tx": 9444, + "universe": "", + "latency": "306 us", + "project": "test", + "runtime": { + "filter": { + "breakdown": [71], + "time": 78, + "rows": 1, + "n_filters": 1 + }, + "ungrouped": { + "having": 0, + "subqueries": [], + "time": 0 + }, + "having": { + "ungroup": 0, + "groups": 1, + "time": 0, + "rows": 1 + }, + "set": {"time": 0}, + "toplevel": { + "print_end": 222, + "execute_begin": 32, + "execute_end": 184, + "parse_end": 31, + "print_begin": 185 + }, + "merge": {"time": 0}, + "group_by": { + "groups": 1, + "time": 3, + "rows": 1 + }, + "sort": { + "groups": 1, + "time": 1, + "rows": 1 + }, + "total_time": 111, + "render": {"time": 37}, + "aggregate": { + "pre_having": 0, + "n_aggregates": 4, + "breakdown": [ + 12, + 3, + 2, + 2 + ], + "pre_sort": 1, + "post_sort": 28 + } + }, + "user": "test" } - } -} \ No newline at end of file +} diff --git a/coroner-client/src/test/resources/backtraceio/coroner/responses/timestamp-err-type-filter.json b/coroner-client/src/test/resources/backtraceio/coroner/responses/timestamp-err-type-filter.json index 3dfcc809f..aa1eca554 100644 --- a/coroner-client/src/test/resources/backtraceio/coroner/responses/timestamp-err-type-filter.json +++ b/coroner-client/src/test/resources/backtraceio/coroner/responses/timestamp-err-type-filter.json @@ -1,159 +1,143 @@ { - "_": { - "user": "test", - "project": "test", - "tx": 9493, - "universe": "", - "latency": "226 us", - "runtime": { - "filter": { - "time": 44, - "rows": 818, - "n_filters": 3, - "breakdown": [ - 28, - 4, - 2 - ] - }, - "group_by": { - "time": 7, - "groups": 1, - "rows": 818 - }, - "having": { - "time": 0, - "ungroup": 0, - "groups": 1, - "rows": 818 - }, - "aggregate": { - "pre_having": 0, - "pre_sort": 0, - "post_sort": 24, - "n_aggregates": 4, - "breakdown": [ - 2, - 3, - 11, - 1 - ] - }, - "sort": { - "time": 1, - "groups": 1, - "rows": 818 - }, - "render": { - "time": 29 - }, - "set": { - "time": 0 - }, - "merge": { - "time": 0 - }, - "ungrouped": { - "time": 0, - "having": 0, - "subqueries": [] - }, - "total_time": 76, - "toplevel": { - "parse_end": 29, - "execute_begin": 29, - "execute_end": 112, - "print_begin": 112, - "print_end": 142 - } - }, - "navigation": [] - }, - "response": { - "version": "1.2.0", - "seq": 1, - "encoding": "rle", - "columns": [ - [ - "head(error.message)", - "" - ], - [ - "head(callstack)", - "callstack" - ], - [ - "head(guid)", - "uuid" - ], - [ - "head(classifiers)", - "labels" - ] - ], - "columns_desc": [ - { - "name": "error.message", - "format": "", - "type": "dictionary", - "op": "head" - }, - { - "name": "callstack", - "format": "callstack", - "type": "dictionary", - "op": "head" - }, - { - "name": "guid", - "format": "uuid", - "type": "uuid", - "op": "head" - }, - { - "name": "classifiers", - "format": "labels", - "type": "dictionary", - "op": "head" - } - ], - "pagination": { - "limit": 1, - "offset": 0 - }, - "values": [ - [ - "*", - [ - [ - "DumpWithoutCrash" - ], - [ - "{\"frame\":[\"libbacktrace-native.so\",\"libbacktrace-native.so\",\"libart.so\",\"libc.so\",\"libbacktrace-native.so\",\"libbacktrace-native.so\",\"libart.so\",\"libbacktrace-native.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libc.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\"]}" - ], - [ - "71baf2e3-0fe3-48fa-ba18-d2b3d98d1e75" - ], - [ - "exception" - ] + "response": { + "columns_desc": [ + { + "op": "head", + "name": "error.message", + "format": "", + "type": "dictionary" + }, + { + "op": "head", + "name": "callstack", + "format": "callstack", + "type": "dictionary" + }, + { + "op": "head", + "name": "guid", + "format": "uuid", + "type": "uuid" + }, + { + "op": "head", + "name": "classifiers", + "format": "labels", + "type": "dictionary" + } ], - 818 - ] - ], - "cardinalities": { - "initial": { - "rows": 818, - "groups": 1 - }, - "having": { - "rows": 818, - "groups": 1 - }, - "pagination": { - "rows": 818, - "groups": 1 - } + "pagination": { + "offset": 0, + "limit": 1 + }, + "columns": [ + [ + "head(error.message)", + "" + ], + [ + "head(callstack)", + "callstack" + ], + [ + "head(guid)", + "uuid" + ], + [ + "head(classifiers)", + "labels" + ] + ], + "values": [[ + "*", + [ + ["DumpWithoutCrash"], + ["{\"frame\":[\"libbacktrace-native.so\",\"libbacktrace-native.so\",\"libart.so\",\"libc.so\",\"libbacktrace-native.so\",\"libbacktrace-native.so\",\"libart.so\",\"libbacktrace-native.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libc.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\",\"libart.so\"]}"], + ["71baf2e3-0fe3-48fa-ba18-d2b3d98d1e75"], + ["exception"] + ], + 818 + ]], + "cardinalities": { + "having": { + "groups": 1, + "rows": 818 + }, + "pagination": { + "groups": 1, + "rows": 818 + }, + "initial": { + "groups": 1, + "rows": 818 + } + }, + "encoding": "rle", + "version": "1.2.0", + "seq": 1 + }, + "_": { + "navigation": [], + "tx": 9493, + "universe": "", + "latency": "226 us", + "project": "test", + "runtime": { + "filter": { + "breakdown": [ + 28, + 4, + 2 + ], + "time": 44, + "rows": 818, + "n_filters": 3 + }, + "ungrouped": { + "having": 0, + "subqueries": [], + "time": 0 + }, + "having": { + "ungroup": 0, + "groups": 1, + "time": 0, + "rows": 818 + }, + "set": {"time": 0}, + "toplevel": { + "print_end": 142, + "execute_begin": 29, + "execute_end": 112, + "parse_end": 29, + "print_begin": 112 + }, + "merge": {"time": 0}, + "group_by": { + "groups": 1, + "time": 7, + "rows": 818 + }, + "sort": { + "groups": 1, + "time": 1, + "rows": 818 + }, + "total_time": 76, + "render": {"time": 29}, + "aggregate": { + "pre_having": 0, + "n_aggregates": 4, + "breakdown": [ + 2, + 3, + 11, + 1 + ], + "pre_sort": 0, + "post_sort": 24 + } + }, + "user": "test" } - } -} \ No newline at end of file +} diff --git a/example-app/build.gradle b/example-app/build.gradle index c58e14dbd..ed0f5f433 100644 --- a/example-app/build.gradle +++ b/example-app/build.gradle @@ -27,7 +27,7 @@ android { version "3.31.6" } } - + // Needed until we migrate to AndroidX android { lintOptions { diff --git a/example-app/src/androidTest/java/backtraceio/backtraceio/ExampleInstrumentedTest.java b/example-app/src/androidTest/java/backtraceio/backtraceio/ExampleInstrumentedTest.java index ad467ed82..b9b389f59 100644 --- a/example-app/src/androidTest/java/backtraceio/backtraceio/ExampleInstrumentedTest.java +++ b/example-app/src/androidTest/java/backtraceio/backtraceio/ExampleInstrumentedTest.java @@ -6,28 +6,23 @@ import static org.junit.Assert.assertEquals; import android.content.Context; - import androidx.test.ext.junit.rules.ActivityScenarioRule; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - +import backtraceio.coroner.response.CoronerResponse; +import backtraceio.coroner.response.CoronerResponseProcessingException; +import backtraceio.library.logger.BacktraceLogger; +import backtraceio.library.logger.LogLevel; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import net.jodah.concurrentunit.Waiter; - import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import java.util.Arrays; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import backtraceio.coroner.response.CoronerResponse; -import backtraceio.coroner.response.CoronerResponseProcessingException; -import backtraceio.library.logger.BacktraceLogger; -import backtraceio.library.logger.LogLevel; - /** * Instrumented test, which will execute on an Android device. * @@ -38,8 +33,7 @@ public class ExampleInstrumentedTest extends InstrumentedTest { private final int THREAD_SLEEP_TIME_MS = 2000; @Rule - public ActivityScenarioRule mActivityRule = - new ActivityScenarioRule<>(MainActivity.class); + public ActivityScenarioRule mActivityRule = new ActivityScenarioRule<>(MainActivity.class); @Before public void enableMetricsAndBreadcrumbs() { @@ -59,11 +53,12 @@ public void handledException() throws TimeoutException, CoronerResponseProcessin // GIVEN final String[] rxId = new String[1]; final Waiter waiter = new Waiter(); - mActivityRule.getScenario().onActivity(activity -> - activity.setOnServerResponseEventListener(backtraceResult -> { - rxId[0] = backtraceResult.rxId; - waiter.resume(); - })); + mActivityRule + .getScenario() + .onActivity(activity -> activity.setOnServerResponseEventListener(backtraceResult -> { + rxId[0] = backtraceResult.rxId; + waiter.resume(); + })); // WHEN onView(withId(R.id.handledException)).perform(click()); // UI action @@ -101,10 +96,12 @@ public void dumpWithoutCrash() throws CoronerResponseProcessingException, Interr // THEN try { - response = this.getCoronerClient().errorTypeTimestampFilter("Crash", - Long.toString(timestampStart), - Long.toString(this.getSecondsTimestampNowGMT()), - Arrays.asList("error.message")); + response = this.getCoronerClient() + .errorTypeTimestampFilter( + "Crash", + Long.toString(timestampStart), + Long.toString(this.getSecondsTimestampNowGMT()), + Arrays.asList("error.message")); } catch (Exception ex) { Assert.fail(ex.getMessage()); } @@ -115,7 +112,7 @@ public void dumpWithoutCrash() throws CoronerResponseProcessingException, Interr Assert.assertEquals("DumpWithoutCrash", val); } - //@Test + // @Test public void unhandledException() throws CoronerResponseProcessingException, InterruptedException { // GIVEN CoronerResponse response = null; @@ -126,16 +123,19 @@ public void unhandledException() throws CoronerResponseProcessingException, Inte // onView(withId(R.id.unhandledException)).perform(click()); // UI action // call BacktraceExceptionHandler directly instead - Thread.getDefaultUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), new NullPointerException()); + Thread.getDefaultUncaughtExceptionHandler() + .uncaughtException(Thread.currentThread(), new NullPointerException()); Thread.sleep(THREAD_SLEEP_TIME_MS); // THEN try { - response = this.getCoronerClient().errorTypeTimestampFilter("Crash", - Long.toString(timestampStart), - Long.toString(this.getSecondsTimestampNowGMT()), - Arrays.asList("error.message")); + response = this.getCoronerClient() + .errorTypeTimestampFilter( + "Crash", + Long.toString(timestampStart), + Long.toString(this.getSecondsTimestampNowGMT()), + Arrays.asList("error.message")); } catch (Exception ex) { Assert.fail(ex.getMessage()); } @@ -152,7 +152,7 @@ public void anr() { } // Will break build, obviously. - //@Test + // @Test public void nativeCrash() { onView(withId(R.id.nativeCrash)).perform(click()); } diff --git a/example-app/src/androidTest/java/backtraceio/backtraceio/InstrumentedTest.java b/example-app/src/androidTest/java/backtraceio/backtraceio/InstrumentedTest.java index e25ae0e1b..d95b1f648 100644 --- a/example-app/src/androidTest/java/backtraceio/backtraceio/InstrumentedTest.java +++ b/example-app/src/androidTest/java/backtraceio/backtraceio/InstrumentedTest.java @@ -1,8 +1,7 @@ package backtraceio.backtraceio; -import org.junit.BeforeClass; - import backtraceio.coroner.CoronerClient; +import org.junit.BeforeClass; public class InstrumentedTest { private static CoronerClient coronerClient; diff --git a/example-app/src/main/java/backtraceio/backtraceio/MainActivity.java b/example-app/src/main/java/backtraceio/backtraceio/MainActivity.java index a39433b84..11cd05471 100644 --- a/example-app/src/main/java/backtraceio/backtraceio/MainActivity.java +++ b/example-app/src/main/java/backtraceio/backtraceio/MainActivity.java @@ -6,21 +6,7 @@ import android.system.Os; import android.util.Log; import android.view.View; - import androidx.appcompat.app.AppCompatActivity; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import backtraceio.library.BacktraceClient; import backtraceio.library.BacktraceCredentials; import backtraceio.library.BacktraceDatabase; @@ -32,6 +18,17 @@ import backtraceio.library.models.BacktraceExceptionHandler; import backtraceio.library.models.database.BacktraceDatabaseSettings; import backtraceio.library.models.json.BacktraceReport; +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class MainActivity extends AppCompatActivity { @@ -87,13 +84,17 @@ private BacktraceClient initializeBacktrace(final String submissionUrl) { settings.setAutoSendMode(true); settings.setRetryOrder(RetryOrder.Queue); - Map attributes = new HashMap() {{ - put("custom.attribute", "My Custom Attribute"); - }}; + Map attributes = new HashMap() { + { + put("custom.attribute", "My Custom Attribute"); + } + }; - List attachments = new ArrayList() {{ - add(context.getFilesDir() + "/" + "myCustomFile.txt"); - }}; + List attachments = new ArrayList() { + { + add(context.getFilesDir() + "/" + "myCustomFile.txt"); + } + }; BacktraceDatabase database = new BacktraceDatabase(context, settings); BacktraceClient backtraceClient = new BacktraceClient(context, credentials, database, attributes, attachments); @@ -198,9 +199,11 @@ public void enableBreadcrumbsUserOnly(View view) throws Exception { public void sendReport(View view) { final long id = Thread.currentThread().getId(); - Map attributes = new HashMap() {{ - put("Caller thread", id); - }}; + Map attributes = new HashMap() { + { + put("Caller thread", id); + } + }; backtraceClient.addBreadcrumb("About to send Backtrace report", attributes, BacktraceBreadcrumbType.LOG); addNativeBreadcrumb(); addNativeBreadcrumbUserError(); diff --git a/example-app/src/test/java/backtraceio/backtraceio/ExampleUnitTest.java b/example-app/src/test/java/backtraceio/backtraceio/ExampleUnitTest.java index 6e364a1fd..5b5f261c7 100644 --- a/example-app/src/test/java/backtraceio/backtraceio/ExampleUnitTest.java +++ b/example-app/src/test/java/backtraceio/backtraceio/ExampleUnitTest.java @@ -14,4 +14,4 @@ public class ExampleUnitTest { public void addition_isCorrect() { assertEquals(4, 2 + 2); } -} \ No newline at end of file +}