/* * Copyright (C) 2012 Brockmann Consult GmbH (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 3 of the License, or (at your option) * any later version. * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, see http://www.gnu.org/licenses/ */ package com.bc.ceres.metadata; import com.bc.ceres.resource.Resource; import org.apache.velocity.VelocityContext; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.util.Map; import static org.junit.Assert.*; public class MetadataResourceEngineTest { private MetadataResourceEngine metadataResourceEngine; private SimpleFileSystem ioAccessor; @Before public void setUp() throws Exception { ioAccessor = Mockito.mock(SimpleFileSystem.class); metadataResourceEngine = new MetadataResourceEngine(ioAccessor); } @Test public void testCreation() throws Exception { VelocityContext velocityContext = metadataResourceEngine.getVelocityContext(); assertNotNull(velocityContext); assertEquals(0, velocityContext.getKeys().length); } /** * A typical end-to-end example usage of the {@code MetadataResourceEngine}. */ @Ignore public void useCaseOverview() throws Exception { metadataResourceEngine.readResource("metadata", "input/metadata.properties"); metadataResourceEngine.readRelatedResource("source1", "input/MER_L1_1.N1"); // <-"input/MER_L1_1-report.xml", "input/MER_L1_1-meta.txt" metadataResourceEngine.readRelatedResource("source2", "input/MER_L1_2.N1"); VelocityContext velocityContext = metadataResourceEngine.getVelocityContext(); velocityContext.put("myKey", "value1"); velocityContext.put("myOtherKey", "value2"); metadataResourceEngine.writeRelatedResource("templates/report.xml.vm", "output/MER_L2_1.dim"); // ->"output/MER_L2_1-report.xml" metadataResourceEngine.writeRelatedResource("templates/report.txt.vm", "output/MER_L2_1.dim"); // ->"output/MER_L2_1-report.txt" } @Test public void testWriteTargetMetadata() throws Exception { Mockito.when(ioAccessor.createReader("templates/metadata.xml.vm")).thenReturn( new StringReader("I would say: ${var1} ${var2}")); StringWriter stringWriter = new StringWriter(); Mockito.when(ioAccessor.createWriter("out/MER_L2-metadata.xml")).thenReturn(stringWriter); Mockito.when(ioAccessor.isFile("out/MER_L2.dim")).thenReturn(true); VelocityContext velocityContext = metadataResourceEngine.getVelocityContext(); velocityContext.put("var1", "Hello"); velocityContext.put("var2", "world"); metadataResourceEngine.writeRelatedResource("templates/metadata.xml.vm", "out/MER_L2.dim"); assertEquals("I would say: Hello world", stringWriter.toString()); assertEquals(4, velocityContext.getKeys().length); assertEquals("metadata.xml.vm", velocityContext.get("templateName")); assertEquals("metadata.xml", velocityContext.get("templateBaseName")); } @Test public void testMetadataAsProperties() throws Exception { Mockito.when(ioAccessor.createReader("static.properties")).thenReturn(new StringReader("key = sdkfj")); VelocityContext velocityContext = metadataResourceEngine.getVelocityContext(); metadataResourceEngine.readResource("props", "static.properties"); assertEquals(1, velocityContext.getKeys().length); Object metadata = velocityContext.get("props"); assertTrue(metadata instanceof Resource); Resource resource = (Resource) metadata; assertFalse(resource.isXml()); assertEquals("key = sdkfj", resource.getContent()); Map<String, String> map = resource.getMap(); assertNotNull(map); assertEquals(1, map.size()); assertEquals("sdkfj", map.get("key")); } @Test public void testMetadataAsPropertiesWithEvaluation() throws Exception { Reader reader = new StringReader("key = BEAM is ${state}"); Mockito.when(ioAccessor.createReader("evaluation.data")).thenReturn(reader); VelocityContext velocityContext = metadataResourceEngine.getVelocityContext(); velocityContext.put("state", "ok"); metadataResourceEngine.readResource("foo", "evaluation.data"); assertEquals(2, velocityContext.getKeys().length); Object metadata = velocityContext.get("foo"); assertTrue(metadata instanceof Resource); Resource resource = (Resource) metadata; assertFalse(resource.isXml()); assertEquals("key = BEAM is ok", resource.getContent()); Map<String, String> map = resource.getMap(); assertNotNull(map); assertEquals(1, map.size()); assertEquals("BEAM is ok", map.get("key")); resource = resource.getOrigin(); assertFalse(resource.isXml()); assertEquals("key = BEAM is ${state}", resource.getContent()); map = resource.getMap(); assertNotNull(map); assertEquals(1, map.size()); assertEquals("BEAM is ${state}", map.get("key")); } @Test public void testMetadataAsXML() throws Exception { Reader reader = new StringReader("<?xml>this is XML</xml>"); Mockito.when(ioAccessor.createReader("static.xml")).thenReturn(reader); VelocityContext velocityContext = metadataResourceEngine.getVelocityContext(); metadataResourceEngine.readResource("myxml", "static.xml"); assertEquals(1, velocityContext.getKeys().length); assertNull(velocityContext.get("wrongKey")); Object metadata = velocityContext.get("myxml"); assertTrue(metadata instanceof Resource); Resource resource = (Resource) metadata; assertTrue(resource.isXml()); assertEquals("<?xml>this is XML</xml>", resource.getContent()); Map<String, String> map = resource.getMap(); assertNotNull(map); assertTrue(map.isEmpty()); } @Test public void testSourceMetadata() throws Exception { Mockito.when(ioAccessor.createReader("input/MER_L1-report.xml")).thenReturn( new StringReader("<?xml>this is XML</xml>")); Mockito.when(ioAccessor.createReader("input/MER_L1-meta.txt")).thenReturn( new StringReader("key = BEAM is ${state}")); Mockito.when(ioAccessor.list("input")).thenReturn( new String[]{"MER_L1-report.xml", "MER_L1-meta.txt", "MER_L1.N1"}); Mockito.when(ioAccessor.isFile(Matchers.anyString())).thenReturn(true); //execution metadataResourceEngine.readRelatedResource("source1", "input/MER_L1.N1"); VelocityContext velocityContext = metadataResourceEngine.getVelocityContext(); assertEquals(1, velocityContext.getKeys().length); assertNotNull(velocityContext.get("sourceMetadata")); Object object = velocityContext.get("sourceMetadata"); assertTrue(object instanceof Map); Map map = (Map) object; assertEquals(1, map.size()); assertTrue(map.containsKey("source1")); object = map.get("source1"); assertNotNull(object); assertTrue(object instanceof Map); Map resourceMap = (Map) object; assertEquals(2, resourceMap.size()); assertTrue(resourceMap.containsKey("report_xml")); assertTrue(resourceMap.containsKey("meta_txt")); object = resourceMap.get("report_xml"); assertNotNull(object); assertTrue(object instanceof Resource); Resource resource = (Resource) object; assertTrue(resource.isXml()); assertEquals("<?xml>this is XML</xml>", resource.getContent()); Map<String, String> xmlMap = resource.getMap(); assertNotNull(xmlMap); assertTrue(xmlMap.isEmpty()); object = resourceMap.get("meta_txt"); assertNotNull(object); assertTrue(object instanceof Resource); resource = (Resource) object; assertFalse(resource.isXml()); assertEquals("key = BEAM is ${state}", resource.getContent()); // sourceMetadata NEVER gets evaluated Map<String, String> propertiesMap = resource.getMap(); assertNotNull(propertiesMap); assertEquals(1, propertiesMap.size()); assertEquals("BEAM is ${state}", propertiesMap.get("key")); } @Test public void testSourceMetadataWith2ProductsInSameDirectory() throws Exception { Mockito.when(ioAccessor.createReader("input/MER_L1-report.xml")).thenReturn(new StringReader("<?xml>hello</xml>")); Mockito.when(ioAccessor.createReader("input/MER_FRS_L1-meta.xml")).thenReturn(new StringReader("world")); Mockito.when(ioAccessor.list("input")).thenReturn(new String[]{"MER_L1-report.xml", "MER_L1.dim", "MER_L1.data", "MER_FRS_L1-meta.xml", "MER_FRS_L1.N1"}); Mockito.when(ioAccessor.isFile(Matchers.endsWith(".data"))).thenReturn(false); Mockito.when(ioAccessor.isFile(Matchers.anyString())).thenReturn(true); //execution metadataResourceEngine.readRelatedResource("source1", "input/MER_L1.N1"); metadataResourceEngine.readRelatedResource("source2", "input/MER_FRS_L1.N1"); VelocityContext velocityContext = metadataResourceEngine.getVelocityContext(); assertEquals(1, velocityContext.getKeys().length); assertNotNull(velocityContext.get("sourceMetadata")); Object object = velocityContext.get("sourceMetadata"); assertTrue(object instanceof Map); Map map = (Map) object; assertEquals(2, map.size()); assertTrue(map.containsKey("source1")); assertTrue(map.containsKey("source2")); object = map.get("source1"); assertNotNull(object); assertTrue(object instanceof Map); Map sourceMap = (Map) object; assertEquals(1, sourceMap.size()); object = sourceMap.get("report_xml"); assertNotNull(object); assertTrue(object instanceof Resource); Resource resource = (Resource) object; assertTrue(resource.isXml()); assertEquals("input/MER_L1-report.xml", resource.getPath()); assertEquals("<?xml>hello</xml>", resource.getContent()); object = map.get("source2"); assertNotNull(object); assertTrue(object instanceof Map); sourceMap = (Map) object; assertEquals(1, sourceMap.size()); object = sourceMap.get("meta_xml"); assertNotNull(object); assertTrue(object instanceof Resource); resource = (Resource) object; assertFalse(resource.isXml()); assertEquals("input/MER_FRS_L1-meta.xml", resource.getPath()); assertEquals("world", resource.getContent()); } @Test public void testSourceMetadataWith2Sources() throws Exception { Mockito.when(ioAccessor.createReader("input1/MER_L1-report.xml")).thenReturn( new StringReader("<?xml>this is XML</xml>")); Mockito.when(ioAccessor.createReader("input2/MER_FRS_L1-meta.xml")).thenReturn( new StringReader("<?xml>this is XML</xml> <tag>value</tag>")); Mockito.when(ioAccessor.list("input1")).thenReturn(new String[]{"MER_L1-report.xml", "MER_L1.N1"}); Mockito.when(ioAccessor.list("input2")).thenReturn(new String[]{"MER_FRS_L1-meta.xml", "MER_FRS_L1.N1"}); Mockito.when(ioAccessor.isFile(Matchers.anyString())).thenReturn(true); //execution metadataResourceEngine.readRelatedResource("source1", "input1/MER_L1.N1"); metadataResourceEngine.readRelatedResource("source2", "input2/MER_FRS_L1.N1"); VelocityContext velocityContext = metadataResourceEngine.getVelocityContext(); assertEquals(1, velocityContext.getKeys().length); Object object = velocityContext.get("sourceMetadata"); assertTrue(object instanceof Map); Map map = (Map) object; assertEquals(2, map.size()); assertTrue(map.containsKey("source1")); assertTrue(map.containsKey("source2")); object = map.get("source1"); assertTrue(object instanceof Map); Map sourceMap = (Map) object; assertEquals(1, sourceMap.size()); assertTrue(sourceMap.containsKey("report_xml")); object = sourceMap.get("report_xml"); assertNotNull(object); assertTrue(object instanceof Resource); Resource resource = (Resource) object; assertTrue(resource.isXml()); assertEquals("input1/MER_L1-report.xml", resource.getPath()); assertEquals("<?xml>this is XML</xml>", resource.getContent()); object = map.get("source2"); assertTrue(object instanceof Map); sourceMap = (Map) object; assertEquals(1, sourceMap.size()); assertTrue(sourceMap.containsKey("meta_xml")); object = sourceMap.get("meta_xml"); assertNotNull(object); assertTrue(object instanceof Resource); resource = (Resource) object; assertTrue(resource.isXml()); assertEquals("input2/MER_FRS_L1-meta.xml", resource.getPath()); assertEquals("<?xml>this is XML</xml> <tag>value</tag>", resource.getContent()); } }