null, 'brand' => 'Cooper', 'client' => [ 'type' => 'browser', 'name' => 'Microsoft Edge', ], 'device' => 1, 'model' => 'iPhone', 'os' => [ 'name' => 'Linux', ], ]; self::writeFakeFile($expected, $userAgent); $factory = new Factory(); $deviceDetection = $factory->makeInstance($userAgent, []); $this->assertInstanceOf(CachedEntry::class, $deviceDetection); $this->assertEquals(null, $deviceDetection->getBot()); $this->assertEquals('Cooper', $deviceDetection->getBrandName()); $this->assertEquals($expected['client'], $deviceDetection->getClient()); $this->assertEquals(1, $deviceDetection->getDevice()); $this->assertEquals('iPhone', $deviceDetection->getModel()); $this->assertEquals($expected['os'], $deviceDetection->getOs()); } public function testGetInstanceFromCacheWithClientHints() { $userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.66"; $clientHints = [ 'HTTP_SEC_CH_UA_PLATFORM' => '"Windows"', 'HTTP_SEC_CH_UA' => '" Not A;Brand";v="99", "Chromium";v="95", "Microsoft Edge";v="95"', 'HTTP_SEC_CH_UA_MOBILE' => "?0", 'HTTP_SEC_CH_UA_FULL_VERSION' => '"98.0.0.1"', 'HTTP_SEC_CH_UA_PLATFORM_VERSION' => '"14.0.0"', 'HTTP_SEC_CH_UA_ARCH' => "x86", 'HTTP_SEC_CH_UA_BITNESS' => "64", 'HTTP_SEC_CH_UA_MODEL' => "" ]; $expected = [ 'bot' => null, 'brand' => '', 'client' => [ 'type' => 'browser', 'name' => 'Microsoft Edge', 'version' => '97.0.1072.66' ], 'device' => 1, 'model' => '', 'os' => [ 'name' => 'Windows', 'version' => '10', ], ]; self::writeFakeFile($expected, $userAgent); $factory = new Factory(); // not using client hints will return the cached entry $deviceDetection = $factory->makeInstance($userAgent, []); $this->assertInstanceOf(CachedEntry::class, $deviceDetection); $this->assertEquals(null, $deviceDetection->getBot()); $this->assertEquals($expected['brand'], $deviceDetection->getBrandName()); $this->assertEquals($expected['client'], $deviceDetection->getClient()); $this->assertEquals(1, $deviceDetection->getDevice()); $this->assertEquals($expected['model'], $deviceDetection->getModel()); $this->assertEquals($expected['os'], $deviceDetection->getOs()); // using client hints will overwrite some value if needed $deviceDetection = $factory->makeInstance($userAgent, $clientHints); $expected['os'] = [ 'name' => 'Windows', 'version' => '11', 'short_name' => 'WIN', 'platform' => 'x64', 'family' => 'Windows', ]; $expected['client'] = [ 'type' => 'browser', 'name' => 'Microsoft Edge', 'version' => '98.0', 'short_name' => 'PS', // empty because cached result doesn't contain it and engine won't be detected through client hints only 'engine' => '', 'engine_version' => '', 'family' => 'Internet Explorer', ]; if (version_compare('4.11.0', Version::VERSION, '>=')) { // On older versions client hints were not supported and thus the result differed. $expected['os'] = [ 'name' => 'Windows', 'version' => '10', ]; $expected['client'] = [ 'type' => 'browser', 'name' => 'Microsoft Edge', 'version' => '97.0.1072.66' ]; } $this->assertInstanceOf(CachedEntry::class, $deviceDetection); $this->assertEquals(null, $deviceDetection->getBot()); $this->assertEquals($expected['brand'], $deviceDetection->getBrandName()); $this->assertEquals($expected['client'], $deviceDetection->getClient()); $this->assertEquals(1, $deviceDetection->getDevice()); $this->assertEquals($expected['model'], $deviceDetection->getModel()); $this->assertEquals($expected['os'], $deviceDetection->getOs()); } public function testGetInstanceFromDeviceDetector() { $userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:33.0) Gecko/20100101 Firefox/33.0"; $expected = [ 'client' => [ 'type' => 'browser', 'name' => 'Firefox', 'short_name' => 'FF', 'version' => '33.0', 'engine' => 'Gecko', 'engine_version' => '33.0', ], 'os' => [ 'name' => 'Mac', 'short_name' => 'MAC', 'version' => '10.10', 'platform' => '', ], ]; $factory = new Factory(); $deviceDetection = $factory->makeInstance($userAgent, []); $this->assertInstanceOf("\DeviceDetector\DeviceDetector", $deviceDetection); $this->assertEquals(null, $deviceDetection->getBot()); $this->assertEquals('AP', $deviceDetection->getBrand()); $client = $deviceDetection->getClient(); unset($client['family']); // newer version of DD might return the family. We ignore it here, to allow tests with older Matomo versions $this->assertEquals($expected['client'], $client); $this->assertEquals(0, $deviceDetection->getDevice()); $this->assertEquals('', $deviceDetection->getModel()); $os = $deviceDetection->getOs(); unset($os['family']); // newer version of DD might return the family. We ignore it here, to allow tests with older Matomo versions $this->assertEquals($expected['os'], $os); } public static function writeFakeFile($expected, $userAgent) { $filePath = CachedEntry::getCachePath($userAgent, true); $content = "