fuc-new/tests/App/Utils/ToolsTest.php
hellcat 1fe8673f62 1
2025-10-01 13:34:29 +08:00

299 lines
8.2 KiB
PHP
Executable File

<?php
declare(strict_types=1);
namespace App\Utils;
use MaxMind\Db\Reader\InvalidDatabaseException;
use PHPUnit\Framework\TestCase;
use function date_default_timezone_set;
use function strlen;
class ToolsTest extends TestCase
{
/**
* @covers App\Utils\Tools::getIpLocation
*/
public function testGetIpLocation()
{
$_ENV['maxmind_license_key'] = '';
$msg = Tools::getIpLocation('8.8.8.8');
$this->assertIsString($msg);
$this->assertEquals('GeoIP2 服务未配置', $msg);
}
/**
* @covers App\Utils\Tools::autoBytes
*/
public function testAutoBytes()
{
$size = 1024;
$bytes = Tools::autoBytes($size);
$this->assertIsString($bytes);
$this->assertEquals('1KB', $bytes);
}
/**
* @covers App\Utils\Tools::autoBytesR
*/
public function testAutoBytesR()
{
$size = '1KB';
$bytes = Tools::autoBytesR($size);
$this->assertIsInt($bytes);
$this->assertEquals(1024, $bytes);
}
/**
* @covers App\Utils\Tools::autoMbps
*/
public function testAutoMbps()
{
$bandwidth = 1;
$mbps = Tools::autoMbps($bandwidth);
$this->assertIsString($mbps);
$this->assertEquals('1Mbps', $mbps);
}
/**
* @covers App\Utils\Tools::toMB
*/
public function testToMB()
{
$traffic = 1;
$mb = 1048576;
$result = Tools::toMB($traffic);
$this->assertIsInt($result);
$this->assertEquals($traffic * $mb, $result);
}
/**
* @covers App\Utils\Tools::toGB
*/
public function testToGB()
{
$traffic = 1;
$gb = 1048576 * 1024;
$result = Tools::toGB($traffic);
$this->assertIsInt($result);
$this->assertEquals($traffic * $gb, $result);
}
/**
* @covers App\Utils\Tools::flowToGB
*/
public function testFlowToGB()
{
$traffic = 1048576 * 1024;
$gb = 1048576 * 1024;
$result = Tools::flowToGB($traffic);
$this->assertIsFloat($result);
$this->assertEquals($traffic / $gb, $result);
}
/**
* @covers App\Utils\Tools::flowToMB
*/
public function testFlowToMB()
{
$traffic = 1048576;
$mb = 1048576;
$result = Tools::flowToMB($traffic);
$this->assertIsFloat($result);
$this->assertEquals($traffic / $mb, $result);
}
/**
* @covers App\Utils\Tools::genSubToken
*/
public function testGenSubToken()
{
$_ENV['sub_token_len'] = 10;
$token = Tools::genSubToken();
$this->assertEquals(10, strlen($token));
$_ENV['sub_token_len'] = 0;
$token = Tools::genSubToken();
$this->assertEquals(8, strlen($token));
$_ENV['sub_token_len'] = -5;
$token = Tools::genSubToken();
$this->assertEquals(8, strlen($token));
}
/**
* @covers App\Utils\Tools::genRandomChar
*/
public function testGenRandomChar()
{
$randomString = Tools::genRandomChar();
$this->assertIsString($randomString);
$this->assertEquals(8, strlen($randomString));
$length = 10;
$randomString = Tools::genRandomChar($length);
$this->assertIsString($randomString);
$this->assertEquals($length, strlen($randomString));
$length = 9;
$randomString = Tools::genRandomChar($length);
$this->assertIsString($randomString);
$this->assertEquals($length, strlen($randomString));
$length = 1;
$randomString = Tools::genRandomChar($length);
$this->assertIsString($randomString);
$this->assertEquals(2, strlen($randomString));
}
/**
* @covers App\Utils\Tools::genSs2022UserPk
*/
public function testGenSs2022UserPk()
{
$passwd = 'password';
$method = '2022-blake3-aes-128-gcm';
$pk = Tools::genSs2022UserPk($passwd, $method);
$this->assertIsString($pk);
$this->assertEquals('YzAwNjdkNGFmNGU4N2YwMA==', $pk);
$method = '2022-blake3-aes-256-gcm';
$pk = Tools::genSs2022UserPk($passwd, $method);
$this->assertIsString($pk);
$this->assertEquals('YzAwNjdkNGFmNGU4N2YwMGRiYWM2M2I2MTU2ODI4MjM=', $pk);
$method = 'bomb_three_gorges_dam';
$pk = Tools::genSs2022UserPk($passwd, $method);
$this->assertFalse($pk);
}
/**
* @covers App\Utils\Tools::toDateTime
*/
public function testToDateTime()
{
date_default_timezone_set('ROC'); // Use Asia/Shanghai or PRC will cause this test to fail
$time = 612907200; // 1989-06-04 04:00:00 UTC+8
$expected = '1989-06-04 04:00:00';
$result = Tools::toDateTime($time);
$this->assertIsString($result);
$this->assertEquals($expected, $result);
}
/**
* @covers App\Utils\Tools::getDir
*/
public function testGetDir()
{
// Scenario 1: Valid directory
$dir1 = 'tests/testDir';
$expected1 = ['emptyDir', 'file1', 'file2', 'file3']; // Replace with actual expected result
$result1 = Tools::getDir($dir1);
$this->assertEqualsCanonicalizing($expected1, $result1);
// Scenario 2: Directory with .gitkeep
$dir2 = 'tests/testDir/emptyDir';
$result2 = Tools::getDir($dir2);
$this->assertEqualsCanonicalizing(['.gitkeep'], $result2);
}
/**
* @covers App\Utils\Tools::isParamValidate
*/
public function testIsParamValidate()
{
$this->assertTrue(Tools::isParamValidate('default', 'aes-128-gcm'));
$this->assertFalse(Tools::isParamValidate('default', 'rc4-md5'));
}
/**
* @covers App\Utils\Tools::getSsMethod
*/
public function testGetSsMethod()
{
// Scenario 1: ss_obfs
$expected1 = [
'simple_obfs_http',
'simple_obfs_http_compatible',
'simple_obfs_tls',
'simple_obfs_tls_compatible',
];
$result1 = Tools::getSsMethod('ss_obfs');
$this->assertEquals($expected1, $result1);
// Scenario 2: default
$expected2 = [
'aes-128-gcm',
'aes-192-gcm',
'aes-256-gcm',
'chacha20-ietf-poly1305',
'xchacha20-ietf-poly1305',
];
$result2 = Tools::getSsMethod('default');
$this->assertEquals($expected2, $result2);
// Scenario 3: Random string
$expected3 = [
'aes-128-gcm',
'aes-192-gcm',
'aes-256-gcm',
'chacha20-ietf-poly1305',
'xchacha20-ietf-poly1305',
];
$result3 = Tools::getSsMethod('randomString');
$this->assertEquals($expected3, $result3);
// Scenario 4: Empty string
$expected4 = [
'aes-128-gcm',
'aes-192-gcm',
'aes-256-gcm',
'chacha20-ietf-poly1305',
'xchacha20-ietf-poly1305',
];
$result4 = Tools::getSsMethod('');
$this->assertEquals($expected4, $result4);
}
/**
* @covers App\Utils\Tools::isEmail
*/
public function testIsEmail()
{
$this->assertTrue(Tools::isEmail('test@example.com'));
$this->assertFalse(Tools::isEmail('test@example'));
}
/**
* @covers App\Utils\Tools::isIPv4
*/
public function testIsIPv4()
{
$this->assertTrue(Tools::isIPv4('192.168.0.1'));
$this->assertFalse(Tools::isIPv4('2001:0db8:85a3:0000:0000:8a2e:0370:7334'));
$this->assertFalse(Tools::isIPv4('UwU'));
}
/**
* @covers App\Utils\Tools::isIPv6
*/
public function testIsIPv6()
{
$this->assertTrue(Tools::isIPv6('2001:0db8:85a3:0000:0000:8a2e:0370:7334'));
$this->assertFalse(Tools::isIPv6('192.168.0.1'));
$this->assertFalse(Tools::isIPv6('hmm'));
}
/**
* @covers App\Utils\Tools::isInt
*/
public function testIsInt()
{
$this->assertTrue(Tools::isInt(123));
$this->assertFalse(Tools::isInt('abc'));
}
/**
* @covers App\Utils\Tools::isJson
*/
public function testIsJson()
{
$this->assertTrue(Tools::isJson('{}'));
$this->assertFalse(Tools::isJson('[]'));
$this->assertFalse(Tools::isJson('what the'));
}
}