public function testDeviceDetection()
{
// // iOS
$state = $this->getMockSkipConstructor('Horde_ActiveSync_State_Base');
$fixture = array('deviceType' => 'iPod', 'userAgent' => 'Apple-iPod5C1/1102.55400001', 'properties' => array(Horde_ActiveSync_Device::OS => 'iOS 7.0.4'));
$device = new Horde_ActiveSync_Device($state, $fixture);
$this->assertEquals(7, $device->getMajorVersion());
$this->assertEquals(0, $device->getMinorVersion());
$this->assertEquals(Horde_ActiveSync_Device::TYPE_IPOD, Horde_String::lower($device->deviceType));
$this->assertEquals(Horde_ActiveSync_Device::MULTIPLEX_NOTES, $device->multiplex);
$fixture = array('deviceType' => 'iPhone', 'userAgent' => 'iOS/1002.329');
$device = new Horde_ActiveSync_Device($state, $fixture);
$this->assertEquals(6, $device->getMajorVersion());
$this->assertEquals(1, $device->getMinorVersion());
$this->assertEquals(Horde_ActiveSync_Device::TYPE_IPHONE, Horde_String::lower($device->deviceType));
$this->assertEquals(Horde_ActiveSync_Device::MULTIPLEX_NOTES, $device->multiplex);
$this->assertEquals(false, $device->hasQuirk(Horde_ActiveSync_Device::QUIRK_NEEDS_SUPPORTED_PICTURE_TAG));
$fixture = array('deviceType' => 'iPod', 'userAgent' => 'Apple-iPod2C1/803.148');
$device = new Horde_ActiveSync_Device($state, $fixture);
$this->assertEquals(4, $device->getMajorVersion());
$this->assertEquals(2, $device->getMinorVersion());
$this->assertEquals(true, $device->hasQuirk(Horde_ActiveSync_Device::QUIRK_NEEDS_SUPPORTED_PICTURE_TAG));
$fixture = array('deviceType' => 'iPad', 'userAgent' => 'Apple-iPad3C6/1202.435', 'properties' => array(Horde_ActiveSync_Device::OS => 'iOS 8.1.1'));
$device = new Horde_ActiveSync_Device($state, $fixture);
$this->assertEquals(8, $device->getMajorVersion());
$this->assertEquals(1, $device->getMinorVersion());
$this->assertEquals(Horde_ActiveSync_Device::TYPE_IPAD, Horde_String::lower($device->deviceType));
$this->assertEquals(Horde_ActiveSync_Device::MULTIPLEX_NOTES, $device->multiplex);
$fixture = array('deviceType' => 'iPad', 'userAgent' => 'Apple-iPad4C5/1206.69', 'properties' => array(Horde_ActiveSync_Device::OS => 'iOS 8.3 12F69'));
$device = new Horde_ActiveSync_Device($state, $fixture);
$this->assertEquals(8, $device->getMajorVersion());
$this->assertEquals(3, $device->getMinorVersion());
$this->assertEquals(Horde_ActiveSync_Device::TYPE_IPAD, Horde_String::lower($device->deviceType));
$this->assertEquals(Horde_ActiveSync_Device::MULTIPLEX_NOTES, $device->multiplex);
$fixture = array('deviceType' => 'iPhone', 'userAgent' => 'Apple-iPhone6C1/1104.201', 'properties' => array(Horde_ActiveSync_Device::OS => 'iOS 9.0.2 13A452'));
$device = new Horde_ActiveSync_Device($state, $fixture);
$this->assertEquals(9, $device->getMajorVersion());
$this->assertEquals(0, $device->getMinorVersion());
$this->assertEquals(Horde_ActiveSync_Device::TYPE_IPHONE, Horde_String::lower($device->deviceType));
$this->assertEquals(Horde_ActiveSync_Device::MULTIPLEX_NOTES, $device->multiplex);
// Old Android.
$fixture = array('userAgent' => 'Android/0.3', 'deviceType' => 'Android');
$device = new Horde_ActiveSync_Device($state, $fixture);
$this->assertEquals(0, $device->getMajorVersion());
$this->assertEquals(3, $device->getMinorVersion());
$this->assertEquals(Horde_ActiveSync_Device::TYPE_ANDROID, Horde_String::lower($device->deviceType));
$this->assertEquals(Horde_ActiveSync_Device::TYPE_ANDROID, Horde_String::lower($device->clientType));
$this->assertEquals(Horde_ActiveSync_Device::MULTIPLEX_CONTACTS | Horde_ActiveSync_Device::MULTIPLEX_CALENDAR | Horde_ActiveSync_Device::MULTIPLEX_NOTES | Horde_ActiveSync_Device::MULTIPLEX_TASKS, $device->multiplex);
// Touchdown client on Android.
$fixture = array('userAgent' => 'TouchDown(MSRPC)/7.1.0005', 'deviceType' => 'Android');
$device = new Horde_ActiveSync_Device($state, $fixture);
$this->assertEquals(7, $device->getMajorVersion());
$this->assertEquals(1, $device->getMinorVersion());
$this->assertEquals(Horde_ActiveSync_Device::TYPE_ANDROID, Horde_String::lower($device->deviceType));
$this->assertEquals(Horde_ActiveSync_Device::TYPE_TOUCHDOWN, Horde_String::lower($device->clientType));
$this->assertEquals(0, $device->multiplex);
// Not-so-old-but-still-old Android.
$fixture = array('userAgent' => 'MOTOROLA-Droid(4D6F7869SAM)/2.1707', 'deviceType' => 'Android');
$device = new Horde_ActiveSync_Device($state, $fixture);
$this->assertEquals(2, $device->getMajorVersion());
$this->assertEquals(1707, $device->getMinorVersion());
$this->assertEquals(Horde_ActiveSync_Device::TYPE_ANDROID, Horde_String::lower($device->deviceType));
$this->assertEquals(Horde_ActiveSync_Device::TYPE_ANDROID, Horde_String::lower($device->clientType));
$this->assertEquals(15, $device->multiplex);
// KK Android (taken from SDK).
$fixture = array('userAgent' => 'Android/4.4.2-EAS-1.3', 'deviceType' => 'Android', 'properties' => array(Horde_ActiveSync_Device::OS => 'Android 4.4.2'));
$device = new Horde_ActiveSync_Device($state, $fixture);
$this->assertEquals(4, $device->getMajorVersion());
$this->assertEquals(4, $device->getMinorVersion());
$this->assertEquals(Horde_ActiveSync_Device::TYPE_ANDROID, Horde_String::lower($device->deviceType));
$this->assertEquals(Horde_ActiveSync_Device::TYPE_ANDROID, Horde_String::lower($device->clientType));
$this->assertEquals(13, $device->multiplex);
// Devices like this (from a Note 3) we simply can't sniff multiplex for
// since there is no version string. Stuff like this would go in the
// hook.
$fixture = array('deviceType' => 'SAMSUNGSMN900V', 'userAgent' => 'SAMSUNG-SM-N900V/101.403', 'properties' => array(Horde_ActiveSync_Device::OS => 'Android'));
$device = new Horde_ActiveSync_Device($state, $fixture);
// These are useless values, but still tests the reliability of the code
$this->assertEquals(101, $device->getMajorVersion());
$this->assertEquals(403, $device->getMinorVersion());
$this->assertEquals('samsungsmn900v', Horde_String::lower($device->deviceType));
$this->assertEquals(Horde_ActiveSync_Device::TYPE_ANDROID, Horde_String::lower($device->clientType));
$this->assertEquals(15, $device->multiplex);
// Nine (From Note 3 running 4.4.2).
$fixture = array('deviceType' => 'Android', 'userAgent' => 'hltevzw/KOT49H', 'properties' => array(Horde_ActiveSync_Device::OS => 'Android 4.4.2.N900VVRUCNC4'));
$device = new Horde_ActiveSync_Device($state, $fixture);
$device->id = '6E696E656331393035333833303331';
$this->assertEquals(4, $device->getMajorVersion());
$this->assertEquals('android', Horde_String::lower($device->deviceType));
$this->assertEquals(Horde_ActiveSync_Device::TYPE_NINE, Horde_String::lower($device->clientType));
$this->assertEquals(0, $device->multiplex);
// HTCOneMini2
$fixture = array('userAgent' => 'HTC', 'deviceType' => 'HTCOnemini2', 'properties' => array(Horde_ActiveSync_Device::OS => 'Android 4.4.2', Horde_ActiveSync_Device::MODEL => 'HTCOnemini2'));
$device = new Horde_ActiveSync_Device($state, $fixture);
$this->assertEquals(4, $device->getMajorVersion());
$this->assertEquals(4, $device->getMinorVersion());
$this->assertEquals('htconemini2', Horde_String::lower($device->deviceType));
$this->assertEquals(Horde_ActiveSync_Device::TYPE_ANDROID, Horde_String::lower($device->clientType));
$this->assertEquals(15, $device->multiplex);
}