Egyéni kód használata befejezési házirend meghatározásához

Egyéni Java™ osztály írásával megadhatja, hogy egy socket fogadási elem mikor állítsa le a fogadást. Ez maximális rugalmasságot biztosít, de saját Java osztály írását igényli, a Rational Performance Tester kiterjesztés API használatával.

Mielőtt elkezdené

A befejezési házirend adja meg, hogy a fogadási elem hogyan állítja le a fogadást, és engedélyezi a teszt folytatását. Számos előre meghatározott befejezési házirend közül választhat, például adott számú byte fogadása után, vagy adott karaktersorozat előfordulásakor. Néhány esetben azonban összetett feltételt kell meghatározni. Ezt a döntés egyéni kódra delegálásával teheti meg.

Eljárás

Új egyéni kódosztály létrehozása:

  1. A tesztszerkesztőben válasszon ki egy socket fogadási elemet.
  2. A Befejezési házirend szakaszban válassza az Egyéni kódra delegálva beállítást, majd kattintson a Kód előállítása bejegyzésre. Ezzel létrehoz egy Java osztálysablont, a Rational Performance Tester kiterjesztés API alapján. A Java osztály az aktuális projekt src mappájában jön létre.
  3. Az egyéni kódot az előállító osztály kiterjesztésével írhatja meg. További információkat a Rational Performance Tester Java kóddal történő kiterjesztésével kapcsolatban a Tesztvégrehajtás kiterjesztése egyéni kóddal témakörben talál.
  4. Mentse az egyéni kódot és a tesztet. Ezután a Kód megjelenítése ablakban szerkesztheti a Java osztályt.

Példa

Az alábbi példa egy minta egyéni osztály, amely bemutatja, hogy lehet beállítani egyéni befejezési házirendet az internet idő protokoll számára:
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;

/**
 *  Egyéni fogadási házirend CustomReceive_TimeReceiver.
 *  Az ITestExecutionServices javadoc dokumentuma esetén válassza a 'Súgó tartalma' bejegyzést a Súgó menüben, majd válassza a
 *  'Rational Performance Tester funkcionalitás kiterjesztése -> 'Tesztvégrehajtás kiterjesztése egyéni kóddal' beállítást
 */
public class CustomReceive_TimeReceiver implements ISckCustomReceivePolicy {

	// static {
	//	 a statikus blokkok minden futás alkalmával egyszer kerülnek meghívásra, például hogy kötést hozzanak létre
	//	 egy külső dinamikus könyvtárhoz
	// }

	ISckReceiveAction receiveAction;
	ITestExecutionServices testExecutionServices;

	public CustomReceive_TimeReceiver() {
		// A konstruktor a teszt létrehozása során kerül hívásra, nem pedig az egyéni fogadás
		// művelet végrehajtáskor
	}

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

	public boolean onRead(int readByte) {
		// TIME protokoll (RFC 868): egy csatlakoztatott kiszolgáló visszaad 4 byte-ot, és bezárja a kapcsolatot
		// Ez a 4 byte jelenti az 1900/1/1-óta eltelt másodpercek számát
		// A teszt egyszerűen egy TIME kiszolgáló kapcsolatból jön létre a 37-es porton
		// (nyilvános kiszolgálók listája: A TIME kiszolgáló nevének forrása: http://tf.nist.gov/service/time-servers.html),
		// Majd az adott egyéni kódosztályra delegált fogadás,
		// Majd bezárás
		try {
			if (readByte == EndOfStream) {
				/* Ha sikeres: */
				receiveAction.receiveSuccess();
				String message = extractAndCheckTime(receiveAction.getConnectionHolder().getFinallyReceivedBytes());
				/* Egy üzenet kerül a tesztnaplóba közvetlenül a fogadás művelet után: */
				testExecutionServices.getTestLogManager().reportMessage(message);
				return true;
			}
		} catch (Throwable t) {
			/* Kivétel esetén: */
			receiveAction.handleException(t);
			return true;
		}
		if (receiveAction.getConnectionHolder().getCurrentlyReceivedBytesCount() > 4) {
			/* Nem várt feltétel: */
			receiveAction.handleException(new Exception("Time protocol server returned more than 4 bytes"));
			return true;
		}
		/* A fogadás befejezéséhez további byte-ok szükségesek */
		return false;
	}

	private String extractAndCheckTime(byte[] bytes) {
		// Hálózati sorrend, például big endian
		long remoteTime = ((((long)bytes[0]) & 0x00000000000000ff) << 24) +
						  ((((long)bytes[1]) & 0x00000000000000ff) << 16) +
						  ((((long)bytes[2]) & 0x00000000000000ff) << 8) +
						   (((long)bytes[3]) & 0x00000000000000ff);
		// 1900 - 1970: referencia eltérés, lásd: RFC 868 és 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;
	}

}

Visszajelzés