Použití vlastního kódu k určení zásady ukončení

Můžete napsat vlastní třídu Java™ a určit, kdy prvek příjmu soketu ukončí příjem. Tento způsob nabízí větší pružnost, ale vyžaduje, abyste napsali vlastní třídu Java používající rozšiřující rozhraní API produktu Rational Performance Tester.

Než začnete

Zásada ukončení určuje, jak prvek příjmu zastaví příjem a umožní testu pokračovat. Existuje několik předdefinovaných zásad ukončení, ze kterých si můžete vybrat. Například po přijetí určitého počtu bajtů nebo po zjištění specifického řetězce. V některých případech je však nutné definovat komplexní podmínku. To můžete provést přenesením rozhodnutí na vlastní kód.

Postup

Chcete-li vytvořit novou vlastní třídu kódu, postupujte takto:

  1. V editoru testů vyberte prvek příjmu soketu.
  2. V části Zásada ukončení vyberte volbu Delegováno na vlastní kód a klepněte na tlačítko Generovat kód. Dojde k vytvoření šablony třídy Java, která sleduje instrukce rozšiřujícího rozhraní API produktu Rational Performance Tester. Třída Java se vytvoří ve složce src aktuálního projektu.
  3. Napište vlastní kód rozšířením generování třídy. Další informace o rozšíření produktu Rational Performance Tester s kódem Java najdete v tématu Rozšíření provedení testu pomocí vlastního kódu.
  4. Uložte vlastní kód a test. Můžete později klepnout na volbu Zobrazit kód a upravit třídu Java.

Příklad

Následující příklad je ukázkovou vlastní třídou, která demonstruje, jak nakonfigurovat vlastní zásadu ukončení pro protokol ITP (Internet Time Protocol):
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;

/**
 *  Vlastní zásada příjmu CustomReceive_TimeReceiver.
 *  Pro javadoc z ITestExecutionServices vyberte v nabídce Nápověda volbu 'Obsah nápovědy' a vyberte
 *  'Rozšíření funkčnosti Rational Performance Tester' -> 'Rozšíření provedení testu vlastním kódem'
 */
public class CustomReceive_TimeReceiver implements ISckCustomReceivePolicy {

	// static {
	//	 statické bloky se volají jednou v každém běhu a umožňují např. spojit se s
	//	 externí dynamickou knihovnou
	// }

	ISckReceiveAction receiveAction;
	ITestExecutionServices testExecutionServices;

	public CustomReceive_TimeReceiver() {
		// Konstruktor se volá při vytváření testu, ne při provádění
		// upravené akce příjmu
	}

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

	public boolean onRead(int readByte) {
		// Protokol TIME (RFC 868): připojený server vrátí 4 bajty a zavře připojení
		// Tyto 4 bajty jsou počtem sekund od 1.1.1900
		// Test se jednoduše skládá z připojení k jednomu serveru TIME na portu 37
		// (seznam veřejných serverů je zde: Názvy hostitelů serverů TIME získáte na adrese http://tf.nist.gov/service/time-servers.html),
		// Pak prvek příjmu delegovaný na tuto vlastní třídu kódu
		// Pak zavřít
		try {
			if (readByte == EndOfStream) {
				/* při úspěchu: */
				receiveAction.receiveSuccess();
				String message = extractAndCheckTime(receiveAction.getConnectionHolder().getFinallyReceivedBytes());
				/* do protokolu testu se přidá zpráva hned za tuto akci příjmu: */
				testExecutionServices.getTestLogManager().reportMessage(message);
				return true;
			}
		} catch (Throwable t) {
			/* při výjimce: */
			receiveAction.handleException(t);
			return true;
		}
		if (receiveAction.getConnectionHolder().getCurrentlyReceivedBytesCount() > 4) {
			/* neočekávaná podmínka: */
			receiveAction.handleException(new Exception("Time protocol server returned more than 4 bytes"));
			return true;
		}
		/* K dokončení tohoto příjmu je třeba více bajtů */
		return false;
	}

	private String extractAndCheckTime(byte[] bytes) {
		// Toto je pořadí sítě, tj. 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: rozdíl v odkazu, viz RFC 868 a 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;
	}

}

Váš názor