Skip to content

Commit 5622674

Browse files
author
Akos Kitta
committed
test: fix EPERM when corrupting test data folders
Signed-off-by: Akos Kitta <[email protected]>
1 parent 27b38f0 commit 5622674

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

arduino-ide-extension/src/node/arduino-daemon-impl.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { ArduinoDaemon, NotificationServiceServer } from '../common/protocol';
1616
import { CLI_CONFIG } from './cli-config';
1717
import { getExecPath } from './exec-util';
1818
import { SettingsReader } from './settings-reader';
19+
import { ProcessUtils } from '@theia/core/lib/node/process-utils';
1920

2021
@injectable()
2122
export class ArduinoDaemonImpl
@@ -34,6 +35,9 @@ export class ArduinoDaemonImpl
3435
@inject(SettingsReader)
3536
private readonly settingsReader: SettingsReader;
3637

38+
@inject(ProcessUtils)
39+
private readonly processUtils: ProcessUtils;
40+
3741
private readonly toDispose = new DisposableCollection();
3842
private readonly onDaemonStartedEmitter = new Emitter<string>();
3943
private readonly onDaemonStoppedEmitter = new Emitter<void>();
@@ -84,8 +88,16 @@ export class ArduinoDaemonImpl
8488
).unref();
8589

8690
this.toDispose.pushAll([
87-
Disposable.create(() => daemon.kill()),
88-
Disposable.create(() => this.fireDaemonStopped()),
91+
Disposable.create(() => {
92+
if (daemon.pid) {
93+
this.processUtils.terminateProcessTree(daemon.pid);
94+
this.fireDaemonStopped();
95+
} else {
96+
throw new Error(
97+
'The CLI Daemon process does not have a PID. IDE2 could not stop the CLI daemon.'
98+
);
99+
}
100+
}),
89101
]);
90102
this.fireDaemonStarted(port);
91103
this.onData('Daemon is running.');

arduino-ide-extension/src/test/node/core-client-provider.slow-test.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { DisposableCollection } from '@theia/core/lib/common/disposable';
2+
import { waitForEvent } from '@theia/core/lib/common/promise-util';
23
import type { MaybePromise } from '@theia/core/lib/common/types';
34
import { FileUri } from '@theia/core/lib/node/file-uri';
45
import { Container } from '@theia/core/shared/inversify';
@@ -11,6 +12,7 @@ import {
1112
CoreService,
1213
LibraryService,
1314
} from '../../common/protocol';
15+
import { ArduinoDaemonImpl } from '../../node/arduino-daemon-impl';
1416
import { CLI_CONFIG } from '../../node/cli-config';
1517
import { BoardListRequest } from '../../node/cli-protocol/cc/arduino/cli/commands/v1/board_pb';
1618
import { CoreClientProvider } from '../../node/core-client-provider';
@@ -263,7 +265,13 @@ async function prepareTestConfigDir(
263265
container.get<ConfigDirUriProvider>(ConfigDirUriProvider);
264266
return FileUri.fsPath(configDirUriProvider.configDirUri());
265267
} finally {
266-
toDispose.dispose();
268+
const daemon = container.get<ArduinoDaemonImpl>(ArduinoDaemonImpl);
269+
// Wait for the daemon stop event. All subprocesses (such as `serial-discovery` and `mdns-discovery`) must terminate.
270+
// Otherwise, `EPERM: operation not permitted, unlink` is thrown on Windows when "corrupting" the `directories.data` folder for the tests.
271+
await Promise.all([
272+
waitForEvent(daemon.onDaemonStopped, 5_000),
273+
Promise.resolve(toDispose.dispose()),
274+
]);
267275
}
268276
}
269277

arduino-ide-extension/src/test/node/test-bindings.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { waitForEvent } from '@theia/core/lib/common/promise-util';
1515
import { MockLogger } from '@theia/core/lib/common/test/mock-logger';
1616
import URI from '@theia/core/lib/common/uri';
1717
import { FileUri } from '@theia/core/lib/node/file-uri';
18+
import { ProcessUtils } from '@theia/core/lib/node/process-utils';
1819
import {
1920
Container,
2021
ContainerModule,
@@ -351,6 +352,7 @@ export async function createBaseContainer(
351352
bind(SettingsReader).toSelf().inSingletonScope();
352353
bind(LibraryServiceImpl).toSelf().inSingletonScope();
353354
bind(LibraryService).toService(LibraryServiceImpl);
355+
bind(ProcessUtils).toSelf().inSingletonScope();
354356
params?.additionalBindings?.(bind, rebind);
355357
});
356358
container.load(module);

0 commit comments

Comments
 (0)