179 lines
5.1 KiB
Python
179 lines
5.1 KiB
Python
|
# Copyright 2020 Red Hat, Inc.
|
||
|
#
|
||
|
# 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 tempfile
|
||
|
import textwrap
|
||
|
|
||
|
from openstack.config import loader
|
||
|
from openstack import exceptions
|
||
|
from openstack.tests.unit.config import base
|
||
|
|
||
|
FILES = {
|
||
|
'yaml': textwrap.dedent(
|
||
|
'''
|
||
|
foo: bar
|
||
|
baz:
|
||
|
- 1
|
||
|
- 2
|
||
|
- 3
|
||
|
'''
|
||
|
),
|
||
|
'json': textwrap.dedent(
|
||
|
'''
|
||
|
{
|
||
|
"foo": "bar",
|
||
|
"baz": [
|
||
|
1,
|
||
|
2,
|
||
|
3
|
||
|
]
|
||
|
}
|
||
|
'''
|
||
|
),
|
||
|
'txt': textwrap.dedent(
|
||
|
'''
|
||
|
foo
|
||
|
bar baz
|
||
|
test
|
||
|
one two
|
||
|
'''
|
||
|
),
|
||
|
}
|
||
|
|
||
|
|
||
|
class TestLoader(base.TestCase):
|
||
|
def test_base_load_yaml_json_file(self):
|
||
|
with tempfile.TemporaryDirectory() as tmpdir:
|
||
|
tested_files = []
|
||
|
for key, value in FILES.items():
|
||
|
fn = os.path.join(tmpdir, 'file.{ext}'.format(ext=key))
|
||
|
with open(fn, 'w+') as fp:
|
||
|
fp.write(value)
|
||
|
tested_files.append(fn)
|
||
|
|
||
|
path, result = loader.OpenStackConfig()._load_yaml_json_file(
|
||
|
tested_files
|
||
|
)
|
||
|
# NOTE(hberaud): Prefer to test path rather than file because
|
||
|
# our FILES var is a dict so results are appened
|
||
|
# without keeping the initial order (python 3.5)
|
||
|
self.assertEqual(tmpdir, os.path.dirname(path))
|
||
|
|
||
|
def test__load_yaml_json_file_without_json(self):
|
||
|
with tempfile.TemporaryDirectory() as tmpdir:
|
||
|
tested_files = []
|
||
|
for key, value in FILES.items():
|
||
|
if key == 'json':
|
||
|
continue
|
||
|
fn = os.path.join(tmpdir, 'file.{ext}'.format(ext=key))
|
||
|
with open(fn, 'w+') as fp:
|
||
|
fp.write(value)
|
||
|
tested_files.append(fn)
|
||
|
|
||
|
path, result = loader.OpenStackConfig()._load_yaml_json_file(
|
||
|
tested_files
|
||
|
)
|
||
|
# NOTE(hberaud): Prefer to test path rather than file because
|
||
|
# our FILES var is a dict so results are appened
|
||
|
# without keeping the initial order (python 3.5)
|
||
|
self.assertEqual(tmpdir, os.path.dirname(path))
|
||
|
|
||
|
def test__load_yaml_json_file_without_json_yaml(self):
|
||
|
with tempfile.TemporaryDirectory() as tmpdir:
|
||
|
tested_files = []
|
||
|
fn = os.path.join(tmpdir, 'file.txt')
|
||
|
with open(fn, 'w+') as fp:
|
||
|
fp.write(FILES['txt'])
|
||
|
tested_files.append(fn)
|
||
|
|
||
|
path, result = loader.OpenStackConfig()._load_yaml_json_file(
|
||
|
tested_files
|
||
|
)
|
||
|
self.assertEqual(fn, path)
|
||
|
|
||
|
def test__load_yaml_json_file_without_perm(self):
|
||
|
with tempfile.TemporaryDirectory() as tmpdir:
|
||
|
tested_files = []
|
||
|
fn = os.path.join(tmpdir, 'file.txt')
|
||
|
with open(fn, 'w+') as fp:
|
||
|
fp.write(FILES['txt'])
|
||
|
os.chmod(fn, 222)
|
||
|
tested_files.append(fn)
|
||
|
|
||
|
path, result = loader.OpenStackConfig()._load_yaml_json_file(
|
||
|
tested_files
|
||
|
)
|
||
|
self.assertEqual(None, path)
|
||
|
|
||
|
def test__load_yaml_json_file_nonexisting(self):
|
||
|
tested_files = []
|
||
|
fn = os.path.join('/fake', 'file.txt')
|
||
|
tested_files.append(fn)
|
||
|
|
||
|
path, result = loader.OpenStackConfig()._load_yaml_json_file(
|
||
|
tested_files
|
||
|
)
|
||
|
self.assertEqual(None, path)
|
||
|
|
||
|
|
||
|
class TestFixArgv(base.TestCase):
|
||
|
def test_no_changes(self):
|
||
|
argv = [
|
||
|
'-a',
|
||
|
'-b',
|
||
|
'--long-arg',
|
||
|
'--multi-value',
|
||
|
'key1=value1',
|
||
|
'--multi-value',
|
||
|
'key2=value2',
|
||
|
]
|
||
|
expected = argv[:]
|
||
|
loader._fix_argv(argv)
|
||
|
self.assertEqual(expected, argv)
|
||
|
|
||
|
def test_replace(self):
|
||
|
argv = [
|
||
|
'-a',
|
||
|
'-b',
|
||
|
'--long-arg',
|
||
|
'--multi_value',
|
||
|
'key1=value1',
|
||
|
'--multi_value',
|
||
|
'key2=value2',
|
||
|
]
|
||
|
expected = [
|
||
|
'-a',
|
||
|
'-b',
|
||
|
'--long-arg',
|
||
|
'--multi-value',
|
||
|
'key1=value1',
|
||
|
'--multi-value',
|
||
|
'key2=value2',
|
||
|
]
|
||
|
loader._fix_argv(argv)
|
||
|
self.assertEqual(expected, argv)
|
||
|
|
||
|
def test_mix(self):
|
||
|
argv = [
|
||
|
'-a',
|
||
|
'-b',
|
||
|
'--long-arg',
|
||
|
'--multi_value',
|
||
|
'key1=value1',
|
||
|
'--multi-value',
|
||
|
'key2=value2',
|
||
|
]
|
||
|
self.assertRaises(exceptions.ConfigException, loader._fix_argv, argv)
|