~charmers/charms/trusty/mongodb/trunk

« back to all changes in this revision

Viewing changes to unit_tests/test_utils.py

  • Committer: Jorge Niedbalski
  • Author(s): Mario Splivalo
  • Date: 2015-01-22 17:09:22 UTC
  • mfrom: (56.1.66 mongodb.replsets-fix-try)
  • Revision ID: jorge.niedbalski@canonical.com-20150122170922-nz94p2e0j4xqbbda
[mariosplivalo, r=niedbalski,freyes] Fixes various replicaset issues bug LP: #1403698, LP: #1370542, LP: #1379604

unit tests Ok, amulet tests OK.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import logging
 
2
import unittest
 
3
import os
 
4
import yaml
 
5
import io
 
6
 
 
7
from contextlib import contextmanager
 
8
from mock import patch
 
9
 
 
10
 
 
11
@contextmanager
 
12
def mock_open(filename, contents=None):
 
13
    ''' Slightly simpler mock of open to return contents for filename '''
 
14
    def mock_file(*args):
 
15
        if args[0] == filename:
 
16
            return io.StringIO(contents)
 
17
        else:
 
18
            return open(*args)
 
19
    with patch('__builtin__.open', mock_file):
 
20
        yield
 
21
 
 
22
 
 
23
def load_config():
 
24
    '''
 
25
    Walk backwords from __file__ looking for config.yaml, load and return the
 
26
    'options' section'
 
27
    '''
 
28
    config = None
 
29
    f = __file__
 
30
    while config is None:
 
31
        d = os.path.dirname(f)
 
32
        if os.path.isfile(os.path.join(d, 'config.yaml')):
 
33
            config = os.path.join(d, 'config.yaml')
 
34
            break
 
35
        f = d
 
36
 
 
37
    if not config:
 
38
        logging.error('Could not find config.yaml in any parent directory '
 
39
                      'of %s. ' % file)
 
40
        raise Exception
 
41
 
 
42
    return yaml.safe_load(open(config).read())['options']
 
43
 
 
44
 
 
45
def get_default_config():
 
46
    '''
 
47
    Load default charm config from config.yaml return as a dict.
 
48
    If no default is set in config.yaml, its value is None.
 
49
    '''
 
50
    default_config = {}
 
51
    config = load_config()
 
52
    for k, v in config.iteritems():
 
53
        if 'default' in v:
 
54
            default_config[k] = v['default']
 
55
        else:
 
56
            default_config[k] = None
 
57
    return default_config
 
58
 
 
59
 
 
60
class CharmTestCase(unittest.TestCase):
 
61
    def setUp(self, obj, patches):
 
62
        super(CharmTestCase, self).setUp()
 
63
        self.patches = patches
 
64
        self.obj = obj
 
65
        self.test_config = TestConfig()
 
66
        self.test_relation = TestRelation()
 
67
        self.patch_all()
 
68
 
 
69
    def patch(self, method):
 
70
        _m = patch.object(self.obj, method)
 
71
        mock = _m.start()
 
72
        self.addCleanup(_m.stop)
 
73
        return mock
 
74
 
 
75
    def patch_all(self):
 
76
        for method in self.patches:
 
77
            setattr(self, method, self.patch(method))
 
78
 
 
79
 
 
80
class TestConfig(object):
 
81
    def __init__(self):
 
82
        self.config = get_default_config()
 
83
 
 
84
    def get(self, attr):
 
85
        try:
 
86
            return self.config[attr]
 
87
        except KeyError:
 
88
            return None
 
89
 
 
90
    def get_all(self):
 
91
        return self.config
 
92
 
 
93
    def set(self, attr, value):
 
94
        if attr not in self.config:
 
95
            raise KeyError
 
96
        self.config[attr] = value
 
97
 
 
98
 
 
99
class TestRelation(object):
 
100
    def __init__(self, relation_data={}):
 
101
        self.relation_data = relation_data
 
102
 
 
103
    def set(self, relation_data):
 
104
        self.relation_data = relation_data
 
105
 
 
106
    def get(self, attr=None, unit=None, rid=None):
 
107
        if attr is None:
 
108
            return self.relation_data
 
109
        elif attr in self.relation_data:
 
110
            return self.relation_data.get(attr)
 
111
        return None