<?php 
declare(strict_types=1); 
 
use ParagonIE\HPKPBuilder\HPKPBuilder; 
use PHPUnit\Framework\TestCase; 
 
class BasicTest extends TestCase 
{ 
    protected function getHPKPObject($reportURI) 
    { 
        $hashes = [ 
            '1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=', 
            '1VilPkeVqirlPifk5scbzcTTbMT2clp-Zkyv9VFFasE', 
            'd558a53e4795aa2ae53e27e4e6c71bcdc4d36cc4f6725a7e664caff551456ac1', 
            "\xd5\x58\xa5\x3e\x47\x95\xaa\x2a\xe5\x3e\x27\xe4\xe6\xc7\x1b\xcd". 
            "\xc4\xd3\x6c\xc4\xf6\x72\x5a\x7e\x66\x4c\xaf\xf5\x51\x45\x6a\xc1" 
        ]; 
 
        $hpkp = new HPKPBuilder(); 
        foreach ($hashes as $h) { 
            $hpkp->addHash($h); 
        } 
        $hpkp->reportOnly(true) 
            ->reportUri($reportURI) 
            ->includeSubdomains(true); 
        return $hpkp; 
    } 
 
    /** 
     * @covers HPKPBuilder::addHash 
     * @covers HPKPBuilder::coerceBase64 
     * @covers HPKPBuilder::includeSubdomains 
     * @covers HPKPBuilder::reportOnly 
     * @covers HPKPBuilder::reportUri 
     */ 
    public function testHeaderOutput() 
    { 
        $reportURI = 'https://f038192cab4afafaacee34d22ed2e1dd.report-uri.io/r/default/hpkp/reportOnly'; 
        $hpkp = $this->getHPKPObject($reportURI); 
 
        $this->assertSame( 
            "Public-Key-Pins-Report-Only: " . 
                "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
                "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
                "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
                "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
                "max-age=5184000; includeSubDomains; " . 
                "report-uri=\"" . $reportURI . "\"" 
            , 
            $hpkp->getHeader() 
        ); 
 
        $hpkp->reportOnly(false); 
        $this->assertSame( 
            "Public-Key-Pins: " . 
            "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
            "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
            "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
            "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
            "max-age=5184000; includeSubDomains; " . 
            "report-uri=\"" . $reportURI . "\"" 
            , 
            $hpkp->getHeader() 
        ); 
 
        $hpkp->reportOnly(true) 
            ->reportUri(''); 
        $this->assertSame( 
            "Public-Key-Pins: " . 
            "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
            "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
            "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
            "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
            "max-age=5184000; includeSubDomains" 
            , 
            $hpkp->getHeader() 
        ); 
 
        $hpkp->includeSubdomains(false); 
 
        $this->assertSame( 
            "Public-Key-Pins: " . 
            "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
            "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
            "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
            "pin-sha256=\"1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=\"; " . 
            "max-age=5184000" 
            , 
            $hpkp->getHeader() 
        ); 
    } 
 
    /** 
     * @covers HPKPBuilder::fromFile 
     * @covers HPKPBuilder::getJSON 
     */ 
    public function testLoadSave() 
    { 
        $reportURI = 'https://f038192cab4afafaacee34d22ed2e1dd.report-uri.io/r/default/hpkp/reportOnly'; 
        $hpkp = $this->getHPKPObject($reportURI); 
        $saved = $hpkp->getJSON(); 
        if (@\file_put_contents(__DIR__. '/testing.json', $saved) === false) { 
            $this->markTestSkipped('Could not save JSON file'); 
        } 
        $hpkp2 = HPKPBuilder::fromFile(__DIR__. '/testing.json'); 
 
        $this->assertSame( 
            $hpkp->getHeader(), 
            $hpkp2->getHeader() 
        ); 
        \unlink(__DIR__ . '/testing.json'); 
    } 
} 
 
 |