/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 1997-2011 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package org.glassfish.appclient.client.acc;
import java.io.IOException;
import java.util.Properties;
import java.io.File;
import com.sun.enterprise.transaction.JavaEETransactionManagerSimplified;
import com.sun.logging.LogDomains;
import java.io.FileWriter;
import java.util.logging.Logger;
import java.util.Arrays;
import java.util.MissingResourceException;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author tjquinn
*/
public class AppclientCommandArgumentsTest {
private static final String USER_VALUE = "joe-the-user";
private static final String PASSWORDFILE_NAME = "topSecret.stuff";
private static final String EXPECTED_TARGETSERVER_VALUE = "A:1234,B:5678";
private static final String EXPECTED_PASSWORD_IN_PASSWORD_FILE = "mySecretPassword";
public AppclientCommandArgumentsTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Test
public void testA() throws Exception, UserError {
AppclientCommandArguments info = AppclientCommandArguments.newInstance(
Arrays.asList("-textauth", "-user", USER_VALUE));
assertEquals("text auth not set", true, info.isTextauth());
assertEquals("noappinvoke incorrectly set", false, info.isNoappinvoke());
assertEquals("user incorrectly set", USER_VALUE, info.getUser());
/*
* Make sure an unspecified argument is repoted as null.
*/
assertEquals("mainclass wrong", null, info.getMainclass());
}
@Test
public void testB() throws Exception, UserError {
AppclientCommandArguments info = AppclientCommandArguments.newInstance(
Arrays.asList("-mainclass", PASSWORDFILE_NAME, "-noappinvoke"));
assertEquals("wrong main class", PASSWORDFILE_NAME, info.getMainclass());
assertEquals("noappinvoke not set", true, info.isNoappinvoke());
assertEquals("user should have been null", null, info.getUser());
assertEquals("textauth found but should be absent", false, info.isTextauth());
}
@Ignore
@Test
public void invalidArgumentTest() throws Exception, UserError {
try {
AppclientCommandArguments.newInstance(
Arrays.asList("-badarg"));
fail("did not throw expected IllegalArgumentException due to an invalid arg");
} catch (IllegalArgumentException e) {
// no-op so test passes
} catch (Exception e) {
fail("expected IllegalArgumentException but got " + e.getClass().getName());
}
}
@Test
public void disallowMainclassAndName() throws Exception {
try {
AppclientCommandArguments.newInstance(
Arrays.asList("-mainclass","x.y.Main","-name","some-display-name"));
fail("did not detect incorrect spec of mainclass and name");
} catch (UserError e) {
// suppress exception for a successful test
}
}
@Test
public void allowMultiValuedTargetServer() throws Exception, UserError {
final AppclientCommandArguments cmdArgs = AppclientCommandArguments.newInstance(
Arrays.asList("-targetserver","\"" + EXPECTED_TARGETSERVER_VALUE + "\""));
assertEquals("did not process targetserver list correctly",
EXPECTED_TARGETSERVER_VALUE,
cmdArgs.getTargetServer());
}
@Test
public void useTransactionLogString() {
final Logger logger = LogDomains.getLogger(JavaEETransactionManagerSimplified.class,
LogDomains.JTA_LOGGER);
final String target = "enterprise_used_delegate_name";
try {
final String result = logger.getResourceBundle().getString(target);
assertTrue("message key look-up failed", (result != null &&
! target.equals(result)));
} catch (MissingResourceException ex) {
fail("could not find message key");
}
}
@Test
public void checkPasswordInFile() {
final Properties props = new Properties();
props.setProperty(AppclientCommandArguments.PASSWORD_FILE_PASSWORD_KEYWORD,
EXPECTED_PASSWORD_IN_PASSWORD_FILE);
try {
final AppclientCommandArguments cmdArgs = prepareWithPWFile(props);
final char[] pwInObject = cmdArgs.getPassword();
assertTrue("Password " + EXPECTED_PASSWORD_IN_PASSWORD_FILE +
" in password file does not match password " + new String(pwInObject) +
" returned from AppclientCommandArguments object",
Arrays.equals(pwInObject, EXPECTED_PASSWORD_IN_PASSWORD_FILE.toCharArray()));
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
@Test
public void checkErrorHandlingIfRequiredPasswordInPasswordFileIsMissing() {
final Properties props = new Properties();
props.setProperty("UNEXPECTED", EXPECTED_PASSWORD_IN_PASSWORD_FILE);
try {
final AppclientCommandArguments cmdArgs = prepareWithPWFile(props);
fail("Missing password in password file NOT correctly detected and flagged");
} catch (UserError ue) {
/*
* This is what we expect - a UserError complaining about the
* missing password value.
*/
return;
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
private AppclientCommandArguments prepareWithPWFile(
final Properties props) throws UserError, IOException {
final File passwordFile = createTempPWFile(props);
return AppclientCommandArguments.newInstance(
Arrays.asList("-passwordfile","\"" + passwordFile.getAbsolutePath() + "\""));
}
private File createTempPWFile(final Properties props) throws IOException {
final File tempFile = File.createTempFile("accpw", ".txt");
props.store(new FileWriter(tempFile), "temp file for acc unit test");
tempFile.deleteOnExit();
return tempFile;
}
}