1#!/usr/bin/perl -w 2 3#-- Pragmas -------------------------------------------------------------------- 4 5use 5.010; 6use strict; 7use warnings; 8 9use lib qw( 10 lib 11 t/lib 12 ../lib 13); 14 15# ENVIRONMENT ------------------------------------------------------------------ 16 17use Test::More; 18 19#-- verify load the module 20 21BEGIN { 22 eval 'use Test::NoWarnings'; ## no critic 23 plan skip_all => 'because Test::NoWarnings required for testing' if $@; 24} 25 26plan 'no_plan'; 27 28#-- load the modules ----------------------------------------------------------- 29 30use Kafka qw ( 31 $BITS64 32); 33 34#-- setting up facilities ------------------------------------------------------ 35 36our %ordinary; 37 38BEGIN { 39 40 unless ( $BITS64 ) { 41 our ( $constants_Kafka_Int64, $functions_Kafka_Int64 ); 42 $ordinary{ 'Kafka::Int64' } = [ $constants_Kafka_Int64, $functions_Kafka_Int64 ]; 43 44 # Kafka::Int64 45 46 $constants_Kafka_Int64 = [ qw( 47 ) ]; 48 49 $functions_Kafka_Int64 = [ qw( 50 intsum 51 packq 52 unpackq 53 ) ]; 54 55 use_ok 'Kafka::Int64', 56 @$constants_Kafka_Int64, 57 @$functions_Kafka_Int64, 58 ; 59 } 60} 61 62 63#-- declarations --------------------------------------------------------------- 64 65#-- Global data ---------------------------------------------------------------- 66 67our ( 68 $constants_Kafka, $functions_Kafka, 69 $constants_Kafka_Internals, $functions_Kafka_Internals, 70 $constants_Kafka_TestInternals, $functions_Kafka_TestInternals, 71 $constants_Kafka_Protocol, $functions_Kafka_Protocol, 72 $constants_Kafka_MockProtocol, $functions_Kafka_MockProtocol, 73 74 $ours_Kafka_IO, $methods_Kafka_IO, 75 $ours_Kafka_MockIO, $methods_Kafka_MockIO, 76 $ours_Kafka_Connection, $methods_Kafka_Connection, 77 $ours_Kafka_Message, $methods_Kafka_Message, 78 $ours_Kafka_Consumer, $methods_Kafka_Consumer, 79 $ours_Kafka_Producer, $methods_Kafka_Producer, 80 $ours_Kafka_Cluster, $methods_Kafka_Cluster, 81); 82 83$ordinary{ 'Kafka' } = [ $constants_Kafka, $functions_Kafka ]; 84$ordinary{ 'Kafka::Internals' } = [ $constants_Kafka_Internals, $functions_Kafka_Internals ]; 85$ordinary{ 'Kafka::TestInternals' } = [ $constants_Kafka_TestInternals, $functions_Kafka_TestInternals ]; 86$ordinary{ 'Kafka::Protocol' } = [ $constants_Kafka_Protocol, $functions_Kafka_Protocol ]; 87$ordinary{ 'Kafka::MockProtokol' } = [ $constants_Kafka_MockProtocol, $functions_Kafka_MockProtocol ]; 88 89my %OO = ( 90 'Kafka::IO' => [ $ours_Kafka_IO, $methods_Kafka_IO ], 91 'Kafka::MockIO' => [ $ours_Kafka_MockIO, $methods_Kafka_MockIO ], 92 'Kafka::Connection' => [ $ours_Kafka_Connection, $methods_Kafka_Connection ], 93 'Kafka::Message' => [ $ours_Kafka_Message, $methods_Kafka_Message ], 94 'Kafka::Consumer' => [ $ours_Kafka_Consumer, $methods_Kafka_Consumer ], 95 'Kafka::Producer' => [ $ours_Kafka_Producer, $methods_Kafka_Producer ], 96 'Kafka::Cluster' => [ $ours_Kafka_Cluster, $methods_Kafka_Cluster ], 97); 98 99# INSTRUCTIONS ----------------------------------------------------------------- 100 101#-- verify load the module 102 103# Kafka 104 105BEGIN { 106 $constants_Kafka = [ qw( 107 $BITS64 108 $BLOCK_UNTIL_IS_COMMITTED 109 $COMPRESSION_GZIP 110 $COMPRESSION_NONE 111 $COMPRESSION_SNAPPY 112 $DEFAULT_MAX_BYTES 113 $DEFAULT_MAX_NUMBER_OF_OFFSETS 114 $DEFAULT_MAX_WAIT_TIME 115 %ERROR 116 $ERROR_BROKER_NOT_AVAILABLE 117 $ERROR_CANNOT_BIND 118 $ERROR_CANNOT_GET_METADATA 119 $ERROR_CANNOT_RECV 120 $ERROR_CANNOT_SEND 121 $ERROR_METADATA_ATTRIBUTES 122 $ERROR_LEADER_NOT_FOUND 123 $ERROR_INVALID_MESSAGE 124 $ERROR_INVALID_MESSAGE_SIZE 125 $ERROR_LEADER_NOT_AVAILABLE 126 $ERROR_MESSAGE_SIZE_TOO_LARGE 127 $ERROR_MISMATCH_ARGUMENT 128 $ERROR_MISMATCH_CORRELATIONID 129 $ERROR_SEND_NO_ACK 130 $ERROR_NO_ERROR 131 $ERROR_NO_KNOWN_BROKERS 132 $ERROR_NOT_BINARY_STRING 133 $ERROR_NOT_LEADER_FOR_PARTITION 134 $ERROR_OFFSET_METADATA_TOO_LARGE_CODE 135 $ERROR_OFFSET_OUT_OF_RANGE 136 $ERROR_PARTITION_DOES_NOT_MATCH 137 $ERROR_REPLICA_NOT_AVAILABLE 138 $ERROR_REQUEST_OR_RESPONSE 139 $ERROR_REQUEST_TIMED_OUT 140 $ERROR_RESPOSEMESSAGE_NOT_RECEIVED 141 $ERROR_SEND_NO_ACK 142 $ERROR_STALE_CONTROLLER_EPOCH_CODE 143 $ERROR_TOPIC_DOES_NOT_MATCH 144 $ERROR_UNKNOWN 145 $ERROR_UNKNOWN_APIKEY 146 $ERROR_UNKNOWN_TOPIC_OR_PARTITION 147 $KAFKA_SERVER_PORT 148 $MIN_BYTES_RESPOND_HAS_DATA 149 $MIN_BYTES_RESPOND_IMMEDIATELY 150 $NOT_SEND_ANY_RESPONSE 151 $RECEIVE_EARLIEST_OFFSETS 152 $RECEIVE_LATEST_OFFSET 153 $RECEIVE_MAX_ATTEMPTS 154 $REQUEST_TIMEOUT 155 $RETRY_BACKOFF 156 $SEND_MAX_ATTEMPTS 157 $WAIT_WRITTEN_TO_LOCAL_LOG 158 ) ]; 159 160 $functions_Kafka = [ qw( 161 ) ]; 162 163 use_ok 'Kafka', 164 @$constants_Kafka, 165 @$functions_Kafka, 166 ; 167} 168 169# Kafka::Internals 170 171BEGIN { 172 $constants_Kafka_Internals = [ qw( 173 $APIKEY_PRODUCE 174 $APIKEY_FETCH 175 $APIKEY_OFFSET 176 $APIKEY_METADATA 177 $MAX_CORRELATIONID 178 $MAX_INT16 179 $MAX_INT32 180 $MAX_SOCKET_REQUEST_BYTES 181 $PRODUCER_ANY_OFFSET 182 ) ]; 183 184 $functions_Kafka_Internals = [ qw( 185 _get_CorrelationId 186 _isbig 187 ) ]; 188 189 use_ok 'Kafka::Internals', 190 @$constants_Kafka_Internals, 191 @$functions_Kafka_Internals, 192 ; 193} 194 195# Kafka::TestInternals 196 197BEGIN { 198 $constants_Kafka_TestInternals = [ qw( 199 @not_array 200 @not_array0 201 @not_empty_string 202 @not_hash 203 @not_is_like_server_list 204 @not_isint 205 @not_nonnegint 206 @not_number 207 @not_posint 208 @not_posnumber 209 @not_right_object 210 @not_string 211 @not_string_array 212 @not_topics_array 213 $topic 214 ) ]; 215 216 $functions_Kafka_TestInternals = [ qw( 217 _is_suitable_int 218 ) ]; 219 220 use_ok 'Kafka::TestInternals', 221 @$constants_Kafka_TestInternals, 222 @$functions_Kafka_TestInternals, 223 ; 224} 225 226# Kafka::Protocol 227 228BEGIN { 229 $constants_Kafka_Protocol = [ qw( 230 $APIVERSION 231 $BAD_OFFSET 232 $COMPRESSION_CODEC_MASK 233 $CONSUMERS_REPLICAID 234 $NULL_BYTES_LENGTH 235 $_int64_template 236 ) ]; 237 238 $functions_Kafka_Protocol = [ qw( 239 decode_fetch_response 240 decode_metadata_response 241 decode_offset_response 242 decode_produce_response 243 encode_fetch_request 244 encode_metadata_request 245 encode_offset_request 246 encode_produce_request 247 _decode_MessageSet_template 248 _decode_MessageSet_array 249 _encode_MessageSet_array 250 _encode_string 251 _pack64 252 _unpack64 253 ) ]; 254 255 use_ok 'Kafka::Protocol', 256 @$constants_Kafka_Protocol, 257 @$functions_Kafka_Protocol, 258 ; 259} 260 261# Kafka::MockProtocol 262 263BEGIN { 264 $constants_Kafka_MockProtocol = [ qw( 265 ) ]; 266 267 $functions_Kafka_MockProtocol = [ qw( 268 decode_fetch_request 269 decode_metadata_request 270 decode_offset_request 271 decode_produce_request 272 encode_fetch_response 273 encode_metadata_response 274 encode_offset_response 275 encode_produce_response 276 ) ]; 277 278 use_ok 'Kafka::MockProtocol', 279 @$constants_Kafka_MockProtocol, 280 @$functions_Kafka_MockProtocol, 281 ; 282} 283 284# Kafka::IO 285 286BEGIN { 287 $ours_Kafka_IO = [ qw ( 288 DEBUG 289 _hdr 290 ) ]; 291 292 $methods_Kafka_IO = [ qw( 293 close 294 is_alive 295 new 296 receive 297 send 298 ) ]; 299 300 use_ok 'Kafka::IO'; 301} 302 303# Kafka::MockIO 304 305BEGIN { 306 $ours_Kafka_MockIO = [ qw( 307 PARTITION 308 ) ]; 309 310 $methods_Kafka_MockIO = [ qw( 311 add_special_case 312 close 313 del_special_case 314 is_alive 315 new 316 override 317 receive 318 restore 319 send 320 special_cases 321 ) ]; 322 323 use_ok 'Kafka::MockIO', 324 @$ours_Kafka_MockIO, 325 @$methods_Kafka_MockIO, 326 ; 327} 328 329# Kafka::Connection 330 331BEGIN { 332 $ours_Kafka_Connection = [ qw ( 333 DEBUG 334 RETRY_ON_ERRORS 335 ) ]; 336 337 $methods_Kafka_Connection = [ qw( 338 clear_nonfatals 339 close 340 close_connection 341 cluster_errors 342 debug_level 343 get_known_servers 344 is_server_alive 345 is_server_connected 346 is_server_known 347 new 348 nonfatal_errors 349 receive_response_to_request 350 ) ]; 351 352 use_ok 'Kafka::Connection'; 353} 354 355# Kafka::Message 356 357BEGIN { 358 $ours_Kafka_Message = [ qw ( 359 _standard_fields 360 ) ]; 361 362 $methods_Kafka_Message = [ qw( 363 Attributes 364 error 365 HighwaterMarkOffset 366 key 367 MagicByte 368 next_offset 369 payload 370 offset 371 valid 372 ) ]; 373 374 use_ok 'Kafka::Message'; 375} 376 377# Kafka::Consumer 378 379BEGIN { 380 $ours_Kafka_Consumer = [ qw ( 381 ) ]; 382 383 $methods_Kafka_Consumer = [ qw( 384 fetch 385 new 386 offsets 387 ) ]; 388 389 use_ok 'Kafka::Consumer'; 390} 391 392# Kafka::Producer 393 394BEGIN { 395 $ours_Kafka_Producer = [ qw ( 396 ) ]; 397 398 $methods_Kafka_Producer = [ qw( 399 new 400 send 401 ) ]; 402 403 use_ok 'Kafka::Producer'; 404} 405 406# Kafka::Cluster 407 408BEGIN { 409 $ours_Kafka_Cluster = [ qw ( 410 DEFAULT_TOPIC 411 START_PORT 412 ) ]; 413 414 $methods_Kafka_Cluster = [ qw( 415 base_dir 416 close 417 init 418 is_run_in_base_dir 419 log_dir 420 new 421 node_id 422 request 423 servers 424 start 425 stop 426 zookeeper_port 427 ) ]; 428 429 use_ok 'Kafka::Cluster'; 430} 431 432#-- Verify that the simple module has the necessary API 433 434foreach my $module ( keys %ordinary ) { 435 # verify import the constants 436 my $value; 437 ok( defined( $value = eval( "$_" ) ), "import OK: $_ = $value" ) for @{ $ordinary{ $module }->[0] }; ## no critic 438 439 # verify import of functions 440 can_ok( __PACKAGE__, $_ ) for @{ $ordinary{ $module }->[1] }; 441} 442 443#-- Verify that the OO module has the necessary API 444 445foreach my $module ( keys %OO ) { 446 # verify import the our variables 447 foreach my $name ( @{ $OO{ $module }->[0] } ) { 448 my $var_name = "\$${module}::$name"; 449 ok( eval( "exists \$${module}::{$name}" ), "import OK: $var_name exists" ); ## no critic 450 } 451 452 # verify availability of methods 453 can_ok( $module, $_ ) for @{ $OO{ $module }->[1] }; 454} 455 456# POSTCONDITIONS --------------------------------------------------------------- 457