zuul/tests/test_layoutvalidator.py
Clark Boylan 2532dd65c8 Handle random PYTHONHASHSEED values.
Voluptions does a depth first in order traversal of the data structures
it is checking and fails fast. This means it will die when it hits the
first error and return only that error. The test_layouts test is
checking that different bad layout files fail in unique ways. This check
breaks when the python hashseed is random resulting in different depth
first traversals which can result in returning the same error twice if
bad layout files have common errors.

Fix this by trimming down the errors in each layout file to a single
error this way the order of the errors hit never matters.

Fix a string typo in test_layouts while we are in there.

Change-Id: Ie7587ebac4d22063a6819c68011f7fb67a49fcc0
2014-08-21 14:40:19 -07:00

65 lines
2.2 KiB
Python

#!/usr/bin/env python
# Copyright 2013 OpenStack Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import os
import re
import testtools
import voluptuous
import yaml
import zuul.layoutvalidator
FIXTURE_DIR = os.path.join(os.path.dirname(__file__),
'fixtures')
LAYOUT_RE = re.compile(r'^(good|bad)_.*\.yaml$')
class TestLayoutValidator(testtools.TestCase):
def test_layouts(self):
"""Test layout file validation"""
print
errors = []
for fn in os.listdir(os.path.join(FIXTURE_DIR, 'layouts')):
m = LAYOUT_RE.match(fn)
if not m:
continue
print fn
layout = os.path.join(FIXTURE_DIR, 'layouts', fn)
data = yaml.load(open(layout))
validator = zuul.layoutvalidator.LayoutValidator()
if m.group(1) == 'good':
try:
validator.validate(data)
except voluptuous.Invalid as e:
raise Exception(
'Unexpected YAML syntax error in %s:\n %s' %
(fn, str(e)))
else:
try:
validator.validate(data)
raise Exception("Expected a YAML syntax error in %s." %
fn)
except voluptuous.Invalid as e:
error = str(e)
print ' ', error
if error in errors:
raise Exception("Error has already been tested: %s" %
error)
else:
errors.append(error)
pass