package org.gbif.ipt.validation;
import org.gbif.doi.service.ServiceConfig;
import org.gbif.ipt.action.admin.OrganisationsAction;
import org.gbif.ipt.config.AppConfig;
import org.gbif.ipt.config.Constants;
import org.gbif.ipt.model.Organisation;
import org.gbif.ipt.model.voc.DOIRegistrationAgency;
import org.gbif.ipt.service.admin.RegistrationManager;
import org.gbif.ipt.service.manage.ResourceManager;
import org.gbif.ipt.service.registry.RegistryManager;
import org.gbif.ipt.struts2.SimpleTextProvider;
import org.gbif.utils.HttpUtil;
import org.gbif.utils.file.FileUtils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.UUID;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.log4j.Logger;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(Parameterized.class)
public class OrganisationSupportIT {
private static final Logger LOG = Logger.getLogger(OrganisationSupportIT.class);
private static final DefaultHttpClient CLIENT = HttpUtil.newMultithreadedClient(10000, 3, 2);
private static final String ORGANISATION_KEY = UUID.fromString("dce7a3c9-ea78-4be7-9abc-e3838de70dc5").toString();
private static final String VALID_ORGANISATION_PASSWORD = "password";
private static final OrganisationsAction action =
new OrganisationsAction(mock(SimpleTextProvider.class), mock(AppConfig.class), mock(RegistrationManager.class),
mock(OrganisationSupport.class), mock(OrganisationsAction.RegisteredOrganisations.class),
mock(ResourceManager.class));
private static AppConfig mockCfg;
private static RegistryManager mockRegistryManager;
private Organisation organisation;
private boolean isValid;
public OrganisationSupportIT(Organisation organisation, boolean isValid) {
this.organisation = organisation;
this.isValid = isValid;
}
@BeforeClass
public static void init() {
// config in production mode
mockCfg = mock(AppConfig.class);
when(mockCfg.getRegistryType()).thenReturn(AppConfig.REGISTRY_TYPE.DEVELOPMENT);
mockRegistryManager = mock(RegistryManager.class);
when(mockRegistryManager.validateOrganisation(ORGANISATION_KEY, VALID_ORGANISATION_PASSWORD)).thenReturn(true);
}
@Parameterized.Parameters
public static Iterable data() throws IOException {
// read DataCite config from YAML file
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
InputStream dc = FileUtils.classpathStream("datacite.yaml");
ServiceConfig dcCfg = mapper.readValue(dc, ServiceConfig.class);
//LOG.info("DataCite password (read from Maven property datacite.password)= " + dcCfg.getPassword());
// organisation with valid DataCite account
Organisation o1 = new Organisation();
o1.setName("NHM");
o1.setPassword(VALID_ORGANISATION_PASSWORD);
o1.setKey(ORGANISATION_KEY);
o1.setDoiRegistrationAgency(DOIRegistrationAgency.DATACITE);
o1.setAgencyAccountUsername(dcCfg.getUsername());
o1.setAgencyAccountPassword(dcCfg.getPassword());
o1.setDoiPrefix(Constants.TEST_DOI_PREFIX);
// organisation with valid EZID account
Organisation o2 = new Organisation();
o2.setName("NHM");
o2.setPassword(VALID_ORGANISATION_PASSWORD);
o2.setKey(ORGANISATION_KEY);
o2.setDoiRegistrationAgency(DOIRegistrationAgency.EZID);
o2.setAgencyAccountUsername("apitest");
o2.setAgencyAccountPassword("apitest");
o2.setDoiPrefix(Constants.EZID_TEST_DOI_SHOULDER);
// organisation with DataCite account that does not authenticate (wrong password)
Organisation o3 = new Organisation();
o3.setName("NHM");
o3.setPassword(VALID_ORGANISATION_PASSWORD);
o3.setKey(ORGANISATION_KEY);
o3.setDoiRegistrationAgency(DOIRegistrationAgency.DATACITE);
o3.setAgencyAccountUsername(dcCfg.getUsername());
o3.setAgencyAccountPassword("wrongPassword");
o3.setDoiPrefix(Constants.TEST_DOI_PREFIX);
// organisation with EZID account that does not authenticate (wrong password)
Organisation o4 = new Organisation();
o4.setName("NHM");
o4.setPassword(VALID_ORGANISATION_PASSWORD);
o4.setKey(ORGANISATION_KEY);
o4.setDoiRegistrationAgency(DOIRegistrationAgency.EZID);
o4.setAgencyAccountUsername("apitest");
o4.setAgencyAccountPassword("wrongPassword");
o4.setDoiPrefix(Constants.EZID_TEST_DOI_SHOULDER);
// organisation with DataCite account that does not authenticate (wrong prefix)
Organisation o5 = new Organisation();
o5.setName("NHM");
o5.setPassword(VALID_ORGANISATION_PASSWORD);
o5.setKey(ORGANISATION_KEY);
o5.setDoiRegistrationAgency(DOIRegistrationAgency.DATACITE);
o5.setAgencyAccountUsername(dcCfg.getUsername());
o5.setAgencyAccountPassword(dcCfg.getPassword());
o5.setDoiPrefix("10.9999"); // wrong
// organisation with EZID account that does not authenticate (wrong prefix)
Organisation o6 = new Organisation();
o6.setName("NHM");
o6.setPassword(VALID_ORGANISATION_PASSWORD);
o6.setKey(ORGANISATION_KEY);
o6.setDoiRegistrationAgency(DOIRegistrationAgency.EZID);
o6.setAgencyAccountUsername("apitest");
o6.setAgencyAccountPassword("apitest");
o6.setDoiPrefix("10.9999/FK2"); // wrong
return Arrays.asList(new Object[][] {{o1, true}, {o2, true}, {o3, false}, {o4, false}, {o5, false}, {o6, false}});
}
@Test
public void testValidate() {
LOG.info("Testing " + organisation.getDoiRegistrationAgency() + "...");
// EZID only: one-time login over SSL stores a session cookie, clear otherwise test reuses existing valid connection
if (DOIRegistrationAgency.EZID.equals(organisation.getDoiRegistrationAgency())) {
CLIENT.getCookieStore().clear();
}
OrganisationSupport organisationSupport = new OrganisationSupport(mockRegistryManager, mockCfg, CLIENT);
assertEquals(isValid, organisationSupport.validate(action, organisation));
}
}