Pour créer une nouvelle classe de code personnalisé, procédez comme suit :
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;
/**
* Règle de réception personnalisée CustomReceive_TimeReceiver.
* Pour la javadoc de ITestExecutionServices, sélectionnez 'table des matières de l'aide dans le menu d'aide et sélectionnez
* 'Extension de la fonctionnalité Rational Tester ' -> 'Extension de l'exécution d'un test avec du code personnalisé'
*/
public class CustomReceive_TimeReceiver implements ISckCustomReceivePolicy {
// static {
// Les blocs statiques sont appelés une fois par exécution et permettent par exemple une liaison
// à une bibliothèque dynamique externe
// }
ISckReceiveAction receiveAction;
ITestExecutionServices testExecutionServices;
public CustomReceive_TimeReceiver() {
// Le constructeur est appelé lors de la création du test et non pas à l'exécution de
// l'action de réception personnalisée
}
public void setup(ITestExecutionServices tesRef,
ISckReceiveAction receiveActionRef) {
testExecutionServices = tesRef;
receiveAction = receiveActionRef;
}
public boolean onRead(int readByte) {
// Protocole TIME (RFC 868) : un serveur connecté renvoie 4 octets et referme la connexion
// Ces 4 octets sont le nombre de secondes depuis le 1/1/1900
// Le test est simplement composé d'une connexion à un serveur TIME sur le port 37
// (les serveurs publics sont listés ici : Le nom d'hôte du serveur Time est obtenu de http://tf.nist.gov/service/time-servers.html),
// Puis réception déléguée à cette classe de code personnalisé,
// Puis fermeture
try {
if (readByte == EndOfStream) {
/* En cas de réussite : */
receiveAction.receiveSuccess();
String message = extractAndCheckTime(receiveAction.getConnectionHolder().getFinallyReceivedBytes());
/* Un message est ajouté au Journal de test juste après cette action de réception : */
testExecutionServices.getTestLogManager().reportMessage(message);
return true;
}
} catch (Throwable t) {
/* En cas d'exception : */
receiveAction.handleException(t);
return true;
}
if (receiveAction.getConnectionHolder().getCurrentlyReceivedBytesCount() > 4) {
/* Condition inattendue : */
receiveAction.handleException(new Exception("Time protocol server returned more than 4 bytes"));
return true;
}
/* D'autres octets sont requis pour compléter cette réception */
return false;
}
private String extractAndCheckTime(byte[] bytes) {
// Ordre réseau, par exemple 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: différence de référence, voir la RFC 868 et la javadoc java.util.Date
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 += "-> pas de différence";
} else {
message += "-> Différence (secondes): " + diff;
}
return message;
}
}