org.rhq.bindings.TabularWriterTest.java Source code

Java tutorial

Introduction

Here is the source code for org.rhq.bindings.TabularWriterTest.java

Source

/*
 * 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);
        }
    }

}