1#!/usr/bin/python2
2# -*-coding:utf-8 -*
3
4# Copyright (c) 2011-2015, Intel Corporation
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without modification,
8# are permitted provided that the following conditions are met:
9#
10# 1. Redistributions of source code must retain the above copyright notice, this
11# list of conditions and the following disclaimer.
12#
13# 2. Redistributions in binary form must reproduce the above copyright notice,
14# this list of conditions and the following disclaimer in the documentation and/or
15# other materials provided with the distribution.
16#
17# 3. Neither the name of the copyright holder nor the names of its contributors
18# may be used to endorse or promote products derived from this software without
19# specific prior written permission.
20#
21# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
22# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
25# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
28# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32"""
33Array parameter type testcases : UINT8 Array
34
35List of tested functions :
36--------------------------
37    - [setParameter]  function
38    - [getParameter] function
39
40Initial Settings :
41------------------
42    UINT8 Array = 8bits unsigned int array :
43        - Array size : 5
44        - values range : [0, 15]
45
46Test cases :
47------------
48    - Testing nominal case
49    - Testing minimum
50    - Testing minimum overflow
51    - Testing maximum
52    - Testing maximum overflow
53    - Testing array index out of bounds
54    - Testing value format error
55"""
56import os
57import commands
58from Util.PfwUnitTestLib import PfwTestCase
59from Util import ACTLogging
60log=ACTLogging.Logger()
61
62from ctypes import c_uint16
63
64
65class TestCases(PfwTestCase):
66
67    def setUp(self):
68        self.param_name = "/Test/Test/TEST_DIR/UINT8_ARRAY"
69        self.param_short_name = os.environ["PFW_RESULT"] + "/UINT8_ARRAY"
70        print '\r'
71        self.pfw.sendCmd("setTuningMode", "on")
72        print '\r'
73        self.array_size = 5
74        self.array_min = 0
75        self.array_max = 15
76
77    def tearDown(self):
78        self.pfw.sendCmd("setTuningMode", "off")
79
80    def test_Nominal_Case(self):
81        """
82        Testing UINT8_ARRAY Nominal Case
83        --------------------------------
84            Test case description :
85            ~~~~~~~~~~~~~~~~~~~~~~~
86                - Set every UINT8_ARRAY elements to autorized values
87            Tested commands :
88            ~~~~~~~~~~~~~~~~~
89                - [setParameter] function
90            Used commands :
91            ~~~~~~~~~~~~~~~
92                - [getParameter] function
93            Expected result :
94            ~~~~~~~~~~~~~~~~~
95                - UINT8_ARRAY array elements correctly recorded
96                - Blackboard and filesystem values checked
97        """
98        log.D(self.test_Nominal_Case.__doc__)
99
100        for index in range (self.array_size):
101            indexed_array_value = index + self.array_min
102            if indexed_array_value>self.array_max:
103                indexed_array_value=self.array_max
104            hex_indexed_array_value = hex(c_uint16(indexed_array_value).value)
105            #Check parameter value setting
106            indexed_array_value_path = "".join([self.param_name, "/", str(index)])
107            out, err = self.pfw.sendCmd("setParameter", str(indexed_array_value_path), str(indexed_array_value))
108            assert err == None, log.E("when setting parameter %s[%s]: %s"
109                                      % (self.param_name, str(index), err))
110            assert out == "Done", log.F("when setting parameter %s[%s]: %s"
111                                        % (self.param_name, str(index), out))
112            #Check parameter value on blackboard
113            out, err = self.pfw.sendCmd("getParameter", str(indexed_array_value_path), "")
114            assert err == None, log.E("when setting parameter %s[%s] : %s"
115                                      % (self.param_name, str(index), err))
116            assert out == str(indexed_array_value), log.F("BLACKBOARD : Incorrect value for %s[%s], expected: %s, found: %s"
117                                                          % (self.param_name, str(index), str(indexed_array_value), out))
118            #Check parameter value on filesystem
119            indexed_files_system_array_value = open(self.param_short_name).read().splitlines()[index]
120            assert indexed_files_system_array_value == hex_indexed_array_value, log.F("FILESSYSTEM : %s[%s] update error"
121                                                                                      % (self.param_name, str(index)))
122
123    def test_Min_Value(self):
124        """
125        Testing UINT8_ARRAY minimum value
126        ---------------------------------
127            Test case description :
128            ~~~~~~~~~~~~~~~~~~~~~~~
129                - Set every UINT8_ARRAY elements to minimum values : 0
130            Tested commands :
131            ~~~~~~~~~~~~~~~~~
132                - [setParameter] function
133            Used commands :
134            ~~~~~~~~~~~~~~~
135                - [getParameter] function
136            Expected result :
137            ~~~~~~~~~~~~~~~~~
138                - UINT8_ARRAY array elements correctly recorded
139                - Blackboard and filesystem values checked
140        """
141        log.D(self.test_Min_Value.__doc__)
142        index = 0
143        indexed_array_value = self.array_min
144        indexed_array_value_path = "".join([self.param_name, "/", str(index)])
145        hex_indexed_array_value = hex(c_uint16(indexed_array_value).value)
146        #Check parameter value setting
147        out, err = self.pfw.sendCmd("setParameter", str(indexed_array_value_path), str(indexed_array_value))
148        assert err == None, log.E("when setting parameter %s[%s]: %s"
149                                  % (self.param_name, str(index), err))
150        assert out == "Done", log.E("when setting parameter %s[%s]: %s"
151                                  % (self.param_name, str(index), out))
152        #Check parameter value on blackboard
153        out, err = self.pfw.sendCmd("getParameter", str(indexed_array_value_path), "")
154        assert err == None, log.E("when setting parameter %s[%s] : %s"
155                                  % (self.param_name, str(index), err))
156        assert out == str(indexed_array_value), log.F("BLACKBOARD : Incorrect value for %s[%s], expected: %s, found: %s"
157                                                      % (self.param_name, str(index), str(indexed_array_value), out))
158        #Check parameter value on filesystem
159        indexed_files_system_array_value = open(self.param_short_name).read().splitlines()[index]
160        assert indexed_files_system_array_value == hex_indexed_array_value, log.F("FILESSYSTEM : %s[%s] update error"
161                                                                                  % (self.param_name, str(index)))
162
163    def test_Min_Value_Overflow(self):
164        """
165        Testing UINT8_ARRAY parameter values out of negative range
166        ----------------------------------------------------------
167            Test case description :
168            ~~~~~~~~~~~~~~~~~~~~~~~
169                - Set every UINT8_ARRAY elements to -1
170            Tested commands :
171            ~~~~~~~~~~~~~~~~~
172                - [setParameter] function
173            Used commands :
174            ~~~~~~~~~~~~~~~
175                - [getParameter] function
176            Expected result :
177            ~~~~~~~~~~~~~~~~~
178                - UINT8_ARRAY array elements not recorded
179                - Error correctly detected
180        """
181        log.D(self.test_Min_Value_Overflow.__doc__)
182        index = 0
183        indexed_array_value = self.array_min
184        indexed_array_value_path = "".join([self.param_name, "/", str(index)])
185        #Check initial parameter value setting
186        out, err = self.pfw.sendCmd("setParameter", str(indexed_array_value_path), str(indexed_array_value))
187        assert err == None, log.E("when setting parameter %s[%s]: %s"
188                                  % (self.param_name, str(index), err))
189        assert out == "Done", log.F("when setting parameter %s[%s]: %s"
190                                  % (self.param_name, str(index), out))
191        param_check= open(self.param_short_name).read().splitlines()[index]
192        #Check final parameter value setting
193        indexed_array_value = indexed_array_value - 1
194        out, err = self.pfw.sendCmd("setParameter", str(indexed_array_value_path), str(indexed_array_value), expectSuccess=False)
195        assert err == None, log.E("when setting parameter %s[%s]: %s"
196                                  % (self.param_name, str(index), err))
197        assert out != "Done", log.F("Error not detected when setting parameter %s[%s] out of bounds"
198                                    % (self.param_name, str(index)))
199        #Check parameter value on filesystem
200        indexed_files_system_array_value = open(self.param_short_name).read().splitlines()[index]
201        assert indexed_files_system_array_value == param_check, log.F("FILESSYSTEM : %s[%s] forbiden update"
202                                                                      % (self.param_name, str(index)))
203
204    def test_Max_Value(self):
205        """
206        Testing UINT8_ARRAY maximum value
207        ---------------------------------
208            Test case description :
209            ~~~~~~~~~~~~~~~~~~~~~~~
210                - Set every UINT8_ARRAY elements to maximum values : 15
211            Tested commands :
212            ~~~~~~~~~~~~~~~~~
213                - [setParameter] function
214            Used commands :
215            ~~~~~~~~~~~~~~~
216                - [getParameter] function
217            Expected result :
218            ~~~~~~~~~~~~~~~~~
219                - UINT8_ARRAY array elements correctly recorded
220                - Blackboard and filesystem values checked
221        """
222        log.D(self.test_Max_Value.__doc__)
223        index = 0
224        indexed_array_value = self.array_max
225        indexed_array_value_path = "".join([self.param_name, "/", str(index)])
226        hex_indexed_array_value = hex(c_uint16(indexed_array_value).value)
227        #Check parameter value setting
228        out, err = self.pfw.sendCmd("setParameter", str(indexed_array_value_path), str(indexed_array_value))
229        assert err == None, log.E("when setting parameter %s[%s]: %s"
230                                  % (self.param_name, str(index), err))
231        assert out == "Done", log.F("when setting parameter %s[%s]: %s"
232                                  % (self.param_name, str(index), out))
233        #Check parameter value on blackboard
234        out, err = self.pfw.sendCmd("getParameter", str(indexed_array_value_path), "")
235        assert err == None, log.E("when setting parameter %s[%s] : %s"
236                                  % (self.param_name, str(index), err))
237        assert out == str(indexed_array_value), log.F("BLACKBOARD : Incorrect value for %s[%s], expected: %s, found: %s"
238                                                      % (self.param_name, str(index), str(indexed_array_value), out))
239        #Check parameter value on filesystem
240        indexed_files_system_array_value = open(self.param_short_name).read().splitlines()[index]
241        assert indexed_files_system_array_value == hex_indexed_array_value, log.F("FILESSYSTEM : %s[%s] update error"
242                                                                                  % (self.param_name, str(index)))
243
244    def test_Max_Value_Overflow(self):
245        """
246        Testing UINT8_ARRAY parameter values out of positive range
247        ----------------------------------------------------------
248            Test case description :
249            ~~~~~~~~~~~~~~~~~~~~~~~
250                - Set every UINT8_ARRAY elements to 16
251            Tested commands :
252            ~~~~~~~~~~~~~~~~~
253                - [setParameter] function
254            Used commands :
255            ~~~~~~~~~~~~~~~
256                - [getParameter] function
257            Expected result :
258            ~~~~~~~~~~~~~~~~~
259                - UINT8_ARRAY array elements not recorded
260                - Error correctly detected
261        """
262        log.D(self.test_Max_Value_Overflow.__doc__)
263        index = 0
264        indexed_array_value = self.array_max
265        indexed_array_value_path = "".join([self.param_name, "/", str(index)])
266        #Check initial parameter value setting
267        out, err = self.pfw.sendCmd("setParameter", str(indexed_array_value_path), str(indexed_array_value))
268        assert err == None, log.E("when setting parameter %s[%s]: %s"
269                                  % (self.param_name, str(index), err))
270        assert out == "Done", log.F("when setting parameter %s[%s]: %s"
271                                  % (self.param_name, str(index), out))
272        param_check= open(self.param_short_name).read().splitlines()[index]
273        #Check final parameter value setting
274        indexed_array_value = indexed_array_value + 1
275        out, err = self.pfw.sendCmd("setParameter", str(indexed_array_value_path), str(indexed_array_value), expectSuccess=False)
276        assert err == None, log.E("when setting parameter %s[%s]: %s"
277                                  % (self.param_name, str(index), err))
278        assert out != "Done", log.F("Error not detected when setting parameter %s[%s] out of bounds"
279                                    % (self.param_name, str(index)))
280        #Check parameter value on filesystem
281        indexed_files_system_array_value = open(self.param_short_name).read().splitlines()[index]
282        assert indexed_files_system_array_value == param_check, log.F("FILESSYSTEM : %s[%s] forbiden update"
283                                                                      % (self.param_name, str(index)))
284
285    def test_Array_Index_Overflow(self):
286        """
287        Testing Array index out of bounds
288        ---------------------------------
289            Test case description :
290            ~~~~~~~~~~~~~~~~~~~~~~~
291                - Set an out of bounds array indexed element
292            Tested commands :
293            ~~~~~~~~~~~~~~~~~
294                - [setParameter] function
295            Used commands :
296            ~~~~~~~~~~~~~~~
297                - [getParameter] function
298            Expected result :
299            ~~~~~~~~~~~~~~~~~
300                - UINT8_ARRAY array elements not recorded
301                - Error correctly detected
302        """
303        log.D(self.test_Array_Index_Overflow.__doc__)
304        index_values = (self.array_size-1, self.array_size+1, -1)
305        for index in index_values:
306            print index
307            indexed_array_value = self.array_max
308            indexed_array_value_path = "".join([self.param_name, "/", str(index)])
309            #Check parameter value setting
310            out, err = self.pfw.sendCmd("setParameter", str(indexed_array_value_path), str(indexed_array_value), expectSuccess=None)
311            if index in [0, self.array_size-1]:
312                assert err == None, log.E("when setting parameter %s[%s]: %s"
313                                          % (self.param_name, str(index), err))
314                assert out == "Done", log.F("when setting parameter %s[%s]: %s"
315                                          % (self.param_name, str(index), out))
316            else:
317                assert err == None, log.E("when setting parameter %s[%s]: %s"
318                                          % (self.param_name, str(index), err))
319                assert out != "Done", log.F("Error not detected when setting array %s index out of bounds"
320                                            % (self.param_name))
321
322    def test_Value_Format_Error(self):
323        """
324        Testing Array value format error
325        --------------------------------
326            Test case description :
327            ~~~~~~~~~~~~~~~~~~~~~~~
328                - Trying to write an int16 into an 8 bits array element
329            Tested commands :
330            ~~~~~~~~~~~~~~~~~
331                - [setParameter] function
332            Used commands :
333            ~~~~~~~~~~~~~~~
334                - [getParameter] function
335            Expected result :
336            ~~~~~~~~~~~~~~~~~
337                - UINT8_ARRAY array elements not recorded
338                - Error correctly detected
339        """
340        log.D(self.test_Value_Format_Error.__doc__)
341        index = 0
342        var_uint16 = c_uint16(5).value
343        indexed_array_value_1 = 0
344        indexed_array_value_2 = 10
345        indexed_array_value_path_1 = "".join([self.param_name, "/", str(index)])
346        indexed_array_value_path_2 = "".join([self.param_name, "/", str(index+1)])
347        #Check initial parameter value setting
348        out, err = self.pfw.sendCmd("setParameter", str(indexed_array_value_path_1), str(indexed_array_value_1))
349        assert err == None, log.E("when setting parameter %s[%s]: %s"
350                                  % (self.param_name, str(index), err))
351        assert out == "Done", log.F("when setting parameter %s[%s]: %s"
352                                  % (self.param_name, str(index), out))
353        out, err = self.pfw.sendCmd("setParameter", str(indexed_array_value_path_2), str(indexed_array_value_2))
354        assert err == None, log.E("when setting parameter %s[%s]: %s"
355                                  % (self.param_name, str(index+1), err))
356        assert out == "Done", log.F("when setting parameter %s[%s]: %s"
357                                  % (self.param_name, str(index+1), out))
358        param_check_1 = open(self.param_short_name).read().splitlines()[index]
359        param_check_2 = open(self.param_short_name).read().splitlines()[index + 1]
360        #Check final parameter value setting (!= or == ?)
361        out, err = self.pfw.sendCmd("setParameter", str(indexed_array_value_path_1), str(var_uint16))
362        assert err == None, log.E("Error when setting parameter %s[%s]: %s"
363                           % (self.param_name, str(index), err))
364        ### TBC : check expected result ###
365        assert out == "Done", log.F("Error not detected when setting parameter %s[%s] out of bounds"
366                             % (self.param_name, str(index)))
367        #Check parameter value on filesystem
368        indexed_files_system_array_value_2 = open(self.param_short_name).read().splitlines()[index + 1]
369        assert indexed_files_system_array_value_2 == param_check_2, log.F("FILESSYSTEM : %s[%s] forbiden update"
370                                                                          % (self.param_name, str(index)))
371