python 3.5 support
[tiramisu.git] / test / test_option_consistency.py
index 323f6e4..3761cf2 100644 (file)
@@ -1,4 +1,4 @@
-from autopath import do_autopath
+from .autopath import do_autopath
 do_autopath()
 
 from py.test import raises
@@ -6,19 +6,21 @@ from py.test import raises
 from tiramisu.setting import owners, groups
 from tiramisu.config import Config
 from tiramisu.option import IPOption, NetworkOption, NetmaskOption, IntOption,\
-    BroadcastOption, SymLinkOption, OptionDescription, submulti
+    BroadcastOption, StrOption, SymLinkOption, OptionDescription, submulti
 from tiramisu.error import ConfigError, ValueWarning, PropertiesOptionError
 import warnings
 
 
+def return_value(value=None):
+    return value
+
+
 def test_consistency():
     a = IntOption('a', '')
     b = IntOption('b', '')
     a.impl_add_consistency('not_equal', b)
     #consistency to itself
     raises(ConfigError, "a.impl_add_consistency('not_equal', a)")
-    #consistency with string
-    raises(ConfigError, "a.impl_add_consistency('not_equal', 'a')")
 
 
 def test_consistency_not_exists():
@@ -57,6 +59,29 @@ def test_consistency_warnings_only():
     assert w != []
 
 
+def test_consistency_warnings_only_more_option():
+    a = IntOption('a', '')
+    b = IntOption('b', '')
+    d = IntOption('d', '')
+    od = OptionDescription('od', '', [a, b, d])
+    a.impl_add_consistency('not_equal', b, d, warnings_only=True)
+    c = Config(od)
+    c.a = 1
+    warnings.simplefilter("always", ValueWarning)
+    with warnings.catch_warnings(record=True) as w:
+        c.b = 1
+    assert w != []
+    assert len(w) == 1
+    with warnings.catch_warnings(record=True) as w:
+        c.d
+    assert w != []
+    assert len(w) == 1
+    with warnings.catch_warnings(record=True) as w:
+        c.d = 1
+    assert w != []
+    assert len(w) == 1
+
+
 def test_consistency_not_equal():
     a = IntOption('a', '')
     b = IntOption('b', '')
@@ -102,6 +127,38 @@ def test_consistency_not_equal_many_opts():
     raises(ValueError, "c.e = 3")
 
 
+def test_consistency_not_equal_many_opts_one_disabled():
+    a = IntOption('a', '')
+    b = IntOption('b', '')
+    c = IntOption('c', '')
+    d = IntOption('d', '')
+    e = IntOption('e', '')
+    f = IntOption('f', '')
+    g = IntOption('g', '', properties=('disabled',))
+    od = OptionDescription('od', '', [a, b, c, d, e, f, g])
+    a.impl_add_consistency('not_equal', b, c, d, e, f, g, transitive=False)
+    c = Config(od)
+    c.read_write()
+    assert c.a is None
+    assert c.b is None
+    #
+    c.a = 1
+    del(c.a)
+    #
+    c.a = 1
+    raises(ValueError, "c.b = 1")
+    #
+    c.b = 2
+    raises(ValueError, "c.f = 2")
+    raises(ValueError, "c.f = 1")
+    #
+    c.d = 3
+    raises(ValueError, "c.f = 3")
+    raises(ValueError, "c.a = 3")
+    raises(ValueError, "c.c = 3")
+    raises(ValueError, "c.e = 3")
+
+
 def test_consistency_not_in_config_1():
     a = IntOption('a', '')
     b = IntOption('b', '')
@@ -157,21 +214,9 @@ def test_consistency_not_equal_symlink():
 def test_consistency_not_equal_submulti():
     a = IntOption('a', '', multi=submulti)
     b = IntOption('b', '', multi=submulti)
-    od = OptionDescription('od', '', [a, b])
-    a.impl_add_consistency('not_equal', b)
-    c = Config(od)
-    assert c.a == []
-    assert c.b == []
-    c.a = [[1]]
-    del(c.a)
-    c.a = [[1]]
-    raises(ValueError, "c.b = [[1]]")
-    c.a = [[1, 2]]
-    c.b = [[3]]
-    c.b = [[3, 1]]
-    c.b = [[3]]
-    c.b[0].append(1)
-    c.b = [[3], [1]]
+    od = OptionDescription('a', '', [a, b])
+    od.impl_set_group_type(groups.master)
+    raises(ConfigError, 'a.impl_add_consistency("not_equal", b)')
 
 
 def test_consistency_not_equal_default_submulti():
@@ -179,13 +224,14 @@ def test_consistency_not_equal_default_submulti():
     b = IntOption('b', '', [[1]], multi=submulti)
     od = OptionDescription('od', '', [a, b])
     od
-    raises(ValueError, "a.impl_add_consistency('not_equal', b)")
+    raises(ConfigError, "a.impl_add_consistency('not_equal', b)")
 
 
-def test_consistency_not_equal_multi():
+def test_consistency_not_equal_masterslave():
     a = IntOption('a', '', multi=True)
     b = IntOption('b', '', multi=True)
-    od = OptionDescription('od', '', [a, b])
+    od = OptionDescription('a', '', [a, b])
+    od.impl_set_group_type(groups.master)
     a.impl_add_consistency('not_equal', b)
     c = Config(od)
     assert c.a == []
@@ -195,12 +241,33 @@ def test_consistency_not_equal_multi():
     c.a = [1]
     raises(ValueError, "c.b = [1]")
     c.b = [2]
+    del(c.a)
+    c.a.append(1)
+    c.make_dict()
+    c.b[0] = 3
+    c.a.append(2)
+    c.b[0] = 3
+    raises(ValueError, "c.b[1] = 3")
 
 
-def test_consistency_not_equal_multi_default():
+def test_consistency_not_equal_masterslaves_default():
     a = IntOption('a', '', multi=True)
     b = IntOption('b', '', multi=True, default_multi=1)
-    od = OptionDescription('od', '', [a, b])
+    od = OptionDescription('a', '', [a, b])
+    od.impl_set_group_type(groups.master)
+    a.impl_add_consistency('not_equal', b)
+    c = Config(od)
+    assert c.a == []
+    assert c.b == []
+    raises(ValueError, 'c.a = [1]')
+    c.a = [2]
+    del(c.a)
+
+
+def test_consistency_not_equal_multi():
+    a = IntOption('a', '', multi=True)
+    b = IntOption('b', '', multi=True)
+    od = OptionDescription('a', '', [a, b])
     a.impl_add_consistency('not_equal', b)
     c = Config(od)
     assert c.a == []
@@ -210,6 +277,31 @@ def test_consistency_not_equal_multi_default():
     c.a = [1]
     raises(ValueError, "c.b = [1]")
     c.b = [2]
+    raises(ValueError, "c.b = [2, 1]")
+    raises(ValueError, "c.b.append(1)")
+    c.b.append(3)
+    raises(ValueError, "c.b.append(3)")
+    raises(ValueError, "c.a.append(3)")
+    raises(ValueError, "c.a.append(3)")
+
+
+def test_consistency_not_equal_multi_default():
+    a = IntOption('a', '', multi=True, default=[1])
+    b = IntOption('b', '', multi=True, default=[1, 2])
+    od = OptionDescription('a', '', [a, b])
+    raises(ValueError, "a.impl_add_consistency('not_equal', b)")
+
+
+def test_consistency_not_equal_multi_default_modif():
+    a = IntOption('a', '', multi=True)
+    b = IntOption('b', '', multi=True, default=[1, 2])
+    od = OptionDescription('a', '', [a, b])
+    a.impl_add_consistency('not_equal', b)
+    c = Config(od)
+    assert c.a == []
+    assert c.b == [1, 2]
+    raises(ValueError, 'c.a.append(1)')
+    raises(ValueError, 'c.b.append(1)')
 
 
 def test_consistency_default():
@@ -297,10 +389,7 @@ def test_consistency_ip_in_network_len_error():
     b = NetmaskOption('b', '')
     c = IPOption('c', '')
     od = OptionDescription('od', '', [a, b, c])
-    c.impl_add_consistency('in_network', a)
-    cfg = Config(od)
-    cfg
-    raises(ConfigError, "cfg.a = '192.168.2.0'")
+    raises(ConfigError, "c.impl_add_consistency('in_network', a)")
 
 
 def test_consistency_ip_netmask_network_error():
@@ -325,8 +414,9 @@ def test_consistency_ip_netmask_error_multi():
 def test_consistency_ip_netmask_multi():
     a = IPOption('a', '', multi=True)
     b = NetmaskOption('b', '', multi=True)
-    od = OptionDescription('od', '', [a, b])
+    od = OptionDescription('a', '', [a, b])
     b.impl_add_consistency('ip_netmask', a)
+    od.impl_set_group_type(groups.master)
     c = Config(od)
     c.a = ['192.168.1.1']
     c.b = ['255.255.255.0']
@@ -339,7 +429,8 @@ def test_consistency_ip_netmask_multi():
 def test_consistency_network_netmask_multi():
     a = NetworkOption('a', '', multi=True)
     b = NetmaskOption('b', '', multi=True)
-    od = OptionDescription('od', '', [a, b])
+    od = OptionDescription('a', '', [a, b])
+    od.impl_set_group_type(groups.master)
     b.impl_add_consistency('network_netmask', a)
     c = Config(od)
     c.a = ['192.168.1.1']
@@ -350,6 +441,17 @@ def test_consistency_network_netmask_multi():
     raises(ValueError, "c.a = ['192.168.1.1']")
 
 
+def test_consistency_network_netmask_multi_slave_default_multi():
+    a = NetworkOption('a', '', default_multi=u'192.168.1.0', multi=True, properties=('mandatory',))
+    b = NetmaskOption('b', '', default_multi=u'255.255.255.0', multi=True, properties=('mandatory',))
+    od = OptionDescription('a', '', [a, b])
+    od.impl_set_group_type(groups.master)
+    b.impl_add_consistency('network_netmask', a)
+    c = Config(od)
+    c.read_write()
+    c.a.append()
+
+
 def test_consistency_network_netmask_multi_slave_default():
     a = NetworkOption('a', '', multi=True, properties=('mandatory',))
     b = NetmaskOption('b', '', default_multi=u'255.255.255.0', multi=True, properties=('mandatory',))
@@ -506,6 +608,24 @@ def test_consistency_broadcast_error():
     raises(ConfigError, "c.a = ['192.168.1.0']")
 
 
+def test_consistency_broadcast_warnings():
+    warnings.simplefilter("always", ValueWarning)
+    a = NetworkOption('a', '', properties=('mandatory', 'disabled'))
+    b = NetmaskOption('b', '', properties=('mandatory', 'disabled'))
+    c = NetmaskOption('c', '', properties=('mandatory', 'disabled'))
+    od = OptionDescription('a', '', [a, b, c])
+    b.impl_add_consistency('network_netmask', a, warnings_only=True)
+    c = Config(od)
+    with warnings.catch_warnings(record=True) as w:
+        c.a = '192.168.1.4'
+        c.b = '255.255.255.0'
+    assert len(w) == 1
+    c.read_write()
+    with warnings.catch_warnings(record=True) as w:
+        list(c.cfgimpl_get_values().mandatory_warnings())
+    assert len(w) == 0
+
+
 def test_consistency_broadcast_default_1():
     a = NetworkOption('a', '', '192.168.1.0')
     b = NetmaskOption('b', '', '255.255.255.128')
@@ -600,3 +720,55 @@ def test_consistency_with_callback():
     c.impl_add_consistency('in_network', a, b)
     cfg = Config(od)
     cfg.c
+
+
+def test_consistency_double_warnings():
+    a = IntOption('a', '')
+    b = IntOption('b', '', 1)
+    c = IntOption('c', '', 1)
+    od = OptionDescription('od', '', [a, b, c])
+    warnings.simplefilter("always", ValueWarning)
+    a.impl_add_consistency('not_equal', b, warnings_only=True)
+    a.impl_add_consistency('not_equal', c, warnings_only=True)
+    cfg = Config(od)
+    with warnings.catch_warnings(record=True) as w:
+        cfg.a = 1
+    assert w != []
+    assert len(w) == 2
+    with warnings.catch_warnings(record=True) as w:
+        cfg.c = 2
+    assert w == []
+    with warnings.catch_warnings(record=True) as w:
+        cfg.a = 2
+    assert w != []
+    assert len(w) == 1
+    cfg.cfgimpl_get_settings().remove('warnings')
+    with warnings.catch_warnings(record=True) as w:
+        cfg.a = 1
+    assert w == []
+
+
+def test_consistency_warnings_error():
+    a = IntOption('a', '')
+    b = IntOption('b', '', 1)
+    c = IntOption('c', '', 1)
+    od = OptionDescription('od', '', [a, b, c])
+    warnings.simplefilter("always", ValueWarning)
+    a.impl_add_consistency('not_equal', b, warnings_only=True)
+    a.impl_add_consistency('not_equal', c)
+    cfg = Config(od)
+    with warnings.catch_warnings(record=True) as w:
+        raises(ValueError, "cfg.a = 1")
+    assert w == []
+
+
+def test_consistency_network_netmask_mandatory():
+    a = NetworkOption('a', '', multi=True, properties=('mandatory',), default=[u'0.0.0.0'])
+    b = NetmaskOption('b', '', multi=True, properties=('mandatory',), default_multi=u'0.0.0.0')
+    od = OptionDescription('a', '', [a, b])
+    od.impl_set_group_type(groups.master)
+    b.impl_add_consistency('network_netmask', a)
+    c = Config(od)
+    c.read_only()
+    c.cfgimpl_get_settings().remove('mandatory')
+    c.make_dict()