Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
copy tests
  • Loading branch information
marandaneto committed Dec 2, 2022
commit 2a999cddfb5f51f79b99324e7ec370fe15ce6ff8
45 changes: 29 additions & 16 deletions file/lib/src/sentry_file.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,15 @@ class SentryFile implements File {
Future<File> create({bool recursive = false}) {
return _wrap(
_file.create(recursive: recursive),
'file.create',
'file.write',
);
}

@override
void createSync({bool recursive = false, bool exclusive = false}) {
return _wrapSync(
() => _file.createSync(recursive: recursive),
'file.create',
'file.write',
);
}

Expand All @@ -60,6 +60,8 @@ class SentryFile implements File {
return _wrap(_file.open(mode: mode), 'file.open');
}

// coverage:ignore-start

@override
Stream<List<int>> openRead([int? start, int? end]) {
return _file.openRead(start, end);
Expand All @@ -75,6 +77,8 @@ class SentryFile implements File {
return _file.openWrite(mode: mode, encoding: encoding);
}

// coverage:ignore-end

@override
Future<Uint8List> readAsBytes() {
return _wrap(_file.readAsBytes(), 'file.read');
Expand Down Expand Up @@ -181,18 +185,29 @@ class SentryFile implements File {
);
}

String _getDesc() {
return uri.pathSegments.isNotEmpty ? uri.pathSegments.last : path;
}

Future<T> _wrap<T>(Future<T> future, String operation) async {
final span = _hub.getSpan()?.startChild(operation, description: _file.path);
span?.setData('async-io', true);
final desc = _getDesc();

final currentSpan = _hub.getSpan();
final span = currentSpan?.startChild(operation, description: desc);

span?.setData('file.async', true);
if (_hub.options.sendDefaultPii) {
// if (_hub.options.sendDefaultPii || _hub.options.platformChecker.isMobile) {
span?.setData('file.path', path);
span?.setData('file.path', absolute.path);
}
T data;
try {
data = await future;
if (data is List<int>) {
span?.setData('file.size', data.length);
} else if (data is File) {
span?.setData('file.size', await data.length());
// TODO: if its a copy, we need the new path here too or not?
// TODO: append size in bytes or human readable size
}
span?.status = SpanStatus.ok();
} catch (exception) {
Expand All @@ -206,18 +221,22 @@ class SentryFile implements File {
}

T _wrapSync<T>(Callback<T> callback, String operation) {
final span = _hub.getSpan()?.startChild(operation, description: _file.path);
span?.setData('async-io', false);
final desc = _getDesc();

final currentSpan = _hub.getSpan();
final span = currentSpan?.startChild(operation, description: desc);
span?.setData('file.async', false);

if (_hub.options.sendDefaultPii) {
// if (_hub.options.sendDefaultPii || _hub.options.platformChecker.isMobile) {
span?.setData('file.path', path);
span?.setData('file.path', absolute.path);
}
T data;
try {
data = callback();
if (data is List<int>) {
span?.setData('file.size', data.length);
} else if (data is File) {
span?.setData('file.size', data.lengthSync());
}
span?.status = SpanStatus.ok();
} catch (exception) {
Expand Down Expand Up @@ -304,9 +323,3 @@ class SentryFile implements File {

// coverage:ignore-end
}

// extension on PlatformChecker {
// bool get isMobile {
// return platform.isIOS || platform.isAndroid;
// }
// }
91 changes: 64 additions & 27 deletions file/test/sentry_file_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,45 +11,82 @@ import 'mock_sentry_client.dart';
typedef Callback<T> = T Function();

void main() {
late Fixture fixture;
group('$SentryFile copy', () {
late Fixture fixture;

setUp(() {
fixture = Fixture();
});
setUp(() {
fixture = Fixture();
});

test('uri returns test', () {
final file = File('test.txt');
final sut = fixture.getSut(file, tracesSampleRate: 1.0);
test('copy async', () async {
final file = File('test_resources/testfile.txt');

expect(sut.uri.toFilePath(), 'test.txt');
});
final sut = fixture.getSut(
file,
sendDefaultPii: true,
tracesSampleRate: 1.0,
);

final tr = fixture.hub.startTransaction('name', 'op', bindToScope: true);

final newFile = await sut.copy('test_resources/testfile_copy.txt');

await tr.finish();

final exists = await newFile.exists();
expect(exists, true);

expect(sut.uri.toFilePath(), isNot(newFile.uri.toFilePath()));

final call = fixture.client.captureTransactionCalls.first;
final span = call.transaction.spans.first;

expect(span.context.operation, 'file.copy');
expect(span.data['file.size'], 7);
expect(span.data['file.async'], true);
expect(span.context.description, 'testfile.txt');
expect(
(span.data['file.path'] as String)
.endsWith('test_resources/testfile.txt'),
true);

await newFile.delete();
});

test('copy sync', () async {
final file = File('test_resources/testfile.txt');

test('copy wraps with a trace', () async {
final file = File('test.txt');
await file.create(recursive: true);
expect(await file.exists(), true);
final sut = fixture.getSut(
file,
sendDefaultPii: true,
tracesSampleRate: 1.0,
);

final sut = fixture.getSut(
file,
sendDefaultPii: true,
tracesSampleRate: 1.0,
);
final tr = fixture.hub.startTransaction('name', 'op', bindToScope: true);

final tr = fixture.hub.startTransaction('name', 'op', bindToScope: true);
final newFile = sut.copySync('test_resources/testfile_copy.txt');

var newFile = await sut.copy('new.txt');
await tr.finish();

await tr.finish();
final exists = newFile.existsSync();
expect(exists, true);

final exists = await newFile.exists();
expect(exists, true);
expect(sut.uri.toFilePath(), isNot(newFile.uri.toFilePath()));

expect(file.uri.toFilePath(), isNot(newFile.uri.toFilePath()));
final call = fixture.client.captureTransactionCalls.first;
final span = call.transaction.spans.first;

final call = fixture.client.captureTransactionCalls.first;
final span = call.transaction.spans.first;
expect(span.context.operation, 'file.copy');
expect(span.data['file.size'], 7);
expect(span.data['file.async'], false);
expect(span.context.description, 'testfile.txt');
expect(
(span.data['file.path'] as String)
.endsWith('test_resources/testfile.txt'),
true);

expect(span.context.operation, 'file.copy');
await newFile.delete();
});
});
}

Expand Down