Skip to content

Commit 79a0913

Browse files
authored
feat: Sync file attachments to native (#5211)
1 parent 2166fab commit 79a0913

File tree

8 files changed

+413
-310
lines changed

8 files changed

+413
-310
lines changed

CHANGELOG.md

Lines changed: 320 additions & 310 deletions
Large diffs are not rendered by default.

sentry-android-ndk/api/sentry-android-ndk.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ public final class io/sentry/android/ndk/DebugImagesLoader : io/sentry/android/c
1515

1616
public final class io/sentry/android/ndk/NdkScopeObserver : io/sentry/ScopeObserverAdapter {
1717
public fun <init> (Lio/sentry/SentryOptions;)V
18+
public fun addAttachment (Lio/sentry/Attachment;)V
1819
public fun addBreadcrumb (Lio/sentry/Breadcrumb;)V
20+
public fun clearAttachments ()V
1921
public fun removeExtra (Ljava/lang/String;)V
2022
public fun removeTag (Ljava/lang/String;)V
2123
public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V

sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.sentry.android.ndk;
22

3+
import io.sentry.Attachment;
34
import io.sentry.Breadcrumb;
45
import io.sentry.DateUtils;
56
import io.sentry.IScope;
@@ -145,4 +146,41 @@ public void setTrace(@Nullable SpanContext spanContext, @NotNull IScope scope) {
145146
options.getLogger().log(SentryLevel.ERROR, e, "Scope sync setTrace failed.");
146147
}
147148
}
149+
150+
@Override
151+
public void addAttachment(final @NotNull Attachment attachment) {
152+
final String pathname = attachment.getPathname();
153+
if (pathname != null) {
154+
try {
155+
options.getExecutorService().submit(() -> nativeScope.addAttachment(pathname));
156+
} catch (Throwable e) {
157+
options.getLogger().log(SentryLevel.ERROR, e, "Scope sync addAttachment has an error.");
158+
}
159+
return;
160+
}
161+
162+
final byte[] bytes = attachment.getBytes();
163+
if (bytes != null) {
164+
final String filename = attachment.getFilename();
165+
try {
166+
options.getExecutorService().submit(() -> nativeScope.addAttachmentBytes(bytes, filename));
167+
} catch (Throwable e) {
168+
options.getLogger().log(SentryLevel.ERROR, e, "Scope sync addAttachment has an error.");
169+
}
170+
return;
171+
}
172+
173+
options
174+
.getLogger()
175+
.log(SentryLevel.DEBUG, "Scope sync addAttachment skips attachment without path or bytes.");
176+
}
177+
178+
@Override
179+
public void clearAttachments() {
180+
try {
181+
options.getExecutorService().submit(() -> nativeScope.clearAttachments());
182+
} catch (Throwable e) {
183+
options.getLogger().log(SentryLevel.ERROR, e, "Scope sync clearAttachments has an error.");
184+
}
185+
}
148186
}

sentry-android-ndk/src/test/java/io/sentry/android/ndk/NdkScopeObserverTest.kt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.sentry.android.ndk
22

3+
import io.sentry.Attachment
34
import io.sentry.Breadcrumb
45
import io.sentry.DateUtils
56
import io.sentry.JsonSerializer
@@ -153,4 +154,34 @@ class NdkScopeObserverTest {
153154
verify(fixture.nativeScope)
154155
.addBreadcrumb(anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull())
155156
}
157+
158+
@Test
159+
fun `add file-path attachment syncs to native scope`() {
160+
val sut = fixture.getSut()
161+
162+
val attachment = Attachment("/data/data/com.example/files/log.txt")
163+
sut.addAttachment(attachment)
164+
165+
verify(fixture.nativeScope).addAttachment("/data/data/com.example/files/log.txt")
166+
}
167+
168+
@Test
169+
fun `add byte attachment syncs bytes to native scope`() {
170+
val sut = fixture.getSut()
171+
172+
val bytes = byteArrayOf(1, 2, 3)
173+
val attachment = Attachment(bytes, "data.bin")
174+
sut.addAttachment(attachment)
175+
176+
verify(fixture.nativeScope).addAttachmentBytes(bytes, "data.bin")
177+
}
178+
179+
@Test
180+
fun `clear attachments forwards call to native scope`() {
181+
val sut = fixture.getSut()
182+
183+
sut.clearAttachments()
184+
185+
verify(fixture.nativeScope).clearAttachments()
186+
}
156187
}

sentry/api/sentry.api

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -945,7 +945,9 @@ public abstract interface class io/sentry/IScope {
945945
}
946946

947947
public abstract interface class io/sentry/IScopeObserver {
948+
public abstract fun addAttachment (Lio/sentry/Attachment;)V
948949
public abstract fun addBreadcrumb (Lio/sentry/Breadcrumb;)V
950+
public abstract fun clearAttachments ()V
949951
public abstract fun removeExtra (Ljava/lang/String;)V
950952
public abstract fun removeTag (Ljava/lang/String;)V
951953
public abstract fun setBreadcrumbs (Ljava/util/Collection;)V
@@ -2452,7 +2454,9 @@ public abstract interface class io/sentry/ScopeCallback {
24522454

24532455
public abstract class io/sentry/ScopeObserverAdapter : io/sentry/IScopeObserver {
24542456
public fun <init> ()V
2457+
public fun addAttachment (Lio/sentry/Attachment;)V
24552458
public fun addBreadcrumb (Lio/sentry/Breadcrumb;)V
2459+
public fun clearAttachments ()V
24562460
public fun removeExtra (Ljava/lang/String;)V
24572461
public fun removeTag (Ljava/lang/String;)V
24582462
public fun setBreadcrumbs (Ljava/util/Collection;)V

sentry/src/main/java/io/sentry/IScopeObserver.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,8 @@ public interface IScopeObserver {
4545
void setTrace(@Nullable SpanContext spanContext, @NotNull IScope scope);
4646

4747
void setReplayId(@NotNull SentryId replayId);
48+
49+
void addAttachment(@NotNull Attachment attachment);
50+
51+
void clearAttachments();
4852
}

sentry/src/main/java/io/sentry/Scope.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,12 +924,20 @@ public List<Attachment> getAttachments() {
924924
@Override
925925
public void addAttachment(final @NotNull Attachment attachment) {
926926
attachments.add(attachment);
927+
928+
for (final IScopeObserver observer : options.getScopeObservers()) {
929+
observer.addAttachment(attachment);
930+
}
927931
}
928932

929933
/** Clear all attachments. */
930934
@Override
931935
public void clearAttachments() {
932936
attachments.clear();
937+
938+
for (final IScopeObserver observer : options.getScopeObservers()) {
939+
observer.clearAttachments();
940+
}
933941
}
934942

935943
/**

sentry/src/main/java/io/sentry/ScopeObserverAdapter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,10 @@ public void setTrace(@Nullable SpanContext spanContext, @NotNull IScope scope) {
5757

5858
@Override
5959
public void setReplayId(@NotNull SentryId replayId) {}
60+
61+
@Override
62+
public void addAttachment(@NotNull Attachment attachment) {}
63+
64+
@Override
65+
public void clearAttachments() {}
6066
}

0 commit comments

Comments
 (0)