Skip to content

Commit 8e58817

Browse files
committed
fix(test): isolate IPC test file paths per test instance to prevent Linux failures
EncryptedFileIpcTests and EncryptedFileProcessContractProviderTests shared a single default IPC file path (/tmp/GeneralUpdate/ipc/process_info.enc). On Linux, cross-test file system interactions caused Async_Api_Delegates_To_Sync to return null from ReceiveAsync. Each test instance now creates its own isolated temp directory, matching the pattern already used by ProcessContractProviderTests.
1 parent 923a7cd commit 8e58817

2 files changed

Lines changed: 25 additions & 18 deletions

File tree

tests/CoreTest/Ipc/IpcEncryptionTests.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,25 +77,26 @@ public void DecryptFromFile_FileDeleteFails_DoesNotThrow()
7777
[Collection("IpcTests")]
7878
public class EncryptedFileProcessContractProviderTests : IDisposable
7979
{
80-
private static readonly string IpcFilePath =
81-
EncryptedFileProcessContractProvider.GetDefaultFilePath();
80+
private readonly string _tmpDir;
8281

8382
public EncryptedFileProcessContractProviderTests()
8483
{
85-
// Clean up any leftover IPC file from a previous (possibly parallel) test run
86-
// to ensure deterministic test behaviour.
87-
try { if (File.Exists(IpcFilePath)) File.Delete(IpcFilePath); } catch { /* best-effort */ }
84+
// Each test instance gets its own isolated IPC directory to prevent
85+
// cross-test file collisions (especially on Linux where file-system
86+
// operation ordering differs from Windows).
87+
_tmpDir = Path.Combine(Path.GetTempPath(), "CoreTest.Ipc", Guid.NewGuid().ToString("N"));
88+
Directory.CreateDirectory(_tmpDir);
8889
}
8990

9091
public void Dispose()
9192
{
92-
try { if (File.Exists(IpcFilePath)) File.Delete(IpcFilePath); } catch { /* best-effort */ }
93+
try { if (Directory.Exists(_tmpDir)) Directory.Delete(_tmpDir, true); } catch { /* best-effort */ }
9394
}
9495

9596
[Fact]
9697
public void SendAndReceive_RoundTrip_ProcessContractPreserved()
9798
{
98-
var provider = new EncryptedFileProcessContractProvider();
99+
var provider = new EncryptedFileProcessContractProvider(_tmpDir);
99100
var info = new GeneralUpdate.Core.Configuration.ProcessContract(
100101
"MyApp", Path.GetTempPath(), "1.0.0", "2.0.0",
101102
null, System.Text.Encoding.UTF8, ".zip", 30, "secret",
@@ -115,7 +116,7 @@ public void SendAndReceive_RoundTrip_ProcessContractPreserved()
115116
[Fact]
116117
public void Receive_NoFile_ReturnsNull()
117118
{
118-
var provider = new EncryptedFileProcessContractProvider();
119+
var provider = new EncryptedFileProcessContractProvider(_tmpDir);
119120
var result = provider.Receive();
120121
Assert.Null(result);
121122
}

tests/CoreTest/Ipc/IpcFallbackTests.cs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,25 @@ namespace CoreTest.Ipc;
1010
[Collection("IpcTests")]
1111
public class EncryptedFileIpcTests : IDisposable
1212
{
13-
private static readonly string IpcFilePath =
14-
EncryptedFileProcessContractProvider.GetDefaultFilePath();
13+
private readonly string _tmpDir;
1514

1615
public EncryptedFileIpcTests()
1716
{
18-
// Clean up any leftover IPC file from a previous (possibly parallel) test run
19-
// to ensure deterministic test behaviour.
20-
try { if (File.Exists(IpcFilePath)) File.Delete(IpcFilePath); } catch { /* best-effort */ }
17+
// Each test instance gets its own isolated IPC directory to prevent
18+
// cross-test file collisions (especially on Linux where file-system
19+
// operation ordering differs from Windows).
20+
_tmpDir = Path.Combine(Path.GetTempPath(), "CoreTest.Ipc", Guid.NewGuid().ToString("N"));
21+
Directory.CreateDirectory(_tmpDir);
2122
}
2223

2324
public void Dispose()
2425
{
25-
try { if (File.Exists(IpcFilePath)) File.Delete(IpcFilePath); } catch { /* best-effort */ }
26+
try { if (Directory.Exists(_tmpDir)) Directory.Delete(_tmpDir, true); } catch { /* best-effort */ }
27+
}
28+
29+
private EncryptedFileProcessContractProvider CreateProvider()
30+
{
31+
return new EncryptedFileProcessContractProvider(_tmpDir);
2632
}
2733

2834
private static ProcessContract CreateTestInfo(string appName, string currentVersion)
@@ -39,7 +45,7 @@ private static ProcessContract CreateTestInfo(string appName, string currentVers
3945
[Fact]
4046
public void Send_And_Receive_RoundTrip()
4147
{
42-
var provider = new EncryptedFileProcessContractProvider();
48+
var provider = CreateProvider();
4349
var info = CreateTestInfo("TestApp", "1.0.0");
4450

4551
provider.Send(info);
@@ -53,15 +59,15 @@ public void Send_And_Receive_RoundTrip()
5359
[Fact]
5460
public void Receive_Without_Send_ReturnsNull()
5561
{
56-
var provider = new EncryptedFileProcessContractProvider();
62+
var provider = CreateProvider();
5763
var received = provider.Receive();
5864
Assert.Null(received);
5965
}
6066

6167
[Fact]
6268
public void Data_Confidentiality_And_SingleRead()
6369
{
64-
var provider = new EncryptedFileProcessContractProvider();
70+
var provider = CreateProvider();
6571
var info = CreateTestInfo("SecureApp", "1.0.0");
6672

6773
provider.Send(info);
@@ -78,7 +84,7 @@ public void Data_Confidentiality_And_SingleRead()
7884
[Fact]
7985
public async Task Async_Api_Delegates_To_Sync()
8086
{
81-
var provider = new EncryptedFileProcessContractProvider();
87+
var provider = CreateProvider();
8288
var info = CreateTestInfo("AsyncApp", "1.0.0");
8389

8490
await provider.SendAsync(info);

0 commit comments

Comments
 (0)