mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 17:40:04 +00:00
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:
parent
8e6a02d899
commit
112c08b418
|
@ -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.
|
||||
|
||||
|
|
|
@ -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`
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
},
|
||||
|
|
|
@ -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.
|
||||
];
|
||||
|
||||
|
|
|
@ -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 */}
|
||||
},
|
||||
];
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 */}
|
||||
},
|
||||
];
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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`.
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue