php-bitpay-client/tests/Bitpay/Util/UtilTest.php
Sam Bohler df7bf05c94 Check Requirements Utility Method
Many plugins and other projects that use this library have to determine
whether the requirements for the library have been met.  This method
lists all requirements with boolean true if met, or a message string if not
so that informative error messages can be generated.
2015-04-13 10:11:34 -04:00

321 lines
10 KiB
PHP

<?php
/**
* @license Copyright 2011-2014 BitPay Inc., MIT License
* see https://github.com/bitpay/php-bitpay-client/blob/master/LICENSE
*/
namespace Bitpay\Util;
use Bitpay\Point;
/**
* @package Bitcore
*/
class UtilTest extends \PHPUnit_Framework_TestCase
{
public function testSha256()
{
$data = array(
array(
'03d95e184cce34c3cfa58e9a277a09a7c5ed1b2a8134ea1e52887bc66fa3f47071',
'a5c756101065ac5b8f689139e6d856fa99e54b5000b6428b43729d334cc9277d',
),
);
foreach ($data as $datum) {
$this->assertSame($datum[1], Util::sha256($datum[0]));
}
}
public function testSha512()
{
$data = array(
array('test data', '0e1e21ecf105ec853d24d728867ad70613c21663a4693074b2a3619c1bd39d66b588c33723bb466c72424e80e3ca63c249078ab347bab9428500e7ee43059d0d'),
);
foreach ($data as $datum) {
$this->assertSame($datum[1], Util::sha512($datum[0]));
}
}
public function testSha512Hmac()
{
$data = array(
array('data', 'key', '3c5953a18f7303ec653ba170ae334fafa08e3846f2efe317b87efce82376253cb52a8c31ddcde5a3a2eee183c2b34cb91f85e64ddbc325f7692b199473579c58'),
);
foreach ($data as $datum) {
$this->assertSame($datum[2], Util::sha512hmac($datum[0], $datum[1]));
}
}
public function testRipe160()
{
$data = array(
array('somemessage123', '12fd01a7ec6b9ba23b3a5c16fbfab3ac19624a88'),
array('', '9c1185a5c5e9fc54612808977ee8f548b2258d31'),
array('0000', 'ab20e58c9eeb4776e719deff3158e26ca9edb636'),
);
foreach ($data as $datum) {
$this->assertSame($datum[1], Util::ripe160($datum[0]));
}
}
public function testSha256Ripe160()
{
$data = array(
array(
'03d95e184cce34c3cfa58e9a277a09a7c5ed1b2a8134ea1e52887bc66fa3f47071',
'd166a41f27fd4b158f70314e5eee8998bf3d97d5',
),
);
foreach ($data as $datum) {
$this->assertSame($datum[1], Util::sha256ripe160($datum[0]));
}
}
/**
* @see https://github.com/bitpay/bitcore/blob/master/test/test.util.js
*/
public function testTwoSha256()
{
$data = array(
array(
'907c2bc503ade11cc3b04eb2918b6f547b0630ab569273824748c87ea14b0696526c66ba740200000000fd1f9bdd4ef073c7afc4ae00da8a66f429c917a0081ad1e1dabce28d373eab81d8628de80200000000ad042b5f25efb33beec9f3364e8a9139e8439d9d7e26529c3c30b6c3fd89f8684cfd68ea0200000000599ac2fe02a526ed040000000008535300516352515164370e010000000003006300ab2ec2291fe51c6f',
'60d8ec2b9241235914528efcc7b32315062d78c8dc12e09bbfdd4cb00563be5b',
),
);
foreach ($data as $datum) {
$this->assertSame($datum[1], Util::twoSha256($datum[0]));
}
}
public function testNonce()
{
$a = Util::nonce();
usleep(1);
$b = Util::nonce();
// ensure a < b
$this->assertGreaterThan($a, $b);
}
public function testGuid()
{
$guid = Util::guid();
// ensure proper length
$this->assertEquals(36, strlen($guid));
// Make sure in proper format
$guid = explode('-', $guid);
$this->assertEquals(8, strlen($guid[0]));
$this->assertEquals(4, strlen($guid[1]));
$this->assertEquals(4, strlen($guid[2]));
$this->assertEquals(4, strlen($guid[3]));
$this->assertEquals(12, strlen($guid[4]));
}
public function testEncodeHex()
{
$data = array(
array('123456789', '75bcd15'),
);
foreach ($data as $datum) {
$this->assertSame(
$datum[1],
Util::encodeHex($datum[0])
);
}
}
/**
* @expectedException Exception
*/
public function testEncodeException()
{
Util::encodeHex(new \StdClass());
}
public function testDecodeHex()
{
$data = array(
array('75bcd15', '123456789'),
array('0x75bcd15', '123456789'),
);
foreach ($data as $datum) {
$this->assertSame(
$datum[1],
Util::decodeHex($datum[0])
);
}
}
/**
* @expectedException Exception
*/
public function testDecodeHexException()
{
Util::decodeHex(new \StdClass());
}
public function testDoubleAndAdd()
{
$point = Util::doubleAndAdd('0', new Point(0, 0));
$this->assertInstanceOf('Bitpay\PointInterface', $point);
$this->assertTrue($point->isInfinity());
$point = Util::doubleAndAdd('1', new Point(1, 1));
$this->assertEquals('1', $point->getX());
$this->assertEquals('1', $point->getY());
$point = new Point(
'0x'.substr(Secp256k1::G, 2, 64),
'0x'.substr(Secp256k1::G, 66, 64)
);
$R = Util::doubleAndAdd(
'0xb7dafe35d7d1aab78b53982c8ba554584518f86d50af565c98e053613c8f15e0',
$point
);
$this->assertEquals('14976827122927988984909748681266837395089399768482149532452617485742004777865', $R->getX());
$this->assertEquals('5009713401941157350243425146365130573323232660945282226881202857781593637456', $R->getY());
$R = Util::doubleAndAdd(
'0xfd7c6914790d3bbf3184d9830e3f1a327e951e3478dd0b28f0fd3b0e774bbd68',
$point
);
$this->assertEquals('65041784833307054098962518952641430476519680065454324565175938819000678523383', $R->getX());
$this->assertEquals('53140314933116045874248958072587249546886301333167874306830834776596206062743', $R->getY());
}
public function testDecToBin()
{
$data = array(
array('123456789', '101010001011001111011010111'),
array('0x123456789', '100100011110011010100010110001001'),
);
foreach ($data as $datum) {
$this->assertSame($datum[1], Util::decToBin($datum[0]));
}
}
public function testPointDouble()
{
$point = Util::PointDouble(new Point('89565891926547004231252920425935692360644145829622209833684329913297188986597', '-103633689937622365100603176395974509217114616778598935862658712053120463017733'));
$expectedpoint = new Point("103388573995635080359749164254216598308788835304023601477803095234286494993683", "37057141145242123013015316630864329550140216928701153669873286428255828810018");
$this->assertEquals($expectedpoint, $point);
$point = Util::PointDouble(new Point(1, 1));
$expectedpoint = new Point("28948022309329048855892746252171976963317496166410141009864396001977208667916", "14474011154664524427946373126085988481658748083205070504932198000988604333958");
$this->assertEquals($expectedpoint, $point);
$point = Util::PointDouble(new Point(0, 0));
$expectedpoint = new Point("0", "0");
$this->assertEquals($expectedpoint, $point);
$point = Util::PointDouble(new Point("0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", "0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8"));
$expectedpoint = new Point("89565891926547004231252920425935692360644145829622209833684329913297188986597", "12158399299693830322967808612713398636155367887041628176798871954788371653930");
$this->assertEquals($expectedpoint, $point);
}
public function testPointAdd()
{
$point = Util::pointAdd(
new Point(1, 1),
new Point(1, 1)
);
$expectedpoint = new Point("28948022309329048855892746252171976963317496166410141009864396001977208667916", "14474011154664524427946373126085988481658748083205070504932198000988604333958");
$this->assertEquals($expectedpoint, $point);
$point = Util::pointAdd(
new Point(0, 0),
new Point(1, 1)
);
$expectedpoint = new Point("0", "0");
$this->assertEquals($expectedpoint, $point);
$point = Util::pointAdd(
new Point(1, 0),
new Point(0, 1)
);
$expectedpoint = new Point("0", "115792089237316195423570985008687907853269984665640564039457584007908834671662");
$this->assertEquals($expectedpoint, $point);
}
public function testBinConv()
{
$data = array(
array('7361746f736869', 'satoshi'),
array('0x7361746f736869', 'satoshi'),
);
foreach ($data as $datum) {
$this->assertSame($datum[1], Util::binConv($datum[0]));
}
}
public function testCheckRequirements()
{
$requirements = Util::checkRequirements();
// PHP Version
if (!defined('PHP_VERSION_ID')) {
$version = explode('.', PHP_VERSION);
define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}
if (PHP_VERSION_ID >= 50400) {
$this->assertTrue($requirements['PHP']);
} else {
$this->assertTrue(is_string($requirements['PHP']));
}
// Mcrypt Extension
if (extension_loaded('mcrypt')) {
$this->assertTrue($requirements['Mcrypt']);
} else {
$this->assertTrue(is_string($requirements['Mcrypt']));
}
// OpenSSL Extension
if (extension_loaded('openssl')) {
$this->assertTrue($requirements['OpenSSL']);
} else {
$this->assertTrue(is_string($requirements['OpenSSL']));
}
// JSON Extension
if (extension_loaded('json')) {
$this->assertTrue($requirements['JSON']);
} else {
$this->assertTrue(is_string($requirements['JSON']));
}
// cURL Extension
if (extension_loaded('curl')) {
$this->assertTrue($requirements['cURL']);
$curl_version = curl_version();
$ssl_supported = ($curl_version['features'] & CURL_VERSION_SSL);
if ($ssl_supported) {
$this->assertTrue($requirements['cURL.SSL']);
} else {
$this->assertTrue(is_string($requirements['cURL.SSL']));
}
} else {
$this->assertTrue(is_string($requirements['cURL']));
$this->assertTrue(is_string($requirements['cURL']));
}
// Math
if (extension_loaded('bcmath') || extension_loaded('gmp')) {
$this->assertTrue($requirements['Math']);
} else {
$this->assertTrue(is_string($requirements['Math']));
}
}
}