public function testAuthentication()
 {
     $req = new PasswordAuthenticationRequest();
     $req->action = AuthManager::ACTION_LOGIN;
     $reqs = [PasswordAuthenticationRequest::class => $req];
     $plugin = $this->getMockBuilder('AuthPlugin')->setMethods(['authenticate'])->getMock();
     $plugin->expects($this->never())->method('authenticate');
     $provider = new AuthPluginPrimaryAuthenticationProvider($plugin);
     $this->assertEquals(AuthenticationResponse::newAbstain(), $provider->beginPrimaryAuthentication([]));
     $req->username = '******';
     $req->password = null;
     $this->assertEquals(AuthenticationResponse::newAbstain(), $provider->beginPrimaryAuthentication($reqs));
     $req->username = null;
     $req->password = '******';
     $this->assertEquals(AuthenticationResponse::newAbstain(), $provider->beginPrimaryAuthentication($reqs));
     $req->username = '******';
     $req->password = '******';
     $plugin = $this->getMockBuilder('AuthPlugin')->setMethods(['userExists', 'authenticate'])->getMock();
     $plugin->expects($this->once())->method('userExists')->will($this->returnValue(true));
     $plugin->expects($this->once())->method('authenticate')->with($this->equalTo('Foo'), $this->equalTo('bar'))->will($this->returnValue(true));
     $provider = new AuthPluginPrimaryAuthenticationProvider($plugin);
     $this->assertEquals(AuthenticationResponse::newPass('Foo', $req), $provider->beginPrimaryAuthentication($reqs));
     $plugin = $this->getMockBuilder('AuthPlugin')->setMethods(['userExists', 'authenticate'])->getMock();
     $plugin->expects($this->once())->method('userExists')->will($this->returnValue(false));
     $plugin->expects($this->never())->method('authenticate');
     $provider = new AuthPluginPrimaryAuthenticationProvider($plugin);
     $this->assertEquals(AuthenticationResponse::newAbstain(), $provider->beginPrimaryAuthentication($reqs));
     $pluginUser = $this->getMockBuilder('AuthPluginUser')->setMethods(['isLocked'])->disableOriginalConstructor()->getMock();
     $pluginUser->expects($this->once())->method('isLocked')->will($this->returnValue(true));
     $plugin = $this->getMockBuilder('AuthPlugin')->setMethods(['userExists', 'getUserInstance', 'authenticate'])->getMock();
     $plugin->expects($this->once())->method('userExists')->will($this->returnValue(true));
     $plugin->expects($this->once())->method('getUserInstance')->will($this->returnValue($pluginUser));
     $plugin->expects($this->never())->method('authenticate');
     $provider = new AuthPluginPrimaryAuthenticationProvider($plugin);
     $this->assertEquals(AuthenticationResponse::newAbstain(), $provider->beginPrimaryAuthentication($reqs));
     $plugin = $this->getMockBuilder('AuthPlugin')->setMethods(['userExists', 'authenticate'])->getMock();
     $plugin->expects($this->once())->method('userExists')->will($this->returnValue(true));
     $plugin->expects($this->once())->method('authenticate')->with($this->equalTo('Foo'), $this->equalTo('bar'))->will($this->returnValue(false));
     $provider = new AuthPluginPrimaryAuthenticationProvider($plugin);
     $this->assertEquals(AuthenticationResponse::newAbstain(), $provider->beginPrimaryAuthentication($reqs));
     $plugin = $this->getMockBuilder('AuthPlugin')->setMethods(['userExists', 'authenticate', 'strict'])->getMock();
     $plugin->expects($this->once())->method('userExists')->will($this->returnValue(true));
     $plugin->expects($this->once())->method('authenticate')->with($this->equalTo('Foo'), $this->equalTo('bar'))->will($this->returnValue(false));
     $plugin->expects($this->any())->method('strict')->will($this->returnValue(true));
     $provider = new AuthPluginPrimaryAuthenticationProvider($plugin);
     $ret = $provider->beginPrimaryAuthentication($reqs);
     $this->assertSame(AuthenticationResponse::FAIL, $ret->status);
     $this->assertSame('wrongpassword', $ret->message->getKey());
     $plugin = $this->getMockBuilder('AuthPlugin')->setMethods(['userExists', 'authenticate', 'strictUserAuth'])->getMock();
     $plugin->expects($this->once())->method('userExists')->will($this->returnValue(true));
     $plugin->expects($this->once())->method('authenticate')->with($this->equalTo('Foo'), $this->equalTo('bar'))->will($this->returnValue(false));
     $plugin->expects($this->any())->method('strictUserAuth')->with($this->equalTo('Foo'))->will($this->returnValue(true));
     $provider = new AuthPluginPrimaryAuthenticationProvider($plugin);
     $ret = $provider->beginPrimaryAuthentication($reqs);
     $this->assertSame(AuthenticationResponse::FAIL, $ret->status);
     $this->assertSame('wrongpassword', $ret->message->getKey());
     $plugin = $this->getMockBuilder('AuthPlugin')->setMethods(['domainList', 'validDomain', 'setDomain', 'userExists', 'authenticate'])->getMock();
     $plugin->expects($this->any())->method('domainList')->will($this->returnValue(['Domain1', 'Domain2']));
     $plugin->expects($this->any())->method('validDomain')->will($this->returnCallback(function ($domain) {
         return in_array($domain, ['Domain1', 'Domain2']);
     }));
     $plugin->expects($this->once())->method('setDomain')->with($this->equalTo('Domain2'));
     $plugin->expects($this->once())->method('userExists')->will($this->returnValue(true));
     $plugin->expects($this->once())->method('authenticate')->with($this->equalTo('Foo'), $this->equalTo('bar'))->will($this->returnValue(true));
     $provider = new AuthPluginPrimaryAuthenticationProvider($plugin);
     list($req) = $provider->getAuthenticationRequests(AuthManager::ACTION_LOGIN, []);
     $req->username = '******';
     $req->password = '******';
     $req->domain = 'Domain2';
     $provider->beginPrimaryAuthentication([$req]);
 }