Coverage for manila/tests/scheduler/evaluator/test_evaluator.py: 100%
86 statements
« prev ^ index » next coverage.py v7.11.0, created at 2026-02-18 22:19 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2026-02-18 22:19 +0000
1# Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
16from manila import exception
17from manila.scheduler.evaluator import evaluator
18from manila import test
21class EvaluatorTestCase(test.TestCase):
22 def test_simple_integer(self):
23 self.assertEqual(2, evaluator.evaluate("1+1"))
24 self.assertEqual(9, evaluator.evaluate("2+3+4"))
25 self.assertEqual(23, evaluator.evaluate("11+12"))
26 self.assertEqual(30, evaluator.evaluate("5*6"))
27 self.assertEqual(2, evaluator.evaluate("22/11"))
28 self.assertEqual(38, evaluator.evaluate("109-71"))
29 self.assertEqual(
30 493, evaluator.evaluate("872 - 453 + 44 / 22 * 4 + 66"))
32 def test_simple_float(self):
33 self.assertEqual(2.0, evaluator.evaluate("1.0 + 1.0"))
34 self.assertEqual(2.5, evaluator.evaluate("1.5 + 1.0"))
35 self.assertEqual(3.0, evaluator.evaluate("1.5 * 2.0"))
37 def test_int_float_mix(self):
38 self.assertEqual(2.5, evaluator.evaluate("1.5 + 1"))
39 self.assertEqual(4.25, evaluator.evaluate("8.5 / 2"))
40 self.assertEqual(5.25, evaluator.evaluate("10/4+0.75 + 2"))
42 def test_negative_numbers(self):
43 self.assertEqual(-2, evaluator.evaluate("-2"))
44 self.assertEqual(-1, evaluator.evaluate("-2+1"))
45 self.assertEqual(3, evaluator.evaluate("5+-2"))
47 def test_exponent(self):
48 self.assertEqual(8, evaluator.evaluate("2^3"))
49 self.assertEqual(-8, evaluator.evaluate("-2 ^ 3"))
50 self.assertEqual(15.625, evaluator.evaluate("2.5 ^ 3"))
51 self.assertEqual(8, evaluator.evaluate("4 ^ 1.5"))
53 def test_function(self):
54 self.assertEqual(5, evaluator.evaluate("abs(-5)"))
55 self.assertEqual(2, evaluator.evaluate("abs(2)"))
56 self.assertEqual(1, evaluator.evaluate("min(1, 100)"))
57 self.assertEqual(100, evaluator.evaluate("max(1, 100)"))
58 self.assertEqual(100, evaluator.evaluate("max(1, 2, 100)"))
60 def test_parentheses(self):
61 self.assertEqual(1, evaluator.evaluate("(1)"))
62 self.assertEqual(-1, evaluator.evaluate("(-1)"))
63 self.assertEqual(2, evaluator.evaluate("(1+1)"))
64 self.assertEqual(15, evaluator.evaluate("(1+2) * 5"))
65 self.assertEqual(3, evaluator.evaluate("(1+2)*(3-1)/((1+(2-1)))"))
66 self.assertEqual(
67 -8.0, evaluator. evaluate("((1.0 / 0.5) * (2)) *(-2)"))
69 def test_comparisons(self):
70 self.assertTrue(evaluator.evaluate("1 < 2"))
71 self.assertTrue(evaluator.evaluate("2 > 1"))
72 self.assertTrue(evaluator.evaluate("2 != 1"))
73 self.assertFalse(evaluator.evaluate("1 > 2"))
74 self.assertFalse(evaluator.evaluate("2 < 1"))
75 self.assertFalse(evaluator.evaluate("2 == 1"))
76 self.assertTrue(evaluator.evaluate("(1 == 1) == !(1 == 2)"))
78 def test_logic_ops(self):
79 self.assertTrue(evaluator.evaluate("(1 == 1) AND (2 == 2)"))
80 self.assertTrue(evaluator.evaluate("(1 == 1) and (2 == 2)"))
81 self.assertTrue(evaluator.evaluate("(1 == 1) && (2 == 2)"))
82 self.assertFalse(evaluator.evaluate("(1 == 1) && (5 == 2)"))
84 self.assertTrue(evaluator.evaluate("(1 == 1) OR (5 == 2)"))
85 self.assertTrue(evaluator.evaluate("(1 == 1) or (5 == 2)"))
86 self.assertTrue(evaluator.evaluate("(1 == 1) || (5 == 2)"))
87 self.assertFalse(evaluator.evaluate("(5 == 1) || (5 == 2)"))
89 self.assertFalse(evaluator.evaluate("(1 == 1) AND NOT (2 == 2)"))
90 self.assertFalse(evaluator.evaluate("(1 == 1) AND not (2 == 2)"))
91 self.assertFalse(evaluator.evaluate("(1 == 1) AND !(2 == 2)"))
92 self.assertTrue(evaluator.evaluate("(1 == 1) AND NOT (5 == 2)"))
93 self.assertTrue(evaluator.evaluate("(1 == 1) OR NOT (2 == 2) "
94 "AND (5 == 5)"))
96 def test_ternary_conditional(self):
97 self.assertEqual(5, evaluator.evaluate("(1 < 2) ? 5 : 10"))
98 self.assertEqual(10, evaluator.evaluate("(1 > 2) ? 5 : 10"))
100 def test_variables_dict(self):
101 stats = {'iops': 1000, 'usage': 0.65, 'count': 503, 'free_space': 407}
102 request = {'iops': 500, 'size': 4}
103 self.assertEqual(1500, evaluator.evaluate("stats.iops + request.iops",
104 stats=stats,
105 request=request))
107 def test_missing_var(self):
108 stats = {'iops': 1000, 'usage': 0.65, 'count': 503, 'free_space': 407}
109 request = {'iops': 500, 'size': 4}
110 self.assertRaises(exception.EvaluatorParseException,
111 evaluator.evaluate,
112 "foo.bob + 5",
113 stats=stats, request=request)
114 self.assertRaises(exception.EvaluatorParseException,
115 evaluator.evaluate,
116 "stats.bob + 5",
117 stats=stats, request=request)
118 self.assertRaises(exception.EvaluatorParseException,
119 evaluator.evaluate,
120 "fake.var + 1",
121 stats=stats, request=request, fake=None)
123 def test_bad_expression(self):
124 self.assertRaises(exception.EvaluatorParseException,
125 evaluator.evaluate,
126 "1/*1")
128 def test_nonnumber_comparison(self):
129 nonnumber = {'test': 'foo'}
130 request = {'test': 'bar'}
131 self.assertTrue(
132 evaluator.evaluate("nonnumber.test != request.test",
133 nonnumber=nonnumber, request=request))
134 self.assertFalse(
135 evaluator.evaluate("nonnumber.test == request.test",
136 nonnumber=nonnumber, request=request))
138 def test_div_zero(self):
139 self.assertRaises(exception.EvaluatorParseException,
140 evaluator.evaluate,
141 "7 / 0")