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

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. 

15 

16from manila import exception 

17from manila.scheduler.evaluator import evaluator 

18from manila import test 

19 

20 

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")) 

31 

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")) 

36 

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")) 

41 

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")) 

46 

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")) 

52 

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)")) 

59 

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)")) 

68 

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)")) 

77 

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)")) 

83 

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)")) 

88 

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)")) 

95 

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")) 

99 

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)) 

106 

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) 

122 

123 def test_bad_expression(self): 

124 self.assertRaises(exception.EvaluatorParseException, 

125 evaluator.evaluate, 

126 "1/*1") 

127 

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)) 

137 

138 def test_div_zero(self): 

139 self.assertRaises(exception.EvaluatorParseException, 

140 evaluator.evaluate, 

141 "7 / 0")