1# -*-coding:utf-8 -*
2
3# Copyright (c) 2011-2015, Intel Corporation
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without modification,
7# are permitted provided that the following conditions are met:
8#
9# 1. Redistributions of source code must retain the above copyright notice, this
10# list of conditions and the following disclaimer.
11#
12# 2. Redistributions in binary form must reproduce the above copyright notice,
13# this list of conditions and the following disclaimer in the documentation and/or
14# other materials provided with the distribution.
15#
16# 3. Neither the name of the copyright holder nor the names of its contributors
17# may be used to endorse or promote products derived from this software without
18# specific prior written permission.
19#
20# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
24# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
27# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31"""
32Bit block parameter type testcases.
33
34List of tested functions :
35--------------------------
36    - [setParameter]  function
37    - [getParameter] function
38
39Initial Settings :
40------------------
41    Block size = 8bits :
42        - BIT_0_3, size = 3, pos=0
43        - BIT_3_1, size = 1, pos=3
44        - BIT_4_1, size = 1, pos=4
45        - BIT_6_2, size = 2, pos=6
46        - BIT_7_1, size = 1, pos=7
47
48Test cases :
49------------
50    - Testing nominal TestCase : set bit to bit
51    - Testing error testcase : set block in one shot
52    - Testing out of bound TestCase
53    - Testing conflicting TestCase : two bits at the same position
54    - Testing out of size TestCase : Bit define on a wrong position
55"""
56
57import os
58import commands
59import unittest
60from Util.PfwUnitTestLib import PfwTestCase
61from Util import ACTLogging
62log=ACTLogging.Logger()
63
64# Test of type UINT16 - range [0, 1000]
65class TestCases(PfwTestCase):
66    def setUp(self):
67        self.block_name = "/Test/Test/TEST_TYPES/BLOCK_8BIT"
68        self.filesystem_name=os.environ["PFW_RESULT"] + "/BLOCK_8BIT"
69
70        self.bit_name=[]
71
72        #BIT_0_3, size = 3, pos = 0
73        self.bit_name.append("/Test/Test/TEST_TYPES/BLOCK_8BIT/BIT_0_3")
74        #BIT_3_1, size = 1, pos = 3
75        self.bit_name.append("/Test/Test/TEST_TYPES/BLOCK_8BIT/BIT_3_1")
76        #BIT_4_1, size = 1, pos = 4
77        self.bit_name.append("/Test/Test/TEST_TYPES/BLOCK_8BIT/BIT_4_1")
78        #BIT_6_2, size = 2, pos = 6
79        self.bit_name.append("/Test/Test/TEST_TYPES/BLOCK_8BIT/BIT_6_2")
80        #BIT_7_1, size = 1, pos = 7
81        self.bit_name.append("/Test/Test/TEST_TYPES/BLOCK_8BIT/BIT_7_1")
82
83        self.pfw.sendCmd("setTuningMode", "on")
84
85    def tearDown(self):
86        self.pfw.sendCmd("setTuningMode", "off")
87
88
89    def test_Nominal_Case(self):
90        """
91        Testing Bit block parameter in nominal case
92        -------------------------------------------
93            Test case description :
94            ~~~~~~~~~~~~~~~~~~~~~~~
95                - set Bit parameter in nominal case :
96                    - BLOCK_BIT = 0b01011101, 0x5D, 93
97                    - BIT_0_3 = 5
98                    - BIT_3_1 = 1
99                    - BIT_4_1 = 1
100                    - BIT_6_1 = 1
101            Tested commands :
102            ~~~~~~~~~~~~~~~~~
103                - [setParameter] function
104            Used commands :
105            ~~~~~~~~~~~~~~~
106                - [getParameter] function
107            Expected result :
108            ~~~~~~~~~~~~~~~~~
109                - BIT parameters set to nominal value
110                - FILESYSTEM BLOCK_8BIT set to 0x5D
111        """
112        log.D(self.test_Nominal_Case.__doc__)
113
114        value_bit=["5","1","1","1"]
115        filesystem_value=["0x5","0xd","0x1d","0x5d"]
116
117        for index_bit in range(4):
118            log.I("set parameter %s to %s"%(self.bit_name[index_bit],value_bit[index_bit]))
119            out,err = self.pfw.sendCmd("setParameter",self.bit_name[index_bit],value_bit[index_bit])
120            assert err == None, log.E("setParameter %s %s : %s" % (self.bit_name[index_bit],value_bit[index_bit], err))
121            assert out == "Done", log.F("setParameter %s %s" %(self.bit_name[index_bit],value_bit[index_bit]))
122            log.I("Check bit %s value"%(self.bit_name[index_bit]))
123            out,err = self.pfw.sendCmd("getParameter",self.bit_name[index_bit])
124            assert err == None, log.E("getParameter %s : %s" % (self.block_name, err))
125            assert out == value_bit[index_bit], log.F("getParameter %s - Expected : %s Found : %s" %(self.bit_name[index_bit],value_bit[index_bit], out))
126            log.I("Check filesystem value")
127            assert open(self.filesystem_name).read()[:-1] == filesystem_value[index_bit], log.F("FILESYSTEM : parameter update error for %s after setting bit %s "%(self.block_name, self.bit_name[index_bit]))
128
129
130    def test_Set_Block_Directly_Case(self):
131        """
132        Testing setting Bit block parameter in one shot
133        -----------------------------------------------
134            Test case description :
135            ~~~~~~~~~~~~~~~~~~~~~~~
136                - set Bit block directly without setting bit to bit :
137                    - BLOCK_BIT = 0b01011101, 0x5D, 93
138            Tested commands :
139            ~~~~~~~~~~~~~~~~~
140                - [setParameter] function
141            Used commands :
142            ~~~~~~~~~~~~~~~
143                - [getParameter] function
144            Expected result :
145            ~~~~~~~~~~~~~~~~~
146                - Unable to set directly a block bit
147                - FILESYSTEM BLOCK_8BIT must not change
148        """
149        log.D(self.test_Set_Block_Directly_Case.__doc__)
150
151        value = "93"
152
153        log.I("Load the initial value of bit parameter")
154        init_value_bit=[]
155        for index_bit in range(4):
156            out,err=self.pfw.sendCmd("getParameter",self.bit_name[index_bit])
157            assert err == None, log.E("getParameter %s"%self.bit_name[index_bit])
158            init_value_bit.append(out)
159
160        init_filesystem_value=open(self.filesystem_name).read()[:-1]
161
162        log.I("Try to set parameter %s to %s, failed expected"%(self.block_name,value))
163        out,err = self.pfw.sendCmd("setParameter",self.block_name, value, expectSuccess=False)
164        assert err == None, log.E("setParameter %s %s : %s" % (self.block_name, value, err))
165        assert out != "Done", log.F("Error not detected when setting directly the block %s" % (self.block_name))
166        log.I("Try to get parameter %s to %s, failed expected"%(self.block_name,value))
167        out,err = self.pfw.sendCmd("getParameter",self.block_name, value, expectSuccess=False)
168        assert err == None, log.E("getParameter %s : %s" % (self.block_name, err))
169        assert out != value, log.F("Error not detected when getting directly the block %s" % (self.block_name))
170        log.I("Check filesystem value")
171        assert open(self.filesystem_name).read()[:-1] == init_filesystem_value, log.F("FILESYSTEM : parameter update error for %s"%(self.block_name))
172
173        log.I("Check Bit value")
174        for index_bit in range(4):
175            out,err=self.pfw.sendCmd("getParameter",self.bit_name[index_bit])
176            assert out==init_value_bit[index_bit], log.F("BLACKBOARD: Forbidden change value for bit %s - Expected : %s Found : %s"%(self.bit_name[index_bit],init_value_bit[index_bit],out))
177
178    def test_Out_Of_Bound_Bit_Value_Case(self):
179        """
180        Testing setting bit in out of bound
181        -----------------------------------
182            Test case description :
183            ~~~~~~~~~~~~~~~~~~~~~~~
184                - set bit BIT_3_1 to 2
185                - check bit BIT_3_1 value
186                - check bit BIT_0_3 value
187                - check bit BIT_4_1 value
188                - check block bit Filesystem value
189            Tested commands :
190            ~~~~~~~~~~~~~~~~~
191                - [setParameter] function
192            Used commands :
193            ~~~~~~~~~~~~~~~
194                - [getParameter] function
195            Expected result :
196            ~~~~~~~~~~~~~~~~~
197                - Error detected when setting BIT_3_1 to out of bound value
198                - FILESYSTEM BLOCK_8BIT must not change
199        """
200        log.D(self.test_Out_Of_Bound_Bit_Value_Case.__doc__)
201
202        bit_value="3"
203
204        log.I("Load the initial value of bit parameter")
205        init_value_bit=[]
206        for index_bit in range(4):
207            out,err=self.pfw.sendCmd("getParameter",self.bit_name[index_bit])
208            assert err == None, log.E("getParameter %s"%self.bit_name[index_bit])
209            init_value_bit.append(out)
210
211        init_filesystem_value=open(self.filesystem_name).read()[:-1]
212
213        log.I("set parameter %s to %s, failed expected"%(self.bit_name[1],bit_value))
214        out,err = self.pfw.sendCmd("setParameter",self.bit_name[1],bit_value, expectSuccess=False)
215        assert err == None, log.E("setParameter %s %s : %s" % (self.bit_name[1],bit_value, err))
216        assert out != "Done", log.F("Error not detected when setting the bit %s to out of bound value %s" % (self.bit_name[1],bit_value))
217        log.I("Check Bit value")
218        for index_bit in range(4):
219            out,err=self.pfw.sendCmd("getParameter",self.bit_name[index_bit])
220            assert out==init_value_bit[index_bit], log.F("BLACKBOARD: Forbidden change value for bit %s - Expected : %s Found : %s"%(self.bit_name[index_bit],init_value_bit[index_bit],out))
221        log.I("Check filesystem value")
222        assert open(self.filesystem_name).read()[:-1] == init_filesystem_value, log.F("FILESYSTEM : parameter update error for %s"%(self.block_name))
223
224    def test_Undefined_Bit_Case(self):
225        """
226        Testing setting an undefined bit
227        --------------------------------
228            Test case description :
229            ~~~~~~~~~~~~~~~~~~~~~~~
230                - set bit BIT_UNDEF to 1
231                - check block bit Filesystem value
232            Tested commands :
233            ~~~~~~~~~~~~~~~~~
234                - [setParameter] function
235            Used commands :
236            ~~~~~~~~~~~~~~~
237                - [getParameter] function
238            Expected result :
239            ~~~~~~~~~~~~~~~~~
240                - Error detected when setting BIT_UNDEF
241                - FILESYSTEM BLOCK_8BIT must not change
242        """
243        log.D(self.test_Undefined_Bit_Case.__doc__)
244
245        bit_value="1"
246        bit_undefined_name="/Test/Test/TEST_TYPES/BLOCK_8BIT/BIT_UNDEF"
247
248        log.I("Load the initial value of bit parameter")
249        init_value_bit=[]
250        for index_bit in range(4):
251            out,err=self.pfw.sendCmd("getParameter",self.bit_name[index_bit])
252            assert err == None, log.E("getParameter %s"%self.bit_name[index_bit])
253            init_value_bit.append(out)
254
255        init_filesystem_value=open(self.filesystem_name).read()[:-1]
256
257        log.I("set parameter %s to %s, failed expected"%(bit_undefined_name,bit_value))
258        out,err = self.pfw.sendCmd("setParameter",bit_undefined_name,bit_value, expectSuccess=False)
259        assert err == None, log.E("setParameter %s %s : %s" % (bit_undefined_name,bit_value, err))
260        assert out != "Done", log.F("Error not detected when setting the bit %s to out of bound value %s" % (bit_undefined_name,bit_value))
261        log.I("Check Bit value")
262        for index_bit in range(4):
263            out,err=self.pfw.sendCmd("getParameter",self.bit_name[index_bit])
264            assert out==init_value_bit[index_bit], log.F("BLACKBOARD: Forbidden change value for bit %s - Expected : %s Found : %s"%(self.bit_name[index_bit],init_value_bit[index_bit],out))
265        log.I("Check filesystem value")
266        assert open(self.filesystem_name).read()[:-1] == init_filesystem_value, log.F("FILESYSTEM : parameter update error for %s"%(self.block_name))
267
268    @unittest.expectedFailure
269    def test_Position_Conflicting_Case(self):
270        """
271        Testing conflicting position
272        ----------------------------
273            Parameter :
274            ~~~~~~~~~~~
275                BIT_6_2 : Position = 6, size = 2 conflicting with
276                BIT_7_1 : Position = 7; size = 1
277            Test case description :
278            ~~~~~~~~~~~~~~~~~~~~~~~
279                - set bit BIT_6_2 to 0
280                - set bit BIT_7_1 to 1
281                - check bit BIT_6_2 value
282                - check block bit Filesystem value
283            Tested commands :
284            ~~~~~~~~~~~~~~~~~
285                - [setParameter] function
286            Used commands :
287            ~~~~~~~~~~~~~~~
288                - [getParameter] function
289            Expected result :
290            ~~~~~~~~~~~~~~~~~
291                - Unable to define 2 bits at the same position
292        """
293        log.D(self.test_Position_Conflicting_Case.__doc__)
294
295        bit_value_6_2="0"
296        bit_value_7_1="1"
297
298        log.I("set parameter %s to %s"%(self.bit_name[3],bit_value_6_2))
299        out,err = self.pfw.sendCmd("setParameter",self.bit_name[3],bit_value_6_2)
300        assert err == None, log.E("setParameter %s %s : %s" % (self.bit_name[3],bit_value_6_2, err))
301        assert out == "Done", log.F("setParameter %s %s" %(self.bit_name[3],bit_value_6_2))
302
303        log.I("Load the value of bit parameter")
304        init_value_bit=[]
305        for index_bit in range(4):
306            out,err=self.pfw.sendCmd("getParameter",self.bit_name[index_bit])
307            init_value_bit.append(out)
308
309        init_filesystem_value=open(self.filesystem_name).read()[:-1]
310
311        log.I("set parameter %s to %s, failed expected"%(self.bit_name[4],bit_value_7_1))
312        out,err = self.pfw.sendCmd("setParameter",self.bit_name[4],bit_value_7_1)
313        assert err == None, log.E("setParameter %s %s : %s" % (self.bit_name[4],bit_value_7_1, err))
314        assert out != "Done", log.F("Error not detected when setting the conflicting bit %s" % (self.bit_name[4]))
315        log.I("Check Bit value")
316        for index_bit in range(4):
317            out,err=self.pfw.sendCmd("getParameter",self.bit_name[index_bit])
318            assert out==init_value_bit[index_bit], log.F("BLACKBOARD: Forbidden change value for bit %s - Expected : %s Found : %s"%(self.bit_name[index_bit],init_value_bit[index_bit],out))
319        log.I("Check filesystem value")
320        assert open(self.filesystem_name).read()[:-1] == init_filesystem_value, log.F("FILESYSTEM : parameter update error for %s"%(self.block_name))
321