Utilización del código personalizado para especificar una política de finalización

Puede escribir una clase Java™ personalizada para especificar cuándo un elemento de recepción de socket deja de recibir. Esto le ofrece la mayor flexibilidad, pero es necesario que grabe su propia clase Java utilizando la API de ampliación de Rational Performance Tester.

Antes de empezar

La política de finalización especifica cómo recibir el elemento de recepción y permite que la prueba se reanude. Hay varias políticas de finalización predefinidas entre las que puede elegir, por ejemplo, después de recibir un determinado número de bytes, o cuando se detecta una serie específica. Sin embargo, en determinados casos se debe definir una condición compleja. Esto se puede hacer delegando la decisión al código personalizado.

Procedimiento

Para crear una nueva clase de código personalizado:

  1. En el editor de pruebas, seleccione un elemento de recepción de socket.
  2. En la sección Política de finalización, seleccione Delegada al código personalizado y pulse Generar código. Se crea una plantilla de clase Java que sigue la API de ampliación de Rational Performance Tester. La clase Java se crea en la carpeta src del proyecto actual.
  3. Grabe el código personalizado ampliando la clase generadora. Consulte el apartado Ampliación de la ejecución de pruebas con código personalizado para obtener más información sobre cómo ampliar Rational Performance Tester con código Java.
  4. Guarde el código personalizado y la prueba. Puede pulsar en Ver código para editar la clase Java más adelante.

Ejemplo

El ejemplo siguiente muestra una clase personalizada de ejemplo que muestra cómo configurar una política de finalización personalizada para el protocolo TIME de Internet:
package test;

import java.text.DateFormat;
import java.util.Date;
import java.util.TimeZone;

import com.ibm.rational.test.lt.execution.socket.custom.ISckCustomReceivePolicy;
import com.ibm.rational.test.lt.execution.socket.custom.ISckReceiveAction;
import com.ibm.rational.test.lt.kernel.services.ITestExecutionServices;

/**
 *  Política de recepción personalizada CustomReceive_TimeReceiver.
 *  Para Javadoc de ITestExecutionServices, seleccione 'Help Contents' en el menú Ayuda y seleccione
 *  'Extending Rational Performance Tester functionality' -> 'Extending test execution with custom code'
 */
public class CustomReceive_TimeReceiver implements ISckCustomReceivePolicy {

	// static {
	//	 los bloques estáticos se invocan una vez en cada ejecución y permiten, por ejemplo, crear un enlace
	//	 con una biblioteca dinámica externa
	// }

	ISckReceiveAction receiveAction;
	ITestExecutionServices testExecutionServices;

	public CustomReceive_TimeReceiver() {
		// Se invoca al constructor durante la creación de pruebas, no en el momento de la ejecución
		// de la acción de recepción personalizada
	}

	public void setup(ITestExecutionServices tesRef,
			ISckReceiveAction receiveActionRef) {
		testExecutionServices = tesRef;
		receiveAction = receiveActionRef;
	}

	public boolean onRead(int readByte) {
		// Protocolo TIME (RFC 868): un servidor conectado devuelve 4 bytes y cierra la conexión
		// Estos 4 bytes son el número de segundos desde 1900/1/1
		// La prueba se hace simplemente con una conexión a un servidor TIME en el puerto 37
		// (los servidores públicos se muestran aquí: Obtenga el nombre de host del servidor TIME de http://tf.nist.gov/service/time-servers.html),
		// A continuación, una recepción delegada en esta clase de código personalizado,
		// A continuación, un cierre
		try {
			if (readByte == EndOfStream) {
				/* In case of success: */
				receiveAction.receiveSuccess();
				String message = extractAndCheckTime(receiveAction.getConnectionHolder().getFinallyReceivedBytes());
				/* Se añade un mensaje al Registro de prueba justo después de la acción de recepción: */
				testExecutionServices.getTestLogManager().reportMessage(message);
				return true;
			}
		} catch (Throwable t) {
			/* En caso de excepción: */
			receiveAction.handleException(t);
			return true;
		}
		if (receiveAction.getConnectionHolder().getCurrentlyReceivedBytesCount() > 4) {
			/* Condición inesperada: */
			receiveAction.handleException(new Exception("Time protocol server returned more than 4 bytes"));
			return true;
		}
		/* Se necesitan más bytes para completar esta recepción */
		return false;
	}

	private String extractAndCheckTime(byte[] bytes) {
		// Es el orden de la red, es decir, big endian
		long remoteTime = ((((long)bytes[0]) & 0x00000000000000ff) << 24) +
						  ((((long)bytes[1]) & 0x00000000000000ff) << 16) +
						  ((((long)bytes[2]) & 0x00000000000000ff) << 8) +
						   (((long)bytes[3]) & 0x00000000000000ff);
		// 1900 a 1970: diferencia de referencia, consulte RFC 868 y java.util.Date javadoc
		remoteTime -= 2208988800L;
		Date remoteDate = new Date(remoteTime*1000);
		Date localDate = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance();
		dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
		String message = "Remote time: " + dateFormat.format(remoteDate) + " GMT (TIME server is " +
											receiveAction.getConnectionHolder().getHostName() + ", port 37)\n" +
						 "Local time:  " + dateFormat.format(localDate) + " GMT\n";
		long diff = localDate.getTime()/1000 - remoteTime;
		if (diff == 0) {
			message += "-> No difference";
		} else {
			message += "-> Difference (seconds): " + diff;
		}
		return message;
	}

}

Comentarios