mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-16 23:04:22 +01:00
* feat: win compatibility * fix * fix: uptime parse * opt.: linux uptime accuracy * fix: windows temperature fetching * opt. * opt.: powershell exec * refactor: address PR review feedback and improve code quality ### Major Improvements: - **Refactored Windows status parsing**: Broke down large `_getWindowsStatus` method into 13 smaller, focused helper methods for better maintainability and readability - **Extracted system detection logic**: Created dedicated `SystemDetector` helper class to separate OS detection concerns from ServerProvider - **Improved concurrency handling**: Implemented proper synchronization for server updates using Future-based locks to prevent race conditions ### Bug Fixes: - **Fixed CPU percentage parsing**: Removed incorrect '*100' multiplication in BSD CPU parsing (values were already percentages) - **Enhanced memory parsing**: Added validation and error handling to BSD memory fallback parsing with proper logging - **Improved uptime parsing**: Added support for multiple Windows date formats and robust error handling with validation - **Fixed division by zero**: Added safety checks in Swap.usedPercent getter ### Code Quality Enhancements: - **Added comprehensive documentation**: Documented Windows CPU counter limitations and approach - **Strengthened error handling**: Added detailed logging and validation throughout parsing methods - **Improved robustness**: Enhanced BSD CPU parsing with percentage validation and warnings - **Better separation of concerns**: Each parsing method now has single responsibility ### Files Changed: - `lib/data/helper/system_detector.dart` (new): System detection helper - `lib/data/model/server/cpu.dart`: Fixed percentage parsing and added validation - `lib/data/model/server/memory.dart`: Enhanced fallback parsing and division-by-zero protection - `lib/data/model/server/server_status_update_req.dart`: Refactored into 13 focused parsing methods - `lib/data/provider/server.dart`: Improved synchronization and extracted system detection 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * refactor: parse & shell fn struct --------- Co-authored-by: Claude <noreply@anthropic.com>
93 lines
2.6 KiB
Dart
93 lines
2.6 KiB
Dart
// ignore_for_file: avoid_print
|
|
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:server_box/data/model/server/disk.dart';
|
|
|
|
void main() {
|
|
group('BTRFS RAID1 disk parsing', () {
|
|
test('correctly handles BTRFS RAID1 with same UUID', () {
|
|
final disks = Disk.parse(_btrfsRaidJsonOutput);
|
|
expect(disks, isNotEmpty);
|
|
expect(disks.length, 4); // Should have 2 parent disks + 2 BTRFS partitions
|
|
|
|
// We should get two distinct disks with the same UUID but different paths
|
|
final nvme1Disk = disks.firstWhere((disk) => disk.path == '/dev/nvme1n1p1');
|
|
final nvme2Disk = disks.firstWhere((disk) => disk.path == '/dev/nvme2n1p1');
|
|
|
|
// Both should exist
|
|
expect(nvme1Disk, isNotNull);
|
|
expect(nvme2Disk, isNotNull);
|
|
|
|
// They should have the same UUID (since they're part of the same BTRFS volume)
|
|
expect(nvme1Disk.uuid, nvme2Disk.uuid);
|
|
|
|
// But they should be treated as distinct disks
|
|
expect(identical(nvme1Disk, nvme2Disk), isFalse);
|
|
|
|
// Verify DiskUsage counts physical disks correctly
|
|
final usage = DiskUsage.parse(disks);
|
|
// With our unique path+kname identifier, both disks should be counted
|
|
expect(usage.size, nvme1Disk.size + nvme2Disk.size);
|
|
expect(usage.used, nvme1Disk.used + nvme2Disk.used);
|
|
});
|
|
});
|
|
}
|
|
|
|
// Simulated BTRFS RAID1 lsblk JSON output
|
|
const _btrfsRaidJsonOutput = '''
|
|
{
|
|
"blockdevices": [
|
|
{
|
|
"name": "nvme1n1",
|
|
"kname": "nvme1n1",
|
|
"path": "/dev/nvme1n1",
|
|
"fstype": null,
|
|
"mountpoint": null,
|
|
"fssize": null,
|
|
"fsused": null,
|
|
"fsavail": null,
|
|
"fsuse%": null,
|
|
"children": [
|
|
{
|
|
"name": "nvme1n1p1",
|
|
"kname": "nvme1n1p1",
|
|
"path": "/dev/nvme1n1p1",
|
|
"fstype": "btrfs",
|
|
"mountpoint": "/mnt/raid",
|
|
"fssize": "500000000000",
|
|
"fsused": "100000000000",
|
|
"fsavail": "400000000000",
|
|
"fsuse%": "20%",
|
|
"uuid": "btrfs-raid-uuid-1234-5678"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "nvme2n1",
|
|
"kname": "nvme2n1",
|
|
"path": "/dev/nvme2n1",
|
|
"fstype": null,
|
|
"mountpoint": null,
|
|
"fssize": null,
|
|
"fsused": null,
|
|
"fsavail": null,
|
|
"fsuse%": null,
|
|
"children": [
|
|
{
|
|
"name": "nvme2n1p1",
|
|
"kname": "nvme2n1p1",
|
|
"path": "/dev/nvme2n1p1",
|
|
"fstype": "btrfs",
|
|
"mountpoint": "/mnt/raid",
|
|
"fssize": "500000000000",
|
|
"fsused": "100000000000",
|
|
"fsavail": "400000000000",
|
|
"fsuse%": "20%",
|
|
"uuid": "btrfs-raid-uuid-1234-5678"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
''';
|