Skip to content

Commit b4a4f97

Browse files
Merge pull request #93 from backtrace-labs/release-candidate/3.7.6
Merge 3.7.6 to master
2 parents fba6981 + bf77d03 commit b4a4f97

File tree

12 files changed

+239
-87
lines changed

12 files changed

+239
-87
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Backtrace Android Release Notes
22

3+
## Version 3.7.6
4+
- Maintenance: Update various components to latest versions
5+
- Maintenance: Update gradle
6+
- Bugfix: Fix enabling breadcrumbs when not available
7+
- Add breadcrumb when ANR is detected
8+
39
## Version 3.7.5
410
- Maintenance: Update various components to latest versions
511
- Bugfix: Managed and native reports generated by the same user now have the same `guid`

backtrace-library/build.gradle

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,14 @@ android {
6868
dependencies {
6969
implementation fileTree(dir: 'libs', include: ['*.jar'])
7070
implementation 'com.google.code.gson:gson:2.10'
71-
implementation 'androidx.appcompat:appcompat:1.5.1'
71+
implementation 'androidx.appcompat:appcompat:1.6.1'
7272
implementation 'com.squareup:tape:1.2.3'
7373
testImplementation 'junit:junit:4.13.2'
7474
androidTestImplementation 'net.jodah:concurrentunit:0.4.4'
75-
androidTestImplementation 'androidx.test.ext:junit:1.1.4'
75+
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
7676
androidTestImplementation 'androidx.test:rules:1.5.0'
77-
androidTestImplementation 'androidx.test.ext:junit:1.1.4'
78-
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
77+
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
78+
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
7979
}
8080

8181
apply from: 'publish.gradle'

backtrace-library/src/androidTest/java/backtraceio/library/breadcrumbs/BacktraceBreadcrumbsTest.java

Lines changed: 44 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,25 @@
77
import static junit.framework.TestCase.fail;
88

99
import android.content.Context;
10-
import androidx.test.platform.app.InstrumentationRegistry;
10+
1111
import androidx.test.ext.junit.runners.AndroidJUnit4;
12+
import androidx.test.platform.app.InstrumentationRegistry;
1213

14+
import org.json.JSONException;
1315
import org.json.JSONObject;
1416
import org.junit.After;
1517
import org.junit.Before;
1618
import org.junit.Test;
1719
import org.junit.runner.RunWith;
1820

1921
import java.io.File;
20-
import java.io.FileInputStream;
2122
import java.io.IOException;
22-
import java.util.ArrayList;
2323
import java.util.HashMap;
2424
import java.util.LinkedHashMap;
2525
import java.util.List;
2626
import java.util.Map;
2727

28+
2829
@RunWith(AndroidJUnit4.class)
2930
public class BacktraceBreadcrumbsTest {
3031
public Context context;
@@ -37,7 +38,6 @@ public class BacktraceBreadcrumbsTest {
3738
@Before
3839
public void setUp() {
3940
this.context = InstrumentationRegistry.getInstrumentation().getContext();
40-
4141
backtraceBreadcrumbs = new BacktraceBreadcrumbs(context.getFilesDir().getAbsolutePath());
4242
backtraceBreadcrumbs.enableBreadcrumbs(context);
4343
}
@@ -53,7 +53,7 @@ public void testAddBreadcrumb() {
5353
try {
5454
assertTrue(backtraceBreadcrumbs.addBreadcrumb("Test"));
5555

56-
List<String> breadcrumbLogFileData = readBreadcrumbLogFile();
56+
List<String> breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
5757

5858
// First breadcrumb is configuration breadcrumb
5959
// We start from the second breadcrumb
@@ -70,7 +70,7 @@ public void testClearBreadcrumbs() {
7070
try {
7171
assertTrue(backtraceBreadcrumbs.addBreadcrumb("Test"));
7272

73-
List<String> breadcrumbLogFileData = readBreadcrumbLogFile();
73+
List<String> breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
7474
assertEquals(2, breadcrumbLogFileData.size());
7575

7676
// First breadcrumb is configuration breadcrumb
@@ -83,7 +83,7 @@ public void testClearBreadcrumbs() {
8383

8484
// Should have cleared the breadcrumb we just read but
8585
// We should still have a configuration breadcrumb
86-
breadcrumbLogFileData = readBreadcrumbLogFile();
86+
breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
8787
assertEquals(1, breadcrumbLogFileData.size());
8888
parsedBreadcrumb = new JSONObject(breadcrumbLogFileData.get(0));
8989

@@ -103,7 +103,7 @@ public void testEnableBreadcrumbs() {
103103

104104
assertTrue(backtraceBreadcrumbs.addBreadcrumb("Test"));
105105

106-
List<String> breadcrumbLogFileData = readBreadcrumbLogFile();
106+
List<String> breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
107107

108108
// First breadcrumb is configuration breadcrumb
109109
// We start from the second breadcrumb
@@ -126,7 +126,7 @@ public void testAddBreadcrumbWithAttributes() {
126126

127127
backtraceBreadcrumbs.addBreadcrumb("Test", attributes);
128128

129-
List<String> breadcrumbLogFileData = readBreadcrumbLogFile();
129+
List<String> breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
130130

131131
// First breadcrumb is configuration breadcrumb
132132
// We start from the second breadcrumb
@@ -146,7 +146,7 @@ public void testSpaceInMessage() {
146146
try {
147147
backtraceBreadcrumbs.addBreadcrumb("Testing 1 2 3");
148148

149-
List<String> breadcrumbLogFileData = readBreadcrumbLogFile();
149+
List<String> breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
150150

151151
// First breadcrumb is configuration breadcrumb
152152
// We start from the second breadcrumb
@@ -164,7 +164,7 @@ public void testNewlineInMessage() {
164164
try {
165165
backtraceBreadcrumbs.addBreadcrumb("Testing\n 1 2\n 3\n");
166166

167-
List<String> breadcrumbLogFileData = readBreadcrumbLogFile();
167+
List<String> breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
168168

169169
// First breadcrumb is configuration breadcrumb
170170
// We start from the second breadcrumb
@@ -188,7 +188,7 @@ public void testInvalidCharsInAttribute() {
188188

189189
backtraceBreadcrumbs.addBreadcrumb("Test", attributes);
190190

191-
List<String> breadcrumbLogFileData = readBreadcrumbLogFile();
191+
List<String> breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
192192

193193
// First breadcrumb is configuration breadcrumb
194194
// We start from the second breadcrumb
@@ -208,7 +208,7 @@ public void testLongMessage() {
208208
try {
209209
backtraceBreadcrumbs.addBreadcrumb(longTestMessage);
210210

211-
List<String> breadcrumbLogFileData = readBreadcrumbLogFile();
211+
List<String> breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
212212

213213
// First breadcrumb is configuration breadcrumb
214214
// We start from the second breadcrumb
@@ -230,7 +230,7 @@ public void testLongAttributesLongFirst() {
230230

231231
backtraceBreadcrumbs.addBreadcrumb("Test", attributes);
232232

233-
List<String> breadcrumbLogFileData = readBreadcrumbLogFile();
233+
List<String> breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
234234

235235
// First breadcrumb is configuration breadcrumb
236236
// We start from the second breadcrumb
@@ -254,7 +254,7 @@ public void testLongAttributesShortFirst() {
254254

255255
backtraceBreadcrumbs.addBreadcrumb("Test", attributes);
256256

257-
List<String> breadcrumbLogFileData = readBreadcrumbLogFile();
257+
List<String> breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
258258

259259
// First breadcrumb is configuration breadcrumb
260260
// We start from the second breadcrumb
@@ -283,7 +283,7 @@ public void testQueueFileShouldNotRollover() {
283283
backtraceBreadcrumbs.addBreadcrumb("I am a breadcrumb", attributes);
284284
}
285285

286-
List<String> breadcrumbLogFileData = readBreadcrumbLogFile();
286+
List<String> breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
287287

288288
// First breadcrumb is configuration breadcrumb, it should be valid
289289
JSONObject parsedBreadcrumb = new JSONObject(breadcrumbLogFileData.get(0));
@@ -327,7 +327,7 @@ public void testQueueFileRollover() {
327327
breadcrumbsFileSize > 63 * 1024);
328328

329329
// We should have rolled over the configuration breadcrumb, consider all breadcrumbs here
330-
List<String> breadcrumbLogFileData = readBreadcrumbLogFile();
330+
List<String> breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
331331
for (int i = 0; i < breadcrumbLogFileData.size(); i++) {
332332
JSONObject parsedBreadcrumb = new JSONObject(breadcrumbLogFileData.get(i));
333333
assertEquals("I am a breadcrumb", parsedBreadcrumb.get("message"));
@@ -367,7 +367,7 @@ public void testQueueFileShouldNotRolloverCustomMax() {
367367
backtraceBreadcrumbs.addBreadcrumb("I am a breadcrumb", attributes);
368368
}
369369

370-
List<String> breadcrumbLogFileData = readBreadcrumbLogFile();
370+
List<String> breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
371371

372372
// First breadcrumb is configuration breadcrumb, it should be valid
373373
JSONObject parsedBreadcrumb = new JSONObject(breadcrumbLogFileData.get(0));
@@ -391,42 +391,37 @@ public void testQueueFileShouldNotRolloverCustomMax() {
391391
}
392392

393393
@Test
394-
public void testQueueFileRolloverCustomMax() {
394+
public void testQueueFileRolloverCustomMax() throws IOException, JSONException {
395395
int numIterations = 100;
396396
// Cleanup after default BacktraceBreadcrumbs constructor
397397
// Because we want to create our own instance with custom parameters
398398
cleanUp();
399399

400-
try {
401-
backtraceBreadcrumbs = new BacktraceBreadcrumbs(context.getFilesDir().getAbsolutePath());
402-
backtraceBreadcrumbs.enableBreadcrumbs(context, 6400);
403-
// Account for mandatory configuration breadcrumb
404-
backtraceBreadcrumbs.setCurrentBreadcrumbId(1);
405-
406-
for (int i = 0; i < numIterations; i++) {
407-
final long threadId = Thread.currentThread().getId();
408-
Map<String, Object> attributes = new HashMap<String, Object>() {{
409-
put("From Thread", threadId);
410-
}};
411-
backtraceBreadcrumbs.addBreadcrumb("I am a breadcrumb", attributes);
412-
}
413-
414-
List<String> breadcrumbLogFileData = readBreadcrumbLogFile();
400+
backtraceBreadcrumbs = new BacktraceBreadcrumbs(context.getFilesDir().getAbsolutePath());
401+
backtraceBreadcrumbs.enableBreadcrumbs(context, 6400);
402+
// Account for mandatory configuration breadcrumb
403+
backtraceBreadcrumbs.setCurrentBreadcrumbId(1);
415404

416-
// We should have rolled over the configuration breadcrumb, consider all breadcrumbs here
417-
for (int i = 0; i < breadcrumbLogFileData.size(); i++) {
418-
JSONObject parsedBreadcrumb = new JSONObject(breadcrumbLogFileData.get(i));
419-
assertEquals("I am a breadcrumb", parsedBreadcrumb.get("message"));
420-
assertNotNull(parsedBreadcrumb.getJSONObject("attributes").get("From Thread"));
421-
assertEquals("manual", parsedBreadcrumb.get("type"));
422-
assertEquals("info", parsedBreadcrumb.get("level"));
423-
// Timestamp should be convertible to a long
424-
assertTrue(parsedBreadcrumb.get("timestamp") instanceof Long);
425-
assertTrue(((int) parsedBreadcrumb.get("id")) > 45);
426-
}
405+
for (int i = 0; i < numIterations; i++) {
406+
final long threadId = Thread.currentThread().getId();
407+
Map<String, Object> attributes = new HashMap<String, Object>() {{
408+
put("From Thread", threadId);
409+
}};
410+
backtraceBreadcrumbs.addBreadcrumb("I am a breadcrumb", attributes);
411+
}
427412

428-
} catch (Exception ex) {
429-
fail(ex.getMessage());
413+
List<String> breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
414+
415+
// We should have rolled over the configuration breadcrumb, consider all breadcrumbs here
416+
for (int i = 0; i < breadcrumbLogFileData.size(); i++) {
417+
JSONObject parsedBreadcrumb = new JSONObject(breadcrumbLogFileData.get(i));
418+
assertEquals("I am a breadcrumb", parsedBreadcrumb.get("message"));
419+
assertNotNull(parsedBreadcrumb.getJSONObject("attributes").get("From Thread"));
420+
assertEquals("manual", parsedBreadcrumb.get("type"));
421+
assertEquals("info", parsedBreadcrumb.get("level"));
422+
// Timestamp should be convertible to a long
423+
assertTrue(parsedBreadcrumb.get("timestamp") instanceof Long);
424+
assertTrue(((int) parsedBreadcrumb.get("id")) > 45);
430425
}
431426
}
432427

@@ -445,7 +440,7 @@ public void breadcrumbsEnduranceTest() {
445440
threads[i].join();
446441
}
447442

448-
List<String> breadcrumbLogFileData = readBreadcrumbLogFile();
443+
List<String> breadcrumbLogFileData = BreadcrumbsReader.readBreadcrumbLogFile(context.getFilesDir().getAbsolutePath());
449444

450445
// First breadcrumb is configuration breadcrumb
451446
// We start from the second breadcrumb
@@ -497,32 +492,6 @@ public void run() {
497492
}
498493
}
499494

500-
public List<String> readBreadcrumbLogFile() throws IOException {
501-
BacktraceBreadcrumbs breadcrumbs = new BacktraceBreadcrumbs(context.getFilesDir().getAbsolutePath());
502-
File breadcrumbLogFile = new File(breadcrumbs.getBreadcrumbLogPath());
503-
504-
List<String> breadcrumbLogFileData = new ArrayList<String>();
505-
FileInputStream inputStream = new FileInputStream(breadcrumbLogFile.getAbsolutePath());
506-
507-
// The encoding contains headers for the encoded data
508-
// We just throw away lines that don't start with "timestamp
509-
StringBuilder stringBuilder = new StringBuilder();
510-
while (inputStream.available() > 0) {
511-
char c = (char) inputStream.read();
512-
if (c == '\n') {
513-
String line = stringBuilder.toString();
514-
if (line.matches(".*timestamp.*")) {
515-
breadcrumbLogFileData.add(line);
516-
}
517-
stringBuilder = new StringBuilder();
518-
continue;
519-
}
520-
stringBuilder.append(c);
521-
}
522-
523-
return breadcrumbLogFileData;
524-
}
525-
526495
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" +
527496
"\n" +
528497
"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" +
@@ -542,4 +511,4 @@ public List<String> readBreadcrumbLogFile() throws IOException {
542511
private final String reasonableLengthAttributeKey = "reasonablySizedKey";
543512

544513
private final String reasonableLengthAttributeValue = "reasonableSizedValue";
545-
}
514+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package backtraceio.library.breadcrumbs;
2+
3+
import java.io.File;
4+
import java.io.FileInputStream;
5+
import java.io.IOException;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
public class BreadcrumbsReader {
10+
11+
public static List<String> readBreadcrumbLogFile(String path) throws IOException {
12+
BacktraceBreadcrumbs breadcrumbs = new BacktraceBreadcrumbs(path);
13+
File breadcrumbLogFile = new File(breadcrumbs.getBreadcrumbLogPath());
14+
15+
List<String> breadcrumbLogFileData = new ArrayList<String>();
16+
FileInputStream inputStream = new FileInputStream(breadcrumbLogFile.getAbsolutePath());
17+
18+
// The encoding contains headers for the encoded data
19+
// We just throw away lines that don't start with "timestamp
20+
StringBuilder stringBuilder = new StringBuilder();
21+
while (inputStream.available() > 0) {
22+
char c = (char) inputStream.read();
23+
if (c == '\n') {
24+
String line = stringBuilder.toString();
25+
if (line.matches(".*timestamp.*")) {
26+
breadcrumbLogFileData.add(line);
27+
}
28+
stringBuilder = new StringBuilder();
29+
continue;
30+
}
31+
stringBuilder.append(c);
32+
}
33+
34+
return breadcrumbLogFileData;
35+
}
36+
}

backtrace-library/src/androidTest/java/backtraceio/library/watchdog/BacktraceAnrTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ public void setUp() {
3232
this.backtraceClient = new BacktraceClient(this.context, credentials);
3333
}
3434

35-
3635
@Test
3736
@UiThreadTest
3837
public void checkIfANRIsDetectedCorrectly() {

0 commit comments

Comments
 (0)