/** * Start time:21:08:16 2009-07-07<br> * Project: diameter-auto<br> * * @author <a href="mailto:baranowb@gmail.com">Bartosz Baranowski </a> * @author <a href="mailto:brainslog@gmail.com"> Alexandre Mendonca </a> */ package org.mobicents.slee.resources.diameter.tests.acitivities.answers; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import org.jdiameter.client.impl.parser.MessageImpl; import org.mobicents.slee.resource.diameter.base.events.DiameterMessageImpl; import net.java.slee.resource.diameter.base.DiameterActivity; import net.java.slee.resource.diameter.base.events.DiameterMessage; import static org.junit.Assert.*; /** * Start time:21:08:16 2009-07-07<br> * Project: diameter-auto<br> * Small helper class for common code * * @author <a href="mailto:baranowb@gmail.com"> Bartosz Baranowski </a> * @author <a href="mailto:brainslog@gmail.com"> Alexandre Mendonca </a> */ public class DiameterActivityAnswerCreationHelper { public static void testAnswerCreation(DiameterActivity activity, String messageListFieldName, ArrayList<DiameterMessage> requestList) { try { Field f = activity.getClass().getDeclaredField(messageListFieldName); assertNotNull("There is no such field: " + messageListFieldName, f); f.setAccessible(true); boolean setOnIterate = false; if(f.get(activity) instanceof Collection) { f.set(activity, requestList); }else { setOnIterate = true; } for (DiameterMessage request : requestList) { if(setOnIterate) { f.set(activity, request); } DiameterMessageImpl requestImpl = (DiameterMessageImpl) request; //This is cause some of them are zeros :) ((MessageImpl)requestImpl.getGenericData()).setEndToEndIdentifier((long) (Math.random()*10000)); ((MessageImpl)requestImpl.getGenericData()).setHopByHopIdentifier((long) (Math.random()*10000)); Class activityClass = activity.getClass(); String className = request.getClass().getName(); String packageName = request.getClass().getPackage().getName(); String methodName = "create" + (className.replace(packageName + ".", "").replace("RequestImpl", "Answer")); Method[] methods = activityClass.getMethods(); //System.err.println("METHOD NAME: "+methodName); for(Method createAnswerMethod : methods) { if(!createAnswerMethod.getName().equals(methodName)) { //System.err.println("Skipping: "+createAnswerMethod.getName()); continue; } //System.err.println("Doing magic for: "+createAnswerMethod.getName()); //here we can have 3 types of methods: //#1 without parameters //#2 with long, boolean parameters //#3 with different param!! Object[] args = null; Class[] parameters=createAnswerMethod.getParameterTypes(); if(parameters.length==0) { //parms are null }else { args = new Object[parameters.length]; for(int i=0;i<parameters.length;i++) { args[i] = instantaite(parameters[i]); } } //we only want to see that code matches and answer is not zero? do we want to test avps ? DiameterMessage answer=(DiameterMessage) createAnswerMethod.invoke(activity, args); assertNotNull("Answer is null for method name: "+methodName,answer); if(answer == null) return; //some bsic tests, we dont test values passed, maybe we should ? assertEquals("Command code is not equal",request.getCommand().getCode(),answer.getCommand().getCode()); assertFalse("Answer should have R flag set to false.",answer.getCommand().isRequest()); assertEquals("E2E is not equal",request.getHeader().getEndToEndId(),answer.getHeader().getEndToEndId()); assertEquals("HBH is not equal",request.getHeader().getHopByHopId(),answer.getHeader().getHopByHopId()); } } } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } private static Object instantaite(Class c) { Class type = c; if(c.isArray()) { type = c.getComponentType(); } if(type.getName().equals("boolean")) { boolean b = false; if(c.isArray()) { return new boolean[]{b}; } return b; } if(type.getName().equals("long")) { long b = 0; if(c.isArray()) { return new long[]{b}; } return b; } if(type.getName().equals("byte")) { byte b = 0; if(c.isArray()) { return new byte[]{b}; } return b; } if(type.getName().equals("int")) { int b = 0; if(c.isArray()) { return new int[]{b}; } return b; } if(type.getName().equals("char")) { char b = 0; if(c.isArray()) { return new char[]{b}; } return b; } if(type.getName().equals("float")) { float b = 0; if(c.isArray()) { return new float[]{b}; } return b; } if(type.getName().equals("double")) { double b = 0; if(c.isArray()) { return new double[]{b}; } return b; } if(type.getName().equals("short")) { short b = 0; if(c.isArray()) { return new short[]{b}; } return b; } try { Object o = type.newInstance(); if(c.isArray()) { //BAD return new Object[]{o}; } return o; } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }