From 867ef141cd84c24cec0e1da10c72bd29a66c75f4 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Sun, 22 Dec 2024 22:50:16 +0100 Subject: [PATCH 01/45] Setup spotless and pre-commit --- .github/workflows/test.yml | 3 ++- .pre-commit-config.yaml | 13 +++++++++++++ README.md | 9 +++++++++ build.gradle | 19 +++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 .pre-commit-config.yaml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3b3e8f5f5..5fd2bd833 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -32,7 +32,8 @@ jobs: echo BACKTRACE_SUBMISSION_URL=\"${{ secrets.BACKTRACE_SUBMISSION_URL }}\" >> ./local.properties echo BACKTRACE_CORONER_URL=\"${{ secrets.BACKTRACE_CORONER_URL }}\" >> ./local.properties echo BACKTRACE_CORONER_TOKEN=\"${{ secrets.BACKTRACE_CORONER_TOKEN }}\" >> ./local.properties - + - 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 new file mode 100644 index 000000000..9735a7dd3 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,13 @@ +repos: + - repo: local + hooks: + - id: spotless-apply + name: Spotless Apply + entry: ./gradlew spotlessApply + language: system + stages: [pre-commit] + - id: spotless-check + name: Spotless Check + entry: ./gradlew spotlessCheck + language: system + stages: [pre-commit] diff --git a/README.md b/README.md index d3096d31c..f7163af3f 100644 --- a/README.md +++ b/README.md @@ -70,3 +70,12 @@ backtraceClient.metrics.enable() ## Documentation For more information about the Android SDK, including installation, usage, and configuration options, see the [Android Integration guide](https://docs.saucelabs.com/error-reporting/platform-integrations/android/setup/) in the Sauce Labs documentation. + +## Contribution + +TODO: improve + +``` +pip install pre-commit +pre-commit install +``` diff --git a/build.gradle b/build.gradle index 2ee9fb94b..c9fb4fefd 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,25 @@ buildscript { } } +plugins { + id 'com.diffplug.spotless' version '6.25.0' apply false +} + +subprojects { + apply plugin: 'com.diffplug.spotless' + spotless { + java { + googleJavaFormat('1.25.2') // Specify the version of Google Java Format + indentWithTabs(1) + indentWithSpaces(2) + target fileTree('.') { + include '**/*.java' + exclude '**/build/**', '**/build-*/**', '**/.cxx/**' + } + } + } +} + allprojects { repositories { google() From 370186d5d46b18607c461f758a11d5498dad9d9e Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Sun, 22 Dec 2024 22:57:10 +0100 Subject: [PATCH 02/45] Fix pre-commit-config --- .pre-commit-config.yaml | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9735a7dd3..f2350addb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,13 +1,22 @@ repos: - repo: local hooks: - - id: spotless-apply - name: Spotless Apply - entry: ./gradlew spotlessApply - language: system - stages: [pre-commit] - - id: spotless-check - name: Spotless Check - entry: ./gradlew spotlessCheck + - id: test-hook + name: test-hook + entry: echo 'test' 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 From 67b9cd6003ac92685e050457d1e0335f0c81038b Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Mon, 23 Dec 2024 12:38:14 +0100 Subject: [PATCH 03/45] Improve docs --- .pre-commit-config.yaml | 1 + CONTRIBUTING.md | 10 ++++++++-- README.md | 9 --------- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f2350addb..d70dde568 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,6 +8,7 @@ repos: stages: [pre-commit] pass_filenames: false +# TODO: before merge - remove above and uncomment below # - id: spotless-apply # name: Spotless Apply # entry: ./gradlew spotlessApply diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bf7251903..9570d7242 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,13 +9,19 @@ Thank you for considering contributing to Backtrace Android SDK library. Here ar git clone https://github.com/backtrace-labs/backtrace-android.git ``` -2. **Create a Branch** +2. **Install pre-commit +```bash +pip install pre-commit +pre-commit install +``` + +3. **Create a Branch** - It's good practice to create a new branch for each feature or bugfix, if you have jira ticket put ticket number as branch prefix: ```bash git checkout -b jira-ticket/your-feature-name ``` -3. **Update submodules** +4. **Update submodules** ```bash git submodule update --recursive --remote git submodule update --init --recursive diff --git a/README.md b/README.md index f7163af3f..d3096d31c 100644 --- a/README.md +++ b/README.md @@ -70,12 +70,3 @@ backtraceClient.metrics.enable() ## Documentation For more information about the Android SDK, including installation, usage, and configuration options, see the [Android Integration guide](https://docs.saucelabs.com/error-reporting/platform-integrations/android/setup/) in the Sauce Labs documentation. - -## Contribution - -TODO: improve - -``` -pip install pre-commit -pre-commit install -``` From bb223bc3acac1584394b5f6d709189d5032fdc43 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Mon, 23 Dec 2024 13:11:18 +0100 Subject: [PATCH 04/45] Fix typo --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9570d7242..7373338c6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,7 +9,7 @@ Thank you for considering contributing to Backtrace Android SDK library. Here ar git clone https://github.com/backtrace-labs/backtrace-android.git ``` -2. **Install pre-commit +2. **Install pre-commit** ```bash pip install pre-commit pre-commit install From 48eb471f2f453a344e6459cda0fda7f1885cc0bf Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Mon, 23 Dec 2024 13:14:49 +0100 Subject: [PATCH 05/45] Reformat file --- CONTRIBUTING.md | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7373338c6..82ad0ce6d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,29 +4,28 @@ Thank you for considering contributing to Backtrace Android SDK library. Here ar ### Getting Started 1. **Clone the Repository** - - Clone the repository to your local machine using: - ```bash - git clone https://github.com/backtrace-labs/backtrace-android.git - ``` - + Clone the repository to your local machine using: + ```bash + git clone https://github.com/backtrace-labs/backtrace-android.git + ``` 2. **Install pre-commit** -```bash -pip install pre-commit -pre-commit install -``` + ```bash + pip install pre-commit + pre-commit install + ``` 3. **Create a Branch** - - It's good practice to create a new branch for each feature or bugfix, if you have jira ticket put ticket number as branch prefix: - ```bash - git checkout -b jira-ticket/your-feature-name - ``` + It's good practice to create a new branch for each feature or bugfix, if you have jira ticket put ticket number as branch prefix: + ```bash + git checkout -b jira-ticket/your-feature-name + ``` 4. **Update submodules** -```bash -git submodule update --recursive --remote -git submodule update --init --recursive -``` - + ```bash + git submodule update --recursive --remote + git submodule update --init --recursive + ``` + ### Coding Guidelines 1. **Code Formatting** From 99989acf6e5743653786e472337218bec88f4326 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Mon, 23 Dec 2024 13:16:55 +0100 Subject: [PATCH 06/45] Reformat --- CONTRIBUTING.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 82ad0ce6d..d652946d8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,19 +3,18 @@ Thank you for considering contributing to Backtrace Android SDK library. Here ar ### Getting Started -1. **Clone the Repository** - Clone the repository to your local machine using: +1. **Clone the repository** to your local machine using: ```bash git clone https://github.com/backtrace-labs/backtrace-android.git ``` + 2. **Install pre-commit** ```bash pip install pre-commit pre-commit install ``` -3. **Create a Branch** - It's good practice to create a new branch for each feature or bugfix, if you have jira ticket put ticket number as branch prefix: +3. **Create a branch** - it's good practice to create a new branch for each feature or bugfix, if you have jira ticket put ticket number as branch prefix: ```bash git checkout -b jira-ticket/your-feature-name ``` From 7ac11f24b23fea09af4cf819dc717107c624b9ff Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Mon, 23 Dec 2024 13:18:44 +0100 Subject: [PATCH 07/45] Fix doc --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d652946d8..af8dcb0e5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,7 +3,7 @@ Thank you for considering contributing to Backtrace Android SDK library. Here ar ### Getting Started -1. **Clone the repository** to your local machine using: +1. **Clone the repository** ```bash git clone https://github.com/backtrace-labs/backtrace-android.git ``` From ff017e522db7b026dc22a1222276beeff3fb9caa Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Sun, 5 Oct 2025 20:48:53 +0200 Subject: [PATCH 08/45] Bump spotless plugin version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 272d944d8..afbf55ebd 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { } plugins { - id 'com.diffplug.spotless' version '6.25.0' apply false + id 'com.diffplug.spotless' version '7.21.0' apply false } subprojects { From 1c1cee0bc23ebdff4c01ac692a17faa6d22e8d6c Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Sun, 5 Oct 2025 20:49:24 +0200 Subject: [PATCH 09/45] Tmp update pre-commit --- .pre-commit-config.yaml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d70dde568..d48b79ded 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,15 +9,15 @@ repos: 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 From 25a036ac5a73d23e2765659a8b980e86c85b22ea Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Sun, 5 Oct 2025 21:00:04 +0200 Subject: [PATCH 10/45] Fix version google java format and plugin --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index afbf55ebd..9cc6ff525 100644 --- a/build.gradle +++ b/build.gradle @@ -14,14 +14,14 @@ buildscript { } plugins { - id 'com.diffplug.spotless' version '7.21.0' apply false + id 'com.diffplug.spotless' version '7.2.1' apply false } subprojects { apply plugin: 'com.diffplug.spotless' spotless { java { - googleJavaFormat('1.25.2') // Specify the version of Google Java Format + googleJavaFormat('1.29.0') // Specify the version of Google Java Format indentWithTabs(1) indentWithSpaces(2) target fileTree('.') { From d42aeea4df016e31611129310828a7b30df8839f Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Mon, 6 Oct 2025 22:52:55 +0200 Subject: [PATCH 11/45] Update config --- build.gradle | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 9cc6ff525..6ac2d0b81 100644 --- a/build.gradle +++ b/build.gradle @@ -21,14 +21,36 @@ subprojects { apply plugin: 'com.diffplug.spotless' spotless { java { - googleJavaFormat('1.29.0') // Specify the version of Google Java Format - indentWithTabs(1) - indentWithSpaces(2) + googleJavaFormat('1.29.0').aosp() // Specify the version of Google Java Format + removeUnusedImports() + trimTrailingWhitespace() + endWithNewline() target fileTree('.') { include '**/*.java' exclude '**/build/**', '**/build-*/**', '**/.cxx/**' } } + format 'json', { + target '**/*.json' + leadingTabsToSpaces(2) + trimTrailingWhitespace() + endWithNewline() + targetExclude('**/build/**', '**/.cxx/**', '**/generated/**') + } + + format 'gradle', { + target '**/*.gradle' + leadingTabsToSpaces(4) + trimTrailingWhitespace() + endWithNewline() + } + + + format 'misc', { + target '*.md', '.gitignore' + trimTrailingWhitespace() + endWithNewline() + } } } From 1ca804a7a2c9113dced579e019cd2e6ae91a25f4 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Wed, 8 Oct 2025 21:56:24 +0200 Subject: [PATCH 12/45] Bump spotless plugin --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 6ac2d0b81..2dd00228b 100644 --- a/build.gradle +++ b/build.gradle @@ -14,14 +14,14 @@ buildscript { } plugins { - id 'com.diffplug.spotless' version '7.2.1' apply false + id 'com.diffplug.spotless' version '8.0.0' apply false } subprojects { apply plugin: 'com.diffplug.spotless' spotless { java { - googleJavaFormat('1.29.0').aosp() // Specify the version of Google Java Format + palantirJavaFormat() removeUnusedImports() trimTrailingWhitespace() endWithNewline() From 80c3a705be005cfe03b2a03e8ea026cd0ac15d31 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Sun, 12 Oct 2025 10:12:43 +0200 Subject: [PATCH 13/45] Improve CONTRIBUTING.md - add information about spotless --- .pre-commit-config.yaml | 33 ++++++++++++++++----------------- CONTRIBUTING.md | 37 +++++++++++++++++++++++++++++++------ 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d48b79ded..adcdd78d9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,23 +1,22 @@ repos: - repo: local hooks: - - id: test-hook - name: test-hook - entry: echo 'test' - 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 + - id: start-hook + name: start-hook + entry: echo 'Start pre-commit' 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 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index af8dcb0e5..f3733e386 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,7 @@ # Contributing -Thank you for considering contributing to Backtrace Android SDK library. Here are some guidelines to help you get started: +Thank you for your interest in contributing to the Backtrace Android SDK. Please review the following guidelines to help you get started. -### Getting Started +## Getting Started 1. **Clone the repository** ```bash @@ -25,7 +25,7 @@ Thank you for considering contributing to Backtrace Android SDK library. Here ar git submodule update --init --recursive ``` -### Coding Guidelines +## Coding Guidelines 1. **Code Formatting** - Make sure that your code is properly formatted using the default Android Studio formatter. @@ -38,7 +38,7 @@ Thank you for considering contributing to Backtrace Android SDK library. Here ar 3. **Write Tests** - Ensure that you write tests for the new functionality or changes made. This helps maintain the integrity of the project. -### Commit and Push +## Commit and Push 1. **Commit Your Changes** - Write clear and concise commit messages. Follow the convention of using the imperative mood in the subject line. @@ -52,7 +52,7 @@ Thank you for considering contributing to Backtrace Android SDK library. Here ar git push origin jira-ticket/your-feature-name ``` -### Create a Pull Request +## Create a Pull Request 1. **Submit a Pull Request** - Go to the repository on GitHub and click on the `New Pull Request` button. @@ -61,8 +61,33 @@ Thank you for considering contributing to Backtrace Android SDK library. Here ar 2. **Review Process** - One of the project maintainers will review your pull request. Please be responsive to any comments or suggestions made. -### Additional Notes +## Additional Notes - Ensure that your code follows the existing code style and structure. - Keep your branch up to date with the latest changes from the `master` branch to avoid merge conflicts. + +## Code Formatting + +This project uses **[Spotless](https://github.com/diffplug/spotless)** (a code formatting plugin) integrated with **[pre-commit](https://pre-commit.com/)** to ensure consistent code style and automatic formatting before each commit. + +### Setup Instructions + +1. Run Spotless check +This verifies that your code meets the project’s formatting standards. + ```bash + ./gradlew spotlessCheck + ``` + +2. (Optional) Automatically reformat code +If formatting issues are found, you can automatically fix them with: + ```bash + ./gradlew spotlessApply + ``` + +**Notes** +- The pre-commit hook ensures code formatting is validated automatically before commits are created. +- You can manually trigger all pre-commit checks at any time with: + ```bash + pre-commit run --all-files + ``` From 2f93e88f0867e1f55d6293dfb51c1c8045db501e Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Wed, 15 Oct 2025 18:05:32 +0200 Subject: [PATCH 14/45] Improve json format rules --- build.gradle | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 2dd00228b..bb8af0531 100644 --- a/build.gradle +++ b/build.gradle @@ -30,11 +30,9 @@ subprojects { exclude '**/build/**', '**/build-*/**', '**/.cxx/**' } } - format 'json', { + json { target '**/*.json' - leadingTabsToSpaces(2) - trimTrailingWhitespace() - endWithNewline() + simple() targetExclude('**/build/**', '**/.cxx/**', '**/generated/**') } From 7392e72849e1e9b7f4d5a114579c4287f5f03954 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Wed, 15 Oct 2025 21:43:48 +0200 Subject: [PATCH 15/45] Improve spotless exclude rules --- build.gradle | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index bb8af0531..26a6f28d6 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,15 @@ plugins { id 'com.diffplug.spotless' version '8.0.0' apply false } +def spotlessExcludes = [ + '**/cpp/**', + '**/jniLibs/**', + '**/build/**', + '**/build-*/**', + '**/.cxx/**', + '**/generated/**' +] + subprojects { apply plugin: 'com.diffplug.spotless' spotless { @@ -27,17 +36,18 @@ subprojects { endWithNewline() target fileTree('.') { include '**/*.java' - exclude '**/build/**', '**/build-*/**', '**/.cxx/**' } + targetExclude spotlessExcludes } json { target '**/*.json' simple() - targetExclude('**/build/**', '**/.cxx/**', '**/generated/**') + targetExclude spotlessExcludes } format 'gradle', { target '**/*.gradle' + targetExclude spotlessExcludes leadingTabsToSpaces(4) trimTrailingWhitespace() endWithNewline() @@ -46,6 +56,7 @@ subprojects { format 'misc', { target '*.md', '.gitignore' + targetExclude spotlessExcludes trimTrailingWhitespace() endWithNewline() } From e0a3646a8cd33093fa8b13104b5065557057f736 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Wed, 15 Oct 2025 22:24:03 +0200 Subject: [PATCH 16/45] Fix rules --- build.gradle | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 26a6f28d6..0f0477b0f 100644 --- a/build.gradle +++ b/build.gradle @@ -18,6 +18,10 @@ plugins { } def spotlessExcludes = [ + '.github/**', + '.gradle/**', + '.idea/**', + 'build/**', '**/cpp/**', '**/jniLibs/**', '**/build/**', @@ -30,19 +34,17 @@ subprojects { apply plugin: 'com.diffplug.spotless' spotless { java { + target '**/*.java' + targetExclude spotlessExcludes palantirJavaFormat() removeUnusedImports() trimTrailingWhitespace() endWithNewline() - target fileTree('.') { - include '**/*.java' - } - targetExclude spotlessExcludes } json { target '**/*.json' - simple() targetExclude spotlessExcludes + simple() } format 'gradle', { From 6e5a499bdbe31e266d3d51433495bd0c8c4d4d6f Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Wed, 15 Oct 2025 22:42:31 +0200 Subject: [PATCH 17/45] Reorder spotless check --- .github/workflows/test.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cf1616dd3..8deb680e6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,14 +12,6 @@ jobs: runs-on: ubuntu-latest steps: - - name: Checkout submodules - uses: actions/checkout@v4 - with: - fetch-depth: 2 - submodules: recursive - token: ${{ secrets.ACCESS_TOKEN }} - persist-credentials: false - - name: set up JDK 17 uses: actions/setup-java@v4 with: @@ -27,6 +19,9 @@ jobs: distribution: "adopt" cache: gradle + - name: Check Code Style + run: ./gradlew spotlessCheck + - name: Write to local.properties run: | echo BACKTRACE_SUBMISSION_URL=\"${{ secrets.BACKTRACE_SUBMISSION_URL }}\" >> ./local.properties @@ -36,8 +31,13 @@ jobs: - name: Accept Android SDK licences run: yes | "${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" --licenses - - name: Check Code Style - run: ./gradlew spotlessCheck + - name: Checkout submodules + uses: actions/checkout@v4 + with: + fetch-depth: 2 + submodules: recursive + token: ${{ secrets.ACCESS_TOKEN }} + persist-credentials: false - name: Build and check run: ./gradlew assembleDebug assembleDebugAndroidTest build check From 1ccfbf05503dbbfe51f49c528bbe84b78e480b61 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Wed, 15 Oct 2025 22:46:11 +0200 Subject: [PATCH 18/45] Reorder build --- .github/workflows/test.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8deb680e6..688fb3c5c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,6 +12,9 @@ jobs: runs-on: ubuntu-latest steps: + - name: Accept Android SDK licences + run: yes | "${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" --licenses + - name: set up JDK 17 uses: actions/setup-java@v4 with: @@ -28,8 +31,6 @@ jobs: echo BACKTRACE_CORONER_URL=\"${{ secrets.BACKTRACE_CORONER_URL }}\" >> ./local.properties echo BACKTRACE_CORONER_TOKEN=\"${{ secrets.BACKTRACE_CORONER_TOKEN }}\" >> ./local.properties - - name: Accept Android SDK licences - run: yes | "${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" --licenses - name: Checkout submodules uses: actions/checkout@v4 From 848cf593316b9923ca297dd86522ea98e00395df Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Wed, 15 Oct 2025 22:48:22 +0200 Subject: [PATCH 19/45] Revert --- .github/workflows/test.yml | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 688fb3c5c..cf1616dd3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,8 +12,13 @@ jobs: runs-on: ubuntu-latest steps: - - name: Accept Android SDK licences - run: yes | "${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" --licenses + - name: Checkout submodules + uses: actions/checkout@v4 + with: + fetch-depth: 2 + submodules: recursive + token: ${{ secrets.ACCESS_TOKEN }} + persist-credentials: false - name: set up JDK 17 uses: actions/setup-java@v4 @@ -22,23 +27,17 @@ jobs: distribution: "adopt" cache: gradle - - name: Check Code Style - run: ./gradlew spotlessCheck - - name: Write to local.properties run: | echo BACKTRACE_SUBMISSION_URL=\"${{ secrets.BACKTRACE_SUBMISSION_URL }}\" >> ./local.properties echo BACKTRACE_CORONER_URL=\"${{ secrets.BACKTRACE_CORONER_URL }}\" >> ./local.properties echo BACKTRACE_CORONER_TOKEN=\"${{ secrets.BACKTRACE_CORONER_TOKEN }}\" >> ./local.properties + - name: Accept Android SDK licences + run: yes | "${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" --licenses - - name: Checkout submodules - uses: actions/checkout@v4 - with: - fetch-depth: 2 - submodules: recursive - token: ${{ secrets.ACCESS_TOKEN }} - persist-credentials: false + - name: Check Code Style + run: ./gradlew spotlessCheck - name: Build and check run: ./gradlew assembleDebug assembleDebugAndroidTest build check From f72ddeed51e02f76ce1f6c383111575bc64c03c0 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Mon, 26 Jan 2026 22:28:01 +0100 Subject: [PATCH 20/45] Code reformat --- .../library/ApplicationMetadataTest.java | 6 +- .../BacktraceClientAttachmentsTest.java | 107 ++-- .../BacktraceClientAttributeTests.java | 27 +- .../BacktraceClientBreadcrumbsTest.java | 276 +++++------ .../library/BacktraceClientEventsTest.java | 22 +- .../library/BacktraceClientMetricsTest.java | 94 ++-- .../library/BacktraceClientProguardTest.java | 243 +++++---- .../library/BacktraceClientSendTest.java | 172 ++++--- .../BacktraceClientSerializationTest.java | 61 ++- .../BacktraceClientSummedEventTest.java | 55 +- .../library/BacktraceClientTest.java | 107 ++-- .../BacktraceClientUniqueEventTest.java | 168 +++++-- .../library/BacktraceCredentialsTest.java | 5 +- .../BacktraceErrorTypeAttributeTest.java | 55 +- .../library/BacktraceFileAttachments.java | 105 ++-- .../library/BacktraceUrlTests.java | 2 - .../library/SettingAttributesTest.java | 54 +- ...BacktraceAppExitInfoSenderHandlerTest.java | 70 +-- .../breadcrumbs/BacktraceBreadcrumbsTest.java | 202 +++++--- .../common/BacktraceMathHelperTest.java | 1 - .../common/BacktraceStringHelperTest.java | 2 - .../common/SharedPreferencesManagerTest.java | 1 - ...ceCrashHandlerRunnerConfigurationTest.java | 32 +- ...ashHandlerNativeLibraryResolutionTest.java | 28 +- .../CrashHandlerRunnerInvocationTest.java | 32 +- ...traceDatabaseContextMultithreadedTest.java | 42 +- .../BacktraceDatabaseContextTest.java | 31 +- .../BacktraceDatabaseFileContextTest.java | 109 ++-- .../BacktraceDatabaseProguardTest.java | 15 +- .../database/BacktraceDatabaseRecordTest.java | 74 +-- .../BacktraceDatabaseRecordWriterTest.java | 27 +- .../database/BacktraceDatabaseTest.java | 54 +- .../library/metrics/BacktraceMetricsTest.java | 66 ++- .../library/models/BacktraceDataTest.java | 29 +- .../models/UncaughtExceptionHandlerTest.java | 64 +-- .../models/json/BacktraceAttributesTest.java | 25 +- .../json/BacktraceStaticAttributesTest.java | 9 +- .../library/watchdog/BacktraceAnrTest.java | 15 +- .../watchdog/BacktraceWatchdogSharedTest.java | 28 +- .../watchdog/BacktraceWatchdogTest.java | 27 +- .../backtraceio/library/BacktraceClient.java | 77 +-- .../library/BacktraceCredentials.java | 12 +- .../library/BacktraceDatabase.java | 212 ++++---- .../anr/ActivityManagerExitInfoProvider.java | 3 +- .../library/anr/AnrExitInfoState.java | 2 - .../anr/AppExitInfoDetailsExtractor.java | 14 +- .../anr/BacktraceANRExitInfoException.java | 1 - .../library/anr/BacktraceANRSettings.java | 6 +- .../BacktraceAppExitInfoSenderHandler.java | 67 +-- .../library/anr/ExitInfoAdapter.java | 2 - .../library/anr/ExitInfoStackTraceParser.java | 5 +- .../library/base/BacktraceBase.java | 81 +-- .../BacktraceActivityLifecycleListener.java | 1 - .../breadcrumbs/BacktraceBreadcrumbs.java | 44 +- .../BacktraceBreadcrumbsLogManager.java | 23 +- .../BacktraceBroadcastReceiver.java | 9 +- .../BacktraceComponentListener.java | 21 +- .../breadcrumbs/BacktraceQueueFileHelper.java | 25 +- .../common/ApplicationMetadataCache.java | 12 +- .../common/BacktraceSerializeHelper.java | 2 - .../library/common/CollectionUtils.java | 2 - .../common/DeviceAttributesHelper.java | 45 +- .../library/common/FileHelper.java | 18 +- .../common/MultiFormRequestHelper.java | 50 +- .../library/common/PermissionHelper.java | 6 +- .../library/common/RequestHelper.java | 3 +- .../common/SharedPreferencesManager.java | 1 + .../library/common/TypeHelper.java | 45 +- .../StackTraceElementTypeAdapter.java | 3 +- .../ThrowableTypeAdapterFactory.java | 75 +-- .../library/enums/BatteryState.java | 2 +- .../library/enums/database/RetryOrder.java | 3 +- .../EventsOnServerResponseEventListener.java | 2 +- .../events/OnBeforeSendEventListener.java | 2 +- .../events/OnServerErrorEventListener.java | 2 +- .../events/OnServerResponseEventListener.java | 2 +- .../backtraceio/library/http/HttpHelper.java | 6 +- .../backtraceio/library/interfaces/Api.java | 2 +- .../library/interfaces/Breadcrumbs.java | 22 +- .../library/interfaces/Client.java | 3 +- .../library/interfaces/Database.java | 17 +- .../library/interfaces/DatabaseContext.java | 1 - .../interfaces/DatabaseFileContext.java | 6 +- .../library/interfaces/Metrics.java | 9 +- .../interfaces/NativeCommunication.java | 23 +- .../logger/BacktraceInternalLogger.java | 3 +- .../library/logger/BacktraceLogger.java | 4 +- .../backtraceio/library/logger/Logger.java | 5 +- .../library/models/BacktraceData.java | 44 +- .../BacktraceDataAttachmentsFileHelper.java | 4 +- .../models/BacktraceExceptionHandler.java | 15 +- .../models/BacktraceMetricsSettings.java | 24 +- .../library/models/BacktraceResult.java | 8 +- .../library/models/BacktraceStackFrame.java | 5 +- .../library/models/BacktraceStackTrace.java | 13 +- .../attributes/ReportDataAttributes.java | 1 - .../models/attributes/ReportDataBuilder.java | 3 +- .../database/BacktraceDatabaseRecord.java | 32 +- .../BacktraceDatabaseRecordWriter.java | 12 +- .../database/BacktraceDatabaseSettings.java | 3 - .../library/models/json/Annotations.java | 3 +- .../models/json/BacktraceAttributes.java | 21 +- .../library/models/json/BacktraceReport.java | 75 ++- .../json/BacktraceStaticAttributes.java | 11 +- .../library/models/json/SourceCode.java | 2 - .../library/models/json/SourceCodeData.java | 9 +- .../library/models/json/ThreadData.java | 10 +- .../models/json/ThreadInformation.java | 7 +- .../library/models/metrics/Event.java | 3 - .../library/models/metrics/EventsPayload.java | 1 - .../library/models/metrics/EventsResult.java | 5 +- .../library/models/metrics/SummedEvent.java | 5 +- .../models/metrics/SummedEventsPayload.java | 1 - .../library/models/metrics/UniqueEvent.java | 19 +- .../models/metrics/UniqueEventsPayload.java | 1 - .../CrashHandlerConfiguration.java | 34 +- .../models/types/BacktraceResultStatus.java | 2 +- .../library/models/types/HttpException.java | 2 +- .../nativeCalls/BacktraceCrashHandler.java | 27 +- .../BacktraceCrashHandlerWrapper.java | 36 +- .../library/nativeCalls/SystemLoader.java | 1 - .../library/services/BacktraceApi.java | 24 +- .../services/BacktraceCrashHandlerRunner.java | 15 +- .../services/BacktraceDatabaseContext.java | 27 +- .../BacktraceDatabaseFileContext.java | 14 +- .../services/BacktraceEventsHandler.java | 56 ++- .../services/BacktraceHandlerInputEvents.java | 9 +- .../services/BacktraceHandlerInputReport.java | 9 +- .../services/BacktraceHandlerThread.java | 14 +- .../library/services/BacktraceMetrics.java | 52 +- .../services/BacktraceReportSender.java | 42 +- .../services/ReportExceptionTransformer.java | 15 +- .../library/services/SummedEventsHandler.java | 17 +- .../library/services/UniqueEventsHandler.java | 16 +- .../watchdog/BacktraceANRHandlerWatchdog.java | 14 +- .../library/watchdog/BacktraceWatchdog.java | 29 +- .../watchdog/BacktraceWatchdogShared.java | 17 +- .../BacktraceWatchdogTimeoutException.java | 3 +- .../library/BacktraceSerializeHelperTest.java | 18 +- .../library/BacktraceStackTraceTest.java | 12 +- .../library/ConcatAttributesUnitTest.java | 29 +- .../GsonThrowableDeserializationTest.java | 35 +- .../GsonThrowableSerializationTest.java | 50 +- .../ReportDataAnnotationBuilderTest.java | 38 +- .../ReportDataAttributeBuilderTest.java | 33 +- .../ReportExceptionTransformerTest.java | 41 +- .../java/backtraceio/library/TestUtils.java | 14 +- .../library/anr/BacktraceANRSettingsTest.java | 8 +- .../anr/ExitInfoStackTraceParserTest.java | 38 +- .../library/common/CollectionUtilsTest.java | 3 +- .../anr/AppExitInfoDetailsExtractorTest.java | 20 +- .../database/BacktraceDatabaseRecordTest.java | 18 +- .../logger/BacktraceInternalLoggerTest.java | 30 +- .../library/logger/BacktraceMockLogger.java | 4 +- .../models/BacktraceApiResultTest.java | 3 +- .../library/models/BacktraceDataJsonTest.java | 127 +++-- .../library/models/BacktraceResultTest.java | 3 +- .../models/BacktraceStackFrameTest.java | 22 +- .../models/json/BacktraceReportTest.java | 73 ++- .../models/json/SourceCodeDataTest.java | 65 ++- .../library/models/json/SourceCodeTest.java | 10 +- .../models/json/ThreadInformationTest.java | 40 +- .../types/BacktraceResultStatusTest.java | 28 +- .../resources/backtraceApiResult.error.json | 5 +- .../test/resources/backtraceApiResult.json | 5 +- .../src/test/resources/backtraceData.json | 84 ++-- .../resources/backtraceDatabaseRecord.json | 8 +- .../test/resources/backtraceReport-tmp.json | 468 +++++++++--------- .../src/test/resources/backtraceReport.json | 56 +-- .../src/test/resources/backtraceResult.json | 5 +- .../test/resources/backtraceStackFrame.json | 8 +- .../src/test/resources/serializedError.json | 29 +- .../test/resources/serializedException.json | 29 +- .../serializedExceptionWithCause.json | 62 +-- .../serializedMultiCauseException.json | 128 ++--- .../test/resources/serializedThrowable.json | 29 +- .../serializedThrowableWithCause.json | 62 +-- .../src/test/resources/sourceCode.json | 6 +- .../src/test/resources/sourceCodeData.json | 14 +- .../src/test/resources/threadInformation.json | 28 +- .../backtraceio/coroner/CoronerClient.java | 38 +- .../backtraceio/coroner/CoronerError.java | 4 +- .../coroner/CoronerHttpClient.java | 25 +- .../coroner/common/HttpClient.java | 3 +- .../backtraceio/coroner/query/Constants.java | 10 +- .../coroner/query/CoronerFieldFilter.java | 1 - .../coroner/query/CoronerFiltersBuilder.java | 2 - .../coroner/query/CoronerQueries.java | 7 +- .../coroner/query/CoronerQueryBuilder.java | 3 +- .../coroner/query/FilterOperator.java | 2 +- .../coroner/response/ColumnDescElement.java | 4 +- .../coroner/response/CoronerApiResponse.java | 7 +- .../response/CoronerHttpException.java | 2 +- .../coroner/response/CoronerResponse.java | 14 +- .../response/CoronerResponseGroup.java | 7 +- .../CoronerResponseGroupDeserializer.java | 9 +- .../coroner/serialization/GsonWrapper.java | 4 +- .../coroner/CoronerClientTest.java | 42 +- .../coroner/query/CoronerFieldFilterTest.java | 4 +- .../query/CoronerFiltersBuilderTest.java | 7 +- .../coroner/query/CoronerQueriesTest.java | 21 +- .../query/CoronerQueryBuilderTest.java | 15 +- .../coroner/query/CoronerValueFilterTest.java | 1 - .../CoronerResponseGroupDeserializerTest.java | 4 +- .../serialization/GsonWrapperTest.java | 26 +- .../coroner/utils/MockHttpClient.java | 3 +- .../coroner/utils/ResourceUtils.java | 9 +- .../coroner/utils/StringUtils.java | 2 +- .../resources/backtraceio/coroner/frames.json | 29 +- .../rxid-12345-custom-attr-err-msg.json | 16 +- .../coroner/queries/rxid-12345.json | 15 +- .../queries/timestamp-err-type-filter.json | 28 +- .../coroner/responses/operation-error.json | 6 +- .../coroner/responses/rx-filter-response.json | 290 +++++------ .../responses/timestamp-err-type-filter.json | 296 ++++++----- example-app/build.gradle | 2 +- .../backtraceio/ExampleInstrumentedTest.java | 60 +-- .../backtraceio/InstrumentedTest.java | 3 +- .../backtraceio/backtraceio/MainActivity.java | 49 +- .../backtraceio/ExampleUnitTest.java | 2 +- 220 files changed, 3766 insertions(+), 3429 deletions(-) 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 46be85fe9..21a919cd2 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); } @@ -104,7 +110,8 @@ public void try3TimesOn503() { final int timeBetweenRetriesMillis = 1; // Enable metrics first - this will send startup events with default handlers - backtraceClient.metrics.enable(new BacktraceMetricsSettings(credentials, defaultBaseUrl, 0, timeBetweenRetriesMillis)); + backtraceClient.metrics.enable( + new BacktraceMetricsSettings(credentials, defaultBaseUrl, 0, timeBetweenRetriesMillis)); // Set up mock handlers AFTER enable() so we only track the explicit send() call final MockRequestHandler mockUniqueRequestHandler = new MockRequestHandler(); @@ -117,7 +124,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); @@ -127,7 +136,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); @@ -165,7 +176,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); @@ -176,7 +189,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); @@ -186,7 +201,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); @@ -237,7 +253,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 @@ -260,8 +277,6 @@ public void onEvent(EventsResult result) { } }); - - // Account for unique events startup event for (int i = 0; i < maximumNumberOfEvents - 2; i++) { backtraceClient.metrics.addUniqueEvent(uniqueAttributeName[0]); @@ -269,7 +284,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 @@ -342,7 +359,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 @@ -367,8 +384,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()); @@ -385,7 +405,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); @@ -417,8 +438,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()); } @@ -437,7 +466,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()); } @@ -464,7 +495,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 491f4dbc4..f4069d01f 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientSerializationTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientSerializationTest.java @@ -5,22 +5,9 @@ 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.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 +15,24 @@ 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.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/BacktraceClientTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientTest.java index d904015c7..b7aa7bb1c 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/BacktraceClientTest.java @@ -5,26 +5,21 @@ 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.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - +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.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; - -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.Before; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class BacktraceClientTest { @@ -86,12 +81,12 @@ private void awaitWaiter(Waiter waiter) { private void assertAttachmentsContain(BacktraceData data, List expectedAttachments) { List actualAttachments = data.getAttachmentPaths(); for (String expected : expectedAttachments) { - assertTrue("Expected attachment '" + expected + "' not found in " + actualAttachments, + assertTrue( + "Expected attachment '" + expected + "' not found in " + actualAttachments, actualAttachments.contains(expected)); } } - @Test public void sendBacktraceReportWithoutAttachments() { sendAndAssert( @@ -103,36 +98,26 @@ public void sendBacktraceReportWithoutAttachments() { @Test public void sendBacktraceReportWithInitAttachments() { - sendAndAssert( - new BacktraceReport(RESULT_MESSAGE), - initAttachments, - new ArrayList<>(), - data -> { - assertEquals(initAttachments.size(), data.getAttachmentPaths().size()); - assertAttachmentsContain(data, initAttachments); - }); + sendAndAssert(new BacktraceReport(RESULT_MESSAGE), initAttachments, new ArrayList<>(), data -> { + assertEquals(initAttachments.size(), data.getAttachmentPaths().size()); + assertAttachmentsContain(data, initAttachments); + }); } @Test public void sendBacktraceReportWithDynamicAttachments() { - sendAndAssert( - new BacktraceReport(RESULT_MESSAGE), - new ArrayList<>(), - dynamicAttachments, - data -> { - assertEquals(dynamicAttachments.size(), data.getAttachmentPaths().size()); - assertAttachmentsContain(data, dynamicAttachments); - }); + sendAndAssert(new BacktraceReport(RESULT_MESSAGE), new ArrayList<>(), dynamicAttachments, data -> { + assertEquals(dynamicAttachments.size(), data.getAttachmentPaths().size()); + assertAttachmentsContain(data, dynamicAttachments); + }); } @Test public void sendBacktraceReportWithReportAttachments() { sendAndAssert( - new BacktraceReport(RESULT_MESSAGE, reportAttachments), - new ArrayList<>(), - new ArrayList<>(), - data -> { - assertEquals(reportAttachments.size(), data.getAttachmentPaths().size()); + new BacktraceReport(RESULT_MESSAGE, reportAttachments), new ArrayList<>(), new ArrayList<>(), data -> { + assertEquals( + reportAttachments.size(), data.getAttachmentPaths().size()); assertAttachmentsContain(data, reportAttachments); }); } @@ -140,11 +125,9 @@ public void sendBacktraceReportWithReportAttachments() { @Test public void sendBacktraceReportWithInitAndReportAttachments() { sendAndAssert( - new BacktraceReport(RESULT_MESSAGE, reportAttachments), - initAttachments, - new ArrayList<>(), - data -> { - assertEquals(reportAttachments.size() + initAttachments.size(), + new BacktraceReport(RESULT_MESSAGE, reportAttachments), initAttachments, new ArrayList<>(), data -> { + assertEquals( + reportAttachments.size() + initAttachments.size(), data.getAttachmentPaths().size()); assertAttachmentsContain(data, reportAttachments); assertAttachmentsContain(data, initAttachments); @@ -154,11 +137,9 @@ public void sendBacktraceReportWithInitAndReportAttachments() { @Test public void sendBacktraceReportWithDynamicAndReportAttachments() { sendAndAssert( - new BacktraceReport(RESULT_MESSAGE, reportAttachments), - new ArrayList<>(), - dynamicAttachments, - data -> { - assertEquals(reportAttachments.size() + dynamicAttachments.size(), + new BacktraceReport(RESULT_MESSAGE, reportAttachments), new ArrayList<>(), dynamicAttachments, data -> { + assertEquals( + reportAttachments.size() + dynamicAttachments.size(), data.getAttachmentPaths().size()); assertAttachmentsContain(data, reportAttachments); assertAttachmentsContain(data, dynamicAttachments); @@ -167,26 +148,21 @@ public void sendBacktraceReportWithDynamicAndReportAttachments() { @Test public void sendBacktraceReportWithInitAndDynamicAttachments() { - sendAndAssert( - new BacktraceReport(RESULT_MESSAGE), - initAttachments, - dynamicAttachments, - data -> { - assertEquals(initAttachments.size() + dynamicAttachments.size(), - data.getAttachmentPaths().size()); - assertAttachmentsContain(data, initAttachments); - assertAttachmentsContain(data, dynamicAttachments); - }); + sendAndAssert(new BacktraceReport(RESULT_MESSAGE), initAttachments, dynamicAttachments, data -> { + assertEquals( + initAttachments.size() + dynamicAttachments.size(), + data.getAttachmentPaths().size()); + assertAttachmentsContain(data, initAttachments); + assertAttachmentsContain(data, dynamicAttachments); + }); } @Test public void sendBacktraceReportWithInitDynamicAndReportAttachments() { sendAndAssert( - new BacktraceReport(RESULT_MESSAGE, reportAttachments), - initAttachments, - dynamicAttachments, - data -> { - assertEquals(reportAttachments.size() + initAttachments.size() + dynamicAttachments.size(), + new BacktraceReport(RESULT_MESSAGE, reportAttachments), initAttachments, dynamicAttachments, data -> { + assertEquals( + reportAttachments.size() + initAttachments.size() + dynamicAttachments.size(), data.getAttachmentPaths().size()); assertAttachmentsContain(data, reportAttachments); assertAttachmentsContain(data, initAttachments); @@ -208,7 +184,8 @@ public void sendBacktraceReportWithDynamicAttributesModifyDuringExecution() { client.addAttachment(attachment); sendReportAndWait(client, new BacktraceReport(RESULT_MESSAGE), data -> { assertEquals(1, data.getAttachmentPaths().size()); - assertTrue("Expected attachment '" + attachment + "' not found", + assertTrue( + "Expected attachment '" + attachment + "' not found", data.getAttachmentPaths().contains(attachment)); }); } @@ -224,9 +201,11 @@ public void sendBacktraceReportWithDynamicAttributesRemovedDuringExecution() { // Send first report with two attachments sendReportAndWait(client, new BacktraceReport(RESULT_MESSAGE), data -> { assertEquals(2, data.getAttachmentPaths().size()); - assertTrue("Expected attachment '" + file1 + "' not found", + assertTrue( + "Expected attachment '" + file1 + "' not found", data.getAttachmentPaths().contains(file1)); - assertTrue("Expected attachment '" + file2 + "' not found", + assertTrue( + "Expected attachment '" + file2 + "' not found", data.getAttachmentPaths().contains(file2)); }); 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/CrashHandlerNativeLibraryResolutionTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/crashHandler/CrashHandlerNativeLibraryResolutionTest.java index 22f57b018..67fe9077b 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/crashHandler/CrashHandlerNativeLibraryResolutionTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/crashHandler/CrashHandlerNativeLibraryResolutionTest.java @@ -2,22 +2,18 @@ import static org.junit.Assert.assertEquals; +import android.content.pm.ApplicationInfo; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - -import org.junit.Test; -import org.junit.runner.RunWith; - +import backtraceio.library.common.AbiHelper; +import backtraceio.library.models.nativeHandler.CrashHandlerConfiguration; import java.io.File; import java.io.FileOutputStream; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; - -import android.content.pm.ApplicationInfo; - -import backtraceio.library.common.AbiHelper; -import backtraceio.library.models.nativeHandler.CrashHandlerConfiguration; +import org.junit.Test; +import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class CrashHandlerNativeLibraryResolutionTest { @@ -25,8 +21,8 @@ public class CrashHandlerNativeLibraryResolutionTest { private static final String LIB = "libbacktrace-native.so"; private File tempDir(String name) { - File cache = InstrumentationRegistry.getInstrumentation() - .getTargetContext().getCacheDir(); + File cache = + InstrumentationRegistry.getInstrumentation().getTargetContext().getCacheDir(); File d = new File(cache, name); //noinspection ResultOfMethodCallIgnored d.mkdirs(); @@ -39,7 +35,7 @@ private File makeApk(File dir, String name, String abi, boolean includeLib) thro if (includeLib) { String entry = "lib/" + abi + "/" + LIB; zos.putNextEntry(new ZipEntry(entry)); - zos.write(new byte[]{1, 2, 3, 4}); + zos.write(new byte[] {1, 2, 3, 4}); zos.closeEntry(); } else { zos.putNextEntry(new ZipEntry("META-INF/MANIFEST.MF")); @@ -67,7 +63,7 @@ public void usesSplitWhenBaseDoesNotContainLib() throws Exception { ApplicationInfo ai = new ApplicationInfo(); ai.sourceDir = base.getAbsolutePath(); - ai.splitSourceDirs = new String[]{split.getAbsolutePath()}; + ai.splitSourceDirs = new String[] {split.getAbsolutePath()}; ai.nativeLibraryDir = "/nonexistent"; CrashHandlerConfiguration cfg = new CrashHandlerConfiguration(); @@ -93,12 +89,12 @@ public void prefersExtractedOverApkContainers() throws Exception { nativeDir.mkdirs(); File extracted = new File(nativeDir, LIB); try (FileOutputStream fos = new FileOutputStream(extracted)) { - fos.write(new byte[]{9, 9, 9}); + fos.write(new byte[] {9, 9, 9}); } ApplicationInfo ai = new ApplicationInfo(); ai.sourceDir = base.getAbsolutePath(); - ai.splitSourceDirs = new String[]{split.getAbsolutePath()}; + ai.splitSourceDirs = new String[] {split.getAbsolutePath()}; ai.nativeLibraryDir = nativeDir.getAbsolutePath(); CrashHandlerConfiguration cfg = new CrashHandlerConfiguration(); @@ -120,7 +116,7 @@ public void prefersBaseWhenBaseContainsLib() throws Exception { ApplicationInfo ai = new ApplicationInfo(); ai.sourceDir = base.getAbsolutePath(); - ai.splitSourceDirs = new String[]{split.getAbsolutePath()}; + ai.splitSourceDirs = new String[] {split.getAbsolutePath()}; ai.nativeLibraryDir = "/nonexistent"; CrashHandlerConfiguration cfg = new CrashHandlerConfiguration(); 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 cc31e545f..dcbee3458 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 { @@ -43,6 +39,7 @@ public void setUp() { this.databaseSettings.setRetryLimit(RETRY_LIMIT); this.databaseContext = new BacktraceDatabaseContext(this.databaseSettings); } + @After public void after() { this.databaseContext.clear(); @@ -142,13 +139,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 @@ -237,7 +235,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 @@ -283,12 +283,15 @@ public void testIncrementBatchRetry() { private List fillDatabase() { return this.fillDatabase(3); } + private List fillDatabase(int numberOfReports) { List result = new ArrayList<>(); for (int i = 0; i < numberOfReports; i++) { BacktraceReport report = new BacktraceReport(testMessage); - BacktraceData data = new BacktraceData.Builder(report).setAttributes(this.context, null).build(); + BacktraceData data = new BacktraceData.Builder(report) + .setAttributes(this.context, null) + .build(); result.add(databaseContext.add(data)); } 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/models/json/BacktraceAttributesTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/models/json/BacktraceAttributesTest.java index 0ac999c23..36770bf48 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/models/json/BacktraceAttributesTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/models/json/BacktraceAttributesTest.java @@ -6,17 +6,14 @@ import static org.junit.Assert.assertTrue; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - +import java.util.HashMap; +import java.util.Map; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import java.util.HashMap; -import java.util.Map; - @RunWith(AndroidJUnit4.class) public class BacktraceAttributesTest { @@ -42,19 +39,19 @@ public void testConstructorWithReportAndAttributes() { // THEN Map allAttributes = attributes.getAllAttributes(); assertNotNull(allAttributes); - + // Static attributes assertTrue(allAttributes.containsKey("application.package")); - + // Client attributes assertEquals("custom-value", allAttributes.get("custom-attr")); - + // Report attributes assertEquals(message, allAttributes.get("error.message")); - + // Session attribute assertTrue(allAttributes.containsKey("application.session")); - + // Dynamic attributes assertTrue(allAttributes.containsKey("screen.orientation")); assertTrue(allAttributes.containsKey("screen.brightness")); @@ -74,7 +71,7 @@ public void testConstructorWithExceptionReport() { Map allAttributes = attributes.getAllAttributes(); assertEquals(exceptionMessage, allAttributes.get("error.message")); assertEquals(ex.getClass().getCanonicalName(), allAttributes.get("classifier")); - + // Complex attributes should contain the exception Map complexAttributes = attributes.getComplexAttributes(); assertTrue(complexAttributes.containsKey("Exception properties")); @@ -97,8 +94,8 @@ public void testConstructorWithOnlyClientAttributes() { Map allAttributes = attributes.getAllAttributes(); assertEquals("value", allAttributes.get("only-client")); assertTrue(allAttributes.containsKey("application.session")); - - // Dynamic attributes should NOT be included by default in this constructor + + // Dynamic attributes should NOT be included by default in this constructor // because it calls this(context, null, clientAttributes, false); assertFalse(allAttributes.containsKey("screen.orientation")); assertFalse(allAttributes.containsKey("screen.brightness")); @@ -111,7 +108,7 @@ public void testIncludeDynamicAttributesFlag() { // WHEN - includeDynamicAttributes = true BacktraceAttributes attrWithDynamic = new BacktraceAttributes(context, null, clientAttributes, true); - + // WHEN - includeDynamicAttributes = false BacktraceAttributes attrWithoutDynamic = new BacktraceAttributes(context, null, clientAttributes, false); diff --git a/backtrace-library/src/androidTest/java/backtraceio/library/models/json/BacktraceStaticAttributesTest.java b/backtrace-library/src/androidTest/java/backtraceio/library/models/json/BacktraceStaticAttributesTest.java index 80ead57b7..be98babc6 100644 --- a/backtrace-library/src/androidTest/java/backtraceio/library/models/json/BacktraceStaticAttributesTest.java +++ b/backtrace-library/src/androidTest/java/backtraceio/library/models/json/BacktraceStaticAttributesTest.java @@ -5,16 +5,13 @@ import static org.junit.Assert.assertTrue; import android.content.Context; - import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; - +import java.util.Map; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import java.util.Map; - @RunWith(AndroidJUnit4.class) public class BacktraceStaticAttributesTest { @@ -38,7 +35,6 @@ public void testInitAndGetAttributes() { assertNotNull(instance); assertNotNull(attributes); - // Check app information assertTrue(attributes.containsKey("application.package")); assertTrue(attributes.containsKey("application")); @@ -77,7 +73,8 @@ public void testSingletonBehavior() { BacktraceStaticAttributes instance2 = BacktraceStaticAttributes.getInstance(); // THEN - // Note: The current implementation of init(context) always creates a new instance and assigns it to the static variable. + // Note: The current implementation of init(context) always creates a new instance and assigns it to the static + // variable. // It's not a strict singleton in the sense that it doesn't check if instance is null before overwriting. // However, we expect getInstance() to return the latest initialized instance. assertNotNull(instance1); 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 65e03d791..365c6d7b9 100644 --- a/backtrace-library/src/main/java/backtraceio/library/BacktraceDatabase.java +++ b/backtrace-library/src/main/java/backtraceio/library/BacktraceDatabase.java @@ -2,16 +2,6 @@ import android.content.Context; import android.content.pm.ApplicationInfo; - -import java.io.File; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; -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; @@ -39,6 +29,14 @@ import backtraceio.library.nativeCalls.BacktraceCrashHandlerWrapper; import backtraceio.library.services.BacktraceDatabaseContext; import backtraceio.library.services.BacktraceDatabaseFileContext; +import java.io.File; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.CountDownLatch; /** * Backtrace Database @@ -46,7 +44,7 @@ public class BacktraceDatabase implements Database { 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; @@ -97,25 +95,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(); } @@ -141,9 +140,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); } /** @@ -161,8 +161,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; @@ -179,11 +182,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]); @@ -194,15 +199,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 -> { @@ -211,7 +217,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; } @@ -260,8 +269,7 @@ public void start() { this.removeOrphaned(); - if (databaseSettings.getRetryBehavior() == RetryBehavior.ByInterval || databaseSettings - .isAutoSendMode()) { + if (databaseSettings.getRetryBehavior() == RetryBehavior.ByInterval || databaseSettings.isAutoSendMode()) { setupTimer(); } @@ -279,68 +287,73 @@ public BacktraceDatabaseSettings getSettings() { private void setupTimer() { _timer = new Timer(); - _timer.schedule(new TimerTask() { - @Override - public void run() { - String dateTimeNow = Calendar.getInstance().getTime().toString(); - BacktraceLogger.d(LOG_TAG, "Backtrace DB Timer - " + dateTimeNow); - if (backtraceDatabaseContext == null) { - BacktraceLogger.w(LOG_TAG, "Backtrace DB Timer - database context is null: " + - dateTimeNow); - return; - } + _timer.schedule( + new TimerTask() { + @Override + public void run() { + String dateTimeNow = Calendar.getInstance().getTime().toString(); + BacktraceLogger.d(LOG_TAG, "Backtrace DB Timer - " + dateTimeNow); + if (backtraceDatabaseContext == null) { + BacktraceLogger.w(LOG_TAG, "Backtrace DB Timer - database context is null: " + dateTimeNow); + return; + } - if (backtraceDatabaseContext.isEmpty()) { - BacktraceLogger.d(LOG_TAG, "Backtrace DB Timer - database is empty (no records): " + - dateTimeNow); - return; - } + if (backtraceDatabaseContext.isEmpty()) { + BacktraceLogger.d( + LOG_TAG, "Backtrace DB Timer - database is empty (no records): " + dateTimeNow); + return; + } - try { - 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, "Backtrace DB 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, "Backtrace DB Timer - deleting record"); - delete(currentRecord); - } else { - BacktraceLogger.d(LOG_TAG, "Backtrace DB Timer - closing record"); - currentRecord.close(); - backtraceDatabaseContext.incrementBatchRetry(); // If we are not able to send single record we are moving all reports to next batch + try { + 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, + "Backtrace DB 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, "Backtrace DB Timer - deleting record"); + delete(currentRecord); + } else { + BacktraceLogger.d(LOG_TAG, "Backtrace DB Timer - closing record"); + currentRecord.close(); + backtraceDatabaseContext + .incrementBatchRetry(); // If we are not able to send single + // record we are moving all reports to + // next batch + } + threadWaiter.countDown(); + } + }); + try { + threadWaiter.await(); + } catch (Exception ex) { + BacktraceLogger.e( + LOG_TAG, "Error during waiting for result in Backtrace DB Timer", ex); + } + if (currentRecord.valid() && !currentRecord.locked) { + BacktraceLogger.d(LOG_TAG, "Backtrace DB 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 Backtrace DB Timer", ex - ); - } - if (currentRecord.valid() && !currentRecord.locked) { - BacktraceLogger.d(LOG_TAG, "Backtrace DB Timer - record is valid and unlocked"); - break; + record = backtraceDatabaseContext.first(); } + } catch (Exception e) { + BacktraceLogger.e(LOG_TAG, "Exception in Backtrace DB timer", e); } - record = backtraceDatabaseContext.first(); } - } - catch (Exception e) { - BacktraceLogger.e(LOG_TAG, "Exception in Backtrace DB timer", e); - } - } - }, databaseSettings.getRetryInterval() * 1000L, databaseSettings.getRetryInterval() * 1000L); + }, + databaseSettings.getRetryInterval() * 1000L, + databaseSettings.getRetryInterval() * 1000L); } public void flush() { @@ -385,7 +398,8 @@ 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; } @@ -429,7 +443,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() { @@ -449,7 +466,6 @@ private void loadReportsToDbContext() { validateDatabaseSize(); record.close(); } - } /** @@ -464,14 +480,16 @@ 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()) { backtraceDatabaseContext.removeOldestRecord(); 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 9d25e33ef..1c4aba5ab 100644 --- a/backtrace-library/src/main/java/backtraceio/library/base/BacktraceBase.java +++ b/backtrace-library/src/main/java/backtraceio/library/base/BacktraceBase.java @@ -1,16 +1,7 @@ package backtraceio.library.base; import android.content.Context; - import androidx.annotation.NonNull; - -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - import backtraceio.library.BacktraceCredentials; import backtraceio.library.BacktraceDatabase; import backtraceio.library.common.CollectionUtils; @@ -36,6 +27,10 @@ import backtraceio.library.services.BacktraceApi; import backtraceio.library.services.BacktraceMetrics; import backtraceio.library.services.ReportExceptionTransformer; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; +import java.util.Map; /** * Base Backtrace Android client @@ -66,6 +61,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(); /** @@ -134,7 +130,10 @@ public BacktraceBase(Context context, BacktraceCredentials credentials, Map attributes, + public BacktraceBase( + Context context, + BacktraceCredentials credentials, + Map attributes, List attachments) { this(context, credentials, (Database) null, attributes, attachments); } @@ -146,8 +145,8 @@ public BacktraceBase(Context context, BacktraceCredentials credentials, Map attachments) { this(context, credentials, new BacktraceDatabase(context, databaseSettings), attachments); } @@ -174,7 +176,10 @@ 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, + public BacktraceBase( + Context context, + BacktraceCredentials credentials, + BacktraceDatabaseSettings databaseSettings, Map attributes) { this(context, credentials, new BacktraceDatabase(context, databaseSettings), attributes); } @@ -190,8 +195,12 @@ public BacktraceBase(Context context, BacktraceCredentials credentials, Backtrac * @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); } @@ -216,8 +225,8 @@ public BacktraceBase(Context context, BacktraceCredentials credentials, Database * @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); } @@ -229,8 +238,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); } @@ -245,8 +254,12 @@ public BacktraceBase(Context context, BacktraceCredentials credentials, Database * @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); @@ -435,8 +448,7 @@ public boolean enableBreadcrumbs(Context context) { * 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; } @@ -454,8 +466,7 @@ public boolean enableBreadcrumbs(Context context, * 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; } @@ -475,9 +486,8 @@ public boolean enableBreadcrumbs(Context context, * 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; } @@ -619,7 +629,10 @@ 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, + public boolean addBreadcrumb( + String message, + Map attributes, + BacktraceBreadcrumbType type, BacktraceBreadcrumbLevel level) { if (!isBreadcrumbsAvailable()) { return false; @@ -656,8 +669,8 @@ public void send(BacktraceReport report) { */ public void send(BacktraceReport sourceReport, final OnServerResponseEventListener callback) { Breadcrumbs breadcrumbs = this.database.getBreadcrumbs(); - for (BacktraceReport report : this.reportExceptionTransformer - .transformReportWithInnerExceptions(sourceReport)) { + for (BacktraceReport report : + this.reportExceptionTransformer.transformReportWithInnerExceptions(sourceReport)) { if (breadcrumbs != null) { breadcrumbs.processReportBreadcrumbs(report); } @@ -676,8 +689,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) { 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 d01819235..27566451e 100644 --- a/backtrace-library/src/main/java/backtraceio/library/common/BacktraceSerializeHelper.java +++ b/backtrace-library/src/main/java/backtraceio/library/common/BacktraceSerializeHelper.java @@ -1,7 +1,6 @@ package backtraceio.library.common; import backtraceio.gson.Gson; - import backtraceio.library.common.serialization.BacktraceGsonBuilder; /** @@ -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); } - } diff --git a/backtrace-library/src/main/java/backtraceio/library/common/CollectionUtils.java b/backtrace-library/src/main/java/backtraceio/library/common/CollectionUtils.java index 9bd78766a..3b96c13a2 100644 --- a/backtrace-library/src/main/java/backtraceio/library/common/CollectionUtils.java +++ b/backtrace-library/src/main/java/backtraceio/library/common/CollectionUtils.java @@ -2,10 +2,8 @@ import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; public class CollectionUtils { public static List copyList(List userList) { 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 a88b4d3fd..cfa30334c 100644 --- a/backtrace-library/src/main/java/backtraceio/library/common/DeviceAttributesHelper.java +++ b/backtrace-library/src/main/java/backtraceio/library/common/DeviceAttributesHelper.java @@ -16,14 +16,6 @@ import android.os.Build; 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.BacktraceDatabase; import backtraceio.library.enums.BatteryState; import backtraceio.library.enums.BluetoothStatus; import backtraceio.library.enums.GpsStatus; @@ -31,13 +23,16 @@ import backtraceio.library.enums.NfcStatus; import backtraceio.library.enums.WifiStatus; import backtraceio.library.logger.BacktraceLogger; +import java.io.BufferedReader; +import java.io.FileReader; +import java.util.HashMap; /** * Helper class for extract a device attributes */ public class DeviceAttributesHelper { private final Context context; - private transient final String LOG_TAG = DeviceAttributesHelper.class.getSimpleName(); + private final transient String LOG_TAG = DeviceAttributesHelper.class.getSimpleName(); public DeviceAttributesHelper(Context context) { this.context = context; @@ -64,9 +59,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)); @@ -81,8 +76,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; } /** @@ -91,9 +85,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; } @@ -128,7 +121,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()) { @@ -164,10 +158,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; } /** @@ -181,8 +173,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; } @@ -198,8 +189,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(); } @@ -250,8 +240,7 @@ private BatteryState getBatteryState() { 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 4484ce3f2..9c172d4cd 100644 --- a/backtrace-library/src/main/java/backtraceio/library/common/FileHelper.java +++ b/backtrace-library/src/main/java/backtraceio/library/common/FileHelper.java @@ -2,7 +2,7 @@ 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; @@ -10,9 +10,6 @@ import java.util.Scanner; import java.util.Set; -import backtraceio.library.logger.BacktraceLogger; - - /** * Helper class for access to files */ @@ -68,9 +65,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 @@ -110,7 +111,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 91744b3c1..f73051893 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 backtraceio.gson.stream.JsonReader; import backtraceio.gson.stream.JsonToken; import backtraceio.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 b609d8d65..3d46c1031 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 @@ -10,14 +10,13 @@ import backtraceio.gson.stream.JsonReader; import backtraceio.gson.stream.JsonToken; import backtraceio.gson.stream.JsonWriter; - +import backtraceio.library.logger.BacktraceLogger; 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 backtraceio.library.logger.BacktraceLogger; public class ThrowableTypeAdapterFactory implements TypeAdapterFactory { @@ -31,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) { @@ -61,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(); @@ -98,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)); } @@ -115,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; } @@ -147,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; @@ -155,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) { @@ -176,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); } } @@ -190,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/BacktraceData.java b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceData.java index 7c5c8a7f0..07d1817bc 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,7 @@ package backtraceio.library.models; import android.content.Context; - import backtraceio.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 +11,8 @@ import backtraceio.library.models.json.SourceCodeData; import backtraceio.library.models.json.ThreadData; import backtraceio.library.models.json.ThreadInformation; +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,8 +322,7 @@ 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); 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 d1c8c0872..24619d5e8 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceResult.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceResult.java @@ -1,7 +1,6 @@ package backtraceio.library.models; import backtraceio.gson.annotations.SerializedName; - import backtraceio.library.models.json.BacktraceReport; import backtraceio.library.models.types.BacktraceResultStatus; @@ -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"}) 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 f5328b193..8487ab6bf 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/BacktraceStackFrame.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/BacktraceStackFrame.java @@ -1,11 +1,8 @@ package backtraceio.library.models; - import backtraceio.gson.annotations.SerializedName; - -import java.util.UUID; - import backtraceio.library.logger.BacktraceLogger; +import java.util.UUID; /** * Backtrace stack frame 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 814fa6b34..4bbdc5aad 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,7 @@ package backtraceio.library.models.database; import android.content.Context; - import backtraceio.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 +9,13 @@ import backtraceio.library.logger.BacktraceLogger; import backtraceio.library.models.BacktraceData; import backtraceio.library.models.json.BacktraceReport; +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); } /** 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 f69eb93e5..7270a8aa0 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 @@ -3,15 +3,13 @@ import android.content.Context; import android.content.res.Configuration; import android.provider.Settings; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - import backtraceio.library.common.DeviceAttributesHelper; import backtraceio.library.enums.ScreenOrientation; import backtraceio.library.models.attributes.ReportDataAttributes; import backtraceio.library.models.attributes.ReportDataBuilder; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; /** * Class instance to get a built-in attributes from current application @@ -44,8 +42,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); } @@ -60,7 +57,10 @@ public BacktraceAttributes(Context context, Map clientAttributes * @param clientAttributes client's attributes (report and client) * @param includeDynamicAttributes whether to include dynamic attributes */ - public BacktraceAttributes(Context context, BacktraceReport report, Map clientAttributes, + public BacktraceAttributes( + Context context, + BacktraceReport report, + Map clientAttributes, Boolean includeDynamicAttributes) { this.context = context; @@ -159,10 +159,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); } /** 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/BacktraceStaticAttributes.java b/backtrace-library/src/main/java/backtraceio/library/models/json/BacktraceStaticAttributes.java index 20ced2c98..d0499cb2b 100644 --- a/backtrace-library/src/main/java/backtraceio/library/models/json/BacktraceStaticAttributes.java +++ b/backtrace-library/src/main/java/backtraceio/library/models/json/BacktraceStaticAttributes.java @@ -6,16 +6,14 @@ import android.util.DisplayMetrics; import android.view.Display; import android.view.WindowManager; - +import backtraceio.library.BacktraceClient; +import backtraceio.library.common.ApplicationMetadataCache; +import backtraceio.library.common.BacktraceStringHelper; 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; - /** * Class to hold static attributes that don't change between reports. * These attributes are initialized once when the SDK is initialized. @@ -111,8 +109,7 @@ private String generateDeviceId(Context context) { return uuid; } - String androidId = Settings.Secure.getString(context.getContentResolver(), - Settings.Secure.ANDROID_ID); + String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); // if the android id is not defined we want to cache at least guid // for the current session 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 381ba9d03..27b62694a 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,7 +1,6 @@ package backtraceio.library.models.json; import backtraceio.gson.annotations.SerializedName; - import backtraceio.library.models.BacktraceStackFrame; /** @@ -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 5101b6cee..b18151f20 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.gson.annotations.SerializedName; - +import backtraceio.library.models.BacktraceStackFrame; 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 592ae1182..f7317069c 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 backtraceio.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 0189f1f25..6c760c958 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 backtraceio.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 a95989d8a..67b960be3 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,11 +1,8 @@ package backtraceio.library.models.metrics; import backtraceio.gson.annotations.SerializedName; - -import java.util.HashMap; -import java.util.Map; - import backtraceio.library.common.BacktraceTimeHelper; +import java.util.Map; public final class SummedEvent extends Event { 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 f520a0894..480ef88e1 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 backtraceio.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 c879a1423..aa9c4e47b 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.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; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; 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 012f93e82..4f3f44dd1 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 backtraceio.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 2f9087ca5..f95a5a8be 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.io.IOException; import java.util.ArrayList; @@ -14,18 +15,14 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -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()); } @@ -53,11 +50,11 @@ public List getCrashHandlerEnvironmentVariables(ApplicationInfo applicat // LD_LIBRARY_PATH File nativeLibraryDirectory = new File(nativeLibraryDirPath); 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" }); final String backtraceNativeLibraryPath = resolveBacktraceNativeLibraryPath(applicationInfo, arch); @@ -79,8 +76,7 @@ public List getCrashHandlerEnvironmentVariables(String apkPath, String n 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 @@ -88,11 +84,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)); @@ -168,5 +165,4 @@ private static boolean apkContains(String apkPath, String entry) { return false; } } - } 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 67a644bd0..cae0d5d84 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(); @@ -154,9 +152,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(); } /** @@ -222,8 +218,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()); } } } @@ -336,7 +334,8 @@ private void incrementBatches() { * Remove last batch */ private void removeMaxRetries() { - Queue currentBatch = this.batchRetry.put(_retryNumber - 1, new ConcurrentLinkedQueue<>()); + Queue currentBatch = + this.batchRetry.put(_retryNumber - 1, new ConcurrentLinkedQueue<>()); if (currentBatch == null) { this.batchRetry.put(_retryNumber - 1, new ConcurrentLinkedQueue<>()); 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 0a9376f8b..a544851c0 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.gson.JsonParseException; - -import org.junit.Test; - +import backtraceio.library.common.BacktraceSerializeHelper; 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 7205b17c0..c93e33c7c 100644 --- a/backtrace-library/src/test/java/backtraceio/library/TestUtils.java +++ b/backtrace-library/src/test/java/backtraceio/library/TestUtils.java @@ -1,21 +1,19 @@ package backtraceio.library; -import com.google.common.collect.MapDifference; -import com.google.common.collect.Maps; import backtraceio.gson.Gson; import backtraceio.gson.JsonElement; import backtraceio.gson.JsonParser; import backtraceio.gson.reflect.TypeToken; - -import org.json.JSONException; -import org.json.JSONObject; - +import com.google.common.collect.MapDifference; +import com.google.common.collect.Maps; 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..2474e434b 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,10 @@ import static junit.framework.TestCase.assertEquals; import static org.junit.Assert.assertNull; -import org.junit.Test; - 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 +14,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,10 +22,9 @@ 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); @@ -44,7 +43,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 +54,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 +65,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..b62a3e03f 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,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import org.junit.Test; - import backtraceio.library.TestUtils; import backtraceio.library.common.BacktraceSerializeHelper; +import org.junit.Test; public class BacktraceApiResultTest { 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..26e3ecc87 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,11 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import org.junit.Test; - 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 { 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/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..47a8451ab 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,10 @@ 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.Mockito.mock; +import static org.mockito.Mockito.when; import backtraceio.coroner.response.CoronerApiResponse; import backtraceio.coroner.response.CoronerHttpException; @@ -27,9 +19,15 @@ import backtraceio.coroner.response.CoronerResponseProcessingException; import backtraceio.coroner.serialization.GsonWrapper; 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 +38,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); @@ -60,7 +59,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); @@ -80,7 +80,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); @@ -95,10 +96,8 @@ public void errorTypeTimestampFilter() throws CoronerResponseException, IOExcept when(mockHttpClient.get(Mockito.contains(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 +119,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..af14e961a 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,17 @@ 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 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 +20,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 +35,12 @@ 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( + "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( + "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/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..9e52d8f8f 100644 --- a/coroner-client/src/test/java/backtraceio/coroner/utils/StringUtils.java +++ b/coroner-client/src/test/java/backtraceio/coroner/utils/StringUtils.java @@ -2,6 +2,6 @@ public class StringUtils { public static String normalizeSpace(String input) { - return input.trim().replaceAll("\\s+"," "); + return input.trim().replaceAll("\\s+", " "); } } 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 710f7ba2d..732eb4ad5 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 +} From 2d5d2a2aa4572e88c2d3d103e69da5d4e00f6936 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Mon, 26 Jan 2026 23:14:10 +0100 Subject: [PATCH 21/45] Fix clang --- build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0f0477b0f..1972255d2 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,9 @@ def spotlessExcludes = [ '**/build/**', '**/build-*/**', '**/.cxx/**', - '**/generated/**' + '**/generated/**', + '**/.clang-format', + '**/external/**', ] subprojects { From 7dfd472832a1da2dc3057062a382d540b535c8d2 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Mon, 26 Jan 2026 23:15:46 +0100 Subject: [PATCH 22/45] Bump version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1972255d2..8128e4a5d 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { } plugins { - id 'com.diffplug.spotless' version '8.0.0' apply false + id 'com.diffplug.spotless' version '8.2.0' apply false } def spotlessExcludes = [ From f59d092e9451e694a07875962ba1b082c25f801b Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Tue, 27 Jan 2026 08:28:19 +0100 Subject: [PATCH 23/45] Fix cpp scan --- build.gradle | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8128e4a5d..27b797409 100644 --- a/build.gradle +++ b/build.gradle @@ -50,7 +50,11 @@ subprojects { } format 'gradle', { - target '**/*.gradle' + target fileTree('.') { + include '**/*.gradle' + exclude '**/src/main/cpp/**' + exclude '**/external/**' + } targetExclude spotlessExcludes leadingTabsToSpaces(4) trimTrailingWhitespace() From ad859aa0ad2f86761fef35719d4ec4a6ff74cb5c Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Tue, 27 Jan 2026 08:34:14 +0100 Subject: [PATCH 24/45] Revert changes --- backtrace-library/build.gradle | 6 ++++++ build.gradle | 13 ++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/backtrace-library/build.gradle b/backtrace-library/build.gradle index c08d5077e..b75f971fe 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' @@ -140,3 +142,7 @@ dependencies { afterEvaluate { preBuild.dependsOn(":gson:shadowJar") } + +tasks.withType(SpotlessTask).configureEach { + enabled = false +} diff --git a/build.gradle b/build.gradle index 27b797409..e16eca3d7 100644 --- a/build.gradle +++ b/build.gradle @@ -28,8 +28,11 @@ def spotlessExcludes = [ '**/build-*/**', '**/.cxx/**', '**/generated/**', - '**/.clang-format', - '**/external/**', + '**/jniLibs/**', + '**/libbun/**', + '**/breakpad-builds/**', + '**/crashpad/**', + '**/cpp/**', ] subprojects { @@ -50,11 +53,7 @@ subprojects { } format 'gradle', { - target fileTree('.') { - include '**/*.gradle' - exclude '**/src/main/cpp/**' - exclude '**/external/**' - } + target '**/*.gradle' targetExclude spotlessExcludes leadingTabsToSpaces(4) trimTrailingWhitespace() From c7b528c4f20d942cfb214de4c597a6d5f3e8b2bf Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk Date: Tue, 27 Jan 2026 08:41:41 +0100 Subject: [PATCH 25/45] Break formatting --- .../main/java/backtraceio/library/BacktraceClient.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/backtrace-library/src/main/java/backtraceio/library/BacktraceClient.java b/backtrace-library/src/main/java/backtraceio/library/BacktraceClient.java index 679eae93f..1f3d3475e 100644 --- a/backtrace-library/src/main/java/backtraceio/library/BacktraceClient.java +++ b/backtrace-library/src/main/java/backtraceio/library/BacktraceClient.java @@ -25,6 +25,7 @@ public class BacktraceClient extends BacktraceBase { * Backtrace ANR watchdog instance */ private BacktraceANRHandler anrHandler; + private BacktraceANRHandler anrHandlertmp; /** * Initializing Backtrace client instance with BacktraceCredentials @@ -45,7 +46,7 @@ public BacktraceClient(Context context, BacktraceCredentials credentials) { * @note Attachments for native crashes must be specified here, and cannot be changed during runtime */ public BacktraceClient(Context context, BacktraceCredentials credentials, List attachments) { - this(context, credentials, (BacktraceDatabase) null, attachments); + this(context, credentials, (BacktraceDatabase) null, attachments); } /** @@ -55,7 +56,8 @@ public BacktraceClient(Context context, BacktraceCredentials credentials, List attributes) { + public BacktraceClient(Context context, + BacktraceCredentials credentials, Map attributes) { this(context, credentials, (BacktraceDatabase) null, attributes); } @@ -72,6 +74,8 @@ public BacktraceClient( Context context, BacktraceCredentials credentials, Map attributes, + + List attachments) { this(context, credentials, (BacktraceDatabase) null, attributes, attachments); } From e74bef694aa247b5bb60825082b3f0fcb0cd57c0 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Tue, 27 Jan 2026 17:14:07 +0100 Subject: [PATCH 26/45] Revert "Break formatting" This reverts commit c7b528c4f20d942cfb214de4c597a6d5f3e8b2bf. --- .../main/java/backtraceio/library/BacktraceClient.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/backtrace-library/src/main/java/backtraceio/library/BacktraceClient.java b/backtrace-library/src/main/java/backtraceio/library/BacktraceClient.java index 1f3d3475e..679eae93f 100644 --- a/backtrace-library/src/main/java/backtraceio/library/BacktraceClient.java +++ b/backtrace-library/src/main/java/backtraceio/library/BacktraceClient.java @@ -25,7 +25,6 @@ public class BacktraceClient extends BacktraceBase { * Backtrace ANR watchdog instance */ private BacktraceANRHandler anrHandler; - private BacktraceANRHandler anrHandlertmp; /** * Initializing Backtrace client instance with BacktraceCredentials @@ -46,7 +45,7 @@ public BacktraceClient(Context context, BacktraceCredentials credentials) { * @note Attachments for native crashes must be specified here, and cannot be changed during runtime */ public BacktraceClient(Context context, BacktraceCredentials credentials, List attachments) { - this(context, credentials, (BacktraceDatabase) null, attachments); + this(context, credentials, (BacktraceDatabase) null, attachments); } /** @@ -56,8 +55,7 @@ public BacktraceClient(Context context, BacktraceCredentials credentials, List attributes) { + public BacktraceClient(Context context, BacktraceCredentials credentials, Map attributes) { this(context, credentials, (BacktraceDatabase) null, attributes); } @@ -74,8 +72,6 @@ public BacktraceClient( Context context, BacktraceCredentials credentials, Map attributes, - - List attachments) { this(context, credentials, (BacktraceDatabase) null, attributes, attachments); } From 5dee80b5bb8ce97b9abd49ff8c51d71e21e6a60f Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Tue, 27 Jan 2026 17:14:41 +0100 Subject: [PATCH 27/45] Enable Spotless --- backtrace-library/build.gradle | 6 ------ 1 file changed, 6 deletions(-) diff --git a/backtrace-library/build.gradle b/backtrace-library/build.gradle index b75f971fe..c08d5077e 100644 --- a/backtrace-library/build.gradle +++ b/backtrace-library/build.gradle @@ -1,5 +1,3 @@ -import com.diffplug.gradle.spotless.SpotlessTask - plugins { id 'com.android.library' id 'com.gladed.androidgitversion' version '0.4.14' @@ -142,7 +140,3 @@ dependencies { afterEvaluate { preBuild.dependsOn(":gson:shadowJar") } - -tasks.withType(SpotlessTask).configureEach { - enabled = false -} From 27c9964ce1c5316bb19a6c797e0de38d1300fde5 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Tue, 27 Jan 2026 20:23:17 +0100 Subject: [PATCH 28/45] Tmp remove gradle format --- build.gradle | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index e16eca3d7..90107687e 100644 --- a/build.gradle +++ b/build.gradle @@ -51,16 +51,7 @@ subprojects { targetExclude spotlessExcludes simple() } - - format 'gradle', { - target '**/*.gradle' - targetExclude spotlessExcludes - leadingTabsToSpaces(4) - trimTrailingWhitespace() - endWithNewline() - } - - + format 'misc', { target '*.md', '.gitignore' targetExclude spotlessExcludes From e9740419e9b230b50aef9512656c4bdbd1326379 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Tue, 27 Jan 2026 20:31:21 +0100 Subject: [PATCH 29/45] Fix path resolving --- build.gradle | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index 90107687e..295ed722e 100644 --- a/build.gradle +++ b/build.gradle @@ -39,25 +39,34 @@ subprojects { apply plugin: 'com.diffplug.spotless' spotless { java { - target '**/*.java' + target fileTree(dir: projectDir, include: '**/*.java', exclude: spotlessExcludes) targetExclude spotlessExcludes palantirJavaFormat() removeUnusedImports() trimTrailingWhitespace() endWithNewline() } - json { - target '**/*.json' - targetExclude spotlessExcludes - simple() - } - - format 'misc', { - target '*.md', '.gitignore' - targetExclude spotlessExcludes - trimTrailingWhitespace() - endWithNewline() - } +// json { +// target fileTree(dir: projectDir, include: '**/*.json', exclude: spotlessExcludes) +// targetExclude spotlessExcludes +// simple() +// } + +// format 'gradle', { +// target '**/*.gradle' +// targetExclude spotlessExcludes +// leadingTabsToSpaces(4) +// trimTrailingWhitespace() +// endWithNewline() +// } +// +// +// format 'misc', { +// target '*.md', '.gitignore' +// targetExclude spotlessExcludes +// trimTrailingWhitespace() +// endWithNewline() +// } } } From 6706ebfa38a5d3d49b5c9ce4526dbf8431e2f384 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Tue, 27 Jan 2026 20:46:09 +0100 Subject: [PATCH 30/45] Fix --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 295ed722e..214e36c6a 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ subprojects { apply plugin: 'com.diffplug.spotless' spotless { java { - target fileTree(dir: projectDir, include: '**/*.java', exclude: spotlessExcludes) + target '**/*.java' targetExclude spotlessExcludes palantirJavaFormat() removeUnusedImports() @@ -51,7 +51,7 @@ subprojects { // targetExclude spotlessExcludes // simple() // } - +// // format 'gradle', { // target '**/*.gradle' // targetExclude spotlessExcludes From 180fc0c15ee3937a94e7631d96db0e4c1e8ff860 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Tue, 27 Jan 2026 20:48:52 +0100 Subject: [PATCH 31/45] Fix path resolving --- build.gradle | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 214e36c6a..c34083e98 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,13 @@ subprojects { apply plugin: 'com.diffplug.spotless' spotless { java { - target '**/*.java' + target fileTree(projectDir) { + include '**/*.java' + exclude 'src/main/cpp/**' + exclude '**/build/**' + exclude '.cxx/**' + // Add any other paths from your spotlessExcludes list here + } targetExclude spotlessExcludes palantirJavaFormat() removeUnusedImports() From c10ecf2149e83550e76da408e0924b73a9ab9109 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Tue, 27 Jan 2026 21:19:56 +0100 Subject: [PATCH 32/45] Fix --- .github/workflows/test.yml | 8 ++++---- build.gradle | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5068fb5b8..af5d5228d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,7 +5,7 @@ on: branches: [master] pull_request: schedule: - - cron: '0 0 * * *' + - cron: "0 0 * * *" jobs: build: @@ -36,12 +36,12 @@ 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 + - name: Check Code Style + run: ./gradlew spotlessCheck + - name: Alignment script executable run: chmod +x scripts/check_elf_alignment.sh diff --git a/build.gradle b/build.gradle index c34083e98..adb9e565d 100644 --- a/build.gradle +++ b/build.gradle @@ -44,6 +44,7 @@ subprojects { exclude 'src/main/cpp/**' exclude '**/build/**' exclude '.cxx/**' + exclude '**/libbun/**' // Add any other paths from your spotlessExcludes list here } targetExclude spotlessExcludes From ae01ada95524e806013b0811803df74a19eeb3e4 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Tue, 27 Jan 2026 21:40:36 +0100 Subject: [PATCH 33/45] Add option to have more debug info --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index af5d5228d..74ae4d6db 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,12 +36,12 @@ jobs: - name: Accept Android SDK licences run: yes | "${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" --licenses + - name: Check Code Style + run: ./gradlew spotlessCheck --debug --scan + - name: Build and check run: ./gradlew assembleDebug assembleDebugAndroidTest build check - - name: Check Code Style - run: ./gradlew spotlessCheck - - name: Alignment script executable run: chmod +x scripts/check_elf_alignment.sh From d45657dd8dad2973aca4069ac92fa03cef7ec8bd Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Tue, 27 Jan 2026 22:40:25 +0100 Subject: [PATCH 34/45] Rm symlink clang format --- .github/workflows/test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 74ae4d6db..0b2673c35 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,6 +36,9 @@ jobs: - name: Accept Android SDK licences run: yes | "${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" --licenses + - name: Bugfix libunwindstack-ndk .clang-format symbolic link issue + run: rm ./backtrace-library/src/main/cpp/libbun/external/libunwindstack-ndk/.clang-format + - name: Check Code Style run: ./gradlew spotlessCheck --debug --scan From aa32afe73848f71bebb94fccf717a0fa5cd0c93e Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Tue, 27 Jan 2026 22:46:51 +0100 Subject: [PATCH 35/45] Remove options --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0b2673c35..b9c78a563 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,7 +40,7 @@ jobs: run: rm ./backtrace-library/src/main/cpp/libbun/external/libunwindstack-ndk/.clang-format - name: Check Code Style - run: ./gradlew spotlessCheck --debug --scan + run: ./gradlew spotlessCheck - name: Build and check run: ./gradlew assembleDebug assembleDebugAndroidTest build check From d1f29af9d30291a012352f54151d1fb21eb16e64 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Tue, 27 Jan 2026 23:07:32 +0100 Subject: [PATCH 36/45] Reformat file --- .../common/serialization/StackTraceElementTypeAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f73051893..119c3029d 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 @@ -55,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(); } From a91af2681bfdcb900a6b1744cea1d23523a6bb17 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Wed, 28 Jan 2026 07:54:59 +0100 Subject: [PATCH 37/45] Fix unit tests --- .../library/database/BacktraceDatabaseRecordTest.java | 4 +++- .../backtraceio/library/models/BacktraceApiResultTest.java | 4 +++- .../java/backtraceio/library/models/BacktraceResultTest.java | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) 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 2474e434b..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,6 +3,8 @@ import static junit.framework.TestCase.assertEquals; import static org.junit.Assert.assertNull; +import static backtraceio.library.TestUtils.compareJson; + import backtraceio.library.TestUtils; import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.models.database.BacktraceDatabaseRecord; @@ -31,7 +33,7 @@ public void serialize() { // THEN String expectedJson = TestUtils.readFileAsString(this, JSON_FILE); - assertEquals(expectedJson, json); + compareJson(expectedJson, json); } @Test 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 b62a3e03f..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,6 +3,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static backtraceio.library.TestUtils.compareJson; + import backtraceio.library.TestUtils; import backtraceio.library.common.BacktraceSerializeHelper; import org.junit.Test; @@ -17,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/BacktraceResultTest.java b/backtrace-library/src/test/java/backtraceio/library/models/BacktraceResultTest.java index 26e3ecc87..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,6 +4,8 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static backtraceio.library.TestUtils.compareJson; + import backtraceio.library.TestUtils; import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.models.json.BacktraceReport; @@ -42,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 From 313279631a362f597b52bf5c68c749aae12966ad Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Wed, 28 Jan 2026 08:03:25 +0100 Subject: [PATCH 38/45] Fix formatting --- .../library/database/BacktraceDatabaseRecordTest.java | 3 +-- .../backtraceio/library/models/BacktraceApiResultTest.java | 3 +-- .../java/backtraceio/library/models/BacktraceResultTest.java | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) 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 fde16985e..b931f3b5b 100644 --- a/backtrace-library/src/test/java/backtraceio/library/database/BacktraceDatabaseRecordTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/database/BacktraceDatabaseRecordTest.java @@ -1,10 +1,9 @@ package backtraceio.library.database; +import static backtraceio.library.TestUtils.compareJson; import static junit.framework.TestCase.assertEquals; import static org.junit.Assert.assertNull; -import static backtraceio.library.TestUtils.compareJson; - import backtraceio.library.TestUtils; import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.models.database.BacktraceDatabaseRecord; 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 8fe0dae8c..50d317e42 100644 --- a/backtrace-library/src/test/java/backtraceio/library/models/BacktraceApiResultTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/models/BacktraceApiResultTest.java @@ -1,10 +1,9 @@ package backtraceio.library.models; +import static backtraceio.library.TestUtils.compareJson; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static backtraceio.library.TestUtils.compareJson; - import backtraceio.library.TestUtils; import backtraceio.library.common.BacktraceSerializeHelper; import org.junit.Test; 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 967f5f97c..a60013ad1 100644 --- a/backtrace-library/src/test/java/backtraceio/library/models/BacktraceResultTest.java +++ b/backtrace-library/src/test/java/backtraceio/library/models/BacktraceResultTest.java @@ -1,11 +1,10 @@ package backtraceio.library.models; +import static backtraceio.library.TestUtils.compareJson; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import static backtraceio.library.TestUtils.compareJson; - import backtraceio.library.TestUtils; import backtraceio.library.common.BacktraceSerializeHelper; import backtraceio.library.models.json.BacktraceReport; From 1f064f44d148563808780ed8e02f83948d72d3e1 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Wed, 28 Jan 2026 17:29:48 +0100 Subject: [PATCH 39/45] Fix formatter issues --- CONTRIBUTING.md | 16 +++---- build.gradle | 42 +++++++++---------- coroner-client/build.gradle | 5 ++- .../coroner/CoronerClientTest.java | 11 +++-- .../serialization/GsonWrapperTest.java | 6 ++- .../coroner/utils/JsonMatchers.java | 20 +++++++++ .../coroner/utils/StringUtils.java | 27 ++++++++++++ 7 files changed, 92 insertions(+), 35 deletions(-) create mode 100644 coroner-client/src/test/java/backtraceio/coroner/utils/JsonMatchers.java diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f3733e386..7f07e04d8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -28,14 +28,14 @@ Thank you for your interest in contributing to the Backtrace Android SDK. Please ## Coding Guidelines 1. **Code Formatting** - - Make sure that your code is properly formatted using the default Android Studio formatter. - - In Android Studio, you can format your code by selecting `Code` > `Reformat Code` or by using the shortcut `Ctrl + Alt + L` (Windows/Linux) or `Cmd + Option + L` (macOS). - -2. **Optimize Imports** - - Run 'Optimize imports' to remove unused imports and reorder them. - - In Android Studio, you can optimize imports by selecting `Code` > `Optimize Imports`. You can also enable this option to run it automatically in `Settings` -> `Editor` -> `General` -> `Auto Import` - -3. **Write Tests** + - Make sure that your code is properly formatted using the [**Spotless**](https://github.com/diffplug/spotless) formatter. + - From the command line, you can format the code by running: + ```bash + ./gradlew spotlessApply + ``` + - In Android Studio, you can also use the **Spotless Gradle** plugin to run formatting directly from the IDE. + +2. **Write Tests** - Ensure that you write tests for the new functionality or changes made. This helps maintain the integrity of the project. ## Commit and Push diff --git a/build.gradle b/build.gradle index adb9e565d..4b86171c7 100644 --- a/build.gradle +++ b/build.gradle @@ -53,27 +53,27 @@ subprojects { trimTrailingWhitespace() endWithNewline() } -// json { -// target fileTree(dir: projectDir, include: '**/*.json', exclude: spotlessExcludes) -// targetExclude spotlessExcludes -// simple() -// } -// -// format 'gradle', { -// target '**/*.gradle' -// targetExclude spotlessExcludes -// leadingTabsToSpaces(4) -// trimTrailingWhitespace() -// endWithNewline() -// } -// -// -// format 'misc', { -// target '*.md', '.gitignore' -// targetExclude spotlessExcludes -// trimTrailingWhitespace() -// endWithNewline() -// } + json { + target fileTree(dir: projectDir, include: '**/*.json', exclude: spotlessExcludes) + targetExclude spotlessExcludes + simple() + } + + format 'gradle', { + target '**/*.gradle' + targetExclude spotlessExcludes + leadingTabsToSpaces(4) + trimTrailingWhitespace() + endWithNewline() + } + + + format 'misc', { + target '*.md', '.gitignore' + targetExclude spotlessExcludes + trimTrailingWhitespace() + endWithNewline() + } } } diff --git a/coroner-client/build.gradle b/coroner-client/build.gradle index 4232678d7..e231f18eb 100644 --- a/coroner-client/build.gradle +++ b/coroner-client/build.gradle @@ -9,7 +9,8 @@ java { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.google.code.gson:gson:2.13.1' + implementation 'com.google.code.gson:gson:2.13.2' testImplementation 'junit:junit:4.13.2' - testImplementation group: 'org.mockito', name: 'mockito-core', version: '5.19.0' + testImplementation group: 'org.mockito', name: 'mockito-core', version: '5.21.0' + testImplementation "com.google.guava:guava:33.4.8-jre" } diff --git a/coroner-client/src/test/java/backtraceio/coroner/CoronerClientTest.java b/coroner-client/src/test/java/backtraceio/coroner/CoronerClientTest.java index 47a8451ab..07ccef66f 100644 --- a/coroner-client/src/test/java/backtraceio/coroner/CoronerClientTest.java +++ b/coroner-client/src/test/java/backtraceio/coroner/CoronerClientTest.java @@ -9,6 +9,7 @@ import static backtraceio.coroner.utils.ResourceUtils.readResourceFile; 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; @@ -18,6 +19,7 @@ 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; @@ -47,7 +49,8 @@ public void rxIdFilter() 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); @@ -68,7 +71,8 @@ public void rxIdFilterAttributes() 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); @@ -93,7 +97,8 @@ public void errorTypeTimestampFilter() 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( 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 af14e961a..37ee6a68d 100644 --- a/coroner-client/src/test/java/backtraceio/coroner/serialization/GsonWrapperTest.java +++ b/coroner-client/src/test/java/backtraceio/coroner/serialization/GsonWrapperTest.java @@ -3,9 +3,11 @@ 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 static backtraceio.coroner.utils.StringUtils.compareJson; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import backtraceio.coroner.response.CoronerApiResponse; import backtraceio.coroner.response.CoronerResponseGroup; @@ -37,7 +39,9 @@ public void deserializeApiResponse() throws IOException { CoronerResponseGroup responseGroup = result.getResponse().values.get(0); assertEquals( "Invalid index of selected element!", getResponseGroupAttributeValue(responseGroup.getAttribute(0))); - assertEquals(expectedFrames, getResponseGroupAttributeValue(responseGroup.getAttribute(1))); + assertTrue(compareJson( + expectedFrames, + getResponseGroupAttributeValue(responseGroup.getAttribute(1)).toString())); assertEquals( "e4c57699-0dc9-35e2-b4a0-2ffff1925ca7", getResponseGroupAttributeValue(responseGroup.getAttribute(2))); assertEquals( 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..ab8384a0d --- /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 final class JsonMatchers { + + public static ArgumentMatcher jsonEquals(String expectedJson) { + JsonElement expected = JsonParser.parseString(expectedJson); + + return actualJson -> { + if (actualJson == null) { + return false; + } + JsonElement actual = JsonParser.parseString(actualJson); + return expected.equals(actual); + }; + } +} 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 9e52d8f8f..c04fa920c 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,34 @@ package backtraceio.coroner.utils; +import com.google.common.collect.Maps; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; +import java.lang.reflect.Type; +import java.util.Map; + public class StringUtils { public static String normalizeSpace(String input) { return input.trim().replaceAll("\\s+", " "); } + + public static boolean compareJson(String json1, String json2) { + + final JsonParser parser = new JsonParser(); + final JsonElement o1 = parser.parse(json1); + final JsonElement o2 = parser.parse(json2); + final boolean compareResult = o1.equals(o2); + + if (!compareResult) { + Gson g = new Gson(); + Type mapType = new TypeToken>() {}.getType(); + Map json1Map = g.fromJson(json1, mapType); + Map json2Map = g.fromJson(json2, mapType); + + System.out.println(Maps.difference(json1Map, json2Map)); + return false; + } + return true; + } } From 326f4ef4104d856a3a913bf516835f425cbaed2e Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Wed, 28 Jan 2026 19:15:52 +0100 Subject: [PATCH 40/45] Simplify code --- build.gradle | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 4b86171c7..e16eca3d7 100644 --- a/build.gradle +++ b/build.gradle @@ -39,14 +39,7 @@ subprojects { apply plugin: 'com.diffplug.spotless' spotless { java { - target fileTree(projectDir) { - include '**/*.java' - exclude 'src/main/cpp/**' - exclude '**/build/**' - exclude '.cxx/**' - exclude '**/libbun/**' - // Add any other paths from your spotlessExcludes list here - } + target '**/*.java' targetExclude spotlessExcludes palantirJavaFormat() removeUnusedImports() @@ -54,7 +47,7 @@ subprojects { endWithNewline() } json { - target fileTree(dir: projectDir, include: '**/*.json', exclude: spotlessExcludes) + target '**/*.json' targetExclude spotlessExcludes simple() } From a71018abe33e84edc8f1b7433a237c7df75bdefc Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Wed, 28 Jan 2026 19:40:46 +0100 Subject: [PATCH 41/45] Uncomment pre-commit config --- .pre-commit-config.yaml | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index adcdd78d9..47d101300 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,16 +7,15 @@ 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 From 3ef350a5a2410df496f01e4547dd177ba516bc13 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Wed, 28 Jan 2026 19:44:32 +0100 Subject: [PATCH 42/45] Simplify pre-commit config --- .pre-commit-config.yaml | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 47d101300..16a995230 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,21 +1,10 @@ repos: - repo: local hooks: - - id: start-hook - name: start-hook - entry: echo 'Start pre-commit' - 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 + entry: ./gradlew spotlessApply --quiet --no-daemon language: system - stages: [pre-commit] pass_filenames: false + require_serial: true + always_run: true From d7294d79d20743d75408b62a0f059ea15e1859a7 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Wed, 28 Jan 2026 19:46:58 +0100 Subject: [PATCH 43/45] Update code --- .pre-commit-config.yaml | 1 + .../src/main/java/backtraceio/backtraceio/MainActivity.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 16a995230..8954d5fae 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,6 +5,7 @@ repos: name: Spotless Apply entry: ./gradlew spotlessApply --quiet --no-daemon language: system + stages: [pre-commit] pass_filenames: false require_serial: true always_run: true diff --git a/example-app/src/main/java/backtraceio/backtraceio/MainActivity.java b/example-app/src/main/java/backtraceio/backtraceio/MainActivity.java index 11cd05471..deca6385e 100644 --- a/example-app/src/main/java/backtraceio/backtraceio/MainActivity.java +++ b/example-app/src/main/java/backtraceio/backtraceio/MainActivity.java @@ -135,7 +135,7 @@ void removeEquipment(List armor, int index) { armor.remove(index); } - void equipItem(List armor, int index) { + void equipItem(List armor, int index) { equippedItems.add(armor.get(index)); } From 2ce83eb1d0b74fe2c4a9901bee18a60281b0ddf0 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Wed, 28 Jan 2026 19:52:24 +0100 Subject: [PATCH 44/45] Break pre-commit --- .../src/main/java/backtraceio/backtraceio/MainActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example-app/src/main/java/backtraceio/backtraceio/MainActivity.java b/example-app/src/main/java/backtraceio/backtraceio/MainActivity.java index deca6385e..11cd05471 100644 --- a/example-app/src/main/java/backtraceio/backtraceio/MainActivity.java +++ b/example-app/src/main/java/backtraceio/backtraceio/MainActivity.java @@ -135,7 +135,7 @@ void removeEquipment(List armor, int index) { armor.remove(index); } - void equipItem(List armor, int index) { + void equipItem(List armor, int index) { equippedItems.add(armor.get(index)); } From a48517797ac1c036897c91dc6ee126fbfc05ae24 Mon Sep 17 00:00:00 2001 From: Bartosz Litwiniuk <> Date: Tue, 3 Feb 2026 21:51:28 +0100 Subject: [PATCH 45/45] Remove pre-commit --- .pre-commit-config.yaml | 11 ----------- CONTRIBUTING.md | 19 +++---------------- 2 files changed, 3 insertions(+), 27 deletions(-) delete mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 8954d5fae..000000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,11 +0,0 @@ -repos: - - repo: local - hooks: - - id: spotless-apply - name: Spotless Apply - entry: ./gradlew spotlessApply --quiet --no-daemon - language: system - stages: [pre-commit] - pass_filenames: false - require_serial: true - always_run: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7f07e04d8..8e80ba87b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,19 +7,13 @@ Thank you for your interest in contributing to the Backtrace Android SDK. Please ```bash git clone https://github.com/backtrace-labs/backtrace-android.git ``` - -2. **Install pre-commit** - ```bash - pip install pre-commit - pre-commit install - ``` -3. **Create a branch** - it's good practice to create a new branch for each feature or bugfix, if you have jira ticket put ticket number as branch prefix: +2. **Create a branch** - it's good practice to create a new branch for each feature or bugfix, if you have jira ticket put ticket number as branch prefix: ```bash git checkout -b jira-ticket/your-feature-name ``` -4. **Update submodules** +3. **Update submodules** ```bash git submodule update --recursive --remote git submodule update --init --recursive @@ -69,7 +63,7 @@ Thank you for your interest in contributing to the Backtrace Android SDK. Please ## Code Formatting -This project uses **[Spotless](https://github.com/diffplug/spotless)** (a code formatting plugin) integrated with **[pre-commit](https://pre-commit.com/)** to ensure consistent code style and automatic formatting before each commit. +This project uses **[Spotless](https://github.com/diffplug/spotless)** to ensure consistent code style. ### Setup Instructions @@ -84,10 +78,3 @@ If formatting issues are found, you can automatically fix them with: ```bash ./gradlew spotlessApply ``` - -**Notes** -- The pre-commit hook ensures code formatting is validated automatically before commits are created. -- You can manually trigger all pre-commit checks at any time with: - ```bash - pre-commit run --all-files - ```