xref: /AOO41X/main/framework/inc/macros/debug/assertion.hxx (revision 24c56ab9f1bd1305754aa2f564704f38ff57627e)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef __FRAMEWORK_MACROS_DEBUG_ASSERTION_HXX_
25 #define __FRAMEWORK_MACROS_DEBUG_ASSERTION_HXX_
26 
27 //_________________________________________________________________________________________________________________
28 //  includes
29 //_________________________________________________________________________________________________________________
30 
31 #if defined( ENABLE_ASSERTIONS ) || defined( ENABLE_WARNINGS )
32 
33     #ifndef _OSL_DIAGNOSE_H_
34     #include <osl/diagnose.h>
35     #endif
36 
37     #ifndef _RTL_STRBUF_HXX_
38     #include <rtl/strbuf.hxx>
39     #endif
40 
41 #endif
42 
43 //*****************************************************************************************************************
44 //  special macros for assertion handling
45 //      1)  LOGTYPE                                                         use it to define the output of all assertions, errors, exception infos
46 //      2)  LOGFILE_ASSERTIONS                                              use it to define the file name to log assertions if LOGTYPE=LOGTYPE_FILE...
47 //      3)  LOGFILE_WARNINGS                                                use it to define the file name to log warnings if LOGTYPE=LOGTYPE_FILE...
48 //
49 //      active for "non product":
50 //
51 //      4)  LOG_ASSERT( BCONDITION, STEXT )                                 assert some critical errors wich depend from given condition
52 //      4a) LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )                       same like 4) + additional location of error
53 //      5)  LOG_ERROR( SMETHOD, STEXT )                                     show errors without any condition
54 //
55 //      active for debug only!
56 //
57 //      6)  LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE )        show/log an exception for easier debug
58 //      7)  LOG_WARNING( SMETHOD, STEXT )                                   should be used to detect leaks in algorithm, mechanism or operation handling
59 //*****************************************************************************************************************
60 
61 //_________________________________________________________________________________________________________________
62 #if defined( ENABLE_ASSERTIONS ) || defined( ENABLE_WARNINGS )
63 
64     /*_____________________________________________________________________________________________________________
65         LOGFILE_ASSERTIONS
66 
67         For follow macros we need a special log file. If user forget to specify anyone, we must do it for him!
68     _____________________________________________________________________________________________________________*/
69 
70     #ifndef LOGFILE_ASSERTIONS
71         #define LOGFILE_ASSERTIONS  "_framework_assertions.log"
72     #endif
73 
74     /*_____________________________________________________________________________________________________________
75         LOG_ASSERT ( BCONDITION, STEXT )
76         LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )
77 
78         Forward assertion to logfile (if condition is sal_False - like a DBG_ASSERT!) and continue with program.
79         Set LOGTYPE to LOGTYPE_FILECONTINUE to do this.
80         BCONDITION is inserted in "(...)" because user can call this macro with an complex expression!
81     _____________________________________________________________________________________________________________*/
82     #if LOGTYPE==LOGTYPE_FILECONTINUE
83 
84         #define LOG_ASSERT( BCONDITION, STEXT )                                                                 \
85                     if ( ( BCONDITION ) == sal_False )                                                          \
86                     {                                                                                           \
87                         WRITE_LOGFILE( LOGFILE_ASSERTIONS, STEXT )                                              \
88                     }
89 
90         #define LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )                                                       \
91                     if ( ( BCONDITION ) == sal_True )                                                           \
92                     {                                                                                           \
93                         ::rtl::OStringBuffer _sAssertBuffer( 256 );                                             \
94                         _sAssertBuffer.append( "ASSERT:\n\t"    );                                              \
95                         _sAssertBuffer.append( SMETHOD          );                                              \
96                         _sAssertBuffer.append( "\n\t\""         );                                              \
97                         _sAssertBuffer.append( STEXT            );                                              \
98                         _sAssertBuffer.append( "\"\n"           );                                              \
99                         WRITE_LOGFILE( LOGFILE_ASSERTIONS, _sAssertBuffer.makeStringAndClear() )                \
100                     }
101 
102     #endif
103 
104     /*_____________________________________________________________________________________________________________
105         LOG_ASSERT ( BCONDITION, STEXT )
106         LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )
107 
108         Forward assertion to file and exit the program.
109         Set LOGTYPE to LOGTYPE_FILEEXIT to do this.
110         BCONDITION is inserted in "(...)" because user can call this macro with an complex expression!
111     _____________________________________________________________________________________________________________*/
112     #if LOGTYPE==LOGTYPE_FILEEXIT
113 
114         #define LOG_ASSERT( BCONDITION, STEXT )                                                                 \
115                     if ( ( BCONDITION ) == sal_False )                                                          \
116                     {                                                                                           \
117                         WRITE_LOGFILE( LOGFILE_ASSERTIONS, STEXT )                                              \
118                         exit(-1);                                                                               \
119                     }
120 
121         #define LOG_ASSERT2( BCONDITION, SMETHODE, STEXT )                                                      \
122                     if ( ( BCONDITION ) == sal_True )                                                           \
123                     {                                                                                           \
124                         ::rtl::OStringBuffer _sAssertBuffer( 256 );                                             \
125                         _sAssertBuffer.append( "ASSERT:\n\t"    );                                              \
126                         _sAssertBuffer.append( SMETHOD          );                                              \
127                         _sAssertBuffer.append( "\n\t\""         );                                              \
128                         _sAssertBuffer.append( STEXT            );                                              \
129                         _sAssertBuffer.append( "\"\n"           );                                              \
130                         WRITE_LOGFILE( LOGFILE_ASSERTIONS, _sAssertBuffer.makeStringAndClear() )                \
131                         exit(-1);                                                                               \
132                     }
133 
134     #endif
135 
136     /*_____________________________________________________________________________________________________________
137         LOG_ASSERT ( BCONDITION, STEXT )
138         LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )
139 
140         Forward assertions to messagebox. (We use OSL_ENSURE to do this.)
141         Set LOGTYPE to LOGTYPE_MESSAGEBOX to do this.
142         BCONDITION is inserted in "(...)" because user can call this macro with an complex expression!
143     _____________________________________________________________________________________________________________*/
144     #if LOGTYPE==LOGTYPE_MESSAGEBOX
145 
146         #define LOG_ASSERT( BCONDITION, STEXT )                                                                 \
147                     OSL_ENSURE( ( BCONDITION ), STEXT );
148 
149         #define LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )                                                       \
150                     {                                                                                           \
151                         ::rtl::OStringBuffer _sAssertBuffer( 256 );                                             \
152                         _sAssertBuffer.append( "ASSERT:\n\t"    );                                              \
153                         _sAssertBuffer.append( SMETHOD          );                                              \
154                         _sAssertBuffer.append( "\n\t\""         );                                              \
155                         _sAssertBuffer.append( STEXT            );                                              \
156                         _sAssertBuffer.append( "\"\n"           );                                              \
157                         OSL_ENSURE( !( BCONDITION ), _sAssertBuffer.getStr() );                     \
158                     }
159 
160     #endif
161 
162     /*_____________________________________________________________________________________________________________
163         LOG_ERROR( SMETHOD, STEXT )
164 
165         Show an error by using current set output mode by define LOGTYPE!
166     _____________________________________________________________________________________________________________*/
167 
168     #define LOG_ERROR( SMETHOD, STEXT )                                                                         \
169                 LOG_ASSERT2( sal_True, SMETHOD, STEXT )
170 
171 #else
172 
173     // If right testmode is'nt set - implements these macros empty!
174     #undef  LOGFILE_ASSERTIONS
175     #define LOG_ASSERT( BCONDITION, STEXT )
176     #define LOG_ASSERT2( BCONDITION, SMETHOD, STEXT )
177     #define LOG_ERROR( SMETHOD, STEXT )
178 
179 #endif  // ENABLE_ASSERTIONS
180 
181 //_________________________________________________________________________________________________________________
182 #if defined( ENABLE_WARNINGS )
183 
184     /*_____________________________________________________________________________________________________________
185         LOGFILE_WARNINGS
186 
187         For follow macros we need a special log file. If user forget to specify anyone, we must do it for him!
188     _____________________________________________________________________________________________________________*/
189 
190     #ifndef LOGFILE_WARNINGS
191         #define LOGFILE_WARNINGS  "_framework_warnings.log"
192     #endif
193 
194     /*_____________________________________________________________________________________________________________
195         LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE )
196 
197         Show some exception info by using current set output mode by define LOGTYPE!
198         We use a seperated scope {} do protect us against multiple variable definitions.
199     _____________________________________________________________________________________________________________*/
200 
201     #define LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE )                                            \
202                 {                                                                                               \
203                     ::rtl::OStringBuffer _sAssertBuffer2( 256 );                                                \
204                     _sAssertBuffer2.append( SOWNMESSAGE             );                                          \
205                     _sAssertBuffer2.append( "\n"                    );                                          \
206                     _sAssertBuffer2.append( U2B(SEXCEPTIONMESSAGE)  );                                          \
207                     LOG_ERROR( SMETHOD, _sAssertBuffer2.makeStringAndClear() )                                  \
208                 }
209 
210     /*_____________________________________________________________________________________________________________
211         LOG_WARNING( SMETHOD, STEXT )
212 
213         Use it to show/log warnings for programmer for follow reasons:
214             - algorithm errors
215             - undefined states
216             - unknown errors from other modules ...
217     _____________________________________________________________________________________________________________*/
218 
219     #define LOG_WARNING( SMETHOD, STEXT )                                                                       \
220                 LOG_ERROR( SMETHOD, STEXT )
221 
222 #else
223 
224     // If right testmode is'nt set - implements these macros empty!
225     #undef  LOGFILE_WARNINGS
226     #define LOG_EXCEPTION( SMETHOD, SOWNMESSAGE, SEXCEPTIONMESSAGE )
227     #define LOG_WARNING( SMETHOD, STEXT )
228 
229 #endif  // ENABLE_WARNINGS
230 
231 #endif  // #ifndef __FRAMEWORK_MACROS_DEBUG_ASSERTION_HXX_
232