/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.ambari.server.api.services.serializers; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.StringReader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.apache.ambari.server.api.services.Result; import org.apache.ambari.server.api.services.ResultImpl; import org.apache.ambari.server.api.services.ResultStatus; import org.apache.ambari.server.api.util.TreeNode; import org.apache.ambari.server.controller.internal.ResourceImpl; import org.apache.ambari.server.controller.spi.Resource; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVRecord; import org.easymock.EasyMockSupport; import org.junit.Test; /** * CsvSerializer unit tests */ public class CsvSerializerTest extends EasyMockSupport { @Test public void testSerializeResources_NoColumnInfo() throws Exception { Result result = new ResultImpl(true); result.setResultStatus(new ResultStatus(ResultStatus.STATUS.OK)); TreeNode<Resource> tree = result.getResultTree(); List<TreeMap<String, Object>> data = new ArrayList<TreeMap<String, Object>>() { { add(new TreeMap<String, Object>() { { put("property1", "value1a"); put("property2", "value2a"); put("property3", "value3a"); put("property4", "value4a"); } }); add(new TreeMap<String, Object>() { { put("property1", "value1'b"); put("property2", "value2'b"); put("property3", "value3'b"); put("property4", "value4'b"); } }); add(new TreeMap<String, Object>() { { put("property1", "value1,c"); put("property2", "value2,c"); put("property3", "value3,c"); put("property4", "value4,c"); } }); } }; tree.setName("items"); tree.setProperty("isCollection", "true"); addChildResource(tree, "resource", 0, data.get(0)); addChildResource(tree, "resource", 1, data.get(1)); addChildResource(tree, "resource", 2, data.get(2)); replayAll(); //execute test Object o = new CsvSerializer().serialize(result).toString().replace("\r", ""); verifyAll(); assertNotNull(o); StringReader reader = new StringReader(o.toString()); CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT); List<CSVRecord> records = csvParser.getRecords(); assertNotNull(records); assertEquals(3, records.size()); int i = 0; for (CSVRecord record : records) { TreeMap<String, Object> actualData = data.get(i++); assertEquals(actualData.size(), record.size()); for (String item : record) { assertTrue(actualData.containsValue(item)); } } csvParser.close(); } @Test public void testSerializeResources_HeaderInfo() throws Exception { Result result = new ResultImpl(true); result.setResultStatus(new ResultStatus(ResultStatus.STATUS.OK)); TreeNode<Resource> tree = result.getResultTree(); tree.setName("items"); tree.setProperty("isCollection", "true"); tree.setProperty(CsvSerializer.PROPERTY_COLUMN_MAP, new TreeMap<String, String>() {{ put("propertyD", "Property D"); put("propertyC", "Property C"); put("propertyB", "Property B"); put("propertyA", "Property A"); }}); List<Map<String, Object>> data = new ArrayList<Map<String, Object>>() { { add(new HashMap<String, Object>() { { put("propertyD", "value1a"); put("propertyC", "value2a"); put("propertyB", "value3a"); put("propertyA", "value4a"); } }); add(new HashMap<String, Object>() { { put("propertyD", "value1'b"); put("propertyC", "value2'b"); put("propertyB", "value3'b"); put("propertyA", "value4'b"); } }); add(new HashMap<String, Object>() { { put("propertyD", "value1,c"); put("propertyC", "value2,c"); put("propertyB", "value3,c"); put("propertyA", "value4,c"); } }); } }; addChildResource(tree, "resource", 0, data.get(0)); addChildResource(tree, "resource", 1, data.get(1)); addChildResource(tree, "resource", 2, data.get(2)); replayAll(); //execute test Object o = new CsvSerializer().serialize(result).toString().replace("\r", ""); verifyAll(); String expected = "Property A,Property B,Property C,Property D\n" + "value4a,value3a,value2a,value1a\n" + "value4'b,value3'b,value2'b,value1'b\n" + "\"value4,c\",\"value3,c\",\"value2,c\",\"value1,c\"\n"; assertEquals(expected, o); } @Test public void testSerializeResources_HeaderOrderInfo() throws Exception { Result result = new ResultImpl(true); result.setResultStatus(new ResultStatus(ResultStatus.STATUS.OK)); TreeNode<Resource> tree = result.getResultTree(); tree.setName("items"); tree.setProperty("isCollection", "true"); tree.setProperty(CsvSerializer.PROPERTY_COLUMN_MAP, new HashMap<String, String>() {{ put("property1", "Property 1"); put("property2", "Property 2"); put("property3", "Property 3"); put("property4", "Property 4"); }}); tree.setProperty(CsvSerializer.PROPERTY_COLUMN_ORDER, Arrays.asList( "property1", "property2", "property3", "property4")); addChildResource(tree, "resource", 0, new HashMap<String, Object>() { { put("property1", "value1a"); put("property2", "value2a"); put("property3", "value3a"); put("property4", "value4a"); } }); addChildResource(tree, "resource", 1, new HashMap<String, Object>() { { put("property1", "value1'b"); put("property2", "value2'b"); put("property3", "value3'b"); put("property4", "value4'b"); } }); addChildResource(tree, "resource", 2, new HashMap<String, Object>() { { put("property1", "value1,c"); put("property2", "value2,c"); put("property3", "value3,c"); put("property4", "value4,c"); } }); replayAll(); //execute test Object o = new CsvSerializer().serialize(result).toString().replace("\r", ""); String expected = "Property 1,Property 2,Property 3,Property 4\n" + "value1a,value2a,value3a,value4a\n" + "value1'b,value2'b,value3'b,value4'b\n" + "\"value1,c\",\"value2,c\",\"value3,c\",\"value4,c\"\n"; assertEquals(expected, o); verifyAll(); } private void addChildResource(TreeNode<Resource> parent, String name, int index, final Map<String, Object> data) { Resource resource = new ResourceImpl(Resource.Type.Cluster); if (data != null) { for (Map.Entry<String, Object> entry : data.entrySet()) { resource.setProperty(entry.getKey(), entry.getValue()); } } parent.addChild(resource, String.format("%s:%d", name, index)); } }