<?php 
 
namespace Test\Unit; 
 
use OTP\Base32; 
use OTP\TOTP; 
use OTP\Utils; 
use PHPUnit\Framework\TestCase; 
 
class HOTPTest extends TestCase 
{ 
    /** 
     * @var \OTP\TOTP 
     */ 
    protected $hotp; 
 
    /** 
     * @var string 
     */ 
    protected $secret; 
 
    public function setUp(): void 
    { 
        parent::setUp(); 
        $this->hotp = new TOTP("12345678901234567890", 3, true); 
    } 
 
    public function test_token_and_tokenAt() 
    { 
        $first_otp = $this->hotp->token(); 
        $second_otp = $this->hotp->tokenAt(time() - 30, 1); 
        return $this->assertEquals($first_otp, $second_otp); 
    } 
 
    public function test_token_support_delay_tolerance() 
    { 
        $now = time(); 
        $token_1 = $this->hotp->tokenAt($now - 30); //remove 30 seconds  
        $token_2 = $this->hotp->tokenAt($now + 20); //add 20 seconds 
        $this->assertTrue($this->hotp->verify($token_1)); 
        $this->assertTrue($this->hotp->verify($token_2)); 
    } 
 
    public function testBase32Encoding() 
    { 
        $this->assertEquals(Base32::encode("12345678901234567890"), 'GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ'); 
        $this->assertEquals(Base32::decode("GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ"), "12345678901234567890"); 
    } 
 
    public function test_verify_token_by_windows() 
    { 
        $this->assertTrue($this->hotp->validateByWindow( 
            $this->hotp->token(2), 0 
        )); 
        #Utils::debug('hi'); 
        $this->assertTrue($this->hotp->verify($this->hotp->token(-29))); 
    } 
} 
 
 |