Remove deprecated APIs from dart_io_extensions.dart and add new is*Available RPCs.

Removed:
- `startSocketProfiling`
- `pauseSocketProfiling`
- `getHttpEnableTimelineLogging`
- `setHttpEnableTimelineLogging`

Added:
- `isSocketProfilingAvailable`
- `isHttpTimelineLoggingAvailable`
- `isHttpProfilingAvailable`

The added RPCs were previously implemented in DevTools with a TODO to move these into `dart_io_extensions.dart`: https://github.com/flutter/devtools/blob/master/packages/devtools_app/lib/src/service/vm_service_wrapper.dart#L896-L918

Change-Id: Ic6c14ae7c09361e39fb3b0ad8c28e3e5863ca9bb
CoreLibraryReviewExempt: VM service changes
TEST=existing tests
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/329800
Commit-Queue: Kenzie Davisson <kenzieschmoll@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
This commit is contained in:
Kenzie Schmoll 2023-10-11 22:22:12 +00:00 committed by Commit Queue
parent 8e6a02d899
commit 112c08b418
12 changed files with 170 additions and 262 deletions

View file

@ -1,3 +1,9 @@
## 13.0.0
- Add Dart IO extension methods `isSocketProfilingAvailable`,
`isHttpTimelineLoggingAvailable`, `isHttpProfilingAvailable`.
- Remove deprecated Dart IO extension methods: `startSocketProfiling`
`pauseSocketProfiling`, `getHttpEnableTimelineLogging`, `setHttpEnableTimelineLogging`.
## 12.0.1
- Fix Java VM service version bug.

View file

@ -17,3 +17,18 @@ The VM Service Protocol spec can be found at
Please file feature requests and bugs at the [issue tracker][tracker].
[tracker]: https://github.com/dart-lang/sdk/issues
## Running tests locally
1. Build the SDK
```
gclient sync -D && \
./tools/build.py -ax64 create_sdk
```
Note: for a release build, add the `-mrelease` flag: `./tools/build.py -mrelease -ax64 create_sdk`
2. Run the tests
- To run all the tests: `python3 tools/test.py [ -mdebug | -mrelease ] -ax64 -j4 pkg/vm_service`
- To run a single test: `dart pkg/vm_service/test/<test_name>.dart`

View file

@ -27,17 +27,12 @@ extension DartIOExtension on VmService {
Future<Version> getDartIOVersion(String isolateId) =>
_callHelper('ext.dart.io.getVersion', isolateId);
/// Start profiling new socket connections. Statistics for sockets created
/// before profiling was enabled will not be recorded.
@Deprecated('Use socketProfilingEnabled instead')
Future<Success> startSocketProfiling(String isolateId) =>
_callHelper('ext.dart.io.startSocketProfiling', isolateId);
/// Pause recording socket statistics. [clearSocketProfile] must be called in
/// order for collected statistics to be cleared.
@Deprecated('Use socketProfilingEnabled instead')
Future<Success> pauseSocketProfiling(String isolateId) =>
_callHelper('ext.dart.io.pauseSocketProfiling', isolateId);
/// Whether socket profiling is available for the given [isolateId].
Future<bool> isSocketProfilingAvailable(String isolateId) async {
final Isolate isolate = await getIsolate(isolateId);
return (isolate.extensionRPCs ?? [])
.contains('ext.dart.io.getSocketProfile');
}
/// The _socketProfilingEnabled_ RPC is used to enable/disable the socket profiler
/// and query its current state. If `enabled` is provided, the profiler state will
@ -47,41 +42,33 @@ extension DartIOExtension on VmService {
/// event will be sent on the `Extension` stream.
Future<SocketProfilingState> socketProfilingEnabled(String isolateId,
[bool? enabled]) async {
assert(await isSocketProfilingAvailable(isolateId));
return _callHelper('ext.dart.io.socketProfilingEnabled', isolateId, args: {
if (enabled != null) 'enabled': enabled,
});
}
/// Removes all statistics associated with prior and current sockets.
Future<Success> clearSocketProfile(String isolateId) =>
_callHelper('ext.dart.io.clearSocketProfile', isolateId);
Future<Success> clearSocketProfile(String isolateId) async {
assert(await isSocketProfilingAvailable(isolateId));
return _callHelper('ext.dart.io.clearSocketProfile', isolateId);
}
/// The `getSocketProfile` RPC is used to retrieve socket statistics collected
/// by the socket profiler. Only samples collected after the initial
/// [socketProfilingEnabled] call or the last call to [clearSocketProfile]
/// will be reported.
Future<SocketProfile> getSocketProfile(String isolateId) =>
_callHelper('ext.dart.io.getSocketProfile', isolateId);
Future<SocketProfile> getSocketProfile(String isolateId) async {
assert(await isSocketProfilingAvailable(isolateId));
return _callHelper('ext.dart.io.getSocketProfile', isolateId);
}
/// Gets the current state of HTTP logging for a given isolate.
///
/// Warning: The returned [Future] will not complete if the target isolate is paused
/// and will only complete when the isolate is resumed.
@Deprecated('Use httpEnableTimelineLogging instead.')
Future<HttpTimelineLoggingState> getHttpEnableTimelineLogging(
String isolateId) =>
_callHelper('ext.dart.io.getHttpEnableTimelineLogging', isolateId);
/// Enables or disables HTTP logging for a given isolate.
///
/// Warning: The returned [Future] will not complete if the target isolate is paused
/// and will only complete when the isolate is resumed.
@Deprecated('Use httpEnableTimelineLogging instead.')
Future<Success> setHttpEnableTimelineLogging(
String isolateId, bool enabled) =>
_callHelper('ext.dart.io.setHttpEnableTimelineLogging', isolateId, args: {
'enabled': enabled,
});
/// Whether HTTP timeline logging is available for the given [isolateId].
Future<bool> isHttpTimelineLoggingAvailable(String isolateId) async {
final Isolate isolate = await getIsolate(isolateId);
final rpcs = isolate.extensionRPCs ?? [];
return rpcs.contains('ext.dart.io.httpEnableTimelineLogging');
}
/// The `httpEnableTimelineLogging` RPC is used to set and inspect the value of
/// `HttpClient.enableTimelineLogging`, which determines if HTTP client requests
@ -90,8 +77,11 @@ extension DartIOExtension on VmService {
///
/// If the value of `HttpClient.enableTimelineLogging` is changed, a
/// `HttpTimelineLoggingStateChange` event will be sent on the `Extension` stream.
Future<HttpTimelineLoggingState> httpEnableTimelineLogging(String isolateId,
[bool? enabled]) async {
Future<HttpTimelineLoggingState> httpEnableTimelineLogging(
String isolateId, [
bool? enabled,
]) async {
assert(await isHttpTimelineLoggingAvailable(isolateId));
final version = await _version(isolateId);
// Parameter name changed in version 1.4.
final enableKey =
@ -104,6 +94,12 @@ extension DartIOExtension on VmService {
});
}
/// Whether HTTP profiling is available for the given [isolateId].
Future<bool> isHttpProfilingAvailable(String isolateId) async {
final Isolate isolate = await getIsolate(isolateId);
return (isolate.extensionRPCs ?? []).contains('ext.dart.io.getHttpProfile');
}
/// The `getHttpProfile` RPC is used to retrieve HTTP profiling information
/// for requests made via `dart:io`'s `HttpClient`.
///
@ -113,26 +109,38 @@ extension DartIOExtension on VmService {
///
/// If `updatedSince` is provided, only requests started or updated since
/// the specified time will be reported.
Future<HttpProfile> getHttpProfile(String isolateId, {int? updatedSince}) =>
_callHelper('ext.dart.io.getHttpProfile', isolateId, args: {
if (updatedSince != null) 'updatedSince': updatedSince,
});
Future<HttpProfile> getHttpProfile(
String isolateId, {
int? updatedSince,
}) async {
assert(await isHttpProfilingAvailable(isolateId));
return _callHelper('ext.dart.io.getHttpProfile', isolateId, args: {
if (updatedSince != null) 'updatedSince': updatedSince,
});
}
/// The `getHttpProfileRequest` RPC is used to retrieve an instance of
/// [HttpProfileRequest], which includes request and response body data.
Future<HttpProfileRequest> getHttpProfileRequest(
String isolateId, String id) =>
_callHelper('ext.dart.io.getHttpProfileRequest', isolateId, args: {
'id': id,
});
String isolateId,
String id,
) async {
assert(await isHttpProfilingAvailable(isolateId));
return _callHelper('ext.dart.io.getHttpProfileRequest', isolateId, args: {
'id': id,
});
}
/// The `clearHttpProfile` RPC is used to clear previously recorded HTTP
/// requests from the HTTP profiler state. Requests still in-flight after
/// clearing the profiler state will be ignored by the profiler.
Future<Success> clearHttpProfile(String isolateId) => _callHelper(
'ext.dart.io.clearHttpProfile',
isolateId,
);
Future<Success> clearHttpProfile(String isolateId) async {
assert(await isHttpProfilingAvailable(isolateId));
return _callHelper(
'ext.dart.io.clearHttpProfile',
isolateId,
);
}
/// The `getOpenFiles` RPC is used to retrieve the list of files currently
/// opened files by `dart:io` from a given isolate.

View file

@ -1,5 +1,6 @@
name: vm_service
version: 12.0.1
version: 13.0.0
description: >-
A library to communicate with a service implementing the Dart VM
service protocol.

View file

@ -9,18 +9,16 @@ import 'package:vm_service/vm_service.dart';
import 'common/test_helper.dart';
const String kSetHttpEnableTimelineLogging =
'ext.dart.io.setHttpEnableTimelineLogging';
const String kGetHttpEnableTimelineLogging =
'ext.dart.io.getHttpEnableTimelineLogging';
const String kHttpEnableTimelineLogging =
'ext.dart.io.httpEnableTimelineLogging';
Future<void> setup() async {}
Future<void> waitForStreamEvent(
VmService service, IsolateRef isolateRef, bool state,
{bool useSetter = true}) async {
VmService service,
IsolateRef isolateRef,
bool state,
) async {
final completer = Completer<void>();
final isolateId = isolateRef.id!;
late StreamSubscription sub;
@ -32,13 +30,7 @@ Future<void> waitForStreamEvent(
completer.complete();
});
await service.streamListen(EventStreams.kExtension);
if (useSetter) {
// ignore: deprecated_member_use_from_same_package
await service.setHttpEnableTimelineLogging(isolateId, state);
} else {
await service.httpEnableTimelineLogging(isolateId, state);
}
await service.httpEnableTimelineLogging(isolateId, state);
await completer.future;
await service.streamCancel(EventStreams.kExtension);
}
@ -48,38 +40,18 @@ var tests = <IsolateTest>[
final isolate = await service.getIsolate(isolateRef.id!);
// Ensure all HTTP service extensions are registered.
expect(isolate.extensionRPCs!.length, greaterThanOrEqualTo(2));
expect(
isolate.extensionRPCs!.contains(kGetHttpEnableTimelineLogging), isTrue);
expect(
isolate.extensionRPCs!.contains(kSetHttpEnableTimelineLogging), isTrue);
expect(isolate.extensionRPCs!.contains(kHttpEnableTimelineLogging), isTrue);
},
(VmService service, IsolateRef isolateRef) async {
final isolateId = isolateRef.id!;
// ignore: deprecated_member_use_from_same_package
dynamic response = await service.getHttpEnableTimelineLogging(isolateId);
expect(response.enabled, false);
await waitForStreamEvent(service, isolateRef, true);
// ignore: deprecated_member_use_from_same_package
response = await service.getHttpEnableTimelineLogging(isolateId);
expect(response.enabled, true);
await waitForStreamEvent(service, isolateRef, false);
// ignore: deprecated_member_use_from_same_package
response = await service.getHttpEnableTimelineLogging(isolateId);
expect(response.enabled, false);
},
(VmService service, IsolateRef isolateRef) async {
final isolateId = isolateRef.id!;
dynamic response = await service.httpEnableTimelineLogging(isolateId, null);
expect(response.enabled, false);
await waitForStreamEvent(service, isolateRef, true, useSetter: false);
await waitForStreamEvent(service, isolateRef, true);
response = await service.httpEnableTimelineLogging(isolateId, null);
expect(response.enabled, true);
await waitForStreamEvent(service, isolateRef, false, useSetter: false);
await waitForStreamEvent(service, isolateRef, false);
response = await service.httpEnableTimelineLogging(isolateId);
expect(response.enabled, false);
},

View file

@ -17,14 +17,14 @@ const String udpContent = 'aghfkjdb';
const String kClearSocketProfileRPC = 'ext.dart.io.clearSocketProfile';
const String kGetSocketProfileRPC = 'ext.dart.io.getSocketProfile';
const String kGetVersionRPC = 'ext.dart.io.getVersion';
const String kPauseSocketProfilingRPC = 'ext.dart.io.pauseSocketProfiling';
const String kStartSocketProfilingRPC = 'ext.dart.io.startSocketProfiling';
const String kSocketProfilingEnabledRPC = 'ext.dart.io.socketProfilingEnabled';
const String localhost = '127.0.0.1';
Future<void> waitForStreamEvent(
VmService service, IsolateRef isolateRef, bool state,
{bool useSetter = true}) async {
VmService service,
IsolateRef isolateRef,
bool state,
) async {
final completer = Completer<void>();
final isolateId = isolateRef.id!;
late StreamSubscription sub;
@ -36,16 +36,7 @@ Future<void> waitForStreamEvent(
completer.complete();
});
await service.streamListen(EventStreams.kExtension);
if (useSetter) {
state
// ignore: deprecated_member_use_from_same_package
? await service.startSocketProfiling(isolateId)
// ignore: deprecated_member_use_from_same_package
: await service.pauseSocketProfiling(isolateId);
} else {
await service.socketProfilingEnabled(isolateId, state);
}
await service.socketProfilingEnabled(isolateId, state);
await completer.future;
await service.streamCancel(EventStreams.kExtension);
}
@ -89,9 +80,6 @@ var tests = <IsolateTest>[
expect(isolate.extensionRPCs!.length, greaterThanOrEqualTo(5));
expect(isolate.extensionRPCs!.contains(kClearSocketProfileRPC), isTrue);
expect(isolate.extensionRPCs!.contains(kGetVersionRPC), isTrue);
expect(isolate.extensionRPCs!.contains(kPauseSocketProfilingRPC), isTrue);
expect(isolate.extensionRPCs!.contains(kStartSocketProfilingRPC), isTrue);
expect(isolate.extensionRPCs!.contains(kPauseSocketProfilingRPC), isTrue);
expect(isolate.extensionRPCs!.contains(kSocketProfilingEnabledRPC), isTrue);
},
@ -117,14 +105,6 @@ var tests = <IsolateTest>[
await waitForStreamEvent(service, isolateRef, initial);
expect((await service.socketProfilingEnabled(isolateId)).enabled, initial);
},
(VmService service, IsolateRef isolateRef) async {
final isolateId = isolateRef.id!;
final initial = (await service.socketProfilingEnabled(isolateId)).enabled;
await waitForStreamEvent(service, isolateRef, !initial, useSetter: false);
expect((await service.socketProfilingEnabled(isolateId)).enabled, !initial);
await waitForStreamEvent(service, isolateRef, initial, useSetter: false);
expect((await service.socketProfilingEnabled(isolateId)).enabled, initial);
}
// TODO(bkonyi): fully port observatory test for socket profiling.
];

View file

@ -7,10 +7,9 @@ import 'package:observatory/service_io.dart';
import 'package:test/test.dart';
import 'test_helper.dart';
const String kSetHttpEnableTimelineLogging =
'ext.dart.io.setHttpEnableTimelineLogging';
const String kGetHttpEnableTimelineLogging =
'ext.dart.io.getHttpEnableTimelineLogging';
const String kHttpEnableTimelineLogging =
'ext.dart.io.httpEnableTimelineLogging';
Future<void> setup() async {}
var tests = <IsolateTest>[
@ -18,33 +17,30 @@ var tests = <IsolateTest>[
await isolate.load();
// Ensure all HTTP service extensions are registered.
expect(isolate.extensionRPCs.length, greaterThanOrEqualTo(2));
expect(
isolate.extensionRPCs.contains(kGetHttpEnableTimelineLogging), isTrue);
expect(
isolate.extensionRPCs.contains(kSetHttpEnableTimelineLogging), isTrue);
expect(isolate.extensionRPCs.contains(kHttpEnableTimelineLogging), isTrue);
},
(Isolate isolate) async {
await isolate.load();
var response =
await isolate.invokeRpcNoUpgrade(kGetHttpEnableTimelineLogging, {});
await isolate.invokeRpcNoUpgrade(kHttpEnableTimelineLogging, {});
expect(response['type'], 'HttpTimelineLoggingState');
expect(response['enabled'], false);
response = await isolate
.invokeRpcNoUpgrade(kSetHttpEnableTimelineLogging, {'enabled': true});
expect(response['type'], 'Success');
.invokeRpcNoUpgrade(kHttpEnableTimelineLogging, {'enabled': true});
expect(response['type'], 'HttpTimelineLoggingState');
expect(response['enabled'], true);
response =
await isolate.invokeRpcNoUpgrade(kGetHttpEnableTimelineLogging, {});
response = await isolate.invokeRpcNoUpgrade(kHttpEnableTimelineLogging, {});
expect(response['type'], 'HttpTimelineLoggingState');
expect(response['enabled'], true);
response = await isolate
.invokeRpcNoUpgrade(kSetHttpEnableTimelineLogging, {'enabled': false});
expect(response['type'], 'Success');
.invokeRpcNoUpgrade(kHttpEnableTimelineLogging, {'enabled': false});
expect(response['type'], 'HttpTimelineLoggingState');
expect(response['enabled'], false);
response =
await isolate.invokeRpcNoUpgrade(kGetHttpEnableTimelineLogging, {});
response = await isolate.invokeRpcNoUpgrade(kHttpEnableTimelineLogging, {});
expect(response['type'], 'HttpTimelineLoggingState');
expect(response['enabled'], false);
},
@ -52,11 +48,13 @@ var tests = <IsolateTest>[
// Bad argument.
try {
await isolate.invokeRpcNoUpgrade(
kSetHttpEnableTimelineLogging, {'enabled': 'foo'});
kHttpEnableTimelineLogging,
{'enabled': 'foo'},
);
} catch (e) {/* expected */}
// Missing argument.
try {
await isolate.invokeRpcNoUpgrade(kSetHttpEnableTimelineLogging, {});
await isolate.invokeRpcNoUpgrade(kHttpEnableTimelineLogging, {});
} catch (e) {/* expected */}
},
];

View file

@ -18,8 +18,7 @@ const String udpContent = 'aghfkjdb';
const String kClearSocketProfileRPC = 'ext.dart.io.clearSocketProfile';
const String kGetSocketProfileRPC = 'ext.dart.io.getSocketProfile';
const String kGetVersionRPC = 'ext.dart.io.getVersion';
const String kPauseSocketProfilingRPC = 'ext.dart.io.pauseSocketProfiling';
const String kStartSocketProfilingRPC = 'ext.dart.io.startSocketProfiling';
const String kSocketProfilingEnabledRPC = 'ext.dart.io.socketProfilingEnabled';
const String localhost = '127.0.0.1';
List<Object> sockets = [];
@ -78,9 +77,7 @@ var tests = <IsolateTest>[
expect(isolate.extensionRPCs.length, greaterThanOrEqualTo(5));
expect(isolate.extensionRPCs.contains(kClearSocketProfileRPC), isTrue);
expect(isolate.extensionRPCs.contains(kGetVersionRPC), isTrue);
expect(isolate.extensionRPCs.contains(kPauseSocketProfilingRPC), isTrue);
expect(isolate.extensionRPCs.contains(kStartSocketProfilingRPC), isTrue);
expect(isolate.extensionRPCs.contains(kPauseSocketProfilingRPC), isTrue);
expect(isolate.extensionRPCs.contains(kSocketProfilingEnabledRPC), isTrue);
},
// Test getSocketProfiler
@ -95,15 +92,16 @@ var tests = <IsolateTest>[
expect(response['sockets'].length, 0);
},
// Test getSocketProfile and startSocketProfiling
// Test getSocketProfile and socketProfilingEnabled
(Isolate isolate) async {
await isolate.load();
Library lib = isolate.rootLibrary;
await lib.load();
var response =
await isolate.invokeRpcNoUpgrade(kStartSocketProfilingRPC, {});
expect(response['type'], 'Success');
var response = await isolate
.invokeRpcNoUpgrade(kSocketProfilingEnabledRPC, {'enabled': true});
expect(response['type'], 'SocketProfilingState');
expect(response['enabled'], true);
// Check whether socketTest has finished.
Completer completer = Completer();
@ -189,18 +187,21 @@ var tests = <IsolateTest>[
expect(response['sockets'].length, 0);
},
// Test pauseSocketProfiling
// Test socketProfilingEnabled
(Isolate isolate) async {
await isolate.load();
Library lib = isolate.rootLibrary;
await lib.load();
var response =
await isolate.invokeRpcNoUpgrade(kStartSocketProfilingRPC, {});
expect(response['type'], 'Success');
var response = await isolate
.invokeRpcNoUpgrade(kSocketProfilingEnabledRPC, {'enabled': true});
expect(response['type'], 'SocketProfilingState');
expect(response['enabled'], true);
response = await isolate.invokeRpcNoUpgrade(kPauseSocketProfilingRPC, {});
expect(response['type'], 'Success');
response = await isolate
.invokeRpcNoUpgrade(kSocketProfilingEnabledRPC, {'enabled': false});
expect(response['type'], 'SocketProfilingState');
expect(response['enabled'], false);
// Check whether socketTest has finished.
Completer completer = Completer();

View file

@ -7,10 +7,9 @@ import 'package:observatory_2/service_io.dart';
import 'package:test/test.dart';
import 'test_helper.dart';
const String kSetHttpEnableTimelineLogging =
'ext.dart.io.setHttpEnableTimelineLogging';
const String kGetHttpEnableTimelineLogging =
'ext.dart.io.getHttpEnableTimelineLogging';
const String kHttpEnableTimelineLogging =
'ext.dart.io.httpEnableTimelineLogging';
Future<void> setup() async {}
var tests = <IsolateTest>[
@ -18,33 +17,30 @@ var tests = <IsolateTest>[
await isolate.load();
// Ensure all HTTP service extensions are registered.
expect(isolate.extensionRPCs.length, greaterThanOrEqualTo(2));
expect(
isolate.extensionRPCs.contains(kGetHttpEnableTimelineLogging), isTrue);
expect(
isolate.extensionRPCs.contains(kSetHttpEnableTimelineLogging), isTrue);
expect(isolate.extensionRPCs.contains(kHttpEnableTimelineLogging), isTrue);
},
(Isolate isolate) async {
await isolate.load();
var response =
await isolate.invokeRpcNoUpgrade(kGetHttpEnableTimelineLogging, {});
await isolate.invokeRpcNoUpgrade(kHttpEnableTimelineLogging, {});
expect(response['type'], 'HttpTimelineLoggingState');
expect(response['enabled'], false);
response = await isolate
.invokeRpcNoUpgrade(kSetHttpEnableTimelineLogging, {'enabled': true});
expect(response['type'], 'Success');
.invokeRpcNoUpgrade(kHttpEnableTimelineLogging, {'enabled': true});
expect(response['type'], 'HttpTimelineLoggingState');
expect(response['enabled'], true);
response =
await isolate.invokeRpcNoUpgrade(kGetHttpEnableTimelineLogging, {});
response = await isolate.invokeRpcNoUpgrade(kHttpEnableTimelineLogging, {});
expect(response['type'], 'HttpTimelineLoggingState');
expect(response['enabled'], true);
response = await isolate
.invokeRpcNoUpgrade(kSetHttpEnableTimelineLogging, {'enabled': false});
expect(response['type'], 'Success');
.invokeRpcNoUpgrade(kHttpEnableTimelineLogging, {'enabled': false});
expect(response['type'], 'HttpTimelineLoggingState');
expect(response['enabled'], false);
response =
await isolate.invokeRpcNoUpgrade(kGetHttpEnableTimelineLogging, {});
response = await isolate.invokeRpcNoUpgrade(kHttpEnableTimelineLogging, {});
expect(response['type'], 'HttpTimelineLoggingState');
expect(response['enabled'], false);
},
@ -52,11 +48,13 @@ var tests = <IsolateTest>[
// Bad argument.
try {
await isolate.invokeRpcNoUpgrade(
kSetHttpEnableTimelineLogging, {'enabled': 'foo'});
kHttpEnableTimelineLogging,
{'enabled': 'foo'},
);
} catch (e) {/* expected */}
// Missing argument.
try {
await isolate.invokeRpcNoUpgrade(kSetHttpEnableTimelineLogging, {});
await isolate.invokeRpcNoUpgrade(kHttpEnableTimelineLogging, {});
} catch (e) {/* expected */}
},
];

View file

@ -18,8 +18,7 @@ const String udpContent = 'aghfkjdb';
const String kClearSocketProfileRPC = 'ext.dart.io.clearSocketProfile';
const String kGetSocketProfileRPC = 'ext.dart.io.getSocketProfile';
const String kGetVersionRPC = 'ext.dart.io.getVersion';
const String kPauseSocketProfilingRPC = 'ext.dart.io.pauseSocketProfiling';
const String kStartSocketProfilingRPC = 'ext.dart.io.startSocketProfiling';
const String kSocketProfilingEnabledRPC = 'ext.dart.io.socketProfilingEnabled';
const String localhost = '127.0.0.1';
List<Object> sockets = [];
@ -78,9 +77,7 @@ var tests = <IsolateTest>[
expect(isolate.extensionRPCs.length, greaterThanOrEqualTo(5));
expect(isolate.extensionRPCs.contains(kClearSocketProfileRPC), isTrue);
expect(isolate.extensionRPCs.contains(kGetVersionRPC), isTrue);
expect(isolate.extensionRPCs.contains(kPauseSocketProfilingRPC), isTrue);
expect(isolate.extensionRPCs.contains(kStartSocketProfilingRPC), isTrue);
expect(isolate.extensionRPCs.contains(kPauseSocketProfilingRPC), isTrue);
expect(isolate.extensionRPCs.contains(kSocketProfilingEnabledRPC), isTrue);
},
// Test getSocketProfiler
@ -95,15 +92,16 @@ var tests = <IsolateTest>[
expect(response['sockets'].length, 0);
},
// Test getSocketProfile and startSocketProfiling
// Test getSocketProfile and socketProfilingEnabled
(Isolate isolate) async {
await isolate.load();
Library lib = isolate.rootLibrary;
await lib.load();
var response =
await isolate.invokeRpcNoUpgrade(kStartSocketProfilingRPC, {});
expect(response['type'], 'Success');
var response = await isolate
.invokeRpcNoUpgrade(kSocketProfilingEnabledRPC, {'enabled': true});
expect(response['type'], 'SocketProfilingState');
expect(response['enabled'], true);
// Check whether socketTest has finished.
Completer completer = Completer();
@ -189,18 +187,21 @@ var tests = <IsolateTest>[
expect(response['sockets'].length, 0);
},
// Test pauseSocketProfiling
// Test socketProfilingEnabled
(Isolate isolate) async {
await isolate.load();
Library lib = isolate.rootLibrary;
await lib.load();
var response =
await isolate.invokeRpcNoUpgrade(kStartSocketProfilingRPC, {});
expect(response['type'], 'Success');
var response = await isolate
.invokeRpcNoUpgrade(kSocketProfilingEnabledRPC, {'enabled': true});
expect(response['type'], 'SocketProfilingState');
expect(response['enabled'], true);
response = await isolate.invokeRpcNoUpgrade(kPauseSocketProfilingRPC, {});
expect(response['type'], 'Success');
response = await isolate
.invokeRpcNoUpgrade(kSocketProfilingEnabledRPC, {'enabled': false});
expect(response['type'], 'SocketProfilingState');
expect(response['enabled'], false);
// Check whether socketTest has finished.
Completer completer = Completer();

View file

@ -37,28 +37,6 @@ event will be sent on the `Extension` stream.
See [SocketProfilingState](#socketprofilingstate).
### startSocketProfiling
```
@Deprecated
Success startSocketProfiling(string isolateId)
```
Start profiling new socket connections. Statistics for sockets created before profiling was enabled will not be recorded.
See [Success](#success).
### pauseSocketProfiling
```
@Deprecated
Success pauseSocketProfiling(string isolateId)
```
Pause recording socket statistics. [clearSocketProfile](#clearsocketprofile) must be called in order for collected statistics to be cleared.
See [Success](#success).
### clearSocketProfile
```
@ -69,6 +47,16 @@ Removes all statistics associated with prior and current sockets.
See [Success](#success).
### getSocketProfile
```
SocketProfile getSocketProfile(string isolateId)
```
The _getSocketProfile_ RPC is used to retrieve socket statistics collected by the socket profiler.
Only samples collected after socket profiling was enabled by calling [socketProfilingEnabled](#socketProfilingEnabled)
or after the last call to [clearSocketProfile](#clearsocketprofile) will be reported.
### getOpenFileById
```
@ -113,42 +101,6 @@ The _getSpawnedProcesses_ RPC is used to retrieve the list of processed opened b
See [SpawnedProcessList](#spawnedprocesslist) and [SpawnedProcess](#spawnedprocess).
### getSocketProfile
```
SocketProfile getSocketProfile(string isolateId)
```
The _getSocketProfile_ RPC is used to retrieve socket statistics collected by
the socket profiler. Only samples collected after the initial [startSocketProfiling](#startsocketprofiling) or the last call to [clearSocketProfile](#clearsocketprofile) will be reported.
### getHttpEnableTimelineLogging
```
@Deprecated
HttpTimelineLoggingState getHttpEnableTimelineLogging(string isolateId)
```
The _getHttpEnableTimelineLogging_ RPC is used to remotely inspect the value of
`HttpClient.enableTimelineLogging`, which determines if HTTP client requests
should be logged to the timeline.
See [HttpTimelineLoggingState](#httptimelineloggingstate).
### setHttpEnableTimelineLogging
```
@Deprecated
Success setHttpEnableTimelineLogging(string isolateId, bool enable)
```
The _setHttpEnableTimelineLogging_ RPC is used to remotely set the value of
`HttpClient.enableTimelineLogging`, which determines if HTTP client requests
should be logged to the timeline. Note: this will only change the state of HTTP
timeline logging for the isolate specified by `isolateId`.
See [Success](#success).
### httpEnableTimelineLogging
```
@ -636,3 +588,5 @@ version | comments
1.3 | Added `httpEnableTimelineLogging` RPC and `HttpTimelineLoggingStateChange` event, deprecated `getHttpEnableTimelineLogging` and `setHttpEnableTimelineLogging`.
1.4 | Updated `httpEnableTimelineLogging` parameter `enable` to `enabled`. `enable` will continue to be accepted.
1.5 | Added `socketProfilingEnabled` RPC and `SocketProfilingStateChanged` event, deprecated `startSocketProfiling` and `pauseSocketProfiling`.
1.6 | Added `isSocketProfilingAvailable`, `isHttpTimelineLoggingAvailable`, `isHttpProfilingAvailable`, removed deprecated RPCs `startSocketProfiling`,
`pauseSocketProfiling`, `getHttpEnableTimelineLogging`, and `setHttpEnableTimelineLogging`.

View file

@ -5,7 +5,7 @@
part of dart.io;
// TODO(bkonyi): refactor into io_resource_info.dart
const int _versionMajor = 2;
const int _versionMajor = 3;
const int _versionMinor = 0;
const String _tcpSocket = 'tcp';
@ -14,12 +14,6 @@ const String _udpSocket = 'udp';
@pragma('vm:entry-point', !const bool.fromEnvironment("dart.vm.product"))
abstract class _NetworkProfiling {
// Http relative RPCs
@Deprecated('Use httpEnableTimelineLogging instead')
static const _kGetHttpEnableTimelineLogging =
'ext.dart.io.getHttpEnableTimelineLogging';
@Deprecated('Use httpEnableTimelineLogging instead')
static const _kSetHttpEnableTimelineLogging =
'ext.dart.io.setHttpEnableTimelineLogging';
static const _kHttpEnableTimelineLogging =
'ext.dart.io.httpEnableTimelineLogging';
static const _kGetHttpProfileRPC = 'ext.dart.io.getHttpProfile';
@ -30,10 +24,6 @@ abstract class _NetworkProfiling {
static const _kGetSocketProfileRPC = 'ext.dart.io.getSocketProfile';
static const _kSocketProfilingEnabledRPC =
'ext.dart.io.socketProfilingEnabled';
@Deprecated('Use socketProfilingEnabled instead')
static const _kPauseSocketProfilingRPC = 'ext.dart.io.pauseSocketProfiling';
@Deprecated('Use socketProfilingEnabled instead')
static const _kStartSocketProfilingRPC = 'ext.dart.io.startSocketProfiling';
// TODO(zichangguo): This version number represents the version of service
// extension of dart:io. Consider moving this out of web profiler class,
@ -42,12 +32,8 @@ abstract class _NetworkProfiling {
@pragma('vm:entry-point', !const bool.fromEnvironment("dart.vm.product"))
static void _registerServiceExtension() {
registerExtension(_kGetHttpEnableTimelineLogging, _serviceExtensionHandler);
registerExtension(_kSetHttpEnableTimelineLogging, _serviceExtensionHandler);
registerExtension(_kHttpEnableTimelineLogging, _serviceExtensionHandler);
registerExtension(_kGetSocketProfileRPC, _serviceExtensionHandler);
registerExtension(_kStartSocketProfilingRPC, _serviceExtensionHandler);
registerExtension(_kPauseSocketProfilingRPC, _serviceExtensionHandler);
registerExtension(_kSocketProfilingEnabledRPC, _serviceExtensionHandler);
registerExtension(_kClearSocketProfileRPC, _serviceExtensionHandler);
registerExtension(_kGetVersionRPC, _serviceExtensionHandler);
@ -61,12 +47,6 @@ abstract class _NetworkProfiling {
try {
String responseJson;
switch (method) {
case _kGetHttpEnableTimelineLogging:
responseJson = _getHttpEnableTimelineLogging();
break;
case _kSetHttpEnableTimelineLogging:
responseJson = _setHttpEnableTimelineLogging(parameters);
break;
case _kHttpEnableTimelineLogging:
if (parameters.containsKey('enabled')) {
_setHttpEnableTimelineLogging(parameters);
@ -93,12 +73,6 @@ abstract class _NetworkProfiling {
case _kSocketProfilingEnabledRPC:
responseJson = _socketProfilingEnabled(parameters);
break;
case _kStartSocketProfilingRPC:
responseJson = _SocketProfile.start();
break;
case _kPauseSocketProfilingRPC:
responseJson = _SocketProfile.pause();
break;
case _kClearSocketProfileRPC:
responseJson = _SocketProfile.clear();
break;