package org.ovirt.engine.api.restapi.resource; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.Locale; import java.util.List; import static org.ovirt.engine.api.restapi.test.util.TestHelper.eqQueryParams; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.UriInfo; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.ovirt.engine.api.common.invocation.Current; import org.ovirt.engine.api.common.security.auth.Principal; import org.ovirt.engine.api.model.API; import org.ovirt.engine.api.model.Link; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.interfaces.BackendLocal; import org.ovirt.engine.core.common.queries.GetConfigurationValueParameters; import org.ovirt.engine.core.common.queries.GetSystemStatisticsQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.api.restapi.logging.MessageBundle; import org.ovirt.engine.api.restapi.util.SessionHelper; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import static org.powermock.api.easymock.PowerMock.createMock; import static org.powermock.api.easymock.PowerMock.replayAll; import static org.powermock.api.easymock.PowerMock.verifyAll; @RunWith(PowerMockRunner.class) @PrepareForTest( { Config.class }) public class BackendApiResourceTest extends Assert { protected BackendApiResource resource; protected BackendLocal backend; protected Current current; protected Principal principal; protected SessionHelper sessionHelper; protected HttpHeaders httpHeaders; protected static final String USER = "Aladdin"; protected static final String SECRET = "open sesame"; protected static final String DOMAIN = "Maghreb"; protected static final String URI_ROOT = "http://localhost:8099"; protected static final String SLASH = "/"; protected static final String BASE_PATH = "/api"; protected static final String URI_BASE = URI_ROOT + BASE_PATH; protected static final String BUNDLE_PATH = "org/ovirt/engine/api/restapi/logging/Messages"; protected static final int MAJOR = 11; protected static final int MINOR = 0; protected static final int BUILD = 99; protected static final int REVISION = 13; protected static final String SYSTEM_VERSION = Integer.toString(MAJOR) + "." + Integer.toString(MINOR) + "." + Integer.toString(BUILD) + "." + Integer.toString(REVISION); protected static int TOTAL_VMS = 123456; protected static int ACTIVE_VMS = 23456; protected static int TOTAL_HOSTS = 23456; protected static int ACTIVE_HOSTS = 3456; protected static int TOTAL_USERS = 3456; protected static int ACTIVE_USERS = 456; protected static int TOTAL_STORAGE_DOMAINS = 56; protected static int ACTIVE_STORAGE_DOMAINS = 6; private static final String[] relationships = { "capabilities", "clusters", "clusters/search", "datacenters", "datacenters/search", "events", "events/search", "hosts", "hosts/search", "networks", "roles", "storagedomains", "storagedomains/search", "tags", "templates", "templates/search", "users", "users/search", "groups", "groups/search", "domains", "vmpools", "vmpools/search", "vms", "vms/search", }; private static final String[] hrefs = { BASE_PATH + "/capabilities", BASE_PATH + "/clusters", BASE_PATH + "/clusters?search={query}", BASE_PATH + "/datacenters", BASE_PATH + "/datacenters?search={query}", BASE_PATH + "/events", BASE_PATH + "/events?search={query}&from={event_id}", BASE_PATH + "/hosts", BASE_PATH + "/hosts?search={query}", BASE_PATH + "/networks", BASE_PATH + "/roles", BASE_PATH + "/storagedomains", BASE_PATH + "/storagedomains?search={query}", BASE_PATH + "/tags", BASE_PATH + "/templates", BASE_PATH + "/templates?search={query}", BASE_PATH + "/users", BASE_PATH + "/users?search={query}", BASE_PATH + "/groups", BASE_PATH + "/groups?search={query}", BASE_PATH + "/domains", BASE_PATH + "/vmpools", BASE_PATH + "/vmpools?search={query}", BASE_PATH + "/vms", BASE_PATH + "/vms?search={query}", }; public BackendApiResourceTest() { resource = new BackendApiResource(); } @Before public void setUp() { resource.setUriInfo(setUpUriInfo(URI_BASE + "/")); current = createMock(Current.class); principal = new Principal(USER, SECRET, DOMAIN); expect(current.get(Principal.class)).andReturn(principal).anyTimes(); sessionHelper = new SessionHelper(); sessionHelper.setCurrent(current); resource.setSessionHelper(sessionHelper); backend = createMock(BackendLocal.class); resource.setBackend(backend); MessageBundle messageBundle = new MessageBundle(); messageBundle.setPath(BUNDLE_PATH); messageBundle.populate(); resource.setMessageBundle(messageBundle); httpHeaders = createMock(HttpHeaders.class); List<Locale> locales = new ArrayList<Locale>(); expect(httpHeaders.getAcceptableLanguages()).andReturn(locales).anyTimes(); resource.setHttpHeaders(httpHeaders); } @After public void tearDown() { verifyAll(); } @Test public void testGet() { doTestGet(URI_BASE); } @Test public void testGetWithTrailingSlash() { doTestGet(URI_BASE + "/"); } protected void doTestGet(String base) { setUpGetSystemVersionExpectations(); setUpGetSystemStatisticsExpectations(); verifyResponse(resource.get()); } protected HashMap<String, Integer> setUpStats() { HashMap<String, Integer> stats = new HashMap<String, Integer>(); stats.put("total_vms", TOTAL_VMS); stats.put("active_vms", ACTIVE_VMS); stats.put("total_vds", TOTAL_HOSTS); stats.put("active_vds", ACTIVE_HOSTS); stats.put("total_users", TOTAL_USERS); stats.put("active_users", ACTIVE_USERS); stats.put("total_storage_domains", TOTAL_STORAGE_DOMAINS); stats.put("active_storage_domains", ACTIVE_STORAGE_DOMAINS); return stats; } protected void verifyResponse(Response response) { assertEquals(200, response.getStatus()); assertTrue(response.getEntity() instanceof API); verifyApi((API)response.getEntity()); } protected void verifyApi(API api) { assertNotNull(api); assertNotNull(api.getLinks()); assertEquals(relationships.length, api.getLinks().size()); for (int i = 0; i < relationships.length; i++) { Link l = api.getLinks().get(i); assertNotNull(l); assertEquals(relationships[i], l.getRel()); assertEquals(hrefs[i], l.getHref()); } assertNotNull(api.getProductInfo()); assertNotNull(api.getProductInfo().getVersion()); assertEquals(MAJOR, api.getProductInfo().getVersion().getMajor()); assertEquals(MINOR, api.getProductInfo().getVersion().getMinor()); assertEquals(BUILD, api.getProductInfo().getVersion().getBuild()); assertEquals(REVISION, api.getProductInfo().getVersion().getRevision()); assertNotNull(api.getSummary()); assertEquals(TOTAL_VMS, api.getSummary().getVMs().getTotal()); assertEquals(ACTIVE_VMS, api.getSummary().getVMs().getActive()); assertEquals(TOTAL_HOSTS, api.getSummary().getHosts().getTotal()); assertEquals(ACTIVE_HOSTS, api.getSummary().getHosts().getActive()); assertEquals(TOTAL_USERS, api.getSummary().getUsers().getTotal()); assertEquals(ACTIVE_USERS, api.getSummary().getUsers().getActive()); assertEquals(TOTAL_STORAGE_DOMAINS, api.getSummary().getStorageDomains().getTotal()); assertEquals(ACTIVE_STORAGE_DOMAINS, api.getSummary().getStorageDomains().getActive()); } private static void assertEquals(long expected, Long actual) { assertEquals(expected, actual.longValue()); } protected UriInfo setUpUriInfo(String base) { UriBuilder uriBuilder = createMock(UriBuilder.class); expect(uriBuilder.clone()).andReturn(uriBuilder).anyTimes(); for (String rel : relationships) { UriBuilder colUriBuilder = createMock(UriBuilder.class); expect(colUriBuilder.build()).andReturn(URI.create(URI_ROOT + SLASH + rel+ "/")).anyTimes(); if (rel.endsWith("/search")) { expect(uriBuilder.path(rel.replace("/search", ""))).andReturn(colUriBuilder); } else { expect(uriBuilder.path(rel)).andReturn(colUriBuilder); } } UriInfo uriInfo = createMock(UriInfo.class); expect(uriInfo.getBaseUri()).andReturn(URI.create(base)).anyTimes(); expect(uriInfo.getBaseUriBuilder()).andReturn(uriBuilder); for (int i=0; i<2; i++) { expect(uriInfo.getQueryParameters()).andReturn(null); } return uriInfo; } protected void setUpGetSystemVersionExpectations() { VdcQueryReturnValue queryResult = createMock(VdcQueryReturnValue.class); expect(backend.RunQuery(eq(VdcQueryType.GetConfigurationValue), queryVdcVersionParams())).andReturn(queryResult); expect(queryResult.getSucceeded()).andReturn(true).anyTimes(); expect(queryResult.getReturnValue()).andReturn(SYSTEM_VERSION).anyTimes(); } protected void setUpGetSystemStatisticsExpectations() { VdcQueryReturnValue queryResult = createMock(VdcQueryReturnValue.class); expect(backend.RunQuery(eq(VdcQueryType.GetSystemStatistics), queryParams())).andReturn(queryResult); expect(queryResult.getSucceeded()).andReturn(true).anyTimes(); expect(queryResult.getReturnValue()).andReturn(setUpStats()).anyTimes(); replayAll(); } protected VdcQueryParametersBase queryVdcVersionParams() { return eqQueryParams(GetConfigurationValueParameters.class, new String[] { "SessionId"}, new Object[] { getSessionId() }); } protected VdcQueryParametersBase queryParams() { return eqQueryParams(GetSystemStatisticsQueryParameters.class, new String[] { "SessionId" }, new Object[] { getSessionId() }); } protected String getSessionId() { return sessionHelper.getSessionId(principal); } }