Skip to content

Commit c827add

Browse files
authored
Unit tests - processFactory.ts (#6418)
* News file * Add logging to ProcessService * Undo changes, move to a new class * Fix existing unit tests * Simplify logger * Add logger unit tests * PR comment fixes * More PR changes, prettify command, add unit tests * More test fixes * Test fixes, again * Use nodejs' event emitter instead of vscode's * Remove dead code * PR comment fixes * Shorten cwd copy, add quotes to args with spaces * Don't exclude first arg from being formatted * Prettier-ified logger.ts and logger.unit.test.ts * Address comment * unit tests * refactor processFactory to use ioc * update debugAdapter too * Fix linting functional tests
1 parent 3695395 commit c827add

4 files changed

Lines changed: 78 additions & 22 deletions

File tree

src/client/common/process/processFactory.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,23 @@
55

66
import { inject, injectable } from 'inversify';
77
import { Uri } from 'vscode';
8-
import { IServiceContainer } from '../../ioc/types';
98
import { IDisposableRegistry } from '../types';
109
import { IEnvironmentVariablesProvider } from '../variables/types';
1110
import { ProcessService } from './proc';
1211
import { IBufferDecoder, IProcessLogger, IProcessService, IProcessServiceFactory } from './types';
1312

1413
@injectable()
1514
export class ProcessServiceFactory implements IProcessServiceFactory {
16-
private envVarsService: IEnvironmentVariablesProvider;
17-
private processLogger: IProcessLogger;
18-
constructor(@inject(IServiceContainer) private serviceContainer: IServiceContainer) {
19-
this.envVarsService = serviceContainer.get<IEnvironmentVariablesProvider>(IEnvironmentVariablesProvider);
20-
this.processLogger = serviceContainer.get<IProcessLogger>(IProcessLogger);
21-
}
15+
constructor(
16+
@inject(IEnvironmentVariablesProvider) private readonly envVarsService: IEnvironmentVariablesProvider,
17+
@inject(IProcessLogger) private readonly processLogger: IProcessLogger,
18+
@inject(IBufferDecoder) private readonly decoder: IBufferDecoder,
19+
@inject(IDisposableRegistry) private readonly disposableRegistry: IDisposableRegistry
20+
) {}
2221
public async create(resource?: Uri): Promise<IProcessService> {
2322
const customEnvVars = await this.envVarsService.getEnvironmentVariables(resource);
24-
const decoder = this.serviceContainer.get<IBufferDecoder>(IBufferDecoder);
25-
const disposableRegistry = this.serviceContainer.get<IDisposableRegistry>(IDisposableRegistry);
26-
const proc: IProcessService = new ProcessService(decoder, customEnvVars);
27-
disposableRegistry.push(proc);
23+
const proc: IProcessService = new ProcessService(this.decoder, customEnvVars);
24+
this.disposableRegistry.push(proc);
2825
return proc.on('exec', this.processLogger.logProcess.bind(this.processLogger));
2926
}
3027
}

src/client/debugger/debugAdapter/Common/processServiceFactory.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,13 @@ import { inject, injectable } from 'inversify';
77
import { ProcessService } from '../../../common/process/proc';
88
import { IBufferDecoder, IProcessService, IProcessServiceFactory } from '../../../common/process/types';
99
import { IDisposableRegistry } from '../../../common/types';
10-
import { IServiceContainer } from '../../../ioc/types';
1110

1211
@injectable()
1312
export class DebuggerProcessServiceFactory implements IProcessServiceFactory {
14-
constructor(@inject(IServiceContainer) private serviceContainer: IServiceContainer) { }
13+
constructor(@inject(IBufferDecoder) private readonly decoder: IBufferDecoder, @inject(IDisposableRegistry) private readonly disposableRegistry: IDisposableRegistry) {}
1514
public create(): Promise<IProcessService> {
16-
const processService = new ProcessService(this.serviceContainer.get<IBufferDecoder>(IBufferDecoder), process.env);
17-
this.serviceContainer.get<IDisposableRegistry>(IDisposableRegistry).push(processService);
15+
const processService = new ProcessService(this.decoder, process.env);
16+
this.disposableRegistry.push(processService);
1817
return Promise.resolve(processService);
1918
}
2019
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
'use strict';
4+
import { expect } from 'chai';
5+
import { instance, mock, verify, when } from 'ts-mockito';
6+
import { Disposable, Uri } from 'vscode';
7+
8+
import { BufferDecoder } from '../../../client/common/process/decoder';
9+
import { ProcessLogger } from '../../../client/common/process/logger';
10+
import { ProcessService } from '../../../client/common/process/proc';
11+
import { ProcessServiceFactory } from '../../../client/common/process/processFactory';
12+
import { IBufferDecoder, IProcessLogger } from '../../../client/common/process/types';
13+
import { IDisposableRegistry } from '../../../client/common/types';
14+
import { EnvironmentVariablesProvider } from '../../../client/common/variables/environmentVariablesProvider';
15+
import { IEnvironmentVariablesProvider } from '../../../client/common/variables/types';
16+
17+
suite('Process - ProcessServiceFactory', () => {
18+
let factory: ProcessServiceFactory;
19+
let envVariablesProvider: IEnvironmentVariablesProvider;
20+
let bufferDecoder: IBufferDecoder;
21+
let processLogger: IProcessLogger;
22+
let processService: ProcessService;
23+
let disposableRegistry: IDisposableRegistry;
24+
25+
setup(() => {
26+
bufferDecoder = mock(BufferDecoder);
27+
envVariablesProvider = mock(EnvironmentVariablesProvider);
28+
processLogger = mock(ProcessLogger);
29+
when(processLogger.logProcess('', [], {})).thenReturn();
30+
processService = mock(ProcessService);
31+
when(
32+
processService.on('exec', () => {
33+
return;
34+
})
35+
).thenReturn(processService);
36+
disposableRegistry = [];
37+
factory = new ProcessServiceFactory(instance(envVariablesProvider), instance(processLogger), instance(bufferDecoder), disposableRegistry);
38+
});
39+
40+
teardown(() => {
41+
(disposableRegistry as Disposable[]).forEach(d => d.dispose());
42+
});
43+
44+
[Uri.parse('test'), undefined].forEach(resource => {
45+
test(`Ensure ProcessService is created with an ${resource ? 'existing' : 'undefined'} resource`, async () => {
46+
when(envVariablesProvider.getEnvironmentVariables(resource)).thenResolve({ x: 'test' });
47+
48+
const proc = await factory.create(resource);
49+
verify(envVariablesProvider.getEnvironmentVariables(resource)).once();
50+
51+
const disposables = disposableRegistry as Disposable[];
52+
expect(disposables.length).equal(1);
53+
expect(proc).instanceOf(ProcessService);
54+
});
55+
});
56+
});

src/test/linters/lint.functional.test.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -233,20 +233,24 @@ class TestFixture extends BaseTestFixture {
233233
configService: IConfigurationService
234234
): IPythonExecutionFactory {
235235
const envVarsService = TypeMoq.Mock.ofType<IEnvironmentVariablesProvider>(undefined, TypeMoq.MockBehavior.Strict);
236-
envVarsService.setup(e => e.getEnvironmentVariables(TypeMoq.It.isAny()))
237-
.returns(() => Promise.resolve({}));
238-
serviceContainer.setup(c => c.get(TypeMoq.It.isValue(IEnvironmentVariablesProvider), TypeMoq.It.isAny()))
239-
.returns(() => envVarsService.object);
240-
serviceContainer.setup(c => c.get(TypeMoq.It.isValue(IDisposableRegistry), TypeMoq.It.isAny()))
241-
.returns(() => []);
236+
envVarsService.setup(e => e.getEnvironmentVariables(TypeMoq.It.isAny())).returns(() => Promise.resolve({}));
237+
serviceContainer.setup(c => c.get(TypeMoq.It.isValue(IEnvironmentVariablesProvider), TypeMoq.It.isAny())).returns(() => envVarsService.object);
238+
const disposableRegistry: IDisposableRegistry = [];
239+
serviceContainer.setup(c => c.get(TypeMoq.It.isValue(IDisposableRegistry), TypeMoq.It.isAny())).returns(() => disposableRegistry);
242240

243241
const envActivationService = TypeMoq.Mock.ofType<IEnvironmentActivationService>(undefined, TypeMoq.MockBehavior.Strict);
244242

245243
const decoder = new BufferDecoder();
246244
serviceContainer.setup(c => c.get(TypeMoq.It.isValue(IBufferDecoder), TypeMoq.It.isAny()))
247245
.returns(() => decoder);
248246

249-
const procServiceFactory = new ProcessServiceFactory(serviceContainer.object);
247+
const processLogger = TypeMoq.Mock.ofType<IProcessLogger>(undefined, TypeMoq.MockBehavior.Strict);
248+
processLogger
249+
.setup(p => p.logProcess(TypeMoq.It.isAnyString(), TypeMoq.It.isAny(), TypeMoq.It.isAny()))
250+
.returns(() => {
251+
return;
252+
});
253+
const procServiceFactory = new ProcessServiceFactory(envVarsService.object, processLogger.object, decoder, disposableRegistry);
250254

251255
return new PythonExecutionFactory(
252256
serviceContainer.object,

0 commit comments

Comments
 (0)