assertSame(0.0, SystemInfo::memUsedPercent(0, 0)); $this->assertSame(0.0, SystemInfo::memUsedPercent(512, 0)); } public function testMemoryPercentIsRoundedToTwoPlaces(): void { $this->assertSame(25.0, SystemInfo::memUsedPercent(1024, 4096)); $this->assertSame(33.33, SystemInfo::memUsedPercent(1, 3)); } public function testASingleGpuProcessIsWrappedInAList(): void { $rInstance = ['processes' => ['process_info' => ['pid' => '4242', 'type' => 'C', 'process_name' => 'ffmpeg', 'used_memory' => '312 MiB']]]; $this->assertSame([['pid' => 4242, 'memory' => '312 MiB']], SystemInfo::gpuProcesses($rInstance)); } public function testAListOfGpuProcessesIsMappedInOrder(): void { $rInstance = ['processes' => ['process_info' => [ ['pid' => '11', 'used_memory' => '100 MiB'], ['pid' => '12', 'used_memory' => '200 MiB'], ]]]; $this->assertSame( [['pid' => 11, 'memory' => '100 MiB'], ['pid' => 12, 'memory' => '200 MiB']], SystemInfo::gpuProcesses($rInstance) ); } public function testNoGpuProcessesIsAnEmptyList(): void { $this->assertSame([], SystemInfo::gpuProcesses([])); // An empty element decodes to an empty array. $this->assertSame([], SystemInfo::gpuProcesses(['processes' => []])); $this->assertSame([], SystemInfo::gpuProcesses(['processes' => 'N/A'])); $this->assertSame([], SystemInfo::gpuProcesses(['processes' => ['process_info' => []]])); } public function testGpuProcessesDecodedFromNvidiaSmiXml(): void { $rXML = '' . '777Cffmpeg150 MiB' . ''; $rGPU = json_decode(json_encode(simplexml_load_string($rXML)), true)['gpu']; $this->assertSame([['pid' => 777, 'memory' => '150 MiB']], SystemInfo::gpuProcesses($rGPU)); } public function testGetStatsUsesTheGuardedHelpers(): void { $rSource = (string) file_get_contents(MAIN_HOME . 'Core/Util/SystemInfo.php'); $this->assertStringContainsString("self::memUsedPercent(\$rJSON['total_mem_used'], \$rJSON['total_mem'])", $rSource); $this->assertStringContainsString("\$rArray['processes'] = self::gpuProcesses(\$rInstance);", $rSource); $this->assertStringNotContainsString("\$rInstance['processes']['process_info'] as", $rSource); } }