/* * ==================== * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2008-2009 Sun Microsystems, Inc. All rights reserved. * * The contents of this file are subject to the terms of the Common Development * and Distribution License("CDDL") (the "License"). You may not use this file * except in compliance with the License. * * You can obtain a copy of the License at * http://IdentityConnectors.dev.java.net/legal/license.txt * See the License for the specific language governing permissions and limitations * under the License. * * When distributing the Covered Code, include this CDDL Header Notice in each file * and include the License file at identityconnectors/legal/license.txt. * If applicable, add the following below this CDDL Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" * ==================== */ package org.identityconnectors.rw3270; import org.testng.annotations.Test; import org.testng.annotations.BeforeClass; import org.testng.AssertJUnit; import java.text.MessageFormat; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; import javax.naming.NamingException; import org.identityconnectors.common.l10n.CurrentLocale; import org.identityconnectors.common.script.Script; import org.identityconnectors.common.script.ScriptBuilder; import org.identityconnectors.common.security.GuardedString; import org.identityconnectors.framework.common.objects.ConnectorMessages; import org.identityconnectors.framework.common.objects.ConnectorObject; import org.identityconnectors.framework.common.objects.ResultsHandler; import org.identityconnectors.framework.spi.AbstractConfiguration; public class RW3270ConnectionTests { // Connector Configuration information // private static String HOST_NAME; private static String SYSTEM_PASSWORD; private static String SYSTEM_USER; private static final int HOST_TELNET_PORT = 23; private static final Boolean USE_SSL = Boolean.FALSE; @BeforeClass public static void before() { HOST_NAME = "HOST"; SYSTEM_PASSWORD = "SYSTEM_PASSWORD"; SYSTEM_USER = "SYSTEM_USER"; } @Test public void testNegativePath() { OurConfiguration configuration = createConfiguration(); try { final DummyConnection connection = new DummyConnection(configuration); connection.setDisplay("Nothing"); try { connection.waitFor("USER=", 100); AssertJUnit.fail("exception expected"); } catch (RuntimeException e) { } try { connection.waitFor("USER=", "C", 100); AssertJUnit.fail("exception expected"); } catch (RuntimeException e) { } Thread thread1 = new Thread() { public void run() { try { connection.waitFor("USER="); } catch (RuntimeException e) { e.printStackTrace(); } } }; thread1.start(); thread1.join(5000); AssertJUnit.assertTrue(thread1.isAlive()); Thread thread2 = new Thread() { public void run() { try { connection.waitFor("USER=", "X"); } catch (RuntimeException e) { e.printStackTrace(); } } }; thread2.start(); thread2.join(5000); AssertJUnit.assertTrue(thread2.isAlive()); } catch (Exception e) { e.printStackTrace(); AssertJUnit.fail(e.toString()); } } @Test public void testTelnetConnectionViaPool() { OurConfiguration configuration = createConfiguration(); try { DummyConnection connection = new DummyConnection(configuration); connection.send("Login[enter]"); connection.send("[clear]"); connection.send("[cursor (256)]"); try { connection.send("[bogus]"); AssertJUnit.fail("no error thrown"); } catch (IllegalArgumentException e) { } sendRelease((DummyConnection)connection, "USER=IDM03"); connection.waitFor("USER=IDM03"); sendRelease((DummyConnection)connection, "USER=", "IDM03"); connection.waitFor("USER=", "IDM03"); sendRelease((DummyConnection)connection, "USER=IDM03"); connection.waitFor("USER=IDM03", 3000); sendRelease((DummyConnection)connection, "USER=", "IDM03"); connection.waitFor("USER=", "IDM03", 3000); } catch (Exception e) { e.printStackTrace(); AssertJUnit.fail(e.toString()); } } @Test public void testPaKeys() { OurConfiguration configuration = createConfiguration(); try { DummyConnection connection = new DummyConnection(configuration); for (int i=1; i<4; i++) connection.send("[pa"+i+"]"); try { connection.send("[pa0]"); AssertJUnit.fail("bad PA Key not caught"); } catch (RuntimeException e) { } try { connection.send("[pa5]"); AssertJUnit.fail("bad PA Key not caught"); } catch (RuntimeException e) { } } catch (Exception e) { AssertJUnit.fail(e.toString()); } } @Test public void testPfKeys() { OurConfiguration configuration = createConfiguration(); try { DummyConnection connection = new DummyConnection(configuration); for (int i=1; i<25; i++) connection.send("[pf"+i+"]"); try { connection.send("[pf0]"); AssertJUnit.fail("bad PFA Key not caught"); } catch (RuntimeException e) { } try { connection.send("[pf25]"); AssertJUnit.fail("bad PF Key not caught"); } catch (RuntimeException e) { } } catch (Exception e) { AssertJUnit.fail(e.toString()); } } private void sendRelease(final DummyConnection connection, final String... display) { for (int i=0; i<display.length; i++) { final int index = i; new Thread() { @Override public void run() { try { Thread.sleep(1000*index); } catch (InterruptedException e) { } connection.setDisplay(display[index]); connection.releaseSemaphore(); } }.start(); } } private OurConfiguration createConfiguration() { OurConfiguration config = new OurConfiguration(); config.setHostNameOrIpAddr(HOST_NAME); config.setHostTelnetPortNumber(HOST_TELNET_PORT); config.setConnectionProperties(null); config.setConnectScript(getLoginScript()); config.setDisconnectScript(getLogoffScript()); config.setUserName(SYSTEM_USER); config.setPassword(new GuardedString(SYSTEM_PASSWORD.toCharArray())); config.setEvictionInterval(60000); config.setConnectionClassName(DummyConnection.class.getName()); OurConnectorMessages messages = new OurConnectorMessages(); Map<Locale, Map<String, String>> catalogs = new HashMap<Locale, Map<String,String>>(); ResourceBundle messagesBundle = ResourceBundle.getBundle("org.identityconnectors.rw3270.Messages"); Map<String, String> foo = new HashMap<String, String>(); Enumeration<String> enumeration = messagesBundle.getKeys(); while (enumeration.hasMoreElements()) { String key = enumeration.nextElement(); foo.put(key, messagesBundle.getString(key)); } catalogs.put(Locale.getDefault(), foo); messages.setCatalogs(catalogs); config.setConnectorMessages(messages); return config; } private Script getLoginScript() { ScriptBuilder builder = new ScriptBuilder(); builder.setScriptLanguage("GROOVY"); builder.setScriptText(""); return builder.build(); } private Script getLogoffScript() { ScriptBuilder builder = new ScriptBuilder(); builder.setScriptLanguage("GROOVY"); builder.setScriptText(""); return builder.build(); } public static class DummyConnection extends RW3270BaseConnection { private StringBuffer sentData = new StringBuffer(); private String display; public DummyConnection(RW3270Configuration config) throws NamingException { super(config); } public void releaseSemaphore() { _semaphore.release(); } public void clearAndUnlock() throws InterruptedException { } public void setDisplay(String display) { this.display = display; } public String getDisplay() { return display; } public void sendEnter() { sentData.append("[enter]"); } public void sendKeys(String keys) { sentData.append(keys); } public void sendPAKeys(int pa) { sentData.append("[pa"+pa+"]"); } public void sendPFKeys(int pf) { sentData.append("[pf"+pf+"]"); } public void setCursorPos(short pos) { } public void waitForUnlock() throws InterruptedException { } public void connect() { } public void dispose() { } public String getStandardOutput() { return getDisplay(); } public String getSentData() { return sentData.toString(); } public void resetStandardOutput() { _ioPair.reset(); } @Test public void test() { } } public static class TestHandler implements ResultsHandler, Iterable<ConnectorObject> { private List<ConnectorObject> objects = new LinkedList<ConnectorObject>(); public boolean handle(ConnectorObject object) { objects.add(object); return true; } public Iterator<ConnectorObject> iterator() { return objects.iterator(); } public int size() { return objects.size(); } } public static class OurConfiguration extends AbstractConfiguration implements RW3270Configuration { private Script _connectScript; private Script _disconnectScript; private String _host; private Integer _port; private GuardedString _password; private String _userName; private Integer _evictionInterval; private String _connectClass; private String[] _connectionProperties; public Script getConnectScript() { return _connectScript; } public String getConnectionClassName() { return _connectClass; } public Script getDisconnectScript() { return _disconnectScript; } public String getHostNameOrIpAddr() { return _host; } public Integer getHostTelnetPortNumber() { return _port; } public GuardedString getPassword() { return _password; } public String[] getConnectionProperties() { return _connectionProperties; } public String getUserName() { return _userName; } public void setConnectScript(Script script) { _connectScript = script; } public void setConnectionClassName(String clazz) { _connectClass = clazz; } public void setDisconnectScript(Script script) { _disconnectScript = script; } public void setHostNameOrIpAddr(String host) { _host = host; } public void setHostTelnetPortNumber(Integer port) { _port = port; } public void setPassword(GuardedString password) { _password = password; } public void setConnectionProperties(String[] connectionProperties) { _connectionProperties = connectionProperties; } public void setUserName(String userName) { _userName = userName; } public Integer getEvictionInterval() { return _evictionInterval; } public void setEvictionInterval(Integer interval) { _evictionInterval = interval; } public void validate() { } } public class OurConnectorMessages implements ConnectorMessages { private Map<Locale, Map<String, String>> _catalogs = new HashMap<Locale, Map<String, String>>(); public String format(String key, String defaultValue, Object... args) { Locale locale = CurrentLocale.isSet()?CurrentLocale.get():Locale.getDefault(); Map<String,String> catalog = _catalogs.get(locale); String message = catalog.get(key); MessageFormat formatter = new MessageFormat(message,locale); return formatter.format(args, new StringBuffer(), null).toString(); } public void setCatalogs(Map<Locale,Map<String,String>> catalogs) { _catalogs = catalogs; } } }