2010-11-02 25 views
3

J'ai besoin d'étendre un code python qui a beaucoup de chemin codé en dur
Afin de ne pas tout gâcher, je veux créer des tests unitaires pour le code avant mes modifications: ça servira en tant que tests de non-régression avec mon nouveau code (qui n'aura pas de chemins codés en dur)test de régression traitant du chemin codé dur

Mais à cause d'un chemin système codé en dur, j'exécuterai mon test dans un arbre de chroot (je ne veux pas polluer mon système) dir)
Mon problème est que je veux configurer le chroot seulement pour le test, et cela peut être fait avec os.chroot seulement avec les privilèges root (et je ne veux pas exécuter les scripts de test en tant que root)

En fait, je juste besoin d'un diretory de faux arbre de sorte que lorsque le code qui open('/etc/resolv.conf) récupère un resolv.conf faux et pas mon système un

Je ne veux évidemment pas me remplacer le chemin codé en dur dans le code parce que ce ne serait pas réel test de régression

Avez-vous une idée de comment y parvenir?

Merci

Notez que tous le chemin accessible sont lisibles avec un utilisateur accout

Répondre

5

Dans votre configuration d'essai vous pouvez remplacer le haut-open dans le module que vous testez avec votre propre version qui lit la structure de votre répertoire « faux »:

import mymod 
import os.path 

def chroot_open(filename,*args): 
    filename = os.path.join("/home/you/fakeroot",filename) 
    return open(filename,*args) 

mymod.open = chroot_open 
+0

Merci c'est parfaitement ce dont j'avais besoin – Louis

0

Vous pouvez utiliser une application d'aide qui est suid root pour exécuter le chroot; Cela éviterait d'avoir à exécuter les tests en tant que root. Bien sûr, cela ouvrirait probablement encore un exploit racine local, donc ne devrait être fait avec des précautions appropriées (par exemple dans une image VM). En tout cas, toute solution avec chroot est intrinsèquement dépendante de la plate-forme, donc c'est plutôt gênant. En fait, j'aime mieux l'idée de Dave Webb (override open) mieux, je dois admettre ...