/* (c) 2016 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geogig.geoserver.wms; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.locationtech.geogig.geotools.data.GeoGigDataStoreFactory.REPOSITORY; import java.io.Serializable; import java.util.List; import java.util.Map; import org.geogig.geoserver.GeoGigTestData; import org.geogig.geoserver.GeoGigTestData.CatalogBuilder; import org.geogig.geoserver.config.RepositoryManager; import org.geoserver.catalog.AuthorityURLInfo; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.DataStoreInfo; import org.geoserver.catalog.LayerIdentifierInfo; import org.geoserver.catalog.LayerInfo; import org.geoserver.catalog.ResourceInfo; import org.geoserver.catalog.WorkspaceInfo; import org.geoserver.data.test.SystemTestData; import org.geoserver.test.GeoServerSystemTestSupport; import org.geoserver.test.TestSetup; import org.geoserver.test.TestSetupFrequency; import org.geoserver.wms.WMSInfo; import org.junit.After; import org.junit.Rule; import org.junit.Test; import org.locationtech.geogig.geotools.data.GeoGigDataStoreFactory; @TestSetup(run = TestSetupFrequency.REPEAT) public class GeogigLayerIntegrationListenerTest extends GeoServerSystemTestSupport { @Rule public GeoGigTestData geogigData = new GeoGigTestData(); @Override protected void onSetUp(SystemTestData testData) throws Exception { geogigData.init()// .config("user.name", "gabriel")// .config("user.email", "gabriel@test.com")// .createTypeTree("lines", "geom:LineString:srid=4326")// .createTypeTree("points", "geom:Point:srid=4326")// .add()// .commit("created type trees")// .get(); geogigData.insert("points", // "p1=geom:POINT(0 0)", // "p2=geom:POINT(1 1)", // "p3=geom:POINT(2 2)"); geogigData.insert("lines", // "l1=geom:LINESTRING(-10 0, 10 0)", // "l2=geom:LINESTRING(0 0, 180 0)"); geogigData.add().commit("Added test features"); // add a branch for the explicit HEAD test geogigData.branch("fakeBranch"); // need to instantiate the listerner so it can register with the test GeoServer instance new GeogigLayerIntegrationListener(getGeoServer()); } @After public void after() { RepositoryManager.close(); } @Test public void testAddGeogigLayerForcesCreationOfRootAuthURL() { addAvailableGeogigLayers(); WMSInfo service = getGeoServer().getService(WMSInfo.class); List<AuthorityURLInfo> authorityURLs = service.getAuthorityURLs(); AuthorityURLInfo expected = null; for (AuthorityURLInfo auth : authorityURLs) { if (GeogigLayerIntegrationListener.AUTHORITY_URL_NAME.equals(auth.getName())) { expected = auth; break; } } assertNotNull("No geogig auth url found: " + authorityURLs, expected); } @Test public void testAddGeogigLayerAddsLayerIdentifier() { addAvailableGeogigLayers(); Catalog catalog = getCatalog(); CatalogBuilder catalogBuilder = geogigData.newCatalogBuilder(catalog); String layerName = catalogBuilder.workspaceName() + ":points"; LayerInfo pointLayerInfo = catalog.getLayerByName(layerName); assertIdentifier(pointLayerInfo); layerName = catalogBuilder.workspaceName() + ":lines"; LayerInfo lineLayerInfo = catalog.getLayerByName(layerName); assertIdentifier(lineLayerInfo); } @Test public void testAddGeogigLayerAddsLayerIdentifierWithExplicitBranch() { addAvailableGeogigLayers(); Catalog catalog = getCatalog(); CatalogBuilder catalogBuilder = geogigData.newCatalogBuilder(catalog); DataStoreInfo store = catalog.getDataStoreByName(catalogBuilder.storeName()); store.getConnectionParameters().put(GeoGigDataStoreFactory.BRANCH.key, "master"); catalog.save(store); String layerName = catalogBuilder.workspaceName() + ":points"; LayerInfo pointLayerInfo = catalog.getLayerByName(layerName); assertIdentifier(pointLayerInfo); layerName = catalogBuilder.workspaceName() + ":lines"; LayerInfo lineLayerInfo = catalog.getLayerByName(layerName); assertIdentifier(lineLayerInfo); } @Test public void testAddGeogigLayerAddsLayerIdentifierWithExplicitHead() { addAvailableGeogigLayers(); Catalog catalog = getCatalog(); CatalogBuilder catalogBuilder = geogigData.newCatalogBuilder(catalog); DataStoreInfo store = catalog.getDataStoreByName(catalogBuilder.storeName()); store.getConnectionParameters().put(GeoGigDataStoreFactory.HEAD.key, "fakeBranch"); catalog.save(store); String layerName = catalogBuilder.workspaceName() + ":points"; LayerInfo pointLayerInfo = catalog.getLayerByName(layerName); assertIdentifier(pointLayerInfo); layerName = catalogBuilder.workspaceName() + ":lines"; LayerInfo lineLayerInfo = catalog.getLayerByName(layerName); assertIdentifier(lineLayerInfo); } @Test public void testRenameStore() { addAvailableGeogigLayers(); Catalog catalog = getCatalog(); CatalogBuilder catalogBuilder = geogigData.newCatalogBuilder(catalog); String storeName = catalogBuilder.storeName(); DataStoreInfo store = catalog.getStoreByName(storeName, DataStoreInfo.class); store.setName("new_store_name"); catalog.save(store); String layerName = catalogBuilder.workspaceName() + ":points"; LayerInfo pointLayerInfo = catalog.getLayerByName(layerName); assertIdentifier(pointLayerInfo); layerName = catalogBuilder.workspaceName() + ":lines"; LayerInfo lineLayerInfo = catalog.getLayerByName(layerName); assertIdentifier(lineLayerInfo); } @Test public void testRenameWorkspace() { addAvailableGeogigLayers(); Catalog catalog = getCatalog(); CatalogBuilder catalogBuilder = geogigData.newCatalogBuilder(catalog); String wsName = catalogBuilder.workspaceName(); WorkspaceInfo ws = catalog.getWorkspaceByName(wsName); String newWsName = "new_ws_name"; ws.setName(newWsName); catalog.save(ws); String layerName = newWsName + ":points"; LayerInfo pointLayerInfo = catalog.getLayerByName(layerName); assertIdentifier(pointLayerInfo); layerName = newWsName + ":lines"; LayerInfo lineLayerInfo = catalog.getLayerByName(layerName); assertIdentifier(lineLayerInfo); } private void assertIdentifier(LayerInfo layer) { assertNotNull(layer); final ResourceInfo resource = layer.getResource(); final DataStoreInfo store = (DataStoreInfo) resource.getStore(); final Map<String, Serializable> params = store.getConnectionParameters(); final String repoId = (String) params.get(REPOSITORY.key); List<LayerIdentifierInfo> identifiers = layer.getIdentifiers(); LayerIdentifierInfo expected = null; for (LayerIdentifierInfo idinfo : identifiers) { if (GeogigLayerIntegrationListener.AUTHORITY_URL_NAME.equals(idinfo.getAuthority())) { expected = idinfo; } } assertNotNull("No geogig identifier added for layer " + layer, expected); String expectedId = repoId + ":" + resource.getNativeName(); if (params.containsKey(GeoGigDataStoreFactory.BRANCH.key)) { String branch = (String) params.get(GeoGigDataStoreFactory.BRANCH.key); expectedId += ":" + branch; } else if (params.containsKey(GeoGigDataStoreFactory.HEAD.key)) { String head = (String) params.get(GeoGigDataStoreFactory.HEAD.key); expectedId += ":" + head; } assertEquals(expectedId, expected.getIdentifier()); } private void addAvailableGeogigLayers() { Catalog catalog = getCatalog(); CatalogBuilder catalogBuilder = geogigData.newCatalogBuilder(catalog); catalogBuilder.addAllRepoLayers().build(); } }