diff --git a/src/client/testing/testController/common/resultResolver.ts b/src/client/testing/testController/common/resultResolver.ts index 16ee79371b37..23719d27ba2d 100644 --- a/src/client/testing/testController/common/resultResolver.ts +++ b/src/client/testing/testController/common/resultResolver.ts @@ -26,7 +26,7 @@ import { Deferred } from '../../../common/utils/async'; export class PythonResultResolver implements ITestResultResolver { testController: TestController; - testProvider: TestProvider; + public testProvider: TestProvider; public runIdToTestItem: Map; diff --git a/src/client/testing/testController/controller.ts b/src/client/testing/testController/controller.ts index 710a6cdce425..f123534f289a 100644 --- a/src/client/testing/testController/controller.ts +++ b/src/client/testing/testController/controller.ts @@ -29,17 +29,9 @@ import { traceError, traceInfo, traceVerbose } from '../../logging'; import { IEventNamePropertyMapping, sendTelemetryEvent } from '../../telemetry'; import { EventName } from '../../telemetry/constants'; import { PYTEST_PROVIDER, UNITTEST_PROVIDER } from '../common/constants'; -import { TestProvider } from '../types'; import { DebugTestTag, getNodeByUri, RunTestTag } from './common/testItemUtilities'; import { pythonTestAdapterRewriteEnabled } from './common/utils'; -import { - ITestController, - ITestDiscoveryAdapter, - ITestFrameworkController, - TestRefreshOptions, - ITestExecutionAdapter, - ITestResultResolver, -} from './common/types'; +import { ITestController, ITestFrameworkController, TestRefreshOptions } from './common/types'; import { UnittestTestDiscoveryAdapter } from './unittest/testDiscoveryAdapter'; import { UnittestTestExecutionAdapter } from './unittest/testExecutionAdapter'; import { PytestTestDiscoveryAdapter } from './pytest/pytestDiscoveryAdapter'; @@ -157,49 +149,8 @@ export class PythonTestController implements ITestController, IExtensionSingleAc workspaces.forEach((workspace) => { const settings = this.configSettings.getSettings(workspace.uri); - let discoveryAdapter: ITestDiscoveryAdapter; - let executionAdapter: ITestExecutionAdapter; - let testProvider: TestProvider; - let resultResolver: ITestResultResolver; - if (settings.testing.unittestEnabled) { - testProvider = UNITTEST_PROVIDER; - resultResolver = new PythonResultResolver(this.testController, testProvider, workspace.uri); - discoveryAdapter = new UnittestTestDiscoveryAdapter( - this.configSettings, - this.testOutputChannel, - resultResolver, - this.envVarsService, - ); - executionAdapter = new UnittestTestExecutionAdapter( - this.configSettings, - this.testOutputChannel, - resultResolver, - this.envVarsService, - ); - } else { - testProvider = PYTEST_PROVIDER; - resultResolver = new PythonResultResolver(this.testController, testProvider, workspace.uri); - discoveryAdapter = new PytestTestDiscoveryAdapter( - this.configSettings, - this.testOutputChannel, - resultResolver, - this.envVarsService, - ); - executionAdapter = new PytestTestExecutionAdapter( - this.configSettings, - this.testOutputChannel, - resultResolver, - this.envVarsService, - ); - } - - const workspaceTestAdapter = new WorkspaceTestAdapter( - testProvider, - discoveryAdapter, - executionAdapter, - workspace.uri, - resultResolver, - ); + const resultResolver = new PythonResultResolver(this.testController, PYTEST_PROVIDER, workspace.uri); + const workspaceTestAdapter = new WorkspaceTestAdapter(workspace.uri, resultResolver); this.testAdapters.set(workspace.uri, workspaceTestAdapter); @@ -257,12 +208,25 @@ export class PythonTestController implements ITestController, IExtensionSingleAc // ** experiment to roll out NEW test discovery mechanism if (settings.testing.pytestEnabled) { if (pythonTestAdapterRewriteEnabled(this.serviceContainer)) { + // create test adapter for the given framework and type + traceInfo(`Running discovery for pytest using the new test adapter.`); if (workspace && workspace.uri) { - const testAdapter = this.testAdapters.get(workspace.uri); - if (testAdapter) { - testAdapter.discoverTests( + const workspaceTestAdapter = this.testAdapters.get(workspace.uri); + if (workspaceTestAdapter) { + // update test provider + workspaceTestAdapter.resultResolver.testProvider = PYTEST_PROVIDER; + // create test adapter for the given framework and type + const pytestDiscoveryAdapter = new PytestTestDiscoveryAdapter( + this.configSettings, + this.testOutputChannel, + workspaceTestAdapter.resultResolver, + this.envVarsService, + ); + workspaceTestAdapter.discoverTests( this.testController, + pytestDiscoveryAdapter, + PYTEST_PROVIDER, this.refreshCancellation.token, this.pythonExecFactory, ); @@ -279,11 +243,24 @@ export class PythonTestController implements ITestController, IExtensionSingleAc } else if (settings.testing.unittestEnabled) { if (pythonTestAdapterRewriteEnabled(this.serviceContainer)) { traceInfo(`Running discovery for unittest using the new test adapter.`); + // create test adapter for the given framework and type + if (workspace && workspace.uri) { const testAdapter = this.testAdapters.get(workspace.uri); if (testAdapter) { + // update test provider + testAdapter.resultResolver.testProvider = UNITTEST_PROVIDER; + // create test adapter for the given framework and type + const unittestDiscoveryAdapter = new UnittestTestDiscoveryAdapter( + this.configSettings, + this.testOutputChannel, + testAdapter.resultResolver, + this.envVarsService, + ); testAdapter.discoverTests( this.testController, + unittestDiscoveryAdapter, + UNITTEST_PROVIDER, this.refreshCancellation.token, this.pythonExecFactory, ); @@ -414,18 +391,34 @@ export class PythonTestController implements ITestController, IExtensionSingleAc }); // ** experiment to roll out NEW test discovery mechanism if (pythonTestAdapterRewriteEnabled(this.serviceContainer)) { + // create test adapter for the given framework and type const testAdapter = this.testAdapters.get(workspace.uri) || (this.testAdapters.values().next().value as WorkspaceTestAdapter); - return testAdapter.executeTests( - this.testController, - runInstance, - testItems, - token, - request.profile?.kind === TestRunProfileKind.Debug, - this.pythonExecFactory, - this.debugLauncher, - ); + if (testAdapter) { + // update test provider + testAdapter.resultResolver.testProvider = PYTEST_PROVIDER; + // create test adapter for the given framework and type + const pytestExecutionAdapter = new PytestTestExecutionAdapter( + this.configSettings, + this.testOutputChannel, + testAdapter.resultResolver, + this.envVarsService, + ); + return testAdapter.executeTests( + this.testController, + pytestExecutionAdapter, + PYTEST_PROVIDER, + runInstance, + testItems, + token, + request.profile?.kind === TestRunProfileKind.Debug, + this.pythonExecFactory, + this.debugLauncher, + ); + } + traceError('Unable to find test adapter for workspace.'); + return Promise.resolve(); } return this.pytest.runTests( { @@ -448,15 +441,31 @@ export class PythonTestController implements ITestController, IExtensionSingleAc const testAdapter = this.testAdapters.get(workspace.uri) || (this.testAdapters.values().next().value as WorkspaceTestAdapter); - return testAdapter.executeTests( - this.testController, - runInstance, - testItems, - token, - request.profile?.kind === TestRunProfileKind.Debug, - this.pythonExecFactory, - this.debugLauncher, - ); + + if (testAdapter) { + // update test provider + testAdapter.resultResolver.testProvider = UNITTEST_PROVIDER; + // create test adapter for the given framework and type + const unittestExecutionAdapter = new UnittestTestExecutionAdapter( + this.configSettings, + this.testOutputChannel, + testAdapter.resultResolver, + this.envVarsService, + ); + return testAdapter.executeTests( + this.testController, + unittestExecutionAdapter, + UNITTEST_PROVIDER, + runInstance, + testItems, + token, + request.profile?.kind === TestRunProfileKind.Debug, + this.pythonExecFactory, + this.debugLauncher, + ); + } + traceError('Unable to find test adapter for workspace.'); + return Promise.resolve(); } // below is old way of running unittest execution return this.unittest.runTests( diff --git a/src/client/testing/testController/workspaceTestAdapter.ts b/src/client/testing/testController/workspaceTestAdapter.ts index 5fe69dfe3d69..94e7b3458fb4 100644 --- a/src/client/testing/testController/workspaceTestAdapter.ts +++ b/src/client/testing/testController/workspaceTestAdapter.ts @@ -8,12 +8,13 @@ import { Testing } from '../../common/utils/localize'; import { traceError } from '../../logging'; import { sendTelemetryEvent } from '../../telemetry'; import { EventName } from '../../telemetry/constants'; -import { TestProvider } from '../types'; import { createErrorTestItem, getTestCaseNodes } from './common/testItemUtilities'; -import { ITestDiscoveryAdapter, ITestExecutionAdapter, ITestResultResolver } from './common/types'; import { IPythonExecutionFactory } from '../../common/process/types'; import { ITestDebugLauncher } from '../common/types'; import { buildErrorNodeOptions } from './common/utils'; +import { ITestDiscoveryAdapter, ITestExecutionAdapter } from './common/types'; +import { TestProvider } from '../types'; +import { PythonResultResolver } from './common/resultResolver'; /** * This class exposes a test-provider-agnostic way of discovering tests. @@ -29,16 +30,12 @@ export class WorkspaceTestAdapter { private executing: Deferred | undefined; - constructor( - private testProvider: TestProvider, - private discoveryAdapter: ITestDiscoveryAdapter, - private executionAdapter: ITestExecutionAdapter, - private workspaceUri: Uri, - private resultResolver: ITestResultResolver, - ) {} + constructor(private workspaceUri: Uri, public resultResolver: PythonResultResolver) {} public async executeTests( testController: TestController, + executionAdapter: ITestExecutionAdapter, + testProvider: TestProvider, runInstance: TestRun, includes: TestItem[], token?: CancellationToken, @@ -73,7 +70,7 @@ export class WorkspaceTestAdapter { const testCaseIds = Array.from(testCaseIdsSet); // ** execution factory only defined for new rewrite way if (executionFactory !== undefined) { - await this.executionAdapter.runTests( + await executionAdapter.runTests( this.workspaceUri, testCaseIds, debugBool, @@ -82,7 +79,7 @@ export class WorkspaceTestAdapter { debugLauncher, ); } else { - await this.executionAdapter.runTests(this.workspaceUri, testCaseIds, debugBool); + await executionAdapter.runTests(this.workspaceUri, testCaseIds, debugBool); } deferred.resolve(); } catch (ex) { @@ -92,14 +89,14 @@ export class WorkspaceTestAdapter { let cancel = token?.isCancellationRequested ? Testing.cancelUnittestExecution : Testing.errorUnittestExecution; - if (this.testProvider === 'pytest') { + if (testProvider === 'pytest') { cancel = token?.isCancellationRequested ? Testing.cancelPytestExecution : Testing.errorPytestExecution; } traceError(`${cancel}\r\n`, ex); // Also report on the test view const message = util.format(`${cancel} ${Testing.seePythonOutput}\r\n`, ex); - const options = buildErrorNodeOptions(this.workspaceUri, message, this.testProvider); + const options = buildErrorNodeOptions(this.workspaceUri, message, testProvider); const errorNode = createErrorTestItem(testController, options); testController.items.add(errorNode); @@ -113,10 +110,12 @@ export class WorkspaceTestAdapter { public async discoverTests( testController: TestController, + discoveryAdapter: ITestDiscoveryAdapter, + testProvider: TestProvider, token?: CancellationToken, executionFactory?: IPythonExecutionFactory, ): Promise { - sendTelemetryEvent(EventName.UNITTEST_DISCOVERING, undefined, { tool: this.testProvider }); + sendTelemetryEvent(EventName.UNITTEST_DISCOVERING, undefined, { tool: testProvider }); // Discovery is expensive. If it is already running, use the existing promise. if (this.discovering) { @@ -130,18 +129,21 @@ export class WorkspaceTestAdapter { try { // ** execution factory only defined for new rewrite way if (executionFactory !== undefined) { - await this.discoveryAdapter.discoverTests(this.workspaceUri, executionFactory); + await discoveryAdapter.discoverTests(this.workspaceUri, executionFactory); } else { - await this.discoveryAdapter.discoverTests(this.workspaceUri); + await discoveryAdapter.discoverTests(this.workspaceUri); } deferred.resolve(); } catch (ex) { - sendTelemetryEvent(EventName.UNITTEST_DISCOVERY_DONE, undefined, { tool: this.testProvider, failed: true }); + sendTelemetryEvent(EventName.UNITTEST_DISCOVERY_DONE, undefined, { + tool: testProvider, + failed: true, + }); let cancel = token?.isCancellationRequested ? Testing.cancelUnittestDiscovery : Testing.errorUnittestDiscovery; - if (this.testProvider === 'pytest') { + if (testProvider === 'pytest') { cancel = token?.isCancellationRequested ? Testing.cancelPytestDiscovery : Testing.errorPytestDiscovery; } @@ -149,7 +151,7 @@ export class WorkspaceTestAdapter { // Report also on the test view. const message = util.format(`${cancel} ${Testing.seePythonOutput}\r\n`, ex); - const options = buildErrorNodeOptions(this.workspaceUri, message, this.testProvider); + const options = buildErrorNodeOptions(this.workspaceUri, message, testProvider); const errorNode = createErrorTestItem(testController, options); testController.items.add(errorNode); @@ -160,7 +162,7 @@ export class WorkspaceTestAdapter { this.discovering = undefined; } - sendTelemetryEvent(EventName.UNITTEST_DISCOVERY_DONE, undefined, { tool: this.testProvider, failed: false }); + sendTelemetryEvent(EventName.UNITTEST_DISCOVERY_DONE, undefined, { tool: testProvider, failed: false }); return Promise.resolve(); } } diff --git a/src/test/testing/testController/workspaceTestAdapter.unit.test.ts b/src/test/testing/testController/workspaceTestAdapter.unit.test.ts index 9a07d4451e85..40b69ee5aca8 100644 --- a/src/test/testing/testController/workspaceTestAdapter.unit.test.ts +++ b/src/test/testing/testController/workspaceTestAdapter.unit.test.ts @@ -17,11 +17,12 @@ import * as testItemUtilities from '../../../client/testing/testController/commo import * as util from '../../../client/testing/testController/common/utils'; import * as ResultResolver from '../../../client/testing/testController/common/resultResolver'; import { IPythonExecutionFactory } from '../../../client/common/process/types'; +import { UNITTEST_PROVIDER } from '../../../client/testing/common/constants'; suite('Workspace test adapter', () => { suite('Test discovery', () => { let stubConfigSettings: IConfigurationService; - let stubResultResolver: ITestResultResolver; + let stubResultResolver: ResultResolver.PythonResultResolver; let discoverTestsStub: sinon.SinonStub; let sendTelemetryStub: sinon.SinonStub; @@ -41,15 +42,6 @@ suite('Workspace test adapter', () => { }), } as unknown) as IConfigurationService; - stubResultResolver = ({ - resolveDiscovery: () => { - // no body - }, - resolveExecution: () => { - // no body - }, - } as unknown) as ITestResultResolver; - // const vsIdToRunIdGetStub = sinon.stub(stubResultResolver.vsIdToRunId, 'get'); // const expectedRunId = 'expectedRunId'; // vsIdToRunIdGetStub.withArgs(sinon.match.any).returns(expectedRunId); @@ -92,6 +84,14 @@ suite('Workspace test adapter', () => { } as unknown) as TestController; // testController = tests.createTestController('mock-python-tests', 'Mock Python Tests'); + stubResultResolver = ({ + resolveDiscovery: () => { + // no body + }, + resolveExecution: () => { + // no body + }, + } as unknown) as ResultResolver.PythonResultResolver; const mockSendTelemetryEvent = ( eventName: EventName, @@ -120,15 +120,8 @@ suite('Workspace test adapter', () => { discoverTestsStub.rejects(new Error('foo')); const testDiscoveryAdapter = new UnittestTestDiscoveryAdapter(stubConfigSettings, outputChannel.object); - const testExecutionAdapter = new UnittestTestExecutionAdapter(stubConfigSettings, outputChannel.object); const uriFoo = Uri.parse('foo'); - const workspaceTestAdapter = new WorkspaceTestAdapter( - 'unittest', - testDiscoveryAdapter, - testExecutionAdapter, - uriFoo, - stubResultResolver, - ); + const workspaceTestAdapter = new WorkspaceTestAdapter(uriFoo, stubResultResolver); const blankTestItem = ({ canResolveChildren: false, @@ -149,7 +142,13 @@ suite('Workspace test adapter', () => { const testProvider = 'unittest'; execFactory = typemoq.Mock.ofType(); - await workspaceTestAdapter.discoverTests(testController, undefined, execFactory.object); + await workspaceTestAdapter.discoverTests( + testController, + testDiscoveryAdapter, + UNITTEST_PROVIDER, + undefined, + execFactory.object, + ); sinon.assert.calledWithMatch(createErrorTestItemStub, sinon.match.any, sinon.match.any); sinon.assert.calledWithMatch(buildErrorNodeOptionsStub, uriFoo, sinon.match.any, testProvider); @@ -159,17 +158,16 @@ suite('Workspace test adapter', () => { discoverTestsStub.resolves(); const testDiscoveryAdapter = new UnittestTestDiscoveryAdapter(stubConfigSettings, outputChannel.object); - const testExecutionAdapter = new UnittestTestExecutionAdapter(stubConfigSettings, outputChannel.object); - const workspaceTestAdapter = new WorkspaceTestAdapter( - 'unittest', + const workspaceTestAdapter = new WorkspaceTestAdapter(Uri.parse('foo'), stubResultResolver); + + await workspaceTestAdapter.discoverTests( + testController, testDiscoveryAdapter, - testExecutionAdapter, - Uri.parse('foo'), - stubResultResolver, + UNITTEST_PROVIDER, + undefined, + execFactory.object, ); - await workspaceTestAdapter.discoverTests(testController, undefined, execFactory.object); - sinon.assert.calledOnce(discoverTestsStub); }); @@ -185,18 +183,11 @@ suite('Workspace test adapter', () => { ); const testDiscoveryAdapter = new UnittestTestDiscoveryAdapter(stubConfigSettings, outputChannel.object); - const testExecutionAdapter = new UnittestTestExecutionAdapter(stubConfigSettings, outputChannel.object); - const workspaceTestAdapter = new WorkspaceTestAdapter( - 'unittest', - testDiscoveryAdapter, - testExecutionAdapter, - Uri.parse('foo'), - stubResultResolver, - ); + const workspaceTestAdapter = new WorkspaceTestAdapter(Uri.parse('foo'), stubResultResolver); // Try running discovery twice - const one = workspaceTestAdapter.discoverTests(testController); - const two = workspaceTestAdapter.discoverTests(testController); + const one = workspaceTestAdapter.discoverTests(testController, testDiscoveryAdapter, UNITTEST_PROVIDER); + const two = workspaceTestAdapter.discoverTests(testController, testDiscoveryAdapter, UNITTEST_PROVIDER); Promise.all([one, two]); @@ -207,18 +198,17 @@ suite('Workspace test adapter', () => { discoverTestsStub.resolves({ status: 'success' }); const testDiscoveryAdapter = new UnittestTestDiscoveryAdapter(stubConfigSettings, outputChannel.object); - const testExecutionAdapter = new UnittestTestExecutionAdapter(stubConfigSettings, outputChannel.object); - const workspaceTestAdapter = new WorkspaceTestAdapter( - 'unittest', + const workspaceTestAdapter = new WorkspaceTestAdapter(Uri.parse('foo'), stubResultResolver); + + await workspaceTestAdapter.discoverTests( + testController, testDiscoveryAdapter, - testExecutionAdapter, - Uri.parse('foo'), - stubResultResolver, + UNITTEST_PROVIDER, + undefined, + execFactory.object, ); - await workspaceTestAdapter.discoverTests(testController, undefined, execFactory.object); - sinon.assert.calledWith(sendTelemetryStub, EventName.UNITTEST_DISCOVERY_DONE); assert.strictEqual(telemetryEvent.length, 2); @@ -230,17 +220,10 @@ suite('Workspace test adapter', () => { discoverTestsStub.rejects(new Error('foo')); const testDiscoveryAdapter = new UnittestTestDiscoveryAdapter(stubConfigSettings, outputChannel.object); - const testExecutionAdapter = new UnittestTestExecutionAdapter(stubConfigSettings, outputChannel.object); - const workspaceTestAdapter = new WorkspaceTestAdapter( - 'unittest', - testDiscoveryAdapter, - testExecutionAdapter, - Uri.parse('foo'), - stubResultResolver, - ); + const workspaceTestAdapter = new WorkspaceTestAdapter(Uri.parse('foo'), stubResultResolver); - await workspaceTestAdapter.discoverTests(testController); + await workspaceTestAdapter.discoverTests(testController, testDiscoveryAdapter, UNITTEST_PROVIDER); sinon.assert.calledWith(sendTelemetryStub, EventName.UNITTEST_DISCOVERY_DONE); assert.strictEqual(telemetryEvent.length, 2); @@ -251,7 +234,7 @@ suite('Workspace test adapter', () => { }); suite('Test execution workspace test adapter', () => { let stubConfigSettings: IConfigurationService; - let stubResultResolver: ITestResultResolver; + let stubResultResolver: ResultResolver.PythonResultResolver; let executionTestsStub: sinon.SinonStub; let sendTelemetryStub: sinon.SinonStub; let outputChannel: typemoq.IMock; @@ -283,7 +266,7 @@ suite('Workspace test adapter', () => { vsIdToRunId: { get: sinon.stub().returns('expectedRunId'), }, - } as unknown) as ITestResultResolver; + } as unknown) as ResultResolver.PythonResultResolver; const testItem = ({ canResolveChildren: false, tags: [], @@ -346,15 +329,8 @@ suite('Workspace test adapter', () => { sandbox.restore(); }); test('When executing tests, the right tests should be sent to be executed', async () => { - const testDiscoveryAdapter = new UnittestTestDiscoveryAdapter(stubConfigSettings, outputChannel.object); const testExecutionAdapter = new UnittestTestExecutionAdapter(stubConfigSettings, outputChannel.object); - const workspaceTestAdapter = new WorkspaceTestAdapter( - 'unittest', - testDiscoveryAdapter, - testExecutionAdapter, - Uri.parse('foo'), - resultResolver, - ); + const workspaceTestAdapter = new WorkspaceTestAdapter(Uri.parse('foo'), resultResolver); resultResolver.runIdToVSid.set('mockTestItem1', 'mockTestItem1'); sinon.stub(testItemUtilities, 'getTestCaseNodes').callsFake((testNode: TestItem) => @@ -388,24 +364,29 @@ suite('Workspace test adapter', () => { testControllerMock = typemoq.Mock.ofType(); testControllerMock.setup((t) => t.items).returns(() => testItemCollectionMock.object); - await workspaceTestAdapter.executeTests(testController, runInstance.object, [mockTestItem1, mockTestItem2]); + await workspaceTestAdapter.executeTests( + testController, + testExecutionAdapter, + UNITTEST_PROVIDER, + runInstance.object, + [mockTestItem1, mockTestItem2], + ); runInstance.verify((r) => r.started(typemoq.It.isAny()), typemoq.Times.exactly(2)); }); test("When executing tests, the workspace test adapter should call the test execute adapter's executionTest method", async () => { - const testDiscoveryAdapter = new UnittestTestDiscoveryAdapter(stubConfigSettings, outputChannel.object); const testExecutionAdapter = new UnittestTestExecutionAdapter(stubConfigSettings, outputChannel.object); - const workspaceTestAdapter = new WorkspaceTestAdapter( - 'unittest', - testDiscoveryAdapter, + const workspaceTestAdapter = new WorkspaceTestAdapter(Uri.parse('foo'), resultResolver); + + await workspaceTestAdapter.executeTests( + testController, testExecutionAdapter, - Uri.parse('foo'), - stubResultResolver, + UNITTEST_PROVIDER, + runInstance.object, + [], ); - await workspaceTestAdapter.executeTests(testController, runInstance.object, []); - sinon.assert.calledOnce(executionTestsStub); }); @@ -420,19 +401,24 @@ suite('Workspace test adapter', () => { }), ); - const testDiscoveryAdapter = new UnittestTestDiscoveryAdapter(stubConfigSettings, outputChannel.object); const testExecutionAdapter = new UnittestTestExecutionAdapter(stubConfigSettings, outputChannel.object); - const workspaceTestAdapter = new WorkspaceTestAdapter( - 'unittest', - testDiscoveryAdapter, - testExecutionAdapter, - Uri.parse('foo'), - stubResultResolver, - ); + const workspaceTestAdapter = new WorkspaceTestAdapter(Uri.parse('foo'), stubResultResolver); // Try running discovery twice - const one = workspaceTestAdapter.executeTests(testController, runInstance.object, []); - const two = workspaceTestAdapter.executeTests(testController, runInstance.object, []); + const one = workspaceTestAdapter.executeTests( + testController, + testExecutionAdapter, + UNITTEST_PROVIDER, + runInstance.object, + [], + ); + const two = workspaceTestAdapter.executeTests( + testController, + testExecutionAdapter, + UNITTEST_PROVIDER, + runInstance.object, + [], + ); Promise.all([one, two]); @@ -442,16 +428,9 @@ suite('Workspace test adapter', () => { test('If execution failed correctly create error node', async () => { executionTestsStub.rejects(new Error('foo')); - const testDiscoveryAdapter = new UnittestTestDiscoveryAdapter(stubConfigSettings, outputChannel.object); const testExecutionAdapter = new UnittestTestExecutionAdapter(stubConfigSettings, outputChannel.object); - const workspaceTestAdapter = new WorkspaceTestAdapter( - 'unittest', - testDiscoveryAdapter, - testExecutionAdapter, - Uri.parse('foo'), - stubResultResolver, - ); + const workspaceTestAdapter = new WorkspaceTestAdapter(Uri.parse('foo'), resultResolver); const blankTestItem = ({ canResolveChildren: false, @@ -471,7 +450,13 @@ suite('Workspace test adapter', () => { const buildErrorNodeOptionsStub = sinon.stub(util, 'buildErrorNodeOptions').returns(errorTestItemOptions); const testProvider = 'unittest'; - await workspaceTestAdapter.executeTests(testController, runInstance.object, []); + await workspaceTestAdapter.executeTests( + testController, + testExecutionAdapter, + UNITTEST_PROVIDER, + runInstance.object, + [], + ); sinon.assert.calledWithMatch(createErrorTestItemStub, sinon.match.any, sinon.match.any); sinon.assert.calledWithMatch(buildErrorNodeOptionsStub, Uri.parse('foo'), sinon.match.any, testProvider); @@ -480,19 +465,18 @@ suite('Workspace test adapter', () => { test('If execution failed, send a telemetry event with the "failed" key set to true, and add an error node to the test controller', async () => { executionTestsStub.rejects(new Error('foo')); - const testDiscoveryAdapter = new UnittestTestDiscoveryAdapter(stubConfigSettings, outputChannel.object); const testExecutionAdapter = new UnittestTestExecutionAdapter(stubConfigSettings, outputChannel.object); - const workspaceTestAdapter = new WorkspaceTestAdapter( - 'unittest', - testDiscoveryAdapter, + const workspaceTestAdapter = new WorkspaceTestAdapter(Uri.parse('foo'), resultResolver); + + await workspaceTestAdapter.executeTests( + testController, testExecutionAdapter, - Uri.parse('foo'), - stubResultResolver, + UNITTEST_PROVIDER, + runInstance.object, + [], ); - await workspaceTestAdapter.executeTests(testController, runInstance.object, []); - sinon.assert.calledWith(sendTelemetryStub, EventName.UNITTEST_RUN_ALL_FAILED); assert.strictEqual(telemetryEvent.length, 1); });