/* * Copyright (c) 2010-2017 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.evolveum.midpoint.testing.rest; import static org.testng.AssertJUnit.assertEquals; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.ws.rs.core.Response; import org.apache.cxf.endpoint.Server; import org.apache.cxf.jaxrs.JAXRSServerFactoryBean; import org.apache.cxf.jaxrs.client.ClientConfiguration; import org.apache.cxf.jaxrs.client.WebClient; import org.apache.cxf.transport.local.LocalConduit; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.model.impl.rest.MidpointAbstractProvider; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.provisioning.impl.ProvisioningServiceImpl; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.sql.SqlRepositoryServiceImpl; import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.task.api.TaskManager; import com.evolveum.midpoint.test.DummyAuditService; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; @ContextConfiguration(locations = { "classpath:ctx-rest-test.xml" }) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public abstract class RestServiceInitializer { private static final Trace LOGGER = TraceManager.getTrace(RestServiceInitializer.class); protected static final File BASE_REPO_DIR = new File("src/test/resources/repo/"); public static final File USER_ADMINISTRATOR_FILE = new File(BASE_REPO_DIR, "user-administrator.xml"); public static final String USER_ADMINISTRATOR_USERNAME = "administrator"; public static final String USER_ADMINISTRATOR_PASSWORD = "5ecr3t"; // No authorization public static final File USER_NOBODY_FILE = new File(BASE_REPO_DIR, "user-nobody.xml"); public static final String USER_NOBODY_OID = "ffb9729c-d48b-11e4-9720-001e8c717e5b"; public static final String USER_NOBODY_USERNAME = "nobody"; public static final String USER_NOBODY_PASSWORD = "nopassword"; // REST authorization only public static final File USER_CYCLOPS_FILE = new File(BASE_REPO_DIR, "user-cyclops.xml"); public static final String USER_CYCLOPS_OID = "6020bb52-d48e-11e4-9eaf-001e8c717e5b"; public static final String USER_CYCLOPS_USERNAME = "cyclops"; public static final String USER_CYCLOPS_PASSWORD = "cyclopassword"; // REST and reader authorization public static final File USER_SOMEBODY_FILE = new File(BASE_REPO_DIR, "user-somebody.xml"); public static final String USER_SOMEBODY_OID = "a5f3e3c8-d48b-11e4-8d88-001e8c717e5b"; public static final String USER_SOMEBODY_USERNAME = "somebody"; public static final String USER_SOMEBODY_PASSWORD = "somepassword"; public static final File ROLE_SUPERUSER_FILE = new File(BASE_REPO_DIR, "role-superuser.xml"); public static final File ROLE_ENDUSER_FILE = new File(BASE_REPO_DIR, "role-enduser.xml"); public static final File ROLE_REST_FILE = new File(BASE_REPO_DIR, "role-rest.xml"); public static final File ROLE_READER_FILE = new File(BASE_REPO_DIR, "role-reader.xml"); public static final File SYSTEM_CONFIGURATION_FILE = new File(BASE_REPO_DIR, "system-configuration.xml"); public static final File VALUE_POLICY_GENERAL = new File(BASE_REPO_DIR, "value-policy-general.xml"); public static final File VALUE_POLICY_NUMERIC = new File(BASE_REPO_DIR, "value-policy-numeric.xml"); public static final File VALUE_POLICY_SIMPLE = new File(BASE_REPO_DIR, "value-policy-simple.xml"); public static final File SECURITY_POLICY = new File(BASE_REPO_DIR, "security-policy.xml"); ApplicationContext applicationContext = null; private PrismContext prismContext; private TaskManager taskManager; private ModelService modelService; private Server server; private RepositoryService repositoryService; private ProvisioningService provisioning; protected DummyAuditService dummyAuditService; protected TestXmlProvider xmlProvider; protected TestJsonProvider jsonProvider; protected TestYamlProvider yamlProvider; protected abstract String getAcceptHeader(); protected abstract String getContentType(); protected abstract MidpointAbstractProvider getProvider(); protected final static String ENDPOINT_ADDRESS = "http://localhost:18080/rest"; @BeforeClass public void initialize() throws Exception { startServer(); } @AfterClass public void shutDown() { ((ClassPathXmlApplicationContext) applicationContext).close(); } public void startServer() throws Exception { applicationContext = new ClassPathXmlApplicationContext("ctx-rest-test-main.xml"); LOGGER.info("Spring context initialized."); JAXRSServerFactoryBean sf = (JAXRSServerFactoryBean) applicationContext.getBean("restService"); sf.setAddress(ENDPOINT_ADDRESS); server = sf.create(); repositoryService = (SqlRepositoryServiceImpl) applicationContext.getBean("repositoryService"); provisioning = (ProvisioningServiceImpl) applicationContext.getBean("provisioningService"); taskManager = (TaskManager) applicationContext.getBean("taskManager"); modelService = (ModelService) applicationContext.getBean("modelController"); xmlProvider = (TestXmlProvider) applicationContext.getBean("testXmlProvider"); jsonProvider = (TestJsonProvider) applicationContext.getBean("testJsonProvider"); yamlProvider = (TestYamlProvider) applicationContext.getBean("testYamlProvider"); InternalsConfig.encryptionChecks = false; prismContext = (PrismContext) applicationContext.getBean("prismContext"); Task initTask = getTaskManager().createTaskInstance(TestAbstractRestService.class.getName() + ".startServer"); OperationResult result = initTask.getResult(); addObject(ROLE_SUPERUSER_FILE, result); addObject(ROLE_ENDUSER_FILE, result); addObject(ROLE_REST_FILE, result); addObject(ROLE_READER_FILE, result); addObject(USER_ADMINISTRATOR_FILE, result); addObject(USER_NOBODY_FILE, result); addObject(USER_CYCLOPS_FILE, result); addObject(USER_SOMEBODY_FILE, result); addObject(VALUE_POLICY_GENERAL, result); addObject(VALUE_POLICY_NUMERIC, result); addObject(VALUE_POLICY_SIMPLE, result); addObject(SECURITY_POLICY, result); addObject(SYSTEM_CONFIGURATION_FILE, result); dummyAuditService = getDummyAuditService().getInstance(); InternalMonitor.reset(); getModelService().postInit(result); result.computeStatus(); TestUtil.assertSuccessOrWarning("startServer failed (result)", result, 1); } protected <O extends ObjectType> PrismObject<O> addObject(File file, OperationResult result) throws SchemaException, IOException, ObjectAlreadyExistsException { PrismObject<O> object = getPrismContext().parseObject(file); String oid = getRepositoryService().addObject(object, null, result); object.setOid(oid); return object; } protected WebClient prepareClient(String username, String password) { List providers = new ArrayList<>(); providers.add(getProvider()); WebClient client = WebClient.create(ENDPOINT_ADDRESS, providers);// , // provider); ClientConfiguration clientConfig = WebClient.getConfig(client); clientConfig.getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE); client.accept(getAcceptHeader()); client.type(getContentType()); createAuthorizationHeader(client, username, password); return client; } protected void createAuthorizationHeader(WebClient client, String username, String password) { if (username != null) { String authorizationHeader = "Basic " + org.apache.cxf.common.util.Base64Utility .encode((username + ":" + (password == null ? "" : password)).getBytes()); client.header("Authorization", authorizationHeader); } } protected void assertStatus(Response response, int expStatus) { assertEquals("Expected " + expStatus + " but got " + response.getStatus(), expStatus, response.getStatus()); } public PrismContext getPrismContext() { return prismContext; } public TaskManager getTaskManager() { return taskManager; } public ModelService getModelService() { return modelService; } public Server getServer() { return server; } public RepositoryService getRepositoryService() { return repositoryService; } public ProvisioningService getProvisioning() { return provisioning; } public DummyAuditService getDummyAuditService() { return dummyAuditService; } public TestXmlProvider getXmlProvider() { return xmlProvider; } public TestJsonProvider getJsonProvider() { return jsonProvider; } public TestYamlProvider getYamlProvider() { return yamlProvider; } }