package org.odata4j.test.integration.consumer; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.junit.matchers.JUnitMatchers.containsString; import org.eclipse.jetty.http.security.Constraint; import org.eclipse.jetty.http.security.Password; import org.eclipse.jetty.security.ConstraintMapping; import org.eclipse.jetty.security.ConstraintSecurityHandler; import org.eclipse.jetty.security.HashLoginService; import org.eclipse.jetty.security.SecurityHandler; import org.joda.time.LocalDateTime; import org.junit.Test; import org.odata4j.consumer.ODataConsumer; import org.odata4j.consumer.behaviors.OClientBehaviors; import org.odata4j.core.OEntity; import org.odata4j.core.OProperties; import org.odata4j.core.OProperty; import org.odata4j.examples.cxf.producer.server.ODataCxfServer; import org.odata4j.examples.jersey.producer.server.ODataJerseyServer; import org.odata4j.examples.producer.inmemory.AddressBookInMemoryExample; import org.odata4j.exceptions.NotImplementedException; import org.odata4j.producer.resources.DefaultODataProducerProvider; import org.odata4j.test.integration.AbstractODataConsumerTest; import com.sun.net.httpserver.Authenticator; import com.sun.net.httpserver.BasicAuthenticator; public class BasicAuthenticationTest extends AbstractODataConsumerTest { private static final String REALM = "SomeRealm"; private static final String USERNAME = "SomeUsername"; private static final String PASSWORD = "SomePassword"; private static final String ROLE = "SomeRole"; public BasicAuthenticationTest(RuntimeFacadeType type) { super(type); } @Override protected void startODataServer() throws Exception { server = rtFacade.createODataServer(BASE_URI); if (server instanceof ODataJerseyServer) ((ODataJerseyServer) server).setHttpServerAuthenticator(getAuthenticator()); else ((ODataCxfServer) server).setJettySecurityHandler(getSecurityHandler()); server.start(); } private Authenticator getAuthenticator() { Authenticator authenticator = new BasicAuthenticator(REALM) { public boolean checkCredentials(String username, String password) { return USERNAME.equals(username) && PASSWORD.equals(password); } }; return authenticator; } private SecurityHandler getSecurityHandler() { ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler(); securityHandler.addConstraintMapping(mapping(constraint())); securityHandler.setLoginService(loginService()); return securityHandler; } private Constraint constraint() { Constraint constraint = new Constraint(); constraint.setAuthenticate(true); constraint.setRoles(new String[] { ROLE }); return constraint; } private ConstraintMapping mapping(Constraint constraint) { ConstraintMapping constraintMapping = new ConstraintMapping(); constraintMapping.setConstraint(constraint); constraintMapping.setPathSpec("/*"); return constraintMapping; } private HashLoginService loginService() { HashLoginService loginService = new HashLoginService(); loginService.update(USERNAME, new Password(PASSWORD), new String[] { ROLE }); return loginService; } @Override protected void startClient() throws Exception { ODataConsumer.dump.all(true); consumer = rtFacade.createODataConsumer(BASE_URI, format, OClientBehaviors.basicAuth(USERNAME, PASSWORD)); } @Override protected void registerODataProducer() throws Exception { DefaultODataProducerProvider.setInstance(AddressBookInMemoryExample.createProducer()); } @Test public void unauthorizedConsumerIsRejected() throws Exception { ODataConsumer unauthorizedConsumer = rtFacade.createODataConsumer(BASE_URI, format); try { unauthorizedConsumer.getEntities("Persons").execute(); fail(); } catch (RuntimeException e) { assertThat(e.getMessage(), containsString("Unauthorized")); } } @Test public void getEntity() throws Exception { OEntity entity = consumer.getEntity("Persons", Integer.valueOf(1)).execute(); assertThat(entity, notNullValue()); } @Test(expected=NotImplementedException.class) public void createEntity() throws Exception { OProperty<Integer> personId = OProperties.int32("PersonId", Integer.valueOf(4)); OProperty<String> name = OProperties.string("Name", "Stephanie Spring"); OProperty<String> emailAddress = OProperties.string("EmailAddress", "st.spring@mail-provider.com"); OProperty<LocalDateTime> birthDay = OProperties.datetime("BirthDay", new LocalDateTime(1979, 4, 9, 0, 0)); assertThat(consumer.createEntity("Persons").properties(personId, name, emailAddress, birthDay).execute(), notNullValue()); } @Test(expected=NotImplementedException.class) public void updateEntity() throws Exception { OProperty<String> newEmailAddress = OProperties.string("EmailAddress", "walter.winter@new-company.com"); OEntity entity = consumer.getEntity("Persons", Integer.valueOf(2)).execute(); consumer.updateEntity(entity).properties(newEmailAddress).execute(); } @Test(expected=NotImplementedException.class) public void deleteEntity() throws Exception { consumer.deleteEntity("Persons", Integer.valueOf(3)).execute(); } }