Split DDC integration tests between AMD and DDC Library Bundle module systems (#2788)
Migrates `integration` tests to `*_amd_test` and `_ddc_library_bundle_test` files.
diff --git a/dwds/CHANGELOG.md b/dwds/CHANGELOG.md
index cf0cb27..3da791e 100644
--- a/dwds/CHANGELOG.md
+++ b/dwds/CHANGELOG.md
@@ -10,6 +10,7 @@
- Add sourcemap logic fixes to DDC Library Bundle + build_runner execution scheme.
- Update pathing logic for Windows and the DDC Library Bundle module system.
- Fix serialization of `HotRestartRequest` in `AppConnection`.
+- Split integration tests across DDC module systems.
- Split additional tests across DDC module systems.
## 27.0.0
diff --git a/dwds/test/integration/breakpoint_amd_test.dart b/dwds/test/integration/breakpoint_amd_test.dart
new file mode 100644
index 0000000..d6a5ae4
--- /dev/null
+++ b/dwds/test/integration/breakpoint_amd_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn('vm')
+@Timeout(Duration(minutes: 2))
+library;
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:test/test.dart';
+import 'package:test_common/test_sdk_configuration.dart';
+
+import 'breakpoint_common.dart';
+import 'fixtures/context.dart';
+
+void main() {
+ // Enable verbose logging for debugging.
+ const debug = false;
+
+ final provider = TestSdkConfigurationProvider(
+ verbose: debug,
+ ddcModuleFormat: ModuleFormat.amd,
+ );
+ tearDownAll(provider.dispose);
+
+ group('Build Daemon |', () {
+ testBreakpoint(
+ provider: provider,
+ compilationMode: CompilationMode.buildDaemon,
+ );
+ });
+
+ group('Frontend Server |', () {
+ testBreakpoint(
+ provider: provider,
+ compilationMode: CompilationMode.frontendServer,
+ );
+ });
+}
diff --git a/dwds/test/integration/build_daemon_breakpoint_test.dart b/dwds/test/integration/breakpoint_common.dart
similarity index 72%
rename from dwds/test/integration/build_daemon_breakpoint_test.dart
rename to dwds/test/integration/breakpoint_common.dart
index 47dc759..230f2f0 100644
--- a/dwds/test/integration/build_daemon_breakpoint_test.dart
+++ b/dwds/test/integration/breakpoint_common.dart
@@ -2,27 +2,34 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-@TestOn('vm')
-@Timeout(Duration(minutes: 2))
-library;
-
import 'package:test/test.dart';
+import 'package:test_common/logging.dart';
import 'package:test_common/test_sdk_configuration.dart';
import 'package:vm_service/vm_service.dart';
import 'package:vm_service_interface/vm_service_interface.dart';
import 'fixtures/context.dart';
import 'fixtures/project.dart';
+import 'fixtures/utilities.dart';
-void main() {
- final provider = TestSdkConfigurationProvider();
- tearDownAll(provider.dispose);
-
+void testBreakpoint({
+ required TestSdkConfigurationProvider provider,
+ required CompilationMode compilationMode,
+ bool verboseCompiler = false,
+}) {
final context = TestContext(TestProject.testPackage(), provider);
group('shared context', () {
setUpAll(() async {
- await context.setUp();
+ setCurrentLogWriter(debug: provider.verbose);
+ await context.setUp(
+ testSettings: TestSettings(
+ compilationMode: compilationMode,
+ verboseCompiler: verboseCompiler,
+ canaryFeatures: provider.canaryFeatures,
+ moduleFormat: provider.ddcModuleFormat,
+ ),
+ );
});
tearDownAll(() async {
@@ -41,6 +48,7 @@
setUp(() async {
service = context.service;
+ setCurrentLogWriter(debug: provider.verbose);
vm = await service.getVM();
isolate = await service.getIsolate(vm.isolates!.first.id!);
isolateId = isolate.id!;
@@ -56,7 +64,13 @@
});
tearDown(() async {
- await service.resume(isolateId);
+ // We must resume execution in case a test left the isolate paused, but
+ // error 106 is expected if the isolate is already running.
+ try {
+ await service.resume(isolateId);
+ } on RPCError catch (e) {
+ if (e.code != 106) rethrow;
+ }
});
test('set breakpoint', () async {
@@ -130,7 +144,7 @@
var currentIsolate = await service.getIsolate(isolateId);
expect(currentIsolate.breakpoints, containsAll([bp1]));
- // Remove breakpoints so they don't impact other tests.
+ // Remove breakpoint so it doesn't impact other tests.
await service.removeBreakpoint(isolateId, bp1.id!);
currentIsolate = await service.getIsolate(isolateId);
@@ -161,7 +175,7 @@
var currentIsolate = await service.getIsolate(isolateId);
expect(currentIsolate.breakpoints, containsAll([breakpoints[0]]));
- // Remove breakpoints so they don't impact other tests.
+ // Remove breakpoint so it doesn't impact other tests.
await service.removeBreakpoint(isolateId, breakpoints[0].id!);
currentIsolate = await service.getIsolate(isolateId);
@@ -188,7 +202,7 @@
var currentIsolate = await service.getIsolate(isolateId);
expect(currentIsolate.breakpoints, containsAll([bp]));
- // Remove breakpoints so they don't impact other tests.
+ // Remove breakpoint so it doesn't impact other tests.
await service.removeBreakpoint(isolateId, bp.id!);
await expectLater(
service.removeBreakpoint(isolateId, bp.id!),
@@ -198,6 +212,37 @@
currentIsolate = await service.getIsolate(isolateId);
expect(currentIsolate.breakpoints, isEmpty);
});
+
+ test('set breakpoint inside a JavaScript line succeeds', () async {
+ final line = await context.findBreakpointLine(
+ 'printNestedObjectMultiLine',
+ isolateId,
+ mainScript,
+ );
+ final column = 0;
+ final bp = await service.addBreakpointWithScriptUri(
+ isolateId,
+ mainScriptUri,
+ line,
+ column: column,
+ );
+
+ await stream.firstWhere(
+ (Event event) => event.kind == EventKind.kPauseBreakpoint,
+ );
+
+ expect(bp, isNotNull);
+ expect(
+ bp.location,
+ isA<SourceLocation>()
+ .having((loc) => loc.script, 'script', equals(mainScript))
+ .having((loc) => loc.line, 'line', equals(line))
+ .having((loc) => loc.column, 'column', greaterThan(column)),
+ );
+
+ // Remove breakpoint so it doesn't impact other tests.
+ await service.removeBreakpoint(isolateId, bp.id!);
+ });
});
});
}
diff --git a/dwds/test/integration/breakpoint_ddc_library_bundle_test.dart b/dwds/test/integration/breakpoint_ddc_library_bundle_test.dart
new file mode 100644
index 0000000..15d1f38
--- /dev/null
+++ b/dwds/test/integration/breakpoint_ddc_library_bundle_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn('vm')
+@Timeout(Duration(minutes: 2))
+library;
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:test/test.dart';
+import 'package:test_common/test_sdk_configuration.dart';
+
+import 'breakpoint_common.dart';
+import 'fixtures/context.dart';
+
+void main() {
+ // Enable verbose logging for debugging.
+ const debug = false;
+
+ final provider = TestSdkConfigurationProvider(
+ verbose: debug,
+ ddcModuleFormat: ModuleFormat.ddc,
+ canaryFeatures: true,
+ );
+ tearDownAll(provider.dispose);
+
+ group('Build Daemon |', () {
+ testBreakpoint(
+ provider: provider,
+ compilationMode: CompilationMode.buildDaemon,
+ );
+ });
+
+ group('Frontend Server |', () {
+ testBreakpoint(
+ provider: provider,
+ compilationMode: CompilationMode.frontendServer,
+ );
+ });
+}
diff --git a/dwds/test/integration/build_daemon_callstack_test.dart b/dwds/test/integration/build_daemon_callstack_test.dart
deleted file mode 100644
index c93b58f..0000000
--- a/dwds/test/integration/build_daemon_callstack_test.dart
+++ /dev/null
@@ -1,330 +0,0 @@
-// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-@TestOn('vm')
-@Timeout(Duration(minutes: 2))
-library;
-
-import 'package:test/test.dart';
-import 'package:test_common/logging.dart';
-import 'package:test_common/test_sdk_configuration.dart';
-import 'package:vm_service/vm_service.dart';
-import 'package:vm_service_interface/vm_service_interface.dart';
-
-import 'fixtures/context.dart';
-import 'fixtures/project.dart';
-import 'fixtures/utilities.dart';
-
-void main() {
- final provider = TestSdkConfigurationProvider();
- tearDownAll(provider.dispose);
-
- group('shared context |', () {
- // Enable verbose logging for debugging.
- const debug = false;
-
- final project = TestProject.testPackage();
- final context = TestContext(project, provider);
-
- setUpAll(() async {
- setCurrentLogWriter(debug: debug);
- await context.setUp(
- testSettings: TestSettings(
- compilationMode: CompilationMode.buildDaemon,
- enableExpressionEvaluation: true,
- verboseCompiler: debug,
- ),
- );
- });
-
- tearDownAll(() async {
- await context.tearDown();
- });
-
- group('callStack |', () {
- late VmServiceInterface service;
- VM vm;
- late Isolate isolate;
- ScriptList scripts;
- late ScriptRef mainScript;
- late ScriptRef testLibraryScript;
- late Stream<Event> stream;
-
- setUp(() async {
- setCurrentLogWriter(debug: debug);
- service = context.service;
- vm = await service.getVM();
- isolate = await service.getIsolate(vm.isolates!.first.id!);
- scripts = await service.getScripts(isolate.id!);
-
- await service.streamListen('Debug');
- stream = service.onEvent('Debug');
-
- final testPackage = context.project.packageName;
- mainScript = scripts.scripts!.firstWhere(
- (each) => each.uri!.contains('main.dart'),
- );
- testLibraryScript = scripts.scripts!.firstWhere(
- (each) =>
- each.uri!.contains('package:$testPackage/test_library.dart'),
- );
- });
-
- tearDown(() async {
- await service.resume(isolate.id!);
- });
-
- Future<void> onBreakPoint(
- BreakpointTestData breakpoint,
- Future<void> Function() body,
- ) async {
- Breakpoint? bp;
- try {
- final bpId = breakpoint.bpId;
- final script = breakpoint.script;
- final line = await context.findBreakpointLine(
- bpId,
- isolate.id!,
- script,
- );
- bp = await service.addBreakpointWithScriptUri(
- isolate.id!,
- script.uri!,
- line,
- );
-
- expect(bp, isNotNull);
- expect(bp.location, _matchBpLocation(script, line, 0));
-
- await stream.firstWhere(
- (Event event) => event.kind == EventKind.kPauseBreakpoint,
- );
-
- await body();
- } finally {
- // Remove breakpoint so it doesn't impact other tests or retries.
- if (bp != null) {
- await service.removeBreakpoint(isolate.id!, bp.id!);
- }
- }
- }
-
- Future<void> testCallStack(
- List<BreakpointTestData> breakpoints, {
- int frameIndex = 1,
- }) async {
- // Find lines the breakpoints are located on.
- final lines = await Future.wait(
- breakpoints.map(
- (frame) => context.findBreakpointLine(
- frame.bpId,
- isolate.id!,
- frame.script,
- ),
- ),
- );
-
- // Get current stack.
- final stack = await service.getStack(isolate.id!);
-
- // Verify the stack is correct.
- expect(stack.frames!.length, greaterThanOrEqualTo(lines.length));
- final expected = [
- for (var i = 0; i < lines.length; i++)
- _matchFrame(
- breakpoints[i].script,
- breakpoints[i].function,
- lines[i],
- ),
- ];
- expect(stack.frames, containsAll(expected));
-
- // Verify that expression evaluation is not failing.
- final instance = await service.evaluateInFrame(
- isolate.id!,
- frameIndex,
- 'true',
- );
- expect(instance, isA<InstanceRef>());
- }
-
- test('breakpoint succeeds with correct callstack', () async {
- // Expected breakpoints on the stack
- final breakpoints = [
- BreakpointTestData(
- 'printEnclosingObject',
- 'printEnclosingObject',
- mainScript,
- ),
- BreakpointTestData(
- 'printEnclosingFunctionMultiLine',
- 'printNestedObjectsMultiLine',
- mainScript,
- ),
- BreakpointTestData(
- 'callPrintEnclosingFunctionMultiLine',
- '<closure>',
- mainScript,
- ),
- ];
- await onBreakPoint(breakpoints[0], () => testCallStack(breakpoints));
- });
-
- test('expression evaluation succeeds on parent frame', () async {
- // Expected breakpoints on the stack
- final breakpoints = [
- BreakpointTestData(
- 'testLibraryClassConstructor',
- 'new',
- testLibraryScript,
- ),
- BreakpointTestData(
- 'createLibraryObject',
- 'printFieldFromLibraryClass',
- mainScript,
- ),
- BreakpointTestData(
- 'callPrintFieldFromLibraryClass',
- '<closure>',
- mainScript,
- ),
- ];
- await onBreakPoint(
- breakpoints[0],
- () => testCallStack(breakpoints, frameIndex: 2),
- );
- });
-
- test('breakpoint inside a line gives correct callstack', () async {
- // Expected breakpoints on the stack
- final breakpoints = [
- BreakpointTestData('newEnclosedClass', 'new', mainScript),
- BreakpointTestData(
- 'printNestedObjectMultiLine',
- 'printNestedObjectsMultiLine',
- mainScript,
- ),
- BreakpointTestData(
- 'callPrintEnclosingFunctionMultiLine',
- '<closure>',
- mainScript,
- ),
- ];
- await onBreakPoint(breakpoints[0], () => testCallStack(breakpoints));
- });
-
- test('breakpoint gives correct callstack after step out', () async {
- // Expected breakpoints on the stack
- final breakpoints = [
- BreakpointTestData('newEnclosedClass', 'new', mainScript),
- BreakpointTestData(
- 'printEnclosingObjectMultiLine',
- 'printNestedObjectsMultiLine',
- mainScript,
- ),
- BreakpointTestData(
- 'callPrintEnclosingFunctionMultiLine',
- '<closure>',
- mainScript,
- ),
- ];
- await onBreakPoint(breakpoints[0], () async {
- await service.resume(isolate.id!, step: 'Out');
- await stream.firstWhere(
- (Event event) => event.kind == EventKind.kPauseInterrupted,
- );
- return testCallStack([breakpoints[1], breakpoints[2]]);
- });
- });
-
- test('breakpoint gives correct callstack after step in', () async {
- // Expected breakpoints on the stack
- final breakpoints = [
- BreakpointTestData('newEnclosedClass', 'new', mainScript),
- BreakpointTestData(
- 'printNestedObjectMultiLine',
- 'printNestedObjectsMultiLine',
- mainScript,
- ),
- BreakpointTestData(
- 'callPrintEnclosingFunctionMultiLine',
- '<closure>',
- mainScript,
- ),
- ];
- await onBreakPoint(breakpoints[1], () async {
- await service.resume(isolate.id!, step: 'Into');
- await stream.firstWhere(
- (Event event) => event.kind == EventKind.kPauseInterrupted,
- );
- return testCallStack(breakpoints);
- });
- });
-
- test(
- 'breakpoint gives correct callstack after step into chain calls',
- () async {
- // Expected breakpoints on the stack
- final breakpoints = [
- BreakpointTestData(
- 'createObjectWithMethod',
- 'createObject',
- mainScript,
- ),
- BreakpointTestData(
- // This is currently incorrect, should be printObjectMultiLine.
- // See issue: https://github.com/dart-lang/sdk/issues/48874
- 'printMultiLine',
- 'printObjectMultiLine',
- mainScript,
- ),
- BreakpointTestData(
- 'callPrintObjectMultiLine',
- '<closure>',
- mainScript,
- ),
- ];
- final bp = BreakpointTestData(
- 'printMultiLine',
- 'printObjectMultiLine',
- mainScript,
- );
- await onBreakPoint(bp, () async {
- await service.resume(isolate.id!, step: 'Into');
- await stream.firstWhere(
- (Event event) => event.kind == EventKind.kPauseInterrupted,
- );
- return testCallStack(breakpoints);
- });
- },
- );
- });
- });
-}
-
-Matcher _matchFrame(ScriptRef script, String function, int line) => isA<Frame>()
- .having((frame) => frame.code!.name, 'function', function)
- .having(
- (frame) => frame.location,
- 'location',
- _matchFrameLocation(script, line),
- );
-
-Matcher _matchBpLocation(ScriptRef script, int line, int column) =>
- isA<SourceLocation>()
- .having((loc) => loc.script, 'script', equals(script))
- .having((loc) => loc.line, 'line', equals(line))
- .having((loc) => loc.column, 'column', greaterThanOrEqualTo(column));
-
-Matcher _matchFrameLocation(ScriptRef script, int line) => isA<SourceLocation>()
- .having((loc) => loc.script, 'script', equals(script))
- .having((loc) => loc.line, 'line', equals(line));
-
-class BreakpointTestData {
- String bpId;
- String function;
- ScriptRef script;
-
- BreakpointTestData(this.bpId, this.function, this.script);
-}
diff --git a/dwds/test/integration/build_daemon_circular_evaluate_test.dart b/dwds/test/integration/build_daemon_circular_evaluate_test.dart
deleted file mode 100644
index 7e8823e..0000000
--- a/dwds/test/integration/build_daemon_circular_evaluate_test.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-@TestOn('vm')
-@Timeout(Duration(minutes: 2))
-library;
-
-import 'package:test/test.dart';
-import 'package:test_common/test_sdk_configuration.dart';
-
-import 'evaluate_circular_common.dart';
-import 'fixtures/context.dart';
-
-void main() async {
- // Enable verbose logging for debugging.
- const debug = false;
-
- final provider = TestSdkConfigurationProvider(verbose: debug);
- tearDownAll(provider.dispose);
-
- testAll(provider: provider, compilationMode: CompilationMode.buildDaemon);
-}
diff --git a/dwds/test/integration/build_daemon_evaluate_test.dart b/dwds/test/integration/build_daemon_evaluate_test.dart
deleted file mode 100644
index ec756c4..0000000
--- a/dwds/test/integration/build_daemon_evaluate_test.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-@Tags(['daily'])
-@TestOn('vm')
-@Timeout(Duration(minutes: 2))
-library;
-
-import 'package:test/test.dart';
-import 'package:test_common/test_sdk_configuration.dart';
-
-import 'evaluate_common.dart';
-import 'fixtures/context.dart';
-
-void main() async {
- // Enable verbose logging for debugging.
- const debug = false;
-
- final provider = TestSdkConfigurationProvider(verbose: debug);
- tearDownAll(provider.dispose);
-
- testAll(provider: provider, compilationMode: CompilationMode.buildDaemon);
-}
diff --git a/dwds/test/integration/build_daemon_parts_evaluate_test.dart b/dwds/test/integration/build_daemon_parts_evaluate_test.dart
deleted file mode 100644
index bafb960..0000000
--- a/dwds/test/integration/build_daemon_parts_evaluate_test.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-@TestOn('vm')
-@Timeout(Duration(minutes: 2))
-library;
-
-import 'package:test/test.dart';
-import 'package:test_common/test_sdk_configuration.dart';
-
-import 'evaluate_parts_common.dart';
-import 'fixtures/context.dart';
-
-void main() async {
- // Enable verbose logging for debugging.
- const debug = false;
-
- final provider = TestSdkConfigurationProvider(verbose: debug);
- tearDownAll(provider.dispose);
-
- testAll(provider: provider, compilationMode: CompilationMode.buildDaemon);
-}
diff --git a/dwds/test/integration/callstack_amd_test.dart b/dwds/test/integration/callstack_amd_test.dart
new file mode 100644
index 0000000..9deda58
--- /dev/null
+++ b/dwds/test/integration/callstack_amd_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn('vm')
+@Timeout(Duration(minutes: 2))
+library;
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:test/test.dart';
+import 'package:test_common/test_sdk_configuration.dart';
+
+import 'callstack_common.dart';
+import 'fixtures/context.dart';
+
+void main() {
+ // Enable verbose logging for debugging.
+ const debug = false;
+
+ final provider = TestSdkConfigurationProvider(
+ verbose: debug,
+ ddcModuleFormat: ModuleFormat.amd,
+ );
+ tearDownAll(provider.dispose);
+
+ group('Build Daemon |', () {
+ testCallStack(
+ provider: provider,
+ compilationMode: CompilationMode.buildDaemon,
+ );
+ });
+
+ group('Frontend Server |', () {
+ testCallStack(
+ provider: provider,
+ compilationMode: CompilationMode.frontendServer,
+ );
+ });
+}
diff --git a/dwds/test/integration/frontend_server_callstack_test.dart b/dwds/test/integration/callstack_common.dart
similarity index 93%
rename from dwds/test/integration/frontend_server_callstack_test.dart
rename to dwds/test/integration/callstack_common.dart
index 64ff9e3..5f7c652 100644
--- a/dwds/test/integration/frontend_server_callstack_test.dart
+++ b/dwds/test/integration/callstack_common.dart
@@ -2,10 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-@TestOn('vm')
-@Timeout(Duration(minutes: 2))
-library;
-
import 'package:test/test.dart';
import 'package:test_common/logging.dart';
import 'package:test_common/test_sdk_configuration.dart';
@@ -16,24 +12,24 @@
import 'fixtures/project.dart';
import 'fixtures/utilities.dart';
-void main() {
- // Enable verbose logging for debugging.
- const debug = false;
-
- final provider = TestSdkConfigurationProvider(verbose: debug);
- tearDownAll(provider.dispose);
+void testCallStack({
+ required TestSdkConfigurationProvider provider,
+ required CompilationMode compilationMode,
+ bool verboseCompiler = false,
+}) {
+ final project = TestProject.testPackage();
+ final context = TestContext(project, provider);
group('shared context |', () {
- final project = TestProject.testPackage();
- final context = TestContext(project, provider);
-
setUpAll(() async {
- setCurrentLogWriter(debug: debug);
+ setCurrentLogWriter(debug: provider.verbose);
await context.setUp(
testSettings: TestSettings(
- compilationMode: CompilationMode.frontendServer,
+ compilationMode: compilationMode,
enableExpressionEvaluation: true,
- verboseCompiler: debug,
+ verboseCompiler: verboseCompiler,
+ moduleFormat: provider.ddcModuleFormat,
+ canaryFeatures: provider.canaryFeatures,
),
);
});
@@ -53,7 +49,7 @@
late Stream<Event> stream;
setUp(() async {
- setCurrentLogWriter(debug: debug);
+ setCurrentLogWriter(debug: provider.verbose);
service = context.service;
vm = await service.getVM();
isolate = await service.getIsolate(vm.isolates!.first.id!);
@@ -74,7 +70,9 @@
});
tearDown(() async {
- await service.resume(isolateId);
+ try {
+ await service.resume(isolateId);
+ } catch (_) {}
});
Future<void> onBreakPoint(
diff --git a/dwds/test/integration/callstack_ddc_library_bundle_test.dart b/dwds/test/integration/callstack_ddc_library_bundle_test.dart
new file mode 100644
index 0000000..35e067c
--- /dev/null
+++ b/dwds/test/integration/callstack_ddc_library_bundle_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn('vm')
+@Timeout(Duration(minutes: 2))
+library;
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:test/test.dart';
+import 'package:test_common/test_sdk_configuration.dart';
+
+import 'callstack_common.dart';
+import 'fixtures/context.dart';
+
+void main() {
+ // Enable verbose logging for debugging.
+ const debug = false;
+
+ final provider = TestSdkConfigurationProvider(
+ verbose: debug,
+ ddcModuleFormat: ModuleFormat.ddc,
+ canaryFeatures: true,
+ );
+ tearDownAll(provider.dispose);
+
+ group('Build Daemon |', () {
+ testCallStack(
+ provider: provider,
+ compilationMode: CompilationMode.buildDaemon,
+ );
+ });
+
+ group('Frontend Server |', () {
+ testCallStack(
+ provider: provider,
+ compilationMode: CompilationMode.frontendServer,
+ );
+ });
+}
diff --git a/dwds/test/integration/circular_evaluate_amd_test.dart b/dwds/test/integration/circular_evaluate_amd_test.dart
new file mode 100644
index 0000000..a577469
--- /dev/null
+++ b/dwds/test/integration/circular_evaluate_amd_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@Tags(['daily'])
+@TestOn('vm')
+@Timeout(Duration(minutes: 5))
+library;
+
+import 'dart:io';
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:test/test.dart';
+import 'package:test_common/test_sdk_configuration.dart';
+
+import 'evaluate_circular_common.dart';
+import 'fixtures/context.dart';
+import 'fixtures/project.dart';
+
+void main() async {
+ // Enable verbose logging for debugging.
+ const debug = false;
+
+ final provider = TestSdkConfigurationProvider(
+ verbose: debug,
+ ddcModuleFormat: ModuleFormat.amd,
+ );
+ tearDownAll(provider.dispose);
+
+ group('Build Daemon |', () {
+ testAll(provider: provider, compilationMode: CompilationMode.buildDaemon);
+ });
+
+ group('Frontend Server |', () {
+ group('Context with circular dependencies |', () {
+ for (final indexBaseMode in IndexBaseMode.values) {
+ group(
+ 'with ${indexBaseMode.name} |',
+ () {
+ testAll(
+ provider: provider,
+ compilationMode: CompilationMode.frontendServer,
+ indexBaseMode: indexBaseMode,
+ useDebuggerModuleNames: true,
+ );
+ },
+ skip:
+ // https://github.com/dart-lang/sdk/issues/49277
+ indexBaseMode == IndexBaseMode.base && Platform.isWindows,
+ );
+ }
+ });
+ });
+}
diff --git a/dwds/test/integration/circular_evaluate_ddc_library_bundle_test.dart b/dwds/test/integration/circular_evaluate_ddc_library_bundle_test.dart
new file mode 100644
index 0000000..4eff848
--- /dev/null
+++ b/dwds/test/integration/circular_evaluate_ddc_library_bundle_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@Tags(['daily'])
+@TestOn('vm')
+@Timeout(Duration(minutes: 5))
+library;
+
+import 'dart:io';
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:test/test.dart';
+import 'package:test_common/test_sdk_configuration.dart';
+
+import 'evaluate_circular_common.dart';
+import 'fixtures/context.dart';
+import 'fixtures/project.dart';
+
+void main() async {
+ // Enable verbose logging for debugging.
+ const debug = false;
+
+ final provider = TestSdkConfigurationProvider(
+ verbose: debug,
+ ddcModuleFormat: ModuleFormat.ddc,
+ canaryFeatures: true,
+ );
+ tearDownAll(provider.dispose);
+
+ group('Build Daemon |', () {
+ testAll(provider: provider, compilationMode: CompilationMode.buildDaemon);
+ });
+
+ group('Frontend Server |', () {
+ group('Context with circular dependencies |', () {
+ for (final indexBaseMode in IndexBaseMode.values) {
+ group(
+ 'with ${indexBaseMode.name} |',
+ () {
+ testAll(
+ provider: provider,
+ compilationMode: CompilationMode.frontendServer,
+ indexBaseMode: indexBaseMode,
+ useDebuggerModuleNames: true,
+ );
+ },
+ skip:
+ // https://github.com/dart-lang/sdk/issues/49277
+ indexBaseMode == IndexBaseMode.base && Platform.isWindows,
+ );
+ }
+ });
+ });
+}
diff --git a/dwds/test/integration/frontend_server_ddc_evaluate_test.dart b/dwds/test/integration/evaluate_amd_test.dart
similarity index 79%
rename from dwds/test/integration/frontend_server_ddc_evaluate_test.dart
rename to dwds/test/integration/evaluate_amd_test.dart
index dc58202..821118c 100644
--- a/dwds/test/integration/frontend_server_ddc_evaluate_test.dart
+++ b/dwds/test/integration/evaluate_amd_test.dart
@@ -23,13 +23,17 @@
final provider = TestSdkConfigurationProvider(
verbose: debug,
- ddcModuleFormat: ModuleFormat.ddc,
+ ddcModuleFormat: ModuleFormat.amd,
);
tearDownAll(provider.dispose);
- for (final useDebuggerModuleNames in [false, true]) {
- group('Debugger module names: $useDebuggerModuleNames |', () {
- group('DDC module system |', () {
+ group('Build Daemon |', () {
+ testAll(provider: provider, compilationMode: CompilationMode.buildDaemon);
+ });
+
+ group('Frontend Server |', () {
+ for (final useDebuggerModuleNames in [false, true]) {
+ group('Debugger module names: $useDebuggerModuleNames |', () {
for (final indexBaseMode in IndexBaseMode.values) {
group(
'with ${indexBaseMode.name} |',
@@ -46,6 +50,6 @@
);
}
});
- });
- }
+ }
+ });
}
diff --git a/dwds/test/integration/evaluate_circular_common.dart b/dwds/test/integration/evaluate_circular_common.dart
index c5a0287..8c1477b 100644
--- a/dwds/test/integration/evaluate_circular_common.dart
+++ b/dwds/test/integration/evaluate_circular_common.dart
@@ -70,6 +70,8 @@
enableExpressionEvaluation: true,
useDebuggerModuleNames: useDebuggerModuleNames,
verboseCompiler: provider.verbose,
+ canaryFeatures: provider.canaryFeatures,
+ moduleFormat: provider.ddcModuleFormat,
),
);
});
diff --git a/dwds/test/integration/evaluate_ddc_library_bundle_test.dart b/dwds/test/integration/evaluate_ddc_library_bundle_test.dart
new file mode 100644
index 0000000..c0193eb
--- /dev/null
+++ b/dwds/test/integration/evaluate_ddc_library_bundle_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@Tags(['daily'])
+@TestOn('vm')
+@Timeout(Duration(minutes: 5))
+library;
+
+import 'dart:io';
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:test/test.dart';
+import 'package:test_common/test_sdk_configuration.dart';
+
+import 'evaluate_common.dart';
+import 'fixtures/context.dart';
+import 'fixtures/project.dart';
+
+void main() async {
+ // Enable verbose logging for debugging.
+ const debug = false;
+
+ group('Canary: true |', () {
+ final provider = TestSdkConfigurationProvider(
+ verbose: debug,
+ ddcModuleFormat: ModuleFormat.ddc,
+ canaryFeatures: true,
+ );
+ tearDownAll(provider.dispose);
+
+ group('Build Daemon |', () {
+ testAll(provider: provider, compilationMode: CompilationMode.buildDaemon);
+ });
+
+ group('Frontend Server |', () {
+ for (final useDebuggerModuleNames in [false, true]) {
+ group('Debugger module names: $useDebuggerModuleNames |', () {
+ for (final indexBaseMode in IndexBaseMode.values) {
+ group(
+ 'with ${indexBaseMode.name} |',
+ () {
+ testAll(
+ provider: provider,
+ compilationMode: CompilationMode.frontendServer,
+ indexBaseMode: indexBaseMode,
+ useDebuggerModuleNames: useDebuggerModuleNames,
+ );
+ },
+ // https://github.com/dart-lang/sdk/issues/49277
+ skip: indexBaseMode == IndexBaseMode.base && Platform.isWindows
+ ? 'Skipped on Windows when indexBaseMode is base. See issue: https://github.com/dart-lang/sdk/issues/49277'
+ : null,
+ );
+ }
+ });
+ }
+ });
+ });
+}
diff --git a/dwds/test/integration/evaluate_parts_common.dart b/dwds/test/integration/evaluate_parts_common.dart
index 7282b89..0d9bfef 100644
--- a/dwds/test/integration/evaluate_parts_common.dart
+++ b/dwds/test/integration/evaluate_parts_common.dart
@@ -75,8 +75,8 @@
enableExpressionEvaluation: true,
useDebuggerModuleNames: useDebuggerModuleNames,
verboseCompiler: provider.verbose,
- moduleFormat: provider.ddcModuleFormat,
canaryFeatures: provider.canaryFeatures,
+ moduleFormat: provider.ddcModuleFormat,
),
);
diff --git a/dwds/test/integration/events_common.dart b/dwds/test/integration/events_common.dart
index ce534f3..0350ee4 100644
--- a/dwds/test/integration/events_common.dart
+++ b/dwds/test/integration/events_common.dart
@@ -435,8 +435,13 @@
});
tearDown(() async {
- // Resume execution to not impact other tests.
- await service.resume(isolateId);
+ // We must resume execution in case a test left the isolate paused, but
+ // error 106 is expected if the isolate is already running.
+ try {
+ await service.resume(isolateId);
+ } on RPCError catch (e) {
+ if (e.code != 106) rethrow;
+ }
});
test('emits RESUME events', () async {
diff --git a/dwds/test/integration/expression_compiler_service_test.dart b/dwds/test/integration/expression_compiler_service_amd_test.dart
similarity index 100%
rename from dwds/test/integration/expression_compiler_service_test.dart
rename to dwds/test/integration/expression_compiler_service_amd_test.dart
diff --git a/dwds/test/integration/expression_compiler_service_ddc_and_canary_test.dart b/dwds/test/integration/expression_compiler_service_ddc_library_bundle_test.dart
similarity index 100%
rename from dwds/test/integration/expression_compiler_service_ddc_and_canary_test.dart
rename to dwds/test/integration/expression_compiler_service_ddc_library_bundle_test.dart
diff --git a/dwds/test/integration/frontend_server_breakpoint_test.dart b/dwds/test/integration/frontend_server_breakpoint_test.dart
deleted file mode 100644
index 24b2414..0000000
--- a/dwds/test/integration/frontend_server_breakpoint_test.dart
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-@TestOn('vm')
-@Timeout(Duration(minutes: 2))
-library;
-
-import 'package:test/test.dart';
-import 'package:test_common/logging.dart';
-import 'package:test_common/test_sdk_configuration.dart';
-import 'package:vm_service/vm_service.dart';
-import 'package:vm_service_interface/vm_service_interface.dart';
-
-import 'fixtures/context.dart';
-import 'fixtures/project.dart';
-import 'fixtures/utilities.dart';
-
-void main() {
- // Enable verbose logging for debugging.
- const debug = false;
-
- final provider = TestSdkConfigurationProvider(verbose: debug);
- tearDownAll(provider.dispose);
-
- final context = TestContext(TestProject.testPackage(), provider);
-
- // Change to 'true' to print expression compiler messages to console.
- //
- // Note: expression compiler runs in an isolate, so its output is not
- // currently redirected to a logger. As a result, it will be printed
- // regardless of the logger settings.
- final verboseCompiler = false;
- group('shared context', () {
- setUpAll(() async {
- setCurrentLogWriter(debug: debug);
- await context.setUp(
- testSettings: TestSettings(
- compilationMode: CompilationMode.frontendServer,
- verboseCompiler: verboseCompiler,
- canaryFeatures: provider.canaryFeatures,
- ),
- );
- });
-
- tearDownAll(() async {
- await context.tearDown();
- });
-
- group('breakpoint', () {
- late VmServiceInterface service;
- VM vm;
- late Isolate isolate;
- late String isolateId;
- ScriptList scripts;
- late ScriptRef mainScript;
- late String mainScriptUri;
- late Stream<Event> stream;
-
- setUp(() async {
- service = context.service;
- setCurrentLogWriter(debug: debug);
- vm = await service.getVM();
- isolate = await service.getIsolate(vm.isolates!.first.id!);
- isolateId = isolate.id!;
- scripts = await service.getScripts(isolateId);
-
- await service.streamListen('Debug');
- stream = service.onEvent('Debug');
-
- mainScript = scripts.scripts!.firstWhere(
- (each) => each.uri!.contains('main.dart'),
- );
- mainScriptUri = mainScript.uri!;
- });
-
- tearDown(() async {
- await service.resume(isolateId);
- });
-
- test('set breakpoint', () async {
- final line = await context.findBreakpointLine(
- 'printLocal',
- isolateId,
- mainScript,
- );
- final bp = await service.addBreakpointWithScriptUri(
- isolateId,
- mainScriptUri,
- line,
- );
-
- await stream.firstWhere(
- (Event event) => event.kind == EventKind.kPauseBreakpoint,
- );
-
- expect(bp, isNotNull);
-
- // Remove breakpoint so it doesn't impact other tests.
- await service.removeBreakpoint(isolateId, bp.id!);
- });
-
- test('set breakpoint again', () async {
- final line = await context.findBreakpointLine(
- 'printLocal',
- isolateId,
- mainScript,
- );
- final bp = await service.addBreakpointWithScriptUri(
- isolateId,
- mainScriptUri,
- line,
- );
-
- await stream.firstWhere(
- (Event event) => event.kind == EventKind.kPauseBreakpoint,
- );
-
- expect(bp, isNotNull);
-
- // Remove breakpoint so it doesn't impact other tests.
- await service.removeBreakpoint(isolateId, bp.id!);
- });
-
- test('set breakpoint inside a JavaScript line succeeds', () async {
- final line = await context.findBreakpointLine(
- 'printNestedObjectMultiLine',
- isolateId,
- mainScript,
- );
- final column = 0;
- final bp = await service.addBreakpointWithScriptUri(
- isolateId,
- mainScriptUri,
- line,
- column: column,
- );
-
- await stream.firstWhere(
- (Event event) => event.kind == EventKind.kPauseBreakpoint,
- );
-
- expect(bp, isNotNull);
- expect(
- bp.location,
- isA<SourceLocation>()
- .having((loc) => loc.script, 'script', equals(mainScript))
- .having((loc) => loc.line, 'line', equals(line))
- .having((loc) => loc.column, 'column', greaterThan(column)),
- );
-
- // Remove breakpoint so it doesn't impact other tests.
- await service.removeBreakpoint(isolateId, bp.id!);
- });
- });
- });
-}
diff --git a/dwds/test/integration/frontend_server_circular_evaluate_test.dart b/dwds/test/integration/frontend_server_circular_evaluate_test.dart
deleted file mode 100644
index 2e8e921..0000000
--- a/dwds/test/integration/frontend_server_circular_evaluate_test.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-@TestOn('vm')
-@Timeout(Duration(minutes: 2))
-library;
-
-import 'dart:io';
-
-import 'package:test/test.dart';
-import 'package:test_common/test_sdk_configuration.dart';
-
-import 'evaluate_circular_common.dart';
-import 'fixtures/context.dart';
-import 'fixtures/project.dart';
-
-void main() async {
- // Enable verbose logging for debugging.
- const debug = false;
-
- final provider = TestSdkConfigurationProvider(verbose: debug);
- tearDownAll(provider.dispose);
-
- group('Context with circular dependencies |', () {
- for (final indexBaseMode in IndexBaseMode.values) {
- group(
- 'with ${indexBaseMode.name} |',
- () {
- testAll(
- provider: provider,
- compilationMode: CompilationMode.frontendServer,
- indexBaseMode: indexBaseMode,
- useDebuggerModuleNames: true,
- );
- },
- skip:
- // https://github.com/dart-lang/sdk/issues/49277
- indexBaseMode == IndexBaseMode.base && Platform.isWindows,
- );
- }
- });
-}
diff --git a/dwds/test/integration/frontend_server_ddc_library_bundle_evaluate_test.dart b/dwds/test/integration/frontend_server_ddc_library_bundle_evaluate_test.dart
deleted file mode 100644
index 4a27968..0000000
--- a/dwds/test/integration/frontend_server_ddc_library_bundle_evaluate_test.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-@Tags(['daily'])
-@TestOn('vm')
-@Timeout(Duration(minutes: 5))
-library;
-
-import 'dart:io';
-
-import 'package:dwds/expression_compiler.dart';
-import 'package:test/test.dart';
-import 'package:test_common/test_sdk_configuration.dart';
-
-import 'evaluate_common.dart';
-import 'fixtures/context.dart';
-import 'fixtures/project.dart';
-
-void main() async {
- // Enable verbose logging for debugging.
- const debug = false;
-
- final provider = TestSdkConfigurationProvider(
- verbose: debug,
- ddcModuleFormat: ModuleFormat.ddc,
- canaryFeatures: true,
- );
- tearDownAll(provider.dispose);
-
- for (final useDebuggerModuleNames in [false, true]) {
- group('Debugger module names: $useDebuggerModuleNames |', () {
- group('DDC module system and canary |', () {
- for (final indexBaseMode in IndexBaseMode.values) {
- group(
- 'with ${indexBaseMode.name} |',
- () {
- testAll(
- provider: provider,
- compilationMode: CompilationMode.frontendServer,
- indexBaseMode: indexBaseMode,
- useDebuggerModuleNames: useDebuggerModuleNames,
- );
- },
- skip: indexBaseMode == IndexBaseMode.base && Platform.isWindows
- ? 'Skipped on Windows when indexBaseMode is base. See issue: https://github.com/dart-lang/sdk/issues/49277'
- : null,
- );
- }
- });
- });
- }
-}
diff --git a/dwds/test/integration/frontend_server_parts_evaluate_test.dart b/dwds/test/integration/frontend_server_parts_evaluate_test.dart
deleted file mode 100644
index e64b799..0000000
--- a/dwds/test/integration/frontend_server_parts_evaluate_test.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-@TestOn('vm')
-@Timeout(Duration(minutes: 2))
-library;
-
-import 'dart:io';
-
-import 'package:test/test.dart';
-import 'package:test_common/test_sdk_configuration.dart';
-
-import 'evaluate_parts_common.dart';
-import 'fixtures/context.dart';
-import 'fixtures/project.dart';
-
-void main() async {
- // Enable verbose logging for debugging.
- const debug = false;
-
- final provider = TestSdkConfigurationProvider(verbose: debug);
- tearDownAll(provider.dispose);
-
- group('Context with parts |', () {
- for (final indexBaseMode in IndexBaseMode.values) {
- group(
- 'with ${indexBaseMode.name} |',
- () {
- testAll(
- provider: provider,
- compilationMode: CompilationMode.frontendServer,
- indexBaseMode: indexBaseMode,
- useDebuggerModuleNames: true,
- );
- },
- skip:
- // https://github.com/dart-lang/sdk/issues/49277
- indexBaseMode == IndexBaseMode.base && Platform.isWindows,
- );
- }
- });
-}
diff --git a/dwds/test/integration/hot_reload_breakpoints_test.dart b/dwds/test/integration/hot_reload_breakpoints_common.dart
similarity index 95%
rename from dwds/test/integration/hot_reload_breakpoints_test.dart
rename to dwds/test/integration/hot_reload_breakpoints_common.dart
index 608b47e..9a22a7e 100644
--- a/dwds/test/integration/hot_reload_breakpoints_test.dart
+++ b/dwds/test/integration/hot_reload_breakpoints_common.dart
@@ -2,14 +2,8 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-@Tags(['daily'])
-@TestOn('vm')
-@Timeout(Duration(minutes: 5))
-library;
-
import 'dart:async';
-import 'package:dwds/expression_compiler.dart';
import 'package:test/test.dart';
import 'package:test_common/logging.dart';
import 'package:test_common/test_sdk_configuration.dart';
@@ -19,22 +13,16 @@
import 'fixtures/project.dart';
import 'fixtures/utilities.dart';
-void main() {
- // Enable verbose logging for debugging.
- const debug = false;
- final provider = TestSdkConfigurationProvider(
- verbose: debug,
- canaryFeatures: true,
- ddcModuleFormat: ModuleFormat.ddc,
- );
+void runTests({
+ required TestSdkConfigurationProvider provider,
+ required CompilationMode compilationMode,
+}) {
final project = TestProject.testHotReloadBreakpoints;
final context = TestContext(project, provider);
final mainFile = project.dartEntryFileName;
final callLogMarker = 'callLog';
final capturedStringMarker = 'capturedString';
- tearDownAll(provider.dispose);
-
Future<void> makeEditsAndRecompile(List<Edit> edits) async {
await context.makeEdits(edits);
await context.recompile(fullRestart: true);
@@ -45,13 +33,13 @@
late Stream<Event> stream;
setUp(() async {
- setCurrentLogWriter(debug: debug);
+ setCurrentLogWriter(debug: provider.verbose);
await context.setUp(
testSettings: TestSettings(
enableExpressionEvaluation: true,
- compilationMode: CompilationMode.frontendServer,
- moduleFormat: ModuleFormat.ddc,
- canaryFeatures: true,
+ compilationMode: compilationMode,
+ moduleFormat: provider.ddcModuleFormat,
+ canaryFeatures: provider.canaryFeatures,
),
);
client = await context.connectFakeClient();
@@ -529,13 +517,13 @@
late VmService client;
setUp(() async {
- setCurrentLogWriter(debug: debug);
+ setCurrentLogWriter(debug: provider.verbose);
await context.setUp(
testSettings: TestSettings(
enableExpressionEvaluation: true,
- compilationMode: CompilationMode.frontendServer,
- moduleFormat: ModuleFormat.ddc,
- canaryFeatures: true,
+ compilationMode: compilationMode,
+ moduleFormat: provider.ddcModuleFormat,
+ canaryFeatures: provider.canaryFeatures,
),
);
client = await context.connectFakeClient();
diff --git a/dwds/test/integration/hot_reload_breakpoints_ddc_library_bundle_test.dart b/dwds/test/integration/hot_reload_breakpoints_ddc_library_bundle_test.dart
new file mode 100644
index 0000000..93cd95c
--- /dev/null
+++ b/dwds/test/integration/hot_reload_breakpoints_ddc_library_bundle_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@Tags(['daily'])
+@TestOn('vm')
+@Timeout(Duration(minutes: 5))
+library;
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:test/test.dart';
+import 'package:test_common/test_sdk_configuration.dart';
+
+import 'fixtures/context.dart';
+import 'hot_reload_breakpoints_common.dart';
+
+void main() {
+ // Enable verbose logging for debugging.
+ const debug = false;
+ final provider = TestSdkConfigurationProvider(
+ verbose: debug,
+ canaryFeatures: true,
+ ddcModuleFormat: ModuleFormat.ddc,
+ );
+
+ tearDownAll(provider.dispose);
+
+ group('Frontend Server', () {
+ runTests(
+ provider: provider,
+ compilationMode: CompilationMode.frontendServer,
+ );
+ });
+}
diff --git a/dwds/test/integration/hot_reload_test.dart b/dwds/test/integration/hot_reload_common.dart
similarity index 86%
rename from dwds/test/integration/hot_reload_test.dart
rename to dwds/test/integration/hot_reload_common.dart
index 41080f7..65a1944 100644
--- a/dwds/test/integration/hot_reload_test.dart
+++ b/dwds/test/integration/hot_reload_common.dart
@@ -2,14 +2,8 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-@Tags(['daily'])
-@TestOn('vm')
-@Timeout(Duration(minutes: 5))
-library;
-
import 'dart:async';
-import 'package:dwds/expression_compiler.dart';
import 'package:test/test.dart';
import 'package:test_common/logging.dart';
import 'package:test_common/test_sdk_configuration.dart';
@@ -22,19 +16,13 @@
const originalString = 'Hello World!';
const newString = 'Bonjour le monde!';
-void main() {
- // Enable verbose logging for debugging.
- const debug = false;
- final provider = TestSdkConfigurationProvider(
- verbose: debug,
- canaryFeatures: true,
- ddcModuleFormat: ModuleFormat.ddc,
- );
+void runTests({
+ required TestSdkConfigurationProvider provider,
+ required CompilationMode compilationMode,
+}) {
final project = TestProject.testHotReload;
final context = TestContext(project, provider);
- tearDownAll(provider.dispose);
-
Future<void> recompile() async {
await context.recompile(fullRestart: false);
}
@@ -79,13 +67,13 @@
late VmService fakeClient;
setUp(() async {
- setCurrentLogWriter(debug: debug);
+ setCurrentLogWriter(debug: provider.verbose);
await context.setUp(
testSettings: TestSettings(
enableExpressionEvaluation: true,
- compilationMode: CompilationMode.frontendServer,
- moduleFormat: ModuleFormat.ddc,
- canaryFeatures: true,
+ compilationMode: compilationMode,
+ moduleFormat: provider.ddcModuleFormat,
+ canaryFeatures: provider.canaryFeatures,
),
);
fakeClient = await context.connectFakeClient();
diff --git a/dwds/test/integration/hot_reload_ddc_library_bundle_test.dart b/dwds/test/integration/hot_reload_ddc_library_bundle_test.dart
new file mode 100644
index 0000000..a01690e
--- /dev/null
+++ b/dwds/test/integration/hot_reload_ddc_library_bundle_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@Tags(['daily'])
+@TestOn('vm')
+@Timeout(Duration(minutes: 5))
+library;
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:test/test.dart';
+import 'package:test_common/test_sdk_configuration.dart';
+
+import 'fixtures/context.dart';
+import 'hot_reload_common.dart';
+
+void main() {
+ // Enable verbose logging for debugging.
+ const debug = false;
+ final provider = TestSdkConfigurationProvider(
+ verbose: debug,
+ canaryFeatures: true,
+ ddcModuleFormat: ModuleFormat.ddc,
+ );
+
+ tearDownAll(provider.dispose);
+
+ group('Frontend Server', () {
+ runTests(
+ provider: provider,
+ compilationMode: CompilationMode.frontendServer,
+ );
+ });
+}
diff --git a/dwds/test/integration/hot_restart_breakpoints_test.dart b/dwds/test/integration/hot_restart_breakpoints_common.dart
similarity index 99%
rename from dwds/test/integration/hot_restart_breakpoints_test.dart
rename to dwds/test/integration/hot_restart_breakpoints_common.dart
index c0a34fe..289af8e 100644
--- a/dwds/test/integration/hot_restart_breakpoints_test.dart
+++ b/dwds/test/integration/hot_restart_breakpoints_common.dart
@@ -2,11 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-@Tags(['daily'])
-@TestOn('vm')
-@Timeout(Duration(minutes: 5))
-library;
-
import 'dart:async';
import 'package:dwds/expression_compiler.dart';
diff --git a/dwds/test/integration/hot_restart_breakpoints_ddc_library_bundle_test.dart b/dwds/test/integration/hot_restart_breakpoints_ddc_library_bundle_test.dart
new file mode 100644
index 0000000..cd7c5ad
--- /dev/null
+++ b/dwds/test/integration/hot_restart_breakpoints_ddc_library_bundle_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@Tags(['daily'])
+@TestOn('vm')
+@Timeout(Duration(minutes: 5))
+library;
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:test/test.dart';
+import 'package:test_common/test_sdk_configuration.dart';
+
+import 'fixtures/context.dart';
+import 'hot_restart_breakpoints_common.dart';
+
+void main() {
+ // Enable verbose logging for debugging.
+ const debug = false;
+ final provider = TestSdkConfigurationProvider(
+ verbose: debug,
+ canaryFeatures: true,
+ ddcModuleFormat: ModuleFormat.ddc,
+ );
+
+ tearDownAll(provider.dispose);
+
+ group('Frontend Server', () {
+ runTests(
+ provider: provider,
+ compilationMode: CompilationMode.frontendServer,
+ );
+ });
+
+ group('Build Daemon', () {
+ runTests(provider: provider, compilationMode: CompilationMode.buildDaemon);
+ });
+}
diff --git a/dwds/test/integration/instances/common/instance_inspection_common.dart b/dwds/test/integration/instances/common/instance_inspection_common.dart
index c3ac0f1..64821ac 100644
--- a/dwds/test/integration/instances/common/instance_inspection_common.dart
+++ b/dwds/test/integration/instances/common/instance_inspection_common.dart
@@ -82,9 +82,13 @@
setUp(() => setCurrentLogWriter(debug: provider.verbose));
tearDown(() async {
+ // We must resume execution in case a test left the isolate paused, but
+ // error 106 is expected if the isolate is already running.
try {
await service.resume(isolateId);
- } catch (_) {}
+ } on RPCError catch (e) {
+ if (e.code != 106) rethrow;
+ }
});
group('Library |', () {
diff --git a/dwds/test/integration/frontend_server_evaluate_test.dart b/dwds/test/integration/parts_evaluate_amd_test.dart
similarity index 61%
rename from dwds/test/integration/frontend_server_evaluate_test.dart
rename to dwds/test/integration/parts_evaluate_amd_test.dart
index 71495fe..a8e0af4 100644
--- a/dwds/test/integration/frontend_server_evaluate_test.dart
+++ b/dwds/test/integration/parts_evaluate_amd_test.dart
@@ -9,10 +9,11 @@
import 'dart:io';
+import 'package:dwds/expression_compiler.dart';
import 'package:test/test.dart';
import 'package:test_common/test_sdk_configuration.dart';
-import 'evaluate_common.dart';
+import 'evaluate_parts_common.dart';
import 'fixtures/context.dart';
import 'fixtures/project.dart';
@@ -20,11 +21,18 @@
// Enable verbose logging for debugging.
const debug = false;
- final provider = TestSdkConfigurationProvider(verbose: debug);
+ final provider = TestSdkConfigurationProvider(
+ verbose: debug,
+ ddcModuleFormat: ModuleFormat.amd,
+ );
tearDownAll(provider.dispose);
- for (final useDebuggerModuleNames in [false, true]) {
- group('Debugger module names: $useDebuggerModuleNames |', () {
+ group('Build Daemon |', () {
+ testAll(provider: provider, compilationMode: CompilationMode.buildDaemon);
+ });
+
+ group('Frontend Server |', () {
+ group('Context with parts |', () {
for (final indexBaseMode in IndexBaseMode.values) {
group(
'with ${indexBaseMode.name} |',
@@ -33,13 +41,14 @@
provider: provider,
compilationMode: CompilationMode.frontendServer,
indexBaseMode: indexBaseMode,
- useDebuggerModuleNames: useDebuggerModuleNames,
+ useDebuggerModuleNames: true,
);
},
- // https://github.com/dart-lang/sdk/issues/49277
- skip: indexBaseMode == IndexBaseMode.base && Platform.isWindows,
+ skip:
+ // https://github.com/dart-lang/sdk/issues/49277
+ indexBaseMode == IndexBaseMode.base && Platform.isWindows,
);
}
});
- }
+ });
}
diff --git a/dwds/test/integration/parts_evaluate_ddc_library_bundle_test.dart b/dwds/test/integration/parts_evaluate_ddc_library_bundle_test.dart
new file mode 100644
index 0000000..4a8ea14
--- /dev/null
+++ b/dwds/test/integration/parts_evaluate_ddc_library_bundle_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@Tags(['daily'])
+@TestOn('vm')
+@Timeout(Duration(minutes: 5))
+library;
+
+import 'dart:io';
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:test/test.dart';
+import 'package:test_common/test_sdk_configuration.dart';
+
+import 'evaluate_parts_common.dart';
+import 'fixtures/context.dart';
+import 'fixtures/project.dart';
+
+void main() async {
+ // Enable verbose logging for debugging.
+ const debug = false;
+
+ final provider = TestSdkConfigurationProvider(
+ verbose: debug,
+ ddcModuleFormat: ModuleFormat.ddc,
+ canaryFeatures: true,
+ );
+ tearDownAll(provider.dispose);
+
+ group('Build Daemon |', () {
+ testAll(provider: provider, compilationMode: CompilationMode.buildDaemon);
+ });
+
+ group('Frontend Server |', () {
+ group('Context with parts |', () {
+ for (final indexBaseMode in IndexBaseMode.values) {
+ group(
+ 'with ${indexBaseMode.name} |',
+ () {
+ testAll(
+ provider: provider,
+ compilationMode: CompilationMode.frontendServer,
+ indexBaseMode: indexBaseMode,
+ useDebuggerModuleNames: true,
+ );
+ },
+ skip:
+ // https://github.com/dart-lang/sdk/issues/49277
+ indexBaseMode == IndexBaseMode.base && Platform.isWindows,
+ );
+ }
+ });
+ });
+}
diff --git a/dwds/test/integration/run_request_test.dart b/dwds/test/integration/run_request_test.dart
index d5e00cb..badb377 100644
--- a/dwds/test/integration/run_request_test.dart
+++ b/dwds/test/integration/run_request_test.dart
@@ -29,9 +29,12 @@
group('while debugger is attached', () {
late VmServiceInterface service;
setUp(() async {
- setCurrentLogWriter(debug: debug);
+ setCurrentLogWriter(debug: provider.verbose);
await context.setUp(
- testSettings: TestSettings(autoRun: false, verboseCompiler: debug),
+ testSettings: TestSettings(
+ autoRun: false,
+ verboseCompiler: provider.verbose,
+ ),
);
service = context.service;
});
@@ -71,7 +74,7 @@
group('while debugger is not attached', () {
setUp(() async {
- setCurrentLogWriter(debug: debug);
+ setCurrentLogWriter(debug: provider.verbose);
await context.setUp(
testSettings: TestSettings(autoRun: false, waitToDebug: true),
);