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