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.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
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
20 # Copyright (C) 2018 Scylladb, Ltd.
23 # Logical target for all unit tests.
24 add_custom_target (unit_tests)
26 set (Seastar_UNIT_TEST_SMP
30 "Run unit tests with this many cores.")
33 # Define a new unit test with the given name.
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])
42 # There are three kinds of test we support (the KIND parameter):
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
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.
51 # KIND can be omitted, in which case it is assumed to be SEASTAR.
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").
56 # WORKING_DIRECTORY can be optionally provided to choose where the test is executed.
58 # If LIBRARIES is provided along with SOURCES, then the executable is additionally linked with these libraries.
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.
64 function (seastar_add_test name)
70 cmake_parse_arguments (parsed_args
72 "WORKING_DIRECTORY;KIND"
73 "RUN_ARGS;SOURCES;LIBRARIES;DEPENDS"
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}")
82 if (parsed_args_SOURCES)
83 # These may be unused.
84 seastar_jenkins_arguments (${name} jenkins_args)
87 # Each kind of test must populate the `args` and `libraries` lists.
90 set (libraries "${parsed_args_LIBRARIES}")
93 if (parsed_args_KIND STREQUAL "SEASTAR")
94 list (APPEND libraries
98 if (NOT (Seastar_JENKINS STREQUAL ""))
99 list (APPEND args ${jenkins_args})
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
108 if (NOT (Seastar_JENKINS STREQUAL ""))
109 list (APPEND args ${jenkins_args})
113 list (APPEND args ${parsed_args_RUN_ARGS})
115 set (executable_target test_unit_${name})
116 add_executable (${executable_target} ${parsed_args_SOURCES})
118 target_link_libraries (${executable_target}
119 PRIVATE ${libraries})
121 target_compile_definitions (${executable_target}
124 SEASTAR_TESTING_WITH_NETWORKING=$<BOOL:${Seastar_ENABLE_TESTS_ACCESSING_INTERNET}>)
126 if ((Seastar_STACK_GUARDS STREQUAL "ON") OR
127 ((Seastar_STACK_GUARDS STREQUAL "DEFAULT") AND
128 (CMAKE_BUILD_TYPE IN_LIST Seastar_STACK_GUARD_MODES)))
129 target_compile_definitions (${executable_target}
131 SEASTAR_THREAD_STACK_GUARDS)
134 target_include_directories (${executable_target}
136 ${CMAKE_CURRENT_SOURCE_DIR}
137 ${Seastar_SOURCE_DIR}/src)
139 set_target_properties (${executable_target}
141 OUTPUT_NAME ${name}_test)
143 add_dependencies (unit_tests ${executable_target})
144 set (forwarded_args COMMAND ${executable_target} ${args})
146 if (NOT (parsed_args_KIND STREQUAL "CUSTOM"))
147 message (FATAL_ERROR "SOURCES are required for ${parsed_args_KIND} tests")
150 set (forwarded_args COMMAND ${parsed_args_RUN_ARGS})
154 # We expect `forwarded_args` to be populated correctly at this point.
157 set (target test_unit_${name}_run)
159 if (parsed_args_WORKING_DIRECTORY)
160 list (APPEND forwarded_args WORKING_DIRECTORY ${parsed_args_WORKING_DIRECTORY})
163 if (parsed_args_DEPENDS)
164 add_dependencies(${executable_target} ${parsed_args_DEPENDS})
167 add_custom_target (${target}
172 NAME Seastar.unit.${name}
173 COMMAND ${CMAKE_COMMAND} --build ${Seastar_BINARY_DIR} --target ${target})
175 set_tests_properties (Seastar.unit.${name}
177 TIMEOUT ${Seastar_TEST_TIMEOUT}
178 ENVIRONMENT "${Seastar_TEST_ENVIRONMENT}")
182 # Define a new custom unit test whose entry point is a Seastar application.
184 # seastar_add_app_test (name
185 # [SOURCES source1 source2 ... sourcen]
186 # [LIBRARIES library1 library2 ... libraryn]
187 # [RUN_ARGS arg1 arg2 ... argn])
189 # These kinds of tests are structured like Seastar applications.
191 # These tests always link against `seastar_private` and are always invoked with
192 # `-c ${Seastar_UNIT_TEST_SMP}`.
194 function (seastar_add_app_test name)
195 cmake_parse_arguments (parsed_args
198 "RUN_ARGS;SOURCES;LIBRARIES"
201 seastar_add_test (${name}
203 SOURCES ${parsed_args_SOURCES}
206 ${parsed_args_LIBRARIES}
208 -c ${Seastar_UNIT_TEST_SMP}
209 ${parsed_args_RUN_ARGS})
212 function (prepend_each var prefix)
216 list (APPEND result ${prefix}/${x})
219 set (${var} ${result} PARENT_SCOPE)
222 add_custom_target (test_unit
223 COMMAND ctest --verbose -R Seastar.unit
226 seastar_add_test (abort_source
227 SOURCES abort_source_test.cc)
229 seastar_add_test (alloc
230 SOURCES alloc_test.cc)
232 if (NOT Seastar_EXECUTE_ONLY_FAST_TESTS)
233 set (allocator_test_args "")
235 if (CMAKE_BUILD_TYPE STREQUAL "Debug")
236 set (allocator_test_args --iterations 5)
238 set (allocator_test_args --time 0.1)
242 seastar_add_test (allocator
243 SOURCES allocator_test.cc
244 RUN_ARGS ${allocator_test_args})
246 seastar_add_app_test (alien
247 SOURCES alien_test.cc)
249 seastar_add_test (checked_ptr
250 SOURCES checked_ptr_test.cc)
252 seastar_add_test (chunked_fifo
253 SOURCES chunked_fifo_test.cc)
255 seastar_add_test (chunk_parsers
256 SOURCES chunk_parsers_test.cc)
258 seastar_add_test (circular_buffer
259 SOURCES circular_buffer_test.cc)
261 seastar_add_test (circular_buffer_fixed_capacity
262 SOURCES circular_buffer_fixed_capacity_test.cc)
264 seastar_add_test (condition_variable
265 SOURCES condition_variable_test.cc)
267 seastar_add_test (connect
268 SOURCES connect_test.cc)
270 seastar_add_test (content_source
271 SOURCES content_source_test.cc)
273 seastar_add_test (coroutines
274 SOURCES coroutines_test.cc)
276 seastar_add_test (defer
277 SOURCES defer_test.cc)
279 seastar_add_test (deleter
280 SOURCES deleter_test.cc)
282 seastar_add_app_test (directory
283 SOURCES directory_test.cc)
285 seastar_add_test (distributed
286 SOURCES distributed_test.cc)
288 seastar_add_test (dns
291 seastar_add_test (execution_stage
292 SOURCES execution_stage_test.cc)
294 seastar_add_test (expiring_fifo
295 SOURCES expiring_fifo_test.cc)
297 seastar_add_test (abortable_fifo
298 SOURCES abortable_fifo_test.cc)
300 seastar_add_test (io_queue
301 SOURCES io_queue_test.cc)
303 seastar_add_test (fair_queue
304 SOURCES fair_queue_test.cc)
306 seastar_add_test (file_io
307 SOURCES file_io_test.cc)
309 seastar_add_test (file_utils
310 SOURCES file_utils_test.cc)
312 seastar_add_test (foreign_ptr
313 SOURCES foreign_ptr_test.cc)
315 seastar_add_test (fsnotifier
316 SOURCES fsnotifier_test.cc)
318 seastar_add_test (fstream
323 seastar_add_test (futures
324 SOURCES futures_test.cc)
326 seastar_add_test (sharded
327 SOURCES sharded_test.cc)
329 seastar_add_test (httpd
334 seastar_add_test (websocket
335 SOURCES websocket_test.cc)
337 seastar_add_test (ipv6
338 SOURCES ipv6_test.cc)
340 seastar_add_test (network_interface
341 SOURCES network_interface_test.cc)
343 seastar_add_test (json_formatter
344 SOURCES json_formatter_test.cc)
346 seastar_add_test (locking
347 SOURCES locking_test.cc)
349 seastar_add_test (lowres_clock
350 SOURCES lowres_clock_test.cc)
352 seastar_add_test (metrics
353 SOURCES metrics_test.cc)
355 seastar_add_test (net_config
357 SOURCES net_config_test.cc)
359 seastar_add_test (noncopyable_function
361 SOURCES noncopyable_function_test.cc)
363 seastar_add_test (output_stream
364 SOURCES output_stream_test.cc)
366 seastar_add_test (packet
368 SOURCES packet_test.cc)
370 seastar_add_test (program_options
372 SOURCES program_options_test.cc)
374 seastar_add_test (queue
375 SOURCES queue_test.cc)
377 seastar_add_test (request_parser
378 SOURCES request_parser_test.cc)
380 seastar_add_test (rpc
385 seastar_add_test (semaphore
386 SOURCES semaphore_test.cc)
388 seastar_add_test (shared_ptr
390 SOURCES shared_ptr_test.cc)
392 seastar_add_test (signal
393 SOURCES signal_test.cc)
395 seastar_add_test (simple_stream
397 SOURCES simple_stream_test.cc)
399 # TODO: Disabled for now. See GH-520.
400 # seastar_add_test (slab
401 # SOURCES slab_test.cc
402 # NO_SEASTAR_TESTING_LIBRARY)
404 seastar_add_app_test (smp
407 seastar_add_test (socket
408 SOURCES socket_test.cc)
410 seastar_add_test (sstring
412 SOURCES sstring_test.cc)
414 seastar_add_test (stall_detector
415 SOURCES stall_detector_test.cc)
417 seastar_add_test (stream_reader
418 SOURCES stream_reader_test.cc)
420 seastar_add_test (thread
421 SOURCES thread_test.cc
422 LIBRARIES Valgrind::valgrind)
424 seastar_add_test (scheduling_group
425 SOURCES scheduling_group_test.cc)
427 seastar_add_app_test (thread_context_switch
428 SOURCES thread_context_switch_test.cc)
430 seastar_add_app_test (timer
431 SOURCES timer_test.cc)
433 seastar_add_test (uname
435 SOURCES uname_test.cc)
437 seastar_add_test (source_location
439 SOURCES source_location_test.cc)
441 seastar_add_test (shared_token_bucket
442 SOURCES shared_token_bucket_test.cc)
444 function(seastar_add_certgen name)
445 cmake_parse_arguments(CERT
447 "SUBJECT;SERVER;NAME;DOMAIN;COMMON;LOCALITY;ORG;WIDTH;STATE;COUNTRY;UNIT;EMAIL;DAYS;ALG"
453 execute_process(COMMAND hostname
454 RESULT_VARIABLE CERT_SERVER
458 execute_process(COMMAND dnsdomainname
459 RESULT_VARIABLE CERT_DOMAIN
463 set(CERT_NAME ${CERT_SERVER})
465 if (NOT CERT_COUNTRY)
469 set(CERT_STATE Stockholm)
471 if (NOT CERT_LOCALITY)
472 set(CERT_LOCALITY ${CERT_STATE})
475 set(CERT_ORG ${CERT_DOMAIN})
478 set(CERT_UNIT ${CERT_DOMAIN})
481 set(CERT_COMMON ${CERT_SERVER}.${CERT_DOMAIN})
484 set(CERT_EMAIL postmaster@${CERT_DOMAIN})
492 if ((NOT CERT_ALG) AND (NOT CERT_ALG_OPTS))
493 set(CERT_ALG_OPTS -pkeyopt rsa_keygen_bits:${CERT_WIDTH})
499 set(CERT_PRIVKEY ${CERT_NAME}.key)
500 set(CERT_REQ ${CERT_NAME}.csr)
501 set(CERT_CERT ${CERT_NAME}.crt)
503 set(CERT_CAPRIVKEY ca${CERT_NAME}.key)
504 set(CERT_CAROOT ca${CERT_NAME}.pem)
506 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cert.cfg.in"
507 "${CMAKE_CURRENT_BINARY_DIR}/${CERT_NAME}.cfg"
510 find_program(OPENSSL openssl)
512 add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${CERT_PRIVKEY}"
513 COMMAND ${OPENSSL} genpkey -quiet -out ${CERT_PRIVKEY} -algorithm ${CERT_ALG} ${CERT_ALG_OPTS}
514 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
516 add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${CERT_REQ}"
517 COMMAND ${OPENSSL} req -new -key ${CERT_PRIVKEY} -out ${CERT_REQ} -config ${CERT_NAME}.cfg
518 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${CERT_PRIVKEY}"
519 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
522 add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${CERT_CAPRIVKEY}"
523 COMMAND ${OPENSSL} genpkey -quiet -out ${CERT_CAPRIVKEY} -algorithm ${CERT_ALG} ${CERT_ALG_OPTS}
524 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
526 add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${CERT_CAROOT}"
527 COMMAND ${OPENSSL} req -x509 -new -nodes -key ${CERT_CAPRIVKEY} -days ${CERT_DAYS} -config ${CERT_NAME}.cfg -out ${CERT_CAROOT}
528 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${CERT_CAPRIVKEY}"
529 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
532 add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${CERT_CERT}"
533 COMMAND ${OPENSSL} x509 -req -in ${CERT_REQ} -CA ${CERT_CAROOT} -CAkey ${CERT_CAPRIVKEY} -CAcreateserial -out ${CERT_CERT} -days ${CERT_DAYS}
534 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${CERT_REQ}" "${CMAKE_CURRENT_BINARY_DIR}/${CERT_CAROOT}"
535 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
538 add_custom_target(${name}
539 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${CERT_CERT}"
543 function(seastar_gen_mtls_certs)
544 find_program(OPENSSL openssl)
546 set(SUBJECT "/C=GB/ST=London/L=London/O=Redpanda Data/OU=Core/CN=redpanda.com")
547 set(EXTENSION "subjectAltName = IP:127.0.0.1")
548 set(CLIENT1_SUBJECT "/C=GB/ST=London/L=London/O=Redpanda Data/OU=Core/CN=client1.org")
549 set(CLIENT2_SUBJECT "/C=GB/ST=London/L=London/O=Redpanda Data/OU=Core/CN=client2.org")
551 add_custom_command(OUTPUT mtls_ca.key
552 COMMAND ${OPENSSL} ecparam -name prime256v1 -genkey -noout -out mtls_ca.key
553 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
555 add_custom_command(OUTPUT mtls_ca.crt
556 COMMAND ${OPENSSL} req -new -x509 -sha256 -key mtls_ca.key -out mtls_ca.crt -subj ${SUBJECT} -addext ${EXTENSION}
558 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
560 # server certificates
561 add_custom_command(OUTPUT mtls_server.key
562 COMMAND ${OPENSSL} ecparam -name prime256v1 -genkey -noout -out mtls_server.key
563 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
565 add_custom_command(OUTPUT mtls_server.csr
566 COMMAND ${OPENSSL} req -new -sha256 -key mtls_server.key -out mtls_server.csr -subj ${SUBJECT}
567 DEPENDS mtls_server.key
568 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
570 add_custom_command(OUTPUT mtls_server.crt
571 COMMAND ${OPENSSL} x509 -req -in mtls_server.csr -CA mtls_ca.crt -CAkey mtls_ca.key -CAcreateserial -out mtls_server.crt -days 1000 -sha256
572 DEPENDS mtls_server.csr mtls_ca.crt mtls_ca.key
573 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
575 # client1 certificates
576 add_custom_command(OUTPUT mtls_client1.key
577 COMMAND ${OPENSSL} ecparam -name prime256v1 -genkey -noout -out mtls_client1.key
578 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
580 add_custom_command(OUTPUT mtls_client1.csr
581 COMMAND ${OPENSSL} req -new -sha256 -key mtls_client1.key -out mtls_client1.csr -subj ${CLIENT1_SUBJECT}
582 DEPENDS mtls_client1.key
583 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
585 add_custom_command(OUTPUT mtls_client1.crt
586 COMMAND ${OPENSSL} x509 -req -in mtls_client1.csr -CA mtls_ca.crt -CAkey mtls_ca.key -CAcreateserial -out mtls_client1.crt -days 1000 -sha256
587 DEPENDS mtls_client1.csr mtls_ca.crt mtls_ca.key
588 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
590 # client2 certificates
591 add_custom_command(OUTPUT mtls_client2.key
592 COMMAND ${OPENSSL} ecparam -name prime256v1 -genkey -noout -out mtls_client2.key
593 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
595 add_custom_command(OUTPUT mtls_client2.csr
596 COMMAND ${OPENSSL} req -new -sha256 -key mtls_client2.key -out mtls_client2.csr -subj ${CLIENT2_SUBJECT}
597 DEPENDS mtls_client2.key
598 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
600 add_custom_command(OUTPUT mtls_client2.crt
601 COMMAND ${OPENSSL} x509 -req -in mtls_client2.csr -CA mtls_ca.crt -CAkey mtls_ca.key -CAcreateserial -out mtls_client2.crt -days 1000 -sha256
602 DEPENDS mtls_client2.csr mtls_ca.crt mtls_ca.key
603 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
606 add_custom_target(mtls_certs
607 DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/mtls_client1.crt" "${CMAKE_CURRENT_BINARY_DIR}/mtls_client2.crt" "${CMAKE_CURRENT_BINARY_DIR}/mtls_server.crt"
611 seastar_add_certgen(testcrt DOMAIN scylladb.org SERVER test)
612 seastar_add_certgen(othercrt DOMAIN apa.org SERVER other)
613 seastar_gen_mtls_certs()
615 set (tls_certificate_files
620 in_tls_certificate_files
621 ${CMAKE_CURRENT_SOURCE_DIR}/
622 ${tls_certificate_files})
625 out_tls_certificate_files
626 ${CMAKE_CURRENT_BINARY_DIR}/
627 ${tls_certificate_files})
630 DEPENDS ${in_tls_certificate_files}
631 OUTPUT ${out_tls_certificate_files}
632 COMMAND ${CMAKE_COMMAND} -E copy ${in_tls_certificate_files} ${CMAKE_CURRENT_BINARY_DIR})
634 add_custom_target(tls_files
635 DEPENDS ${out_tls_certificate_files}
639 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/https-server.py
640 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/https-server.py
641 COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/https-server.py ${CMAKE_CURRENT_BINARY_DIR})
643 add_custom_target (https_server
644 DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/https-server.py)
646 seastar_add_test (tls
647 DEPENDS tls_files testcrt othercrt mtls_certs https_server
649 LIBRARIES Boost::filesystem
650 WORKING_DIRECTORY ${Seastar_BINARY_DIR})
652 seastar_add_test (tuple_utils
654 SOURCES tuple_utils_test.cc)
656 seastar_add_test (unix_domain
657 SOURCES unix_domain_test.cc)
659 seastar_add_test (unwind
661 SOURCES unwind_test.cc)
663 seastar_add_test (weak_ptr
665 SOURCES weak_ptr_test.cc)
667 seastar_add_test (log_buf
668 SOURCES log_buf_test.cc)
670 seastar_add_test (exception_logging
672 SOURCES exception_logging_test.cc)
674 seastar_add_test (closeable
675 SOURCES closeable_test.cc)
677 seastar_add_test (pipe
678 SOURCES pipe_test.cc)
680 seastar_add_test (spawn
681 SOURCES spawn_test.cc)