• Aucun résultat trouvé

Défis pour le test d’expressions de point de coupe

3.3 Cas d’étude

4.1.2 Défis pour le test d’expressions de point de coupe

5 @AdviceName("AccessControl")

6 before(): controlledAccess() {

7 if(!checkAccess(thisJoinPoint.getTarget()))

8 throw new DeniedAccessException();

9 }

10 }

Listing 4.1 – Un exemple d’aspect AspectJ pour le système bancaire.

Account.withDraw if(amount<=balance) return false; balance -= amount; return true;

FIG. 4.3 – Graphe de flot de contrôle de la méthodeAccount.withdraw

etdeleteAccount), et pour récupérer un compte à partir de son numéro ( getAccou-nt). La classe Account possède une méthode pour créditer (deposit) ou débiter (withdraw) le compte.

L’aspect du Listing 4.1 implémente une politique d’accès pour le système bancaire, afin d’assurer que seules les personnes autorisées peuvent accéder à un compte. Le greffon est tissé à l’exécution des méthodes de la classeAccount; si l’accès est autorisé alors la méthode s’exécute normalement, sinon une exception est levée.

4.1.2 Défis pour le test d’expressions de point de coupe

Une expression de point de coupe contenant une faute peut avoir de dangereux ef-fets. La Figure 4.3 montre le graphe de flot de contrôle de la méthode Account.with-drawavant tissage, tandis que la Figure 4.4 montre le graphe de flot de contrôle après

78 CHAPITRE 4. TEST DE L’EXPRESSION DE POINT DE COUPE Account.withDraw if(amount<=balance) return false; balance -= amount; return true; if(!checkAccess( thisJoinPoint.getTarget())) throw new DeniedAccessException();

FIG. 4.4 – Graphe de flot de contrôle de la méthodeAccount.withdrawaprès tissage de l’aspectAccessControl

tissage de l’aspectAccessControl. L’aspect AccesControlmodifie le flot de con-trôle. Une instructionif a été ajoutée au début du flot de contrôle. Si la condition est satisfaite une exception est levée, sinon le flot de contrôle original est exécuté. Dans certains cas, le comportement original n’est donc pas exécuté. Une expression de point de coupe incorrecte peut introduire des problèmes critiques. Si l’expression de point de coupe sélectionne des points de jonction non-attendus, alors l’accès à certaines fonc-tions risque d’être bloqué par le greffon. Pire, si l’expression de point de coupe ne sé-lectionne pas certains points de jonction attendus, une faille de sécurité est introduit, car l’accès à un compte n’est plus sécurisé.

Pour tester une expression de point de coupe en AspectJ, il est actuellement possible

1 public void testAccessControl() {

2 bank.login(nonAuthorizedUser,password);

3 try {

4 account.withdraw(30);

5 fail("Access should not be authorized");

6 } catch(DeniedAccessException() {}

7 }

CHAPITRE 4. TEST DE L’EXPRESSION DE POINT DE COUPE 79 d’utiliser JUnit pour la création et l’exécution des cas de test. Cependant, JUnit n’est pas complètement adapté au test de ces expressions. Le cas de test du Listing 4.2 illustre les défis pour tester une expression de point de coupe en utilisant JUnit seul. Pour vérifier que l’expression de point de coupe est correcte, il faut vérifier que le greffon qui lui est associé a été tissé aux bons endroits. Une façon de le faire est de vérifier que le comportement du greffon s’est exécuté correctement aux points où il est attendu. Le cas de test du Listing 4.2 connecte un utilisateur qui n’est pas autorisé à retirer de l’argent sur un compte particulier, et qui tente tout de même de retirer de l’argent sur ce compte. Si une exception est levée, le cas de test se termine et réussi, mais si aucune exception n’est levée, le cas de test échoue (l’assertion de la ligne 5 échoue toujours si elle est exécutée).

Ce cas de test est simple et peut sembler une bonne manière de tester une expression de point de coupe, mais il y au moins deux problèmes avec ce cas de test. Le premier problème est que si le cas de test échoue, on ne peut pas conclure qu’il y a une faute dans l’expression de point de coupe :

– Si le premier joker «*» à la ligne 3 du Listing 4.1 est remplacé par «void», la méthodewithdrawn’est plus sélectionnée, ettestAccessControléchoue car il y a une faute dans l’expression de point de coupe.

– Si à la ligne 7 du Listing 4.1, la négation («!») est retirée, le comportement du greffon est inversé, ettestAccessControléchoue. Pourtant dans ce cas, l’ex-pression de point de coupe est correcte est la faute détectée se trouve dans le greffon.

Le second problème est quetestAccessControlne peut pas détecter toutes les fautes dans l’expression de point de coupe. Par exemple, supposons que dans le motif de méthode du Listing 4.1, ligne 3, le nom Account soit remplacé par un joker. Le greffon est alors tissé avant les exécutions de la méthodeBank.deleteAccount, mais

testAccessControl réussi même s’il y a une faute dans l’expression de point de coupe. Il s’agit d’une faute de type 3 comme définit sur la Figure 4.1, ce qui veut dire que les points de jonction attendus sont sélectionnés, mais que l’expression de point de coupe sélectionne aussi des points de jonction non-attendus. Pour détecter une telle faute, il faut écrire des cas de test qui spécifient qu’aucun greffon n’est tissé à différents endroits du code. Un cas de test tel que testAccessControl ne peut pas vérifier cela, car il ne mentionne pas explicitement la présence ou l’absence d’un greffon, il présume implicitement sa présence. Il s’agit d’une limitation de JUnit qui ne permet pas de définir des assertions spécifiant explicitement la présence d’un greffon.

Pour résoudre ces problèmes, nous avons besoin d’une façon de définir un oracle qui cible spécifiquement les fautes dans les expressions de point de coupe, et qui ne repose pas sur le comportement du greffon. Dans la section suivante nous proposons une solution pour la définition d’oracles dédiées aux expressions de point de coupe. Cette solution est basée sur la surveillance des exécutions des greffons lorsque les cas de test s’exécutent, et sur la définition d’un ensemble d’assertions dédiées, pour effectuer des requêtes sur ces exécutions. Cette solution a été implémentée dans un outil nommé AdviceTracer et les assertions peuvent être utilisées pour définir un oracle automatique

80 CHAPITRE 4. TEST DE L’EXPRESSION DE POINT DE COUPE

pour les expressions de point de coupe.