Merge branch 'master' into orm
[tiramisu.git] / test / test_option_consistency.py
index 23905c4..5e85530 100644 (file)
@@ -1,10 +1,22 @@
 import autopath
 from py.test import raises
 
-from tiramisu.setting import owners
+from tiramisu.setting import owners, groups
 from tiramisu.config import Config
 from tiramisu.option import IPOption, NetworkOption, NetmaskOption, IntOption,\
-    OptionDescription
+    BroadcastOption, SymLinkOption, OptionDescription
+from tiramisu.error import ConfigError
+
+
+def test_consistency():
+    a = IntOption('a', '')
+    b = IntOption('b', '')
+    od = OptionDescription('od', '', [a, 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_equal():
@@ -22,6 +34,88 @@ def test_consistency_not_equal():
     c.b = 2
 
 
+def test_consistency_not_equal_many_opts():
+    a = IntOption('a', '')
+    b = IntOption('b', '')
+    c = IntOption('c', '')
+    d = IntOption('d', '')
+    e = IntOption('e', '')
+    f = IntOption('f', '')
+    od = OptionDescription('od', '', [a, b, c, d, e, f])
+    a.impl_add_consistency('not_equal', b, c, d, e, f)
+    c = Config(od)
+    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', '')
+    a.impl_add_consistency('not_equal', b)
+    od1 = OptionDescription('od1', '', [a])
+    od2 = OptionDescription('od2', '', [b])
+    od = OptionDescription('root', '', [od1])
+    raises(ConfigError, "Config(od)")
+
+
+def test_consistency_not_in_config_2():
+    a = IntOption('a', '')
+    b = IntOption('b', '')
+    a.impl_add_consistency('not_equal', b)
+    od1 = OptionDescription('od1', '', [a])
+    od2 = OptionDescription('od2', '', [b])
+    od = OptionDescription('root', '', [od1, od2])
+    Config(od)
+
+
+def test_consistency_not_in_config_3():
+    a = IntOption('a', '')
+    b = IntOption('b', '')
+    a.impl_add_consistency('not_equal', b)
+    od1 = OptionDescription('od1', '', [a])
+    od2 = OptionDescription('od2', '', [b])
+    od = OptionDescription('root', '', [od1, od2])
+    #with subconfig
+    raises(ConfigError, "Config(od.od1)")
+
+
+def test_consistency_after_config():
+    a = IntOption('a', '')
+    b = IntOption('b', '')
+    od1 = OptionDescription('od1', '', [a])
+    od2 = OptionDescription('od2', '', [b])
+    od = OptionDescription('root', '', [od1, od2])
+    Config(od)
+    #FIXME a cause du read_only
+    #raises(AttributeError, "a.impl_add_consistency('not_equal', b)")
+
+
+def test_consistency_not_equal_symlink():
+    a = IntOption('a', '')
+    b = IntOption('b', '')
+    c = SymLinkOption('c', a)
+    od = OptionDescription('od', '', [a, b, c])
+    a.impl_add_consistency('not_equal', b)
+    c = Config(od)
+    assert set(od._cache_consistencies.keys()) == set([a, b])
+
+
 def test_consistency_not_equal_multi():
     a = IntOption('a', '', multi=True)
     b = IntOption('b', '', multi=True)
@@ -43,6 +137,14 @@ def test_consistency_default():
     raises(ValueError, "a.impl_add_consistency('not_equal', b)")
 
 
+def test_consistency_default_multi():
+    a = IntOption('a', '', [2, 1], multi=True)
+    b = IntOption('b', '', [1, 1], multi=True)
+    c = IntOption('c', '', [1, 2], multi=True)
+    raises(ValueError, "a.impl_add_consistency('not_equal', b)")
+    a.impl_add_consistency('not_equal', c)
+
+
 def test_consistency_default_diff():
     a = IntOption('a', '', 3)
     b = IntOption('b', '', 1)
@@ -52,9 +154,9 @@ def test_consistency_default_diff():
     raises(ValueError, "c.a = 1")
     c.a = 2
     c.b = 3
-    assert c.getowner('a') is owners.user
+    assert c.getowner(a) is owners.user
     raises(ValueError, "del(c.a)")
-    assert c.getowner('a') is owners.user
+    assert c.getowner(a) is owners.user
 
 
 def test_consistency_ip_netmask():
@@ -85,7 +187,13 @@ def test_consistency_network_netmask():
     raises(ValueError, "c.a = '192.168.1.1'")
 
 
-#FIXME pas de multi si pas de multi en maitre
+def test_consistency_ip_netmask_error_multi():
+    a = IPOption('a', '', multi=True)
+    b = NetmaskOption('b', '')
+    od = OptionDescription('od', '', [a, b])
+    raises(ConfigError, "b.impl_add_consistency('ip_netmask', a)")
+
+
 def test_consistency_ip_netmask_multi():
     a = IPOption('a', '', multi=True)
     b = NetmaskOption('b', '', multi=True)
@@ -112,3 +220,91 @@ def test_consistency_network_netmask_multi():
     c.a = ['192.168.1.0']
     c.b = ['255.255.255.0']
     raises(ValueError, "c.a = ['192.168.1.1']")
+
+
+def test_consistency_ip_netmask_multi_master():
+    a = IPOption('a', '', multi=True)
+    b = NetmaskOption('b', '', multi=True)
+    od = OptionDescription('a', '', [a, b])
+    od.impl_set_group_type(groups.master)
+    b.impl_add_consistency('ip_netmask', a)
+    c = Config(od)
+    c.a = ['192.168.1.1']
+    c.b = ['255.255.255.0']
+    c.a = ['192.168.1.2']
+    c.b = ['255.255.255.255']
+    c.b = ['255.255.255.0']
+    raises(ValueError, "c.a = ['192.168.1.0']")
+    c.a = ['192.168.1.2', '192.168.1.3']
+
+
+def test_consistency_network_netmask_multi_master():
+    a = NetworkOption('a', '', multi=True)
+    b = NetmaskOption('b', '', multi=True)
+    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']
+    c.b = ['255.255.255.255']
+    del(c.b)
+    c.a = ['192.168.1.0']
+    c.b = ['255.255.255.0']
+    raises(ValueError, "c.a = ['192.168.1.1']")
+
+
+def test_consistency_broadcast():
+    a = NetworkOption('a', '', multi=True)
+    b = NetmaskOption('b', '', multi=True)
+    c = BroadcastOption('c', '', multi=True)
+    od = OptionDescription('a', '', [a, b, c])
+    od.impl_set_group_type(groups.master)
+    b.impl_add_consistency('network_netmask', a)
+    c.impl_add_consistency('broadcast', a, b)
+    c = Config(od)
+    #first, test network_netmask
+    c.a = ['192.168.1.128']
+    raises(ValueError, "c.b = ['255.255.255.0']")
+    #
+    c.a = ['192.168.1.0']
+    c.b = ['255.255.255.0']
+    c.c = ['192.168.1.255']
+    raises(ValueError, "c.a = ['192.168.1.1']")
+    #
+    c.a = ['192.168.1.0', '192.168.2.128']
+    c.b = ['255.255.255.0', '255.255.255.128']
+    c.c = ['192.168.1.255', '192.168.2.255']
+    raises(ValueError, "c.c[1] = '192.168.2.128'")
+    c.c[1] = '192.168.2.255'
+
+
+def test_consistency_broadcast_default_1():
+    a = NetworkOption('a', '', '192.168.1.0')
+    b = NetmaskOption('b', '', '255.255.255.128')
+    c = BroadcastOption('c', '', '192.168.2.127')
+    d = BroadcastOption('d', '', '192.168.1.127')
+    od = OptionDescription('a', '', [a, b, c])
+    raises(ValueError, "c.impl_add_consistency('broadcast', a, b)")
+
+
+def test_consistency_broadcast_default_2():
+    a = NetworkOption('a', '', '192.168.1.0')
+    b = NetmaskOption('b', '', '255.255.255.128')
+    c = BroadcastOption('c', '', '192.168.2.127')
+    d = BroadcastOption('d', '', '192.168.1.127')
+    od2 = OptionDescription('a', '', [a, b, d])
+    d.impl_add_consistency('broadcast', a, b)
+
+
+def test_consistency_not_all():
+    #_cache_consistencies is not None by not options has consistencies
+    a = NetworkOption('a', '', multi=True)
+    b = NetmaskOption('b', '', multi=True)
+    c = BroadcastOption('c', '', multi=True)
+    od = OptionDescription('a', '', [a, b, c])
+    od.impl_set_group_type(groups.master)
+    b.impl_add_consistency('network_netmask', a)
+    c = Config(od)
+    c.a = ['192.168.1.0']
+    c.b = ['255.255.255.0']
+    c.c = ['192.168.1.255']