/* * JBoss, Home of Professional Open Source. * Copyright 2012, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.domain.management.security.adduser; import java.util.Iterator; import java.util.LinkedList; import java.util.Queue; import static org.junit.Assert.*; import org.jboss.as.domain.management.logging.DomainManagementLogger; /** * Assert builder for the console. Use this together with the ConsoleMock object * to validate the expected messages are displayed and answers. You should always * recorded in the same order as the user gets it present. * * This example shows how you can record a chain of messages and answers * * AssertConsoleBuilder consoleBuilder = new AssertConsoleBuilder(). * expectedDisplayText("Please enter valid password"). * expectedDisplayText("\n"). * expectedInput("mysecretpassword"); * * ConsoleMock consoleMock = new ConsoleMock(); * consoleMock.setResponses(consoleBuilder); * * ... * ... * * consoleBuilder.validate() * * * @author <a href="mailto:flemming.harms@gmail.com">Flemming Harms</a> */ public class AssertConsoleBuilder { private static String NEW_LINE = String.format("%n"); private enum Type { DISPLAY, INPUT } private class AssertConsole { private String text; private Type type; private AssertConsole() { } private AssertConsole(String text, Type type) { this.text = text; this.type = type; } } private Queue<AssertConsole> queue = new LinkedList<AssertConsole>(); /** * Recorded the expected display text * @param text - the display text * @return this */ public AssertConsoleBuilder expectedDisplayText(String text) { AssertConsole assertConsole = new AssertConsole(); assertConsole.text = text; assertConsole.type = Type.DISPLAY; queue.add(assertConsole); return this; } /** * Expected input string from the user * @param text * @return this */ public AssertConsoleBuilder expectedInput(String text) { AssertConsole assertConsole = new AssertConsole(); assertConsole.text = text; assertConsole.type = Type.INPUT; queue.add(assertConsole); return this; } /** * Expected error message * @param text * @return this */ public AssertConsoleBuilder expectedErrorMessage(String text) { queue.add(new AssertConsole(NEW_LINE,Type.DISPLAY)); queue.add(new AssertConsole(" * ",Type.DISPLAY)); queue.add(new AssertConsole(DomainManagementLogger.ROOT_LOGGER.errorHeader(),Type.DISPLAY)); queue.add(new AssertConsole(" * ",Type.DISPLAY)); queue.add(new AssertConsole(NEW_LINE,Type.DISPLAY)); queue.add(new AssertConsole(text,Type.DISPLAY)); queue.add(new AssertConsole(NEW_LINE,Type.DISPLAY)); queue.add(new AssertConsole(NEW_LINE,Type.DISPLAY)); return this; } /** * Expected confirm message and answer * @param messages - expected display text, if none pass in null * @param prompt - expected text for the console prompt * @param answer - expected answer * @return this */ public AssertConsoleBuilder expectedConfirmMessage(String messages, String prompt, String answer) { if (messages!=null) { queue.add(new AssertConsole(messages,Type.DISPLAY)); queue.add(new AssertConsole(NEW_LINE,Type.DISPLAY)); } queue.add(new AssertConsole(prompt,Type.DISPLAY)); queue.add(new AssertConsole(" ",Type.DISPLAY)); queue.add(new AssertConsole(answer,Type.INPUT)); return this; } /** * Assert the display text from the console, with the recorded display text. * if the doses't match it will fail * @param msg - display text from the console. * @return a String with recorded display text */ public String assertDisplayText(String msg) { AssertConsole assertConsole = queue.poll(); if (assertConsole == null) { fail("Expected display text '"+msg+"' was not recorded"); } if (!assertConsole.type.equals(Type.DISPLAY)) { fail("Wrong assert type, expect Type.DISPLAY"); } assertEquals(assertConsole.text, msg); return assertConsole.text; } /** * Pop the next recorded answer to the console. if recorded is not * the Type.INPUT it will fail. * @return the recorded answer */ public String popAnswer() { AssertConsole assertConsole = queue.poll(); if (assertConsole == null) { fail("Expected answer was not recorded"); } if (!assertConsole.type.equals(Type.INPUT)) { fail("Wrong assert type, expect Type.INPUT"); } return assertConsole.text; } /** * validate if all recorded console assert has been asserted. * if not empty it will fail */ public void validate() { StringBuffer notValidateAsserts = new StringBuffer(); if (!queue.isEmpty()) { Iterator<AssertConsole> assertConsoleIter = queue.iterator(); for (Iterator<AssertConsole> iterator = queue.iterator(); iterator.hasNext(); ) { AssertConsole assertConsole = iterator.next(); notValidateAsserts.append("\""); notValidateAsserts.append(assertConsole.text); notValidateAsserts.append("\" "); } } assertTrue("There are still asserts in the queue that are not validated : "+notValidateAsserts.toString(),queue.isEmpty()); } }