/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * 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 and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.bindings; import static org.testng.Assert.assertEquals; import java.io.File; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import org.apache.commons.lang.StringUtils; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.rhq.bindings.output.TabularWriter; import org.rhq.core.domain.measurement.AvailabilityType; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.shared.ResourceBuilder; public class TabularWriterTest { StringWriter stringWriter; TabularWriter writer; @BeforeMethod public void initFixture() { stringWriter = new StringWriter(); writer = new TabularWriter(new PrintWriter(stringWriter)); } @Test public void testPrintEntityArray() { User[] users = new User[] { new User(1, "rhqadmin", "rhqadmin"), new User(222, "name", "pw") }; writer.print(users); assertLineEquals(1, "id password username", "Cannot print entity array header", false); // skip line 2 - its the separator "--------------" assertLineEquals(3, "1 rhqadmin rhqadmin", "Cannot print first entity array item", false); assertLineEquals(4, "222 pw name ", "Cannot print second entity array item", false); } /** * This tests printing String arrays via the print(Object) API */ @Test public void testPrintStringArray() { String[] objArray = new String[] { new String("first string"), new String("second string") }; Object obj = objArray; writer.print(obj); // first two lines are the header and "----" separator assertLineEquals(3, "first string ", "Cannot print first string array item", false); assertLineEquals(4, "second string", "Cannot print first string array item", false); } /** * This tests printing "primitive object" arrays via the print(Object) API */ @Test public void testPrintObjectArray() { Integer[] objArray = new Integer[] { new Integer("123"), new Integer("789") }; Object obj = objArray; writer.print(obj); String term = (File.separatorChar == '/') ? "\n" : "\r\n"; String expected = "Array of java.lang.Integer" + term + "123" + term + "789" + term; String actual = stringWriter.toString(); assertEquals(actual, expected, "Could not print an object Integer array"); } /** * This tests printing primitive arrays via the print(Object) API */ @Test public void testPrintPrimaryArray() { byte[] primitiveArray = "abc".getBytes(); Object obj = primitiveArray; writer.print(obj); String term = (File.separatorChar == '/') ? "\n" : "\r\n"; String expected = "Array of byte" + term + (int) 'a' + term + (int) 'b' + term + (int) 'c' + term; String actual = stringWriter.toString(); assertEquals(actual, expected, "Could not print a primitive byte array"); } @Test public void aByteShouldPrintUnchanged() { byte value = 1; writer.print(value); String expected = (File.separatorChar == '/') ? "1\n" : "1\r\n"; String actual = stringWriter.toString(); assertEquals(actual, expected, "A byte or Byte should have its value printed as a String"); } @Test public void anIntegerShouldPrintUnchanged() { int value = 1; writer.print(value); String expected = (File.separatorChar == '/') ? "1\n" : "1\r\n"; String actual = stringWriter.toString(); assertEquals(actual, expected, "An int or Integer should have its value printed as a String"); } @Test public void theSimpleClassNameShouldPrintFirstForEntity() { User user = new User(1, "rhqadmin", "rhqadmin"); writer.print(user); assertNumberOfLinesPrintedIs(4); assertLineEquals(0, user.getClass().getSimpleName() + ":", "The simple class name should be the first line printed"); } @Test public void theIdShouldBeTheFirstPropertyPrintedForEntity() { User user = new User(1, "rhqadmin", "rhqadmin"); writer.print(user); int paddingSize = "username".length(); int idLineNumber = 1; String expected = "\t" + StringUtils.leftPad("id", paddingSize) + ": " + user.getId(); assertLineEquals(idLineNumber, expected, "The id property should be the 2nd line printed"); } @Test public void otherPropertiesShouldPrintAfterIdForEntity() { User user = new User(1, "rhqadmin", "rhqadmin"); writer.print(user); int passwordLineNumber = 2; String expectedPasswordLine = "\tpassword: " + user.getPassword(); assertLineEquals(passwordLineNumber, expectedPasswordLine, "The password property should be the 3rd line printed"); int usernameLineNumber = 3; String expectedUsernameLine = "\tusername: " + user.getUsername(); assertLineEquals(usernameLineNumber, expectedUsernameLine, "The username property should be the 4th line printed"); } @Test public void oneToOneAssociationShouldPrintForAnEntity() { User mgr = new User(1, "rhqadmin", "rhqadmin"); Department department = new Department(1, mgr); writer.print(department); int lineNumber = 2; String expectedLine = "\tmanager: " + mgr; assertLineEquals(lineNumber, expectedLine, "The manager property should be the 3rd line printed"); } @Test(enabled = false) // TODO revisit public void oneToManyAssociationShouldPrintForEntity() { User employee = new User(1, "rhq", "rhq"); Company company = new Company(1); company.addEmployee(employee); writer.print(company); int lineNumber = 2; String expectedLine = "\temployees: " + company.getEmployees(); assertLineEquals(lineNumber, expectedLine, "The employees property should be the 2nd line printed and the " + "toString() value of the collection should be displayed."); } @Test public void idShouldBeFirstResourcePropertyPrinted() { Resource resource = createResource(); writer.print(resource); assertLineEquals(1, "\t" + padResourceField("id") + ": " + resource.getId(), "Expected Resource.id to be the first property printed."); } @Test public void nameShouldBeSecondResourcePropertyPrinted() { Resource resource = createResource(); writer.print(resource); assertLineEquals(2, "\t" + padResourceField("name") + ": " + resource.getName(), "Expected Resource.name to be second property printed"); } @Test public void versionShouldBeThirdResourcePropertyPrinted() { Resource resource = createResource(); writer.print(resource); assertLineEquals(3, "\t" + padResourceField("version") + ": " + resource.getVersion(), "Expected Resource.version to be third property printed"); } @Test public void currentAvailabilityShouldBeFourthResourcePropertyPrinted() { Resource resource = createResource(); writer.print(resource); assertLineEquals(4, "\t" + padResourceField("currentAvailability") + ": " + resource.getCurrentAvailability().getAvailabilityType(), "Expected short version of Resource.currentAvailability to be fourth property printed"); } @Test public void handleNullCurrentAvailabilityForResource() { Resource resource = createUncommittedResource(); writer.print(resource); assertLineEquals(4, "\t" + padResourceField("currentAvailability") + ": ", "Expected to see empty string for Resource.currentAvailability when property is null"); } @Test public void resourceTypeShouldBeLastResourcePropertyPrinted() { Resource resource = createResource(); writer.print(resource); assertLineEquals(5, "\t" + padResourceField("resourceType") + ": " + resource.getResourceType().getName(), "Expected short version of Resource.resourceType to be the fifth property printed"); } private Resource createResource() { return new ResourceBuilder().createServer().usingDefaultResourceType().withId(111).withName("test-server") .withUuid("12345").withVersion("1.0").inInventory().withCurrentAvailability(AvailabilityType.UP).build(); } private Resource createUncommittedResource() { return new ResourceBuilder().createServer().usingDefaultResourceType().withId(111).withName("test-server") .withUuid("12345").withVersion("1.0").notInInventory().build(); } @Test public void printCollectionOfUncommittedResource() { Resource parent = new ResourceBuilder().createServer().usingDefaultResourceType().withName("test-server") .withUuid("12345").withVersion("1.0").inInventory().with(2).randomChildServices() // .notInInventory() // .included() .build(); writer.print(parent.getChildResources()); } void assertNumberOfLinesPrintedIs(int expectedNumberOfLines) { String lines[] = getLines(); assertEquals(lines.length, expectedNumberOfLines, "The actual lines printed were\n[\n" + stringWriter.toString() + "\n]"); } void assertLineEquals(int lineNumber, String expectedLine, String msg) { assertLineEquals(lineNumber, expectedLine, msg, true); } void assertLineEquals(int lineNumber, String expectedLine, String msg, boolean addCR) { String actualLine = getLines()[lineNumber]; if (addCR) { expectedLine = (File.separatorChar == '/') ? expectedLine : (expectedLine + "\r"); } assertEquals(actualLine, expectedLine, msg + " -- The actual output was \n[\n" + stringWriter + "\n]."); } String[] getLines() { return stringWriter.toString().split("\n"); } String padResourceField(String field) { return StringUtils.leftPad(field, "currentAvailability".length()); } @Entity static class User { @Id private int id; private String username; private String password; public User(int id, String username, String password) { this.id = id; this.username = username; this.password = password; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return User.class.getSimpleName() + "[id=" + id + ", username=" + username + ", password=" + password + "]"; } } @Entity static class Department { @Id private int id; @OneToOne private User manager; public Department(int id, User manager) { this.id = id; this.manager = manager; } public int getId() { return id; } public void setId(int id) { this.id = id; } public User getManager() { return manager; } public void setManager(User manager) { this.manager = manager; } } @Entity static class Company { @Id private int id; @OneToMany private List<User> employees = new ArrayList<User>(); public Company(int id) { this.id = id; } public int getId() { return id; } public void setId(int id) { this.id = id; } public List<User> getEmployees() { return employees; } public void setEmployees(List<User> employees) { this.employees = employees; } public void addEmployee(User employee) { employees.add(employee); } } }