-
Notifications
You must be signed in to change notification settings - Fork 75
Expand file tree
/
Copy pathGeneralDrivelutionTests.cs
More file actions
467 lines (410 loc) · 13.9 KB
/
Copy pathGeneralDrivelutionTests.cs
File metadata and controls
467 lines (410 loc) · 13.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
using GeneralUpdate.Drivelution;
using GeneralUpdate.Drivelution.Abstractions.Models;
using GeneralUpdate.Drivelution.Abstractions.Configuration;
namespace DrivelutionTest;
/// <summary>
/// Tests for GeneralDrivelution static entry point class.
/// Validates factory methods, quick update methods, and platform info retrieval.
/// </summary>
public class GeneralDrivelutionTests
{
/// <summary>
/// Tests that Create method returns a non-null instance.
/// </summary>
[Fact]
public void Create_WithoutParameters_ReturnsNonNullInstance()
{
// Act
var updater = GeneralDrivelution.Create();
// Assert
Assert.NotNull(updater);
}
/// <summary>
/// Tests that Create method with options returns a non-null instance.
/// </summary>
[Fact]
public void Create_WithOptions_ReturnsNonNullInstance()
{
// Arrange
var options = new DrivelutionOptions
{
DefaultBackupPath = "./backups"
};
// Act
var updater = GeneralDrivelution.Create(options);
// Assert
Assert.NotNull(updater);
}
/// <summary>
/// Tests that GetPlatformInfo returns valid platform information.
/// </summary>
[Fact]
public void GetPlatformInfo_ReturnsValidPlatformInfo()
{
// Act
var platformInfo = GeneralDrivelution.GetPlatformInfo();
// Assert
Assert.NotNull(platformInfo);
Assert.NotNull(platformInfo.Platform);
Assert.NotEmpty(platformInfo.Platform);
Assert.NotNull(platformInfo.OperatingSystem);
Assert.NotEmpty(platformInfo.OperatingSystem);
Assert.NotNull(platformInfo.Architecture);
Assert.NotEmpty(platformInfo.Architecture);
Assert.NotNull(platformInfo.SystemVersion);
Assert.NotEmpty(platformInfo.SystemVersion);
}
/// <summary>
/// Tests that PlatformInfo ToString returns a valid string.
/// </summary>
[Fact]
public void PlatformInfo_ToString_ReturnsValidString()
{
// Arrange
var platformInfo = GeneralDrivelution.GetPlatformInfo();
// Act
var result = platformInfo.ToString();
// Assert
Assert.NotNull(result);
Assert.NotEmpty(result);
Assert.Contains(platformInfo.Platform, result);
Assert.Contains(platformInfo.OperatingSystem, result);
}
/// <summary>
/// Tests that QuickUpdateAsync with minimal parameters works (or throws expected exceptions).
/// </summary>
[Fact]
public async Task QuickUpdateAsync_WithMinimalParameters_HandlesGracefully()
{
// Arrange
var testFilePath = Path.Combine(Path.GetTempPath(), $"test_driver_{Guid.NewGuid()}.txt");
File.WriteAllText(testFilePath, "Test driver content");
try
{
var driverInfo = new DriverInfo
{
Name = "Test Driver",
Version = "1.0.0",
FilePath = testFilePath,
TargetOS = "",
Architecture = ""
};
// Act
var result = await GeneralDrivelution.QuickUpdateAsync(driverInfo);
// Assert
Assert.NotNull(result);
// The result might fail due to validation or permissions, but should not crash
// Verify that result status is one of the valid enum values
Assert.True(Enum.IsDefined(typeof(UpdateStatus), result.Status));
}
finally
{
if (File.Exists(testFilePath))
{
File.Delete(testFilePath);
}
}
}
/// <summary>
/// Tests that QuickUpdateAsync with custom strategy works.
/// </summary>
[Fact]
public async Task QuickUpdateAsync_WithCustomStrategy_HandlesGracefully()
{
// Arrange
var testFilePath = Path.Combine(Path.GetTempPath(), $"test_driver_{Guid.NewGuid()}.txt");
File.WriteAllText(testFilePath, "Test driver content");
try
{
var driverInfo = new DriverInfo
{
Name = "Test Driver",
Version = "1.0.0",
FilePath = testFilePath,
TargetOS = "",
Architecture = ""
};
var strategy = new UpdateStrategy
{
RequireBackup = false,
RetryCount = 1,
RetryIntervalSeconds = 1
};
// Act
var result = await GeneralDrivelution.QuickUpdateAsync(driverInfo, strategy);
// Assert
Assert.NotNull(result);
// Verify that result status is one of the valid enum values
Assert.True(Enum.IsDefined(typeof(UpdateStatus), result.Status));
}
finally
{
if (File.Exists(testFilePath))
{
File.Delete(testFilePath);
}
}
}
/// <summary>
/// Tests that ValidateAsync with minimal driver info works.
/// </summary>
[Fact]
public async Task ValidateAsync_WithMinimalDriverInfo_ReturnsBooleanResult()
{
// Arrange
var testFilePath = Path.Combine(Path.GetTempPath(), $"test_driver_{Guid.NewGuid()}.txt");
File.WriteAllText(testFilePath, "Test driver content");
try
{
var driverInfo = new DriverInfo
{
Name = "Test Driver",
Version = "1.0.0",
FilePath = testFilePath,
TargetOS = "",
Architecture = ""
};
// Act
var result = await GeneralDrivelution.ValidateAsync(driverInfo);
// Assert - Should return a boolean value without throwing
// No assertion needed - the test passes if no exception is thrown
}
finally
{
if (File.Exists(testFilePath))
{
File.Delete(testFilePath);
}
}
}
/// <summary>
/// Tests that ValidateAsync returns false for non-existent file.
/// </summary>
[Fact]
public async Task ValidateAsync_WithNonExistentFile_ReturnsFalse()
{
// Arrange
var driverInfo = new DriverInfo
{
Name = "Test Driver",
Version = "1.0.0",
FilePath = "/nonexistent/path/driver.sys",
TargetOS = "",
Architecture = ""
};
// Act
var result = await GeneralDrivelution.ValidateAsync(driverInfo);
// Assert
Assert.False(result);
}
/// <summary>
/// Tests that QuickUpdateAsync with cancellation token works.
/// </summary>
[Fact]
public async Task QuickUpdateAsync_WithCancellationToken_CanBeCancelled()
{
// Arrange
var testFilePath = Path.Combine(Path.GetTempPath(), $"test_driver_{Guid.NewGuid()}.txt");
File.WriteAllText(testFilePath, "Test driver content");
try
{
var driverInfo = new DriverInfo
{
Name = "Test Driver",
Version = "1.0.0",
FilePath = testFilePath
};
var cts = new CancellationTokenSource();
cts.Cancel();
// Act & Assert
// Should either complete quickly or throw cancellation exception
var exception = await Record.ExceptionAsync(
() => GeneralDrivelution.QuickUpdateAsync(driverInfo, cts.Token));
// Either succeeded, failed gracefully, or was cancelled
Assert.True(exception == null || exception is OperationCanceledException);
}
finally
{
if (File.Exists(testFilePath))
{
File.Delete(testFilePath);
}
}
}
/// <summary>
/// Tests that GetPlatformInfo reports correct support status.
/// </summary>
[Fact]
public void GetPlatformInfo_ReportsCorrectSupportStatus()
{
// Act
var platformInfo = GeneralDrivelution.GetPlatformInfo();
// Assert
if (platformInfo.Platform == "Windows" || platformInfo.Platform == "Linux")
{
Assert.True(platformInfo.IsSupported);
}
else if (platformInfo.Platform == "MacOS")
{
Assert.False(platformInfo.IsSupported); // MacOS not yet implemented
}
}
/// <summary>
/// Tests that GetDriversFromDirectoryAsync returns empty list for non-existent directory.
/// </summary>
[Fact]
public async Task GetDriversFromDirectoryAsync_WithNonExistentDirectory_ReturnsEmptyList()
{
// Arrange
var nonExistentPath = Path.Combine(Path.GetTempPath(), $"nonexistent_{Guid.NewGuid()}");
// Act
var result = await GeneralDrivelution.GetDriversFromDirectoryAsync(nonExistentPath);
// Assert
Assert.NotNull(result);
Assert.Empty(result);
}
/// <summary>
/// Tests that GetDriversFromDirectoryAsync returns empty list for empty directory.
/// </summary>
[Fact]
public async Task GetDriversFromDirectoryAsync_WithEmptyDirectory_ReturnsEmptyList()
{
// Arrange
var emptyDir = Path.Combine(Path.GetTempPath(), $"empty_{Guid.NewGuid()}");
Directory.CreateDirectory(emptyDir);
try
{
// Act
var result = await GeneralDrivelution.GetDriversFromDirectoryAsync(emptyDir);
// Assert
Assert.NotNull(result);
Assert.Empty(result);
}
finally
{
if (Directory.Exists(emptyDir))
{
Directory.Delete(emptyDir, true);
}
}
}
/// <summary>
/// Tests that GetDriversFromDirectoryAsync discovers driver files in directory.
/// </summary>
[Fact]
public async Task GetDriversFromDirectoryAsync_WithDriverFiles_ReturnsDriverInfoList()
{
// Arrange
var testDir = Path.Combine(Path.GetTempPath(), $"drivers_{Guid.NewGuid()}");
Directory.CreateDirectory(testDir);
try
{
// Create test driver files based on platform
var platformInfo = GeneralDrivelution.GetPlatformInfo();
var testFiles = new List<string>();
if (platformInfo.Platform == "Windows")
{
// Create mock .inf file
var infFile = Path.Combine(testDir, "test_driver.inf");
File.WriteAllText(infFile, @"
[Version]
Signature=""$Windows NT$""
DriverVer=01/15/2024,1.0.0.0
[DriverInfo]
DriverDesc=""Test Driver""
");
testFiles.Add(infFile);
}
else if (platformInfo.Platform == "Linux")
{
// Create mock .ko file
var koFile = Path.Combine(testDir, "test_driver.ko");
File.WriteAllText(koFile, "Mock kernel module content");
testFiles.Add(koFile);
}
// Act
var result = await GeneralDrivelution.GetDriversFromDirectoryAsync(testDir);
// Assert
Assert.NotNull(result);
// Should find at least one driver if platform is supported
if (platformInfo.IsSupported && testFiles.Any())
{
Assert.NotEmpty(result);
// Check that driver info has expected properties
var driver = result.First();
Assert.NotNull(driver.Name);
Assert.NotEmpty(driver.Name);
Assert.NotNull(driver.FilePath);
Assert.NotEmpty(driver.FilePath);
Assert.NotNull(driver.Version);
Assert.NotEmpty(driver.Version);
Assert.NotNull(driver.Hash);
Assert.NotEmpty(driver.Hash);
}
}
finally
{
if (Directory.Exists(testDir))
{
Directory.Delete(testDir, true);
}
}
}
/// <summary>
/// Tests that GetDriversFromDirectoryAsync with search pattern filters correctly.
/// </summary>
[Fact]
public async Task GetDriversFromDirectoryAsync_WithSearchPattern_FiltersCorrectly()
{
// Arrange
var testDir = Path.Combine(Path.GetTempPath(), $"drivers_{Guid.NewGuid()}");
Directory.CreateDirectory(testDir);
try
{
// Create different types of files
var infFile = Path.Combine(testDir, "driver1.inf");
var txtFile = Path.Combine(testDir, "readme.txt");
File.WriteAllText(infFile, "INF content");
File.WriteAllText(txtFile, "Text content");
// Act
var result = await GeneralDrivelution.GetDriversFromDirectoryAsync(testDir, "*.inf");
// Assert
Assert.NotNull(result);
// Should only find .inf files
// The count depends on whether the platform supports parsing .inf files
}
finally
{
if (Directory.Exists(testDir))
{
Directory.Delete(testDir, true);
}
}
}
/// <summary>
/// Tests that GetDriversFromDirectoryAsync handles cancellation.
/// </summary>
[Fact]
public async Task GetDriversFromDirectoryAsync_WithCancellation_HandlesCancellation()
{
// Arrange
var testDir = Path.Combine(Path.GetTempPath(), $"drivers_{Guid.NewGuid()}");
Directory.CreateDirectory(testDir);
try
{
var cts = new CancellationTokenSource();
cts.Cancel();
// Act
var result = await GeneralDrivelution.GetDriversFromDirectoryAsync(testDir, null, cts.Token);
// Assert - Should complete without throwing or return empty list
Assert.NotNull(result);
}
finally
{
if (Directory.Exists(testDir))
{
Directory.Delete(testDir, true);
}
}
}
}