]> git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/tests/unit/CMakeLists.txt
import quincy beta 17.1.0
[ceph.git] / ceph / src / seastar / tests / unit / CMakeLists.txt
1 #
2 # This file is open source software, licensed to you under the terms
3 # of the Apache License, Version 2.0 (the "License"). See the NOTICE file
4 # distributed with this work for additional information regarding copyright
5 # ownership. You may not use this file except in compliance with the License.
6 #
7 # You may obtain a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing,
12 # software distributed under the License is distributed on an
13 # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 # KIND, either express or implied. See the License for the
15 # specific language governing permissions and limitations
16 # under the License.
17 #
18
19 #
20 # Copyright (C) 2018 Scylladb, Ltd.
21 #
22
23 # Logical target for all unit tests.
24 add_custom_target (unit_tests)
25
26 set (Seastar_UNIT_TEST_SMP
27 2
28 CACHE
29 STRING
30 "Run unit tests with this many cores.")
31
32 #
33 # Define a new unit test with the given name.
34 #
35 # seastar_add_test (name
36 # [KIND {SEASTAR,BOOST,CUSTOM}]
37 # [SOURCES source1 source2 ... sourcen]
38 # [WORKING_DIRECTORY dir]
39 # [LIBRARIES library1 library2 ... libraryn]
40 # [RUN_ARGS arg1 arg2 ... argn])
41 #
42 # There are three kinds of test we support (the KIND parameter):
43 #
44 # - SEASTAR: Unit tests which use macros like `SEASTAR_TEST_CASE`
45 # - BOOST: Unit tests which use macros like `BOOST_AUTO_TEST_CASE`
46 # - CUSTOM: Custom tests which need to be specified
47 #
48 # SEASTAR and BOOST tests will have their output saved for interpretation by the Jenkins continuous integration service
49 # if this is configured for the build.
50 #
51 # KIND can be omitted, in which case it is assumed to be SEASTAR.
52 #
53 # If SOURCES is provided, then the test files are first compiled into an executable which has the same name as the test
54 # but with a suffix ("_test").
55 #
56 # WORKING_DIRECTORY can be optionally provided to choose where the test is executed.
57 #
58 # If LIBRARIES is provided along with SOURCES, then the executable is additionally linked with these libraries.
59 #
60 # RUN_ARGS are optional additional arguments to pass to the executable. For SEASTAR tests, these come after `--`. For
61 # CUSTOM tests with no SOURCES, this parameter can be used to specify the executable name as well as its arguments since
62 # no executable is compiled.
63 #
64 function (seastar_add_test name)
65 set (test_kinds
66 SEASTAR
67 BOOST
68 CUSTOM)
69
70 cmake_parse_arguments (parsed_args
71 ""
72 "WORKING_DIRECTORY;KIND"
73 "RUN_ARGS;SOURCES;LIBRARIES;DEPENDS"
74 ${ARGN})
75
76 if (NOT parsed_args_KIND)
77 set (parsed_args_KIND SEASTAR)
78 elseif (NOT (parsed_args_KIND IN_LIST test_kinds))
79 message (FATAL_ERROR "Invalid test kind. KIND must be one of ${test_kinds}")
80 endif ()
81
82 if (parsed_args_SOURCES)
83 # These may be unused.
84 seastar_jenkins_arguments (${name} jenkins_args)
85
86 #
87 # Each kind of test must populate the `args` and `libraries` lists.
88 #
89
90 set (libraries "${parsed_args_LIBRARIES}")
91
92 set (args "")
93 if (parsed_args_KIND STREQUAL "SEASTAR")
94 list (APPEND libraries
95 seastar_testing
96 seastar_private)
97
98 if (NOT (Seastar_JENKINS STREQUAL ""))
99 list (APPEND args ${jenkins_args})
100 endif ()
101
102 list (APPEND args -- -c ${Seastar_UNIT_TEST_SMP})
103 elseif (parsed_args_KIND STREQUAL "BOOST")
104 list (APPEND libraries
105 Boost::unit_test_framework
106 seastar_private)
107
108 if (NOT (Seastar_JENKINS STREQUAL ""))
109 list (APPEND args ${jenkins_args})
110 endif ()
111 endif ()
112
113 list (APPEND args ${parsed_args_RUN_ARGS})
114
115 set (executable_target test_unit_${name})
116 add_executable (${executable_target} ${parsed_args_SOURCES})
117
118 target_link_libraries (${executable_target}
119 PRIVATE ${libraries})
120
121 target_compile_definitions (${executable_target}
122 PRIVATE SEASTAR_TESTING_MAIN)
123
124 if ((Seastar_STACK_GUARDS STREQUAL "ON") OR
125 ((Seastar_STACK_GUARDS STREQUAL "DEFAULT") AND
126 (CMAKE_BUILD_TYPE IN_LIST Seastar_STACK_GUARD_MODES)))
127 target_compile_definitions (${executable_target}
128 PRIVATE
129 SEASTAR_THREAD_STACK_GUARDS)
130 endif ()
131
132 target_include_directories (${executable_target}
133 PRIVATE
134 ${CMAKE_CURRENT_SOURCE_DIR}
135 ${Seastar_SOURCE_DIR}/src)
136
137 set_target_properties (${executable_target}
138 PROPERTIES
139 OUTPUT_NAME ${name}_test)
140
141 add_dependencies (unit_tests ${executable_target})
142 set (forwarded_args COMMAND ${executable_target} ${args})
143 else ()
144 if (NOT (parsed_args_KIND STREQUAL "CUSTOM"))
145 message (FATAL_ERROR "SOURCES are required for ${parsed_args_KIND} tests")
146 endif ()
147
148 set (forwarded_args COMMAND ${parsed_args_RUN_ARGS})
149 endif ()
150
151 #
152 # We expect `forwarded_args` to be populated correctly at this point.
153 #
154
155 set (target test_unit_${name}_run)
156
157 if (parsed_args_WORKING_DIRECTORY)
158 list (APPEND forwarded_args WORKING_DIRECTORY ${parsed_args_WORKING_DIRECTORY})
159 endif ()
160
161 if (parsed_args_DEPENDS)
162 add_dependencies(${executable_target} ${parsed_args_DEPENDS})
163 endif()
164
165 add_custom_target (${target}
166 ${forwarded_args}
167 USES_TERMINAL)
168
169 add_test (
170 NAME Seastar.unit.${name}
171 COMMAND ${CMAKE_COMMAND} --build ${Seastar_BINARY_DIR} --target ${target})
172
173 set_tests_properties (Seastar.unit.${name}
174 PROPERTIES
175 TIMEOUT ${Seastar_TEST_TIMEOUT}
176 ENVIRONMENT "${Seastar_TEST_ENVIRONMENT}")
177 endfunction ()
178
179 #
180 # Define a new custom unit test whose entry point is a Seastar application.
181 #
182 # seastar_add_app_test (name
183 # [SOURCES source1 source2 ... sourcen]
184 # [LIBRARIES library1 library2 ... libraryn]
185 # [RUN_ARGS arg1 arg2 ... argn])
186 #
187 # These kinds of tests are structured like Seastar applications.
188 #
189 # These tests always link against `seastar_private` and are always invoked with
190 # `-c ${Seastar_UNIT_TEST_SMP}`.
191 #
192 function (seastar_add_app_test name)
193 cmake_parse_arguments (parsed_args
194 ""
195 ""
196 "RUN_ARGS;SOURCES;LIBRARIES"
197 ${ARGN})
198
199 seastar_add_test (${name}
200 KIND CUSTOM
201 SOURCES ${parsed_args_SOURCES}
202 LIBRARIES
203 seastar_private
204 ${parsed_args_LIBRARIES}
205 RUN_ARGS
206 -c ${Seastar_UNIT_TEST_SMP}
207 ${parsed_args_RUN_ARGS})
208 endfunction ()
209
210 function (prepend_each var prefix)
211 set (result "")
212
213 foreach (x ${ARGN})
214 list (APPEND result ${prefix}/${x})
215 endforeach ()
216
217 set (${var} ${result} PARENT_SCOPE)
218 endfunction ()
219
220 add_custom_target (test_unit
221 COMMAND ctest --verbose -R Seastar.unit
222 USES_TERMINAL)
223
224 seastar_add_test (abort_source
225 SOURCES abort_source_test.cc)
226
227 seastar_add_test (alloc
228 SOURCES alloc_test.cc)
229
230 if (NOT Seastar_EXECUTE_ONLY_FAST_TESTS)
231 set (allocator_test_args "")
232 else ()
233 if (CMAKE_BUILD_TYPE STREQUAL "Debug")
234 set (allocator_test_args --iterations 5)
235 else ()
236 set (allocator_test_args --time 0.1)
237 endif ()
238 endif ()
239
240 seastar_add_test (allocator
241 SOURCES allocator_test.cc
242 RUN_ARGS ${allocator_test_args})
243
244 seastar_add_app_test (alien
245 SOURCES alien_test.cc)
246
247 seastar_add_test (checked_ptr
248 SOURCES checked_ptr_test.cc)
249
250 seastar_add_test (chunked_fifo
251 SOURCES chunked_fifo_test.cc)
252
253 seastar_add_test (chunk_parsers
254 SOURCES chunk_parsers_test.cc)
255
256 seastar_add_test (circular_buffer
257 SOURCES circular_buffer_test.cc)
258
259 seastar_add_test (circular_buffer_fixed_capacity
260 SOURCES circular_buffer_fixed_capacity_test.cc)
261
262 seastar_add_test (connect
263 SOURCES connect_test.cc)
264
265 seastar_add_test (content_source
266 SOURCES content_source_test.cc)
267
268 seastar_add_test (coroutines
269 SOURCES coroutines_test.cc)
270
271 seastar_add_test (defer
272 SOURCES defer_test.cc)
273
274 seastar_add_test (deleter
275 SOURCES deleter_test.cc)
276
277 seastar_add_app_test (directory
278 SOURCES directory_test.cc)
279
280 seastar_add_test (distributed
281 SOURCES distributed_test.cc)
282
283 seastar_add_test (dns
284 SOURCES dns_test.cc)
285
286 seastar_add_test (execution_stage
287 SOURCES execution_stage_test.cc)
288
289 seastar_add_test (expiring_fifo
290 SOURCES expiring_fifo_test.cc)
291
292 seastar_add_test (io_queue
293 SOURCES io_queue_test.cc)
294
295 seastar_add_test (fair_queue
296 SOURCES fair_queue_test.cc)
297
298 seastar_add_test (file_io
299 SOURCES file_io_test.cc)
300
301 seastar_add_test (file_utils
302 SOURCES file_utils_test.cc)
303
304 seastar_add_test (foreign_ptr
305 SOURCES foreign_ptr_test.cc)
306
307 seastar_add_test (fsnotifier
308 SOURCES fsnotifier_test.cc)
309
310 seastar_add_test (fstream
311 SOURCES
312 fstream_test.cc
313 mock_file.hh)
314
315 seastar_add_test (futures
316 SOURCES futures_test.cc)
317
318 seastar_add_test (sharded
319 SOURCES sharded_test.cc)
320
321 seastar_add_test (httpd
322 SOURCES
323 httpd_test.cc
324 loopback_socket.hh)
325
326 seastar_add_test (websocket
327 SOURCES websocket_test.cc)
328
329 seastar_add_test (ipv6
330 SOURCES ipv6_test.cc)
331
332 seastar_add_test (network_interface
333 SOURCES network_interface_test.cc)
334
335 seastar_add_test (json_formatter
336 SOURCES json_formatter_test.cc)
337
338 seastar_add_test (locking
339 SOURCES locking_test.cc)
340
341 seastar_add_test (lowres_clock
342 SOURCES lowres_clock_test.cc)
343
344 seastar_add_test (metrics
345 SOURCES metrics_test.cc)
346
347 seastar_add_test (net_config
348 KIND BOOST
349 SOURCES net_config_test.cc)
350
351 seastar_add_test (noncopyable_function
352 KIND BOOST
353 SOURCES noncopyable_function_test.cc)
354
355 seastar_add_test (output_stream
356 SOURCES output_stream_test.cc)
357
358 seastar_add_test (packet
359 KIND BOOST
360 SOURCES packet_test.cc)
361
362 seastar_add_test (program_options
363 KIND BOOST
364 SOURCES program_options_test.cc)
365
366 seastar_add_test (queue
367 SOURCES queue_test.cc)
368
369 seastar_add_test (request_parser
370 SOURCES request_parser_test.cc)
371
372 seastar_add_test (rpc
373 SOURCES
374 loopback_socket.hh
375 rpc_test.cc)
376
377 seastar_add_test (semaphore
378 SOURCES semaphore_test.cc)
379
380 seastar_add_test (shared_ptr
381 KIND BOOST
382 SOURCES shared_ptr_test.cc)
383
384 seastar_add_test (signal
385 SOURCES signal_test.cc)
386
387 seastar_add_test (simple_stream
388 KIND BOOST
389 SOURCES simple_stream_test.cc)
390
391 # TODO: Disabled for now. See GH-520.
392 # seastar_add_test (slab
393 # SOURCES slab_test.cc
394 # NO_SEASTAR_TESTING_LIBRARY)
395
396 seastar_add_app_test (smp
397 SOURCES smp_test.cc)
398
399 seastar_add_test (socket
400 SOURCES socket_test.cc)
401
402 seastar_add_test (sstring
403 KIND BOOST
404 SOURCES sstring_test.cc)
405
406 seastar_add_test (stall_detector
407 SOURCES stall_detector_test.cc)
408
409 seastar_add_test (stream_reader
410 SOURCES stream_reader_test.cc)
411
412 seastar_add_test (thread
413 SOURCES thread_test.cc)
414
415 seastar_add_test (scheduling_group
416 SOURCES scheduling_group_test.cc)
417
418 seastar_add_app_test (thread_context_switch
419 SOURCES thread_context_switch_test.cc)
420
421 seastar_add_app_test (timer
422 SOURCES timer_test.cc)
423
424 seastar_add_test (uname
425 KIND BOOST
426 SOURCES uname_test.cc)
427
428 seastar_add_test (source_location
429 KIND BOOST
430 SOURCES source_location_test.cc)
431
432 function(seastar_add_certgen name)
433 cmake_parse_arguments(CERT
434 ""
435 "SUBJECT;SERVER;NAME;DOMAIN;COMMON;LOCALITY;ORG;WIDTH;STATE;COUNTRY;UNIT;EMAIL;DAYS;ALG"
436 "ALG_OPTS"
437 ${ARGN}
438 )
439
440 if (NOT CERT_SERVER)
441 execute_process(COMMAND hostname
442 RESULT_VARIABLE CERT_SERVER
443 )
444 endif()
445 if (NOT CERT_DOMAIN)
446 execute_process(COMMAND dnsdomainname
447 RESULT_VARIABLE CERT_DOMAIN
448 )
449 endif()
450 if (NOT CERT_NAME)
451 set(CERT_NAME ${CERT_SERVER})
452 endif()
453 if (NOT CERT_COUNTRY)
454 set(CERT_COUNTRY SE)
455 endif()
456 if (NOT CERT_STATE)
457 set(CERT_STATE Stockholm)
458 endif()
459 if (NOT CERT_LOCALITY)
460 set(CERT_LOCALITY ${CERT_STATE})
461 endif()
462 if (NOT CERT_ORG)
463 set(CERT_ORG ${CERT_DOMAIN})
464 endif()
465 if (NOT CERT_UNIT)
466 set(CERT_UNIT ${CERT_DOMAIN})
467 endif()
468 if (NOT CERT_COMMON)
469 set(CERT_COMMON ${CERT_SERVER}.${CERT_DOMAIN})
470 endif()
471 if (NOT CERT_EMAIL)
472 set(CERT_EMAIL postmaster@${CERT_DOMAIN})
473 endif()
474 if (NOT CERT_WIDTH)
475 set(CERT_WIDTH 4096)
476 endif()
477 if (NOT CERT_DAYS)
478 set(CERT_DAYS 3650)
479 endif()
480 if ((NOT CERT_ALG) AND (NOT CERT_ALG_OPTS))
481 set(CERT_ALG_OPTS -pkeyopt rsa_keygen_bits:${CERT_WIDTH})
482 endif()
483 if (NOT CERT_ALG)
484 set(CERT_ALG RSA)
485 endif()
486
487 set(CERT_PRIVKEY ${CERT_NAME}.key)
488 set(CERT_REQ ${CERT_NAME}.csr)
489 set(CERT_CERT ${CERT_NAME}.crt)
490
491 set(CERT_CAPRIVKEY ca${CERT_NAME}.key)
492 set(CERT_CAROOT ca${CERT_NAME}.pem)
493
494 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cert.cfg.in"
495 "${CMAKE_CURRENT_BINARY_DIR}/${CERT_NAME}.cfg"
496 )
497
498 find_program(OPENSSL openssl)
499
500 add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${CERT_PRIVKEY}"
501 COMMAND ${OPENSSL} genpkey -out ${CERT_PRIVKEY} -algorithm ${CERT_ALG} ${CERT_ALG_OPTS}
502 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
503 )
504 add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${CERT_REQ}"
505 COMMAND ${OPENSSL} req -new -key ${CERT_PRIVKEY} -out ${CERT_REQ} -config ${CERT_NAME}.cfg
506 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${CERT_PRIVKEY}"
507 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
508 )
509
510 add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${CERT_CAPRIVKEY}"
511 COMMAND ${OPENSSL} genpkey -out ${CERT_CAPRIVKEY} -algorithm ${CERT_ALG} ${CERT_ALG_OPTS}
512 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
513 )
514 add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${CERT_CAROOT}"
515 COMMAND ${OPENSSL} req -x509 -new -nodes -key ${CERT_CAPRIVKEY} -days ${CERT_DAYS} -config ${CERT_NAME}.cfg -out ${CERT_CAROOT}
516 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${CERT_CAPRIVKEY}"
517 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
518 )
519
520 add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${CERT_CERT}"
521 COMMAND ${OPENSSL} x509 -req -in ${CERT_REQ} -CA ${CERT_CAROOT} -CAkey ${CERT_CAPRIVKEY} -CAcreateserial -out ${CERT_CERT} -days ${CERT_DAYS}
522 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${CERT_REQ}" "${CMAKE_CURRENT_BINARY_DIR}/${CERT_CAROOT}"
523 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
524 )
525
526 add_custom_target(${name}
527 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${CERT_CERT}"
528 )
529 endfunction()
530
531 seastar_add_certgen(testcrt DOMAIN scylladb.org SERVER test)
532 seastar_add_certgen(othercrt DOMAIN apa.org SERVER other)
533
534 set (tls_certificate_files
535 tls-ca-bundle.pem
536 )
537
538 prepend_each (
539 in_tls_certificate_files
540 ${CMAKE_CURRENT_SOURCE_DIR}/
541 ${tls_certificate_files})
542
543 prepend_each (
544 out_tls_certificate_files
545 ${CMAKE_CURRENT_BINARY_DIR}/
546 ${tls_certificate_files})
547
548 add_custom_command (
549 DEPENDS ${in_tls_certificate_files}
550 OUTPUT ${out_tls_certificate_files}
551 COMMAND ${CMAKE_COMMAND} -E copy ${in_tls_certificate_files} ${CMAKE_CURRENT_BINARY_DIR})
552
553 add_custom_target(tls_files
554 DEPENDS ${out_tls_certificate_files}
555 )
556
557 seastar_add_test (tls
558 DEPENDS tls_files testcrt othercrt
559 SOURCES tls_test.cc
560 LIBRARIES Boost::filesystem
561 WORKING_DIRECTORY ${Seastar_BINARY_DIR})
562
563 seastar_add_test (tuple_utils
564 KIND BOOST
565 SOURCES tuple_utils_test.cc)
566
567 seastar_add_test (unix_domain
568 SOURCES unix_domain_test.cc)
569
570 seastar_add_test (unwind
571 KIND BOOST
572 SOURCES unwind_test.cc)
573
574 seastar_add_test (weak_ptr
575 KIND BOOST
576 SOURCES weak_ptr_test.cc)
577
578 seastar_add_test (log_buf
579 SOURCES log_buf_test.cc)
580
581 seastar_add_test (exception_logging
582 KIND BOOST
583 SOURCES exception_logging_test.cc)
584
585 seastar_add_test (closeable
586 SOURCES closeable_test.cc)
587
588 seastar_add_test (pipe
589 SOURCES pipe_test.cc)