Skip to content

Commit

Permalink
Cleanup not needed stream processing. (#7561) (#7568)
Browse files Browse the repository at this point in the history
  • Loading branch information
kenzieschmoll authored Apr 11, 2024
1 parent 7de9101 commit ce95784
Show file tree
Hide file tree
Showing 4 changed files with 118 additions and 74 deletions.
4 changes: 4 additions & 0 deletions packages/devtools_shared/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# 9.1.0-wip
* Return valid extensions from the `apiServeAvailableExtensions` endpoint even when
an exception is thrown.

# 9.0.1
* Restructure `devtools_extensions.dart` and `devtools_extensions_io.dart` libraries.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,10 @@ $_extensionsKey:
}) {
final yamlEditor = YamlEditor('');
yamlEditor.update([], options);
_lookupOptionsFile(rootUri)?.writeAsStringSync(yamlEditor.toString());
_lookupOptionsFile(rootUri)?.writeAsStringSync(
yamlEditor.toString(),
flush: true,
);
}

/// Returns the `devtools_options.yaml` file in the [rootUri] directory.
Expand All @@ -129,7 +132,10 @@ $_extensionsKey:
if (!optionsFile.existsSync()) {
optionsFile
..createSync()
..writeAsStringSync(_defaultOptions);
..writeAsStringSync(
_defaultOptions,
flush: true,
);
}
return optionsFile;
}
Expand Down
2 changes: 1 addition & 1 deletion packages/devtools_shared/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: devtools_shared
description: Package of shared Dart structures between devtools_app, dds, and other tools.

version: 9.0.1
version: 9.1.0-wip

repository: https://github.com/flutter/devtools/tree/master/packages/devtools_shared

Expand Down
176 changes: 105 additions & 71 deletions packages/devtools_shared/test/server/devtools_extensions_api_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import 'dart:convert';
import 'dart:io';

import 'package:devtools_shared/devtools_extensions.dart';
import 'package:devtools_shared/devtools_shared.dart';
import 'package:devtools_shared/src/extensions/extension_manager.dart';
import 'package:devtools_shared/src/server/server_api.dart';
Expand All @@ -18,39 +19,41 @@ import '../helpers.dart';
late Directory testDirectory;
late String projectRoot;

// TODO(kenz): add tests for ExtensionsApi.apiExtensionEnabledState.

void main() {
late ExtensionsManager extensionsManager;

group(ExtensionsApi.apiServeAvailableExtensions, () {
setUp(() {
extensionsManager = ExtensionsManager();
});
setUp(() {
extensionsManager = ExtensionsManager();
});

tearDown(() async {
// Run with retry to ensure this deletes properly on Windows.
await deleteDirectoryWithRetry(testDirectory);
});
tearDown(() async {
// Run with retry to ensure this deletes properly on Windows.
await deleteDirectoryWithRetry(testDirectory);
});

Future<Response> serveExtensions(ExtensionsManager manager) async {
final request = Request(
'post',
Uri(
scheme: 'https',
host: 'localhost',
path: ExtensionsApi.apiServeAvailableExtensions,
queryParameters: {
ExtensionsApi.extensionRootPathPropertyName: projectRoot,
},
),
);
return await ServerApi.handle(
request,
extensionsManager: manager,
deeplinkManager: FakeDeeplinkManager(),
);
}

group(ExtensionsApi.apiServeAvailableExtensions, () {
test('succeeds for valid extensions', () async {
await _setupTestDirectoryStructure();
final request = Request(
'post',
Uri(
scheme: 'https',
host: 'localhost',
path: ExtensionsApi.apiServeAvailableExtensions,
queryParameters: {
ExtensionsApi.extensionRootPathPropertyName: projectRoot,
},
),
);
final response = await ServerApi.handle(
request,
extensionsManager: extensionsManager,
deeplinkManager: FakeDeeplinkManager(),
);
final response = await serveExtensions(extensionsManager);
expect(response.statusCode, HttpStatus.ok);
expect(extensionsManager.devtoolsExtensions.length, 2);
expect(extensionsManager.devtoolsExtensions[0].name, 'drift');
Expand All @@ -59,22 +62,7 @@ void main() {

test('succeeds with mix of valid and invalid extensions', () async {
await _setupTestDirectoryStructure(includeBadExtension: true);
final request = Request(
'post',
Uri(
scheme: 'https',
host: 'localhost',
path: ExtensionsApi.apiServeAvailableExtensions,
queryParameters: {
ExtensionsApi.extensionRootPathPropertyName: projectRoot,
},
),
);
final Response response = await ServerApi.handle(
request,
extensionsManager: extensionsManager,
deeplinkManager: FakeDeeplinkManager(),
);
final response = await serveExtensions(extensionsManager);
expect(response.statusCode, HttpStatus.ok);
expect(extensionsManager.devtoolsExtensions.length, 2);
expect(extensionsManager.devtoolsExtensions[0].name, 'drift');
Expand All @@ -92,22 +80,7 @@ void main() {
test('succeeds for valid extensions when an exception is thrown', () async {
await _setupTestDirectoryStructure();
extensionsManager = _TestExtensionsManager();
final request = Request(
'post',
Uri(
scheme: 'https',
host: 'localhost',
path: ExtensionsApi.apiServeAvailableExtensions,
queryParameters: {
ExtensionsApi.extensionRootPathPropertyName: projectRoot,
},
),
);
final response = await ServerApi.handle(
request,
extensionsManager: extensionsManager,
deeplinkManager: FakeDeeplinkManager(),
);
final response = await serveExtensions(extensionsManager);
expect(response.statusCode, HttpStatus.ok);
expect(extensionsManager.devtoolsExtensions.length, 2);
expect(extensionsManager.devtoolsExtensions[0].name, 'drift');
Expand All @@ -119,34 +92,95 @@ void main() {
expect(warning, contains('Fake exception for test'));
});

test('fails when an exception is thrown and there are no valid extensions',
() async {
await _setupTestDirectoryStructure(
includeDependenciesWithExtensions: false,
);
extensionsManager = _TestExtensionsManager();
test(
'fails when an exception is thrown and there are no valid extensions',
() async {
await _setupTestDirectoryStructure(
includeDependenciesWithExtensions: false,
);
extensionsManager = _TestExtensionsManager();
final response = await serveExtensions(extensionsManager);
expect(response.statusCode, HttpStatus.internalServerError);
expect(extensionsManager.devtoolsExtensions, isEmpty);

final parsedResponse =
json.decode(await response.readAsString()) as Map;
final error = parsedResponse['error'];
expect(error, contains('Fake exception for test'));
},
);
});

group(ExtensionsApi.apiExtensionEnabledState, () {
late File optionsFile;

setUp(() async {
await _setupTestDirectoryStructure();
optionsFile =
File(p.join(testDirectory.path, 'my_app', 'devtools_options.yaml'));
});

Future<Response> sendEnabledStateRequest({
required String extensionName,
required bool enable,
}) async {
final request = Request(
'post',
Uri(
scheme: 'https',
host: 'localhost',
path: ExtensionsApi.apiServeAvailableExtensions,
path: ExtensionsApi.apiExtensionEnabledState,
queryParameters: {
ExtensionsApi.extensionRootPathPropertyName: projectRoot,
ExtensionsApi.extensionNamePropertyName: extensionName,
ExtensionsApi.enabledStatePropertyName: enable.toString(),
},
),
);
final response = await ServerApi.handle(
return await ServerApi.handle(
request,
extensionsManager: extensionsManager,
deeplinkManager: FakeDeeplinkManager(),
);
expect(response.statusCode, HttpStatus.internalServerError);
expect(extensionsManager.devtoolsExtensions, isEmpty);
}

final parsedResponse = json.decode(await response.readAsString()) as Map;
final error = parsedResponse['error'];
expect(error, contains('Fake exception for test'));
test('options file does not exist until first acesss', () async {
await serveExtensions(extensionsManager);
expect(optionsFile.existsSync(), isFalse);
});

test('can get and set enabled states', () async {
await serveExtensions(extensionsManager);
var response = await sendEnabledStateRequest(
extensionName: 'drift',
enable: true,
);
expect(response.statusCode, HttpStatus.ok);
expect(
jsonDecode(await response.readAsString()),
ExtensionEnabledState.enabled.name,
);

response = await sendEnabledStateRequest(
extensionName: 'provider',
enable: false,
);
expect(response.statusCode, HttpStatus.ok);
expect(
jsonDecode(await response.readAsString()),
ExtensionEnabledState.disabled.name,
);

expect(optionsFile.existsSync(), isTrue);
expect(
optionsFile.readAsStringSync(),
contains(
'''
extensions:
- drift: true
- provider: false''',
),
);
});
});
}
Expand Down

0 comments on commit ce95784

Please sign in to comment.