Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a callback for filtering breadcrumbs #237

Merged
merged 9 commits into from
Feb 9, 2018
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
package com.bugsnag.android;

import android.support.annotation.NonNull;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.HashMap;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;

@RunWith(AndroidJUnit4.class)
@SmallTest
public class BeforeRecordBreadcrumbsTest {

private Client client;

@Before
public void setUp() throws Exception {
Configuration configuration = new Configuration("api-key");
configuration.setAutomaticallyCollectBreadcrumbs(false);
client = new Client(InstrumentationRegistry.getContext(), configuration);
assertEquals(0, client.breadcrumbs.store.size());
}

@Test
public void noCallback() throws Exception {
client.leaveBreadcrumb("Hello");
assertEquals(1, client.breadcrumbs.store.size());
}

@Test
public void falseCallback() throws Exception {
client.beforeRecordBreadcrumb(new BeforeRecordBreadcrumb() {
@Override
public boolean shouldRecord(@NonNull Breadcrumb breadcrumb) {
return false;
}
});
client.leaveBreadcrumb("Hello");
assertEquals(0, client.breadcrumbs.store.size());
}

@Test
public void trueCallback() throws Exception {
client.beforeRecordBreadcrumb(new BeforeRecordBreadcrumb() {
@Override
public boolean shouldRecord(@NonNull Breadcrumb breadcrumb) {
return true;
}
});
client.leaveBreadcrumb("Hello");
assertEquals(1, client.breadcrumbs.store.size());
}

@Test
public void multipleCallbacks() throws Exception {
client.beforeRecordBreadcrumb(new BeforeRecordBreadcrumb() {
@Override
public boolean shouldRecord(@NonNull Breadcrumb breadcrumb) {
return true;
}
});
client.beforeRecordBreadcrumb(new BeforeRecordBreadcrumb() {
@Override
public boolean shouldRecord(@NonNull Breadcrumb breadcrumb) {
return false;
}
});
client.leaveBreadcrumb("Hello");
assertEquals(0, client.breadcrumbs.store.size());
}

@Test
public void ensureBothCalled() throws Exception {
final int[] count = {0};
client.beforeRecordBreadcrumb(new BeforeRecordBreadcrumb() {
@Override
public boolean shouldRecord(@NonNull Breadcrumb breadcrumb) {
count[0] += 1;
return true;
}
});
client.beforeRecordBreadcrumb(new BeforeRecordBreadcrumb() {
@Override
public boolean shouldRecord(@NonNull Breadcrumb breadcrumb) {
count[0] += 1;
return true;
}
});

client.leaveBreadcrumb("Foo");
client.leaveBreadcrumb("Hello", BreadcrumbType.USER, new HashMap<String, String>());
client.leaveBreadcrumb("Hello", BreadcrumbType.USER, new HashMap<String, String>(), false);
assertEquals(6, count[0]);
}

@Test
public void ensureOnlyCalledOnce() throws Exception {
final int[] count = {0};

BeforeRecordBreadcrumb beforeRecordBreadcrumb = new BeforeRecordBreadcrumb() {
@Override
public boolean shouldRecord(@NonNull Breadcrumb breadcrumb) {
count[0] += 1;
return true;
}
};
client.beforeRecordBreadcrumb(beforeRecordBreadcrumb);
client.beforeRecordBreadcrumb(beforeRecordBreadcrumb);
client.leaveBreadcrumb("Foo");
assertEquals(1, count[0]);
}

@Test
public void checkBreadrumbFields() throws Exception {
final int[] count = {0};

BeforeRecordBreadcrumb beforeRecordBreadcrumb = new BeforeRecordBreadcrumb() {
@Override
public boolean shouldRecord(@NonNull Breadcrumb breadcrumb) {
count[0] += 1;
assertEquals("Hello", breadcrumb.getName());
assertEquals(BreadcrumbType.MANUAL, breadcrumb.getType());
assertFalse(breadcrumb.getMetadata().isEmpty());
return true;
}
};
client.beforeRecordBreadcrumb(beforeRecordBreadcrumb);
client.leaveBreadcrumb("Hello");
assertEquals(1, count[0]);
}

}
72 changes: 36 additions & 36 deletions sdk/src/androidTest/java/com/bugsnag/android/BreadcrumbsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ public void setUp() throws Exception {

@Test
public void testSerialization() throws JSONException, IOException {
breadcrumbs.add("Started app");
breadcrumbs.add("Clicked a button");
breadcrumbs.add("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.");
breadcrumbs.add(new Breadcrumb("Started app"));
breadcrumbs.add(new Breadcrumb("Clicked a button"));
breadcrumbs.add(new Breadcrumb("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."));

JSONArray breadcrumbsJson = streamableToJsonArray(breadcrumbs);
assertEquals(3, breadcrumbsJson.length());
Expand All @@ -41,12 +41,12 @@ public void testSerialization() throws JSONException, IOException {
@Test
public void testSizeLimit() throws JSONException, IOException {
breadcrumbs.setSize(5);
breadcrumbs.add("1");
breadcrumbs.add("2");
breadcrumbs.add("3");
breadcrumbs.add("4");
breadcrumbs.add("5");
breadcrumbs.add("6");
breadcrumbs.add(new Breadcrumb("1"));
breadcrumbs.add(new Breadcrumb("2"));
breadcrumbs.add(new Breadcrumb("3"));
breadcrumbs.add(new Breadcrumb("4"));
breadcrumbs.add(new Breadcrumb("5"));
breadcrumbs.add(new Breadcrumb("6"));

JSONArray breadcrumbsJson = streamableToJsonArray(breadcrumbs);
assertEquals(5, breadcrumbsJson.length());
Expand All @@ -56,14 +56,14 @@ public void testSizeLimit() throws JSONException, IOException {

@Test
public void testResizePersists() throws JSONException, IOException {
breadcrumbs.add("1");
breadcrumbs.add("2");
breadcrumbs.add("3");
breadcrumbs.add("4");
breadcrumbs.add("5");
breadcrumbs.add("6");
breadcrumbs.add(new Breadcrumb("1"));
breadcrumbs.add(new Breadcrumb("2"));
breadcrumbs.add(new Breadcrumb("3"));
breadcrumbs.add(new Breadcrumb("4"));
breadcrumbs.add(new Breadcrumb("5"));
breadcrumbs.add(new Breadcrumb("6"));
breadcrumbs.setSize(5);
breadcrumbs.add("7");
breadcrumbs.add(new Breadcrumb("7"));

JSONArray breadcrumbsJson = streamableToJsonArray(breadcrumbs);
assertEquals(5, breadcrumbsJson.length());
Expand All @@ -73,22 +73,22 @@ public void testResizePersists() throws JSONException, IOException {

@Test
public void testResizeEmpty() throws JSONException, IOException {
breadcrumbs.add("1");
breadcrumbs.add("2");
breadcrumbs.add(new Breadcrumb("1"));
breadcrumbs.add(new Breadcrumb("2"));
breadcrumbs.setSize(0);
breadcrumbs.add("3");
breadcrumbs.add("4");
breadcrumbs.add("5");
breadcrumbs.add("6");
breadcrumbs.add(new Breadcrumb("3"));
breadcrumbs.add(new Breadcrumb("4"));
breadcrumbs.add(new Breadcrumb("5"));
breadcrumbs.add(new Breadcrumb("6"));

JSONArray breadcrumbsJson = streamableToJsonArray(breadcrumbs);
assertEquals(0, breadcrumbsJson.length());
}

@Test
public void testResizeNegative() throws JSONException, IOException {
breadcrumbs.add("1");
breadcrumbs.add("2");
breadcrumbs.add(new Breadcrumb("1"));
breadcrumbs.add(new Breadcrumb("2"));
breadcrumbs.setSize(-1);

JSONArray breadcrumbsJson = streamableToJsonArray(breadcrumbs);
Expand All @@ -97,12 +97,12 @@ public void testResizeNegative() throws JSONException, IOException {

@Test
public void testResize() throws JSONException, IOException {
breadcrumbs.add("1");
breadcrumbs.add("2");
breadcrumbs.add("3");
breadcrumbs.add("4");
breadcrumbs.add("5");
breadcrumbs.add("6");
breadcrumbs.add(new Breadcrumb("1"));
breadcrumbs.add(new Breadcrumb("2"));
breadcrumbs.add(new Breadcrumb("3"));
breadcrumbs.add(new Breadcrumb("4"));
breadcrumbs.add(new Breadcrumb("5"));
breadcrumbs.add(new Breadcrumb("6"));
breadcrumbs.setSize(5);

JSONArray breadcrumbsJson = streamableToJsonArray(breadcrumbs);
Expand All @@ -113,9 +113,9 @@ public void testResize() throws JSONException, IOException {

@Test
public void testClear() throws JSONException, IOException {
breadcrumbs.add("1");
breadcrumbs.add("2");
breadcrumbs.add("3");
breadcrumbs.add(new Breadcrumb("1"));
breadcrumbs.add(new Breadcrumb("2"));
breadcrumbs.add(new Breadcrumb("3"));
breadcrumbs.clear();

JSONArray breadcrumbsJson = streamableToJsonArray(breadcrumbs);
Expand All @@ -124,7 +124,7 @@ public void testClear() throws JSONException, IOException {

@Test
public void testType() throws JSONException, IOException {
breadcrumbs.add("1");
breadcrumbs.add(new Breadcrumb("1"));
JSONArray breadcrumbsJson = streamableToJsonArray(breadcrumbs);
assertEquals("manual", breadcrumbsJson.getJSONObject(0).get("type"));
}
Expand All @@ -135,7 +135,7 @@ public void testPayloadSizeLimit() throws JSONException, IOException {
for (int i = 0; i < 400; i++) {
metadata.put(String.format(Locale.US, "%d", i), "!!");
}
breadcrumbs.add("Rotated Menu", BreadcrumbType.STATE, metadata);
breadcrumbs.add(new Breadcrumb("Rotated Menu", BreadcrumbType.STATE, metadata));
JSONArray breadcrumbsJson = streamableToJsonArray(breadcrumbs);
assertEquals(0, breadcrumbsJson.length());
}
Expand All @@ -144,7 +144,7 @@ public void testPayloadSizeLimit() throws JSONException, IOException {
public void testPayloadType() throws JSONException, IOException {
HashMap<String, String> metadata = new HashMap<>();
metadata.put("direction", "left");
breadcrumbs.add("Rotated Menu", BreadcrumbType.STATE, metadata);
breadcrumbs.add(new Breadcrumb("Rotated Menu", BreadcrumbType.STATE, metadata));
JSONArray breadcrumbsJson = streamableToJsonArray(breadcrumbs);

assertEquals("Rotated Menu", breadcrumbsJson.getJSONObject(0).get("name"));
Expand Down
32 changes: 32 additions & 0 deletions sdk/src/main/java/com/bugsnag/android/BeforeRecordBreadcrumb.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.bugsnag.android;

import android.support.annotation.NonNull;

/**
* Add a "before breadcrumb" callback, to execute code before every
* breadcrumb captured by Bugsnag.
* <p>
* You can use this to modify breadcrumbs before they are stored by Bugsnag.
* You can also return <code>false</code> from any callback to ignore a breadcrumb.
* <p>
* For example:
* <p>
* Bugsnag.beforeRecordBreadcrumb(new BeforeRecordBreadcrumb() {
* public boolean shouldRecord(Breadcrumb breadcrumb) {
* return false; // ignore the breadcrumb
* }
* })
*/
public interface BeforeRecordBreadcrumb {

/**
* Runs the "before breadcrumb" callback. If the callback returns
* <code>false</code> any further BeforeRecordBreadcrumb callbacks will not be called
* and the breadcrumb will not be captured by Bugsnag.
*
* @param breadcrumb the breadcrumb to be captured by Bugsnag
* @see Breadcrumb
*/
boolean shouldRecord(@NonNull Breadcrumb breadcrumb);

}
Loading