"""The storage pool target and source checks run in linear time and take paths of letters, digits and "/", "_", ".", ":" and "-" (not first, not right after "/"): both values go into the pool XML.""" import time from types import SimpleNamespace from django.template.loader import render_to_string from django.test import SimpleTestCase from lxml import html from storages.forms import AddStgPool def target_error(target): form = AddStgPool({"name": "pool1", "stg_type": "dir", "target": target}) form.is_valid() return "target" in form.errors def source_error(source, stg_type="logical"): form = AddStgPool({"name": "pool1", "stg_type": stg_type, "source": source, "target": "/mnt/pool1"}) form.is_valid() return "source" in form.errors class PoolTargetTests(SimpleTestCase): def test_accepted_and_refused_targets(self): for target, refused in ( ("/var/lib/libvirt/images", False), ("/srv/iso-pool", False), ("/a//b", False), ("a-b.c_d/e", False), ("/a/-b", True), # a dash right after a slash ("-x", True), ("/a b", True), ("'/a", True), # any first character but "-" passed ("