/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Vera Y. Petrashkova
*/
package org.apache.harmony.auth.tests.javax.security.sasl;
import java.io.IOException;
import java.security.Provider;
import java.security.Security;
import java.util.Map;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.TextOutputCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.sasl.Sasl;
import javax.security.sasl.SaslException;
import javax.security.sasl.SaslServer;
import javax.security.sasl.SaslServerFactory;
import junit.framework.TestCase;
import org.apache.harmony.auth.tests.support.SpiEngUtils;
/**
* Test for Sasl class
*/
public class Sasl4Test extends TestCase {
private static final String SRVSSRV = "SaslServerFactory.";
private static final String fServerClass = mySaslServerFactory.class.getName();
private Provider [] provs;
private boolean initProvs;
@Override
protected void setUp() throws Exception {
super.setUp();
if (!initProvs) {
provs = Security.getProviders();
initProvs = true;
}
if (provs != null) {
for (Provider element : provs) {
Security.removeProvider(element.getName());
}
}
}
protected Provider[] mProv;
private void addProviders() {
for (Provider element : mProv) {
Security.insertProviderAt(element, 1);
}
}
/*
* @see TestCase#tearDown()
*/
@Override
protected void tearDown() throws Exception {
super.tearDown();
if (mProv != null) {
for (Provider element : mProv) {
Security.removeProvider(element.getName());
}
}
if (provs != null) {
for (int i = 0; i < provs.length; i++) {
Security.insertProviderAt(provs[i], (i+1));
}
} }
/**
* Test for createSaslServer(String mechanism,
* String protocol, String serverName,
* Map prop, CallbackHandler cbh))
method
* Assertions:
* throws NullPointerException when mechanism is null;
* throws SaslException when parameters (protocol, cbh,
* mechanism) are wrong.
*
* All providers are previously removed and
* 2 new providers were added.
*/
public void testCreateServer01() throws SaslException {
mProv = new Provider[] {
(new SpiEngUtils()).new MyProvider("MySaslServerProvider1",
"Testing provider SaslServerFactory - 1", SRVSSRV
.concat("MECH-1"), fServerClass),
(new SpiEngUtils()).new MyProvider("MySaslServerProvider2",
"Testing provider SaslServerFactory - 2", SRVSSRV
.concat("MECH-2"), fServerClass) };
addProviders();
CallbackHandler cbH = new Sasl3Test.cbHand();
try {
Sasl.createSaslServer(null, null, null, null, cbH);
fail("NullPointerException should be thrown when mechanisms is null");
} catch (NullPointerException e) {
}
try {
Sasl.createSaslServer("MECH-2", "protocol", null, null, cbH);
fail("SaslException should be thrown when CallbackHandler is wrong");
} catch (SaslException e) {
}
cbH = new Sasl3Test.cbHandN();
try {
Sasl.createSaslServer("MECH-1", "protocol", null, null, cbH);
fail("SaslException should be thrown when mechanisms is wrong");
} catch (SaslException e) {
}
try {
Sasl.createSaslServer("MECH-2", null, null, null, cbH);
fail("SaslException should be thrown when protocol is null");
} catch (SaslException e) {
}
}
/**
* Test for createSaslServer(String mechanism,
* String protocol, String serverName,
* Map prop, CallbackHandler cbh))
* method Assertions: throws NullPointerException when mechanisms is null;
* returns null SaslServer.
*
* All providers are previously removed.
*/
public void testCreateServer02() throws SaslException {
try {
Sasl.createSaslServer(null, null, null, null, null);
fail("NullPointerException should be thrown when mechanisms is null");
} catch (NullPointerException e) {
}
assertNull("Not null result", Sasl.createSaslServer("MECH-999", null,
null, null, null));
}
/**
* Test for createSaslServer(String mechanism,
* String protocol, String serverName,
* Map prop, CallbackHandler cbh))
method
*
* Assertions:
* returns SaslServer;
* throws SaslServer for MECH-1 mechanism
*
* All providers are previously removed and
* 2 new providers were added.
*/
public void testCreateServer03() throws SaslException {
mProv = new Provider[] {
(new SpiEngUtils()).new MyProvider("MySaslServerProvider1",
"Testing provider SaslServerFactory - 1", SRVSSRV
.concat("MECH-1"), fServerClass),
(new SpiEngUtils()).new MyProvider("MySaslServerProvider2",
"Testing provider SaslServerFactory - 2", SRVSSRV
.concat("MECH-2"), fServerClass) };
addProviders();
CallbackHandler cbH = new Sasl3Test.cbHandN();
SaslServer saslS = Sasl.createSaslServer("MECH-2", "protocol", null,
null, cbH);
assertNotNull("Null result", saslS);
try {
saslS.unwrap(null, 1, 1);
fail("SaslException sould be thrown");
} catch (SaslException e) {
}
assertFalse("Incorrect isComplete() result", saslS.isComplete());
// try to create Server for wrong mechanism
try {
saslS = Sasl
.createSaslServer("MECH-1", "protocol", null, null, cbH);
fail("SaslException sould be thrown");
} catch (SaslException e) {
}
}
/**
* Test for createSaslServer(String mechanism,
* String protocol, String serverName,
* Map prop, CallbackHandler cbh))
method
*
* Assertions:
* returns SaslServer;
* throws SaslServer for MECH-1 mechanism
*
* All providers are previously removed and
* 1 new provider was added.
*/
public void testCreateServer04() throws SaslException {
mProv = new Provider[] { (new SpiEngUtils()).new MyProvider(
"MySaslServerProvider1",
"Testing provider SaslServerFactory - 1", SRVSSRV
.concat("MECH-1"), fServerClass) };
mProv[0].put(SRVSSRV.concat("MECH-2"), fServerClass);
addProviders();
CallbackHandler cbH = new Sasl3Test.cbHandN();
SaslServer saslS = Sasl.createSaslServer("MECH-2", "protocol", null,
null, cbH);
assertNotNull("Null result for MECH-2", saslS);
assertFalse("Incorrect isComplete() result", saslS.isComplete());
// try to create Server for wrong mechanism
try {
saslS = Sasl
.createSaslServer("MECH-1", "protocol", null, null, cbH);
fail("SaslException sould be thrown");
} catch (SaslException e) {
}
}
/**
* Test for createSaslServer(String mechanism,
* String protocol, String serverName,
* Map prop, CallbackHandler cbh))
method
*
* Assertions:
* return null Server when there is no provider supported some mechanism
* returns SaslServer when incorrect mechanism is used
*
* All providers are previously removed and
* 2 new providers were added.
*/
public void testCreateServer05() throws SaslException {
mProv = new Provider[] {
(new SpiEngUtils()).new MyProvider("MySaslServerProvider1",
"Testing provider SaslServerFactory - 1", SRVSSRV
.concat("MECH-2"), fServerClass.concat("Ext")),
(new SpiEngUtils()).new MyProvider("MySaslServerProvider2",
"Testing provider SaslServerFactory - 2", SRVSSRV
.concat("MECH-1"), fServerClass),
(new SpiEngUtils()).new MyProvider("MySaslServerProvider3",
"Testing provider SaslServerFactory - 3", SRVSSRV
.concat("MECH-6"), fServerClass) };
mProv[2].put(SRVSSRV.concat("MECH-5"), fServerClass);
addProviders();
CallbackHandler cbH = new Sasl3Test.cbHandN();
SaslServer saslS;
// try to create SaslServer for wrong mechanism
// there is no provider supported MECH-77, MECH-66 mechanisms
assertNull("Not null object was created for wrong mechanism", Sasl
.createSaslServer("MECH-77", "protocol", null, null, cbH));
saslS = Sasl.createSaslServer("MECH-2", "protocol", null, null, cbH);
assertNotNull("Null result for MECH-2", saslS);
try {
saslS.unwrap(null, 1, 1);
fail("SaslException sould be thrown");
} catch (SaslException e) {
}
assertFalse("Incorrect isComplete() result", saslS.isComplete());
// MECH-1 was defined in some provider but it is supported in another
// provider
try {
Sasl.createSaslServer("MECH-1", "protocol", null, null, cbH);
fail("SaslException sould be thrown");
} catch (SaslException e) {
}
// MECH-6 and MECH-5 were defined in one provider but they are supported
// in another provider
saslS = Sasl.createSaslServer("MECH-6", "protocol", null, null, cbH);
assertNotNull("Null result for MECH-6", saslS);
saslS = Sasl.createSaslServer("MECH-5", "protocol", null, null, cbH);
assertNotNull("Null result for MECH-5", saslS);
}
/*
* Additional class for creating SaslServer object
*/
public static class mySaslServerFactory implements SaslServerFactory {
public mySaslServerFactory() {
super();
}
public String[] getMechanismNames(Map prop) {
return new String[] { "MECH-1", "MECH-2", "MECH-3", "MECH-4" };
}
public SaslServer createSaslServer(String mech, String protocol,
String srvName, Map prop, CallbackHandler hnd) throws SaslException {
if (mech == null) {
throw new SaslException();
}
if ("MECH-1".equals(mech)) {
throw new SaslException("Incorrect mechanisms");
}
if (protocol == null) {
throw new SaslException("Protocol is null");
}
TextOutputCallback[] cb = { new TextOutputCallback(
TextOutputCallback.INFORMATION, "Information") };
try {
hnd.handle(cb);
} catch (UnsupportedCallbackException e) {
throw new SaslException("Incorrect callback handlere", e);
} catch (IOException e) {
throw new SaslException("Incorrect callback handlere", e);
}
return new mySaslServer();
}
public class mySaslServer implements SaslServer {
public mySaslServer() {
super();
}
public void dispose() throws SaslException {
}
public byte[] evaluateResponse(byte[] challenge) throws SaslException {
return new byte[0];
}
public String getMechanismName() {
return "Server Proba";
}
public Object getNegotiatedProperty(String s) {
return "";
}
public String getAuthorizationID() {
return "";
}
public boolean isComplete() {
return false;
}
public byte[] unwrap(byte[] incoming, int offset, int len)
throws SaslException {
throw new SaslException();
}
public byte[] wrap(byte[] outgoing, int offset, int len)
throws SaslException {
return new byte[0];
}
}
}
public static class mySaslServerFactoryExt extends mySaslServerFactory {
@Override
public String[] getMechanismNames(Map prop) {
return new String[] { "MECH-5", "MECH-6" };
}
@Override
public SaslServer createSaslServer(String mech, String protocol,
String srvName, Map prop, CallbackHandler hnd) throws SaslException {
if (mech == null) {
throw new SaslException();
}
return new mySaslServer();
}
}
}