6 use RT::Test tests => 133;
8 my ($baseurl, $agent) =RT::Test->started_ok;
9 ok( $agent->login, 'log in' );
11 my $q = RT::Queue->new($RT::SystemUser);
13 my $ip_cf = RT::CustomField->new($RT::SystemUser);
15 my ($val,$msg) = $ip_cf->Create(Name => 'IP', Type =>'IPAddressRange', LookupType => 'RT::Queue-RT::Ticket');
18 $ip_cf->AddToObject($q);
22 diag "load and check basic properties of the IP CF" if $ENV{'TEST_VERBOSE'};
24 my $cfs = RT::CustomFields->new( $RT::SystemUser );
25 $cfs->Limit( FIELD => 'Name', VALUE => 'IP' );
26 is( $cfs->Count, 1, "found one CF with name 'IP'" );
29 is( $cf->Type, 'IPAddressRange', 'type check' );
30 is( $cf->LookupType, 'RT::Queue-RT::Ticket', 'lookup type check' );
31 ok( !$cf->MaxValues, "unlimited number of values" );
32 ok( !$cf->Disabled, "not disabled" );
35 diag "check that CF applies to queue General" if $ENV{'TEST_VERBOSE'};
37 my $cfs = $q->TicketCustomFields;
38 $cfs->Limit( FIELD => 'id', VALUE => $cf->id, ENTRYAGGREGATOR => 'AND' );
39 is( $cfs->Count, 1, 'field applies to queue' );
42 diag "create a ticket via web and set IP" if $ENV{'TEST_VERBOSE'};
44 my $val = '192.168.20.1';
45 ok $agent->goto_create_ticket($q), "go to create ticket";
46 my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
48 form_name => 'TicketCreate',
55 $agent->content_like( qr/\Q$val/, "IP on the page" );
56 my ($id) = $agent->content =~ /Ticket (\d+) created/;
57 ok( $id, "created ticket $id" );
59 my $ticket = RT::Ticket->new($RT::SystemUser);
61 ok( $ticket->id, 'loaded ticket' );
62 is( $ticket->FirstCustomFieldValue('IP'), $val, 'correct value' );
65 diag "create a ticket via web with CIDR" if $ENV{'TEST_VERBOSE'};
67 my $val = '172.16.20/31';
68 ok $agent->goto_create_ticket($q), "go to create ticket";
69 my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
71 form_name => 'TicketCreate',
78 my ($id) = $agent->content =~ /Ticket (\d+) created/;
79 ok( $id, "created ticket $id" );
81 my $ticket = RT::Ticket->new($RT::SystemUser);
83 ok( $ticket->id, 'loaded ticket' );
84 is( $ticket->FirstCustomFieldValue('IP'), '172.16.20.0-172.16.20.1', 'correct value' );
87 diag "create a ticket and edit IP field using Edit page" if $ENV{'TEST_VERBOSE'};
89 my $val = '172.16.0.1';
90 ok $agent->goto_create_ticket($q), "go to create ticket";
92 form_name => 'TicketCreate',
93 fields => { Subject => 'test ip', }
96 my ($id) = $agent->content =~ /Ticket (\d+) created/;
97 ok( $id, "created ticket $id" );
98 my $cf_field = "Object-RT::Ticket-$id-CustomField-$cf_id-Values";
100 $agent->follow_link_ok( { text => 'Basics', n => "1" },
101 "Followed 'Basics' link" );
102 $agent->form_name('TicketModify');
104 like( $agent->value($cf_field), qr/^\s*$/, 'IP is empty' );
105 $agent->field( $cf_field => $val );
106 $agent->click('SubmitTicket');
108 $agent->content_like( qr/\Q$val/, "IP on the page" );
110 my $ticket = RT::Ticket->new($RT::SystemUser);
112 ok( $ticket->id, 'loaded ticket' );
113 is( $ticket->FirstCustomFieldValue('IP'), $val, 'correct value' );
115 diag "set IP with spaces around" if $ENV{'TEST_VERBOSE'};
116 $val = " 172.16.0.2 \n ";
117 $agent->follow_link_ok( { text => 'Basics', n => "1" },
118 "Followed 'Basics' link" );
119 $agent->form_name('TicketModify');
120 like( $agent->value($cf_field),
121 qr/^\s*\Q172.16.0.1\E\s*$/, 'IP is in input box' );
122 $agent->field( $cf_field => $val );
123 $agent->click('SubmitTicket');
125 $agent->content_like( qr/\Q172.16.0.2/, "IP on the page" );
127 $ticket = RT::Ticket->new($RT::SystemUser);
129 ok( $ticket->id, 'loaded ticket' );
130 is( $ticket->FirstCustomFieldValue('IP'), '172.16.0.2', 'correct value' );
132 diag "replace IP with a range" if $ENV{'TEST_VERBOSE'};
133 $val = '172.16.0.0-172.16.0.255';
134 $agent->follow_link_ok( { text => 'Basics', n => "1" },
135 "Followed 'Basics' link" );
136 $agent->form_name('TicketModify');
137 like( $agent->value($cf_field),
138 qr/^\s*\Q172.16.0.2\E\s*$/, 'IP is in input box' );
139 $agent->field( $cf_field => $val );
140 $agent->click('SubmitTicket');
142 $agent->content_like( qr/\Q$val/, "IP on the page" );
144 $ticket = RT::Ticket->new($RT::SystemUser);
146 ok( $ticket->id, 'loaded ticket' );
147 is( $ticket->FirstCustomFieldValue('IP'), $val, 'correct value' );
149 diag "delete range, add another range using CIDR" if $ENV{'TEST_VERBOSE'};
151 $agent->follow_link_ok( { text => 'Basics', n => "1" },
152 "Followed 'Basics' link" );
153 $agent->form_name('TicketModify');
154 is( $agent->value($cf_field),
155 '172.16.0.0-172.16.0.255', 'IP is in input box' );
156 $agent->field( $cf_field => $val );
157 $agent->click('SubmitTicket');
159 $agent->content_like( qr/\Q$val/, "IP on the page" );
161 $ticket = RT::Ticket->new($RT::SystemUser);
163 ok( $ticket->id, 'loaded ticket' );
164 is( $ticket->FirstCustomFieldValue('IP'),
165 '172.16.0.0-172.16.255.255', 'correct value' );
168 diag "check that we parse correct IPs only" if $ENV{'TEST_VERBOSE'};
171 my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
172 for my $valid (qw/1.0.0.0 255.255.255.255/) {
173 ok $agent->goto_create_ticket($q), "go to create ticket";
175 form_name => 'TicketCreate',
177 Subject => 'test ip',
182 my ($id) = $agent->content =~ /Ticket (\d+) created/;
183 ok( $id, "created ticket $id" );
184 my $ticket = RT::Ticket->new($RT::SystemUser);
186 is( $ticket->id, $id, 'loaded ticket' );
188 is( $ticket->FirstCustomFieldValue('IP'), $valid, 'correct value' );
191 for my $invalid (qw{255.255.255.256 355.255.255.255 8.13.8/8.13.0/1.0}) {
192 ok $agent->goto_create_ticket($q), "go to create ticket";
194 form_name => 'TicketCreate',
196 Subject => 'test ip',
197 $cf_field => $invalid,
201 $agent->content_like( qr/can not be parsed as an IP address range/, 'ticket fails to create' );
206 diag "search tickets by IP" if $ENV{'TEST_VERBOSE'};
208 my $val = '172.16.1/31';
209 ok $agent->goto_create_ticket($q), "go to create ticket";
210 my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
212 form_name => 'TicketCreate',
214 Subject => 'test ip',
219 my ($id) = $agent->content =~ /Ticket (\d+) created/;
220 ok( $id, "created ticket $id" );
222 my $ticket = RT::Ticket->new($RT::SystemUser);
224 ok( $ticket->id, 'loaded ticket' );
226 my $tickets = RT::Tickets->new($RT::SystemUser);
227 $tickets->FromSQL("id = $id AND CF.{IP} = '172.16.1.1'");
228 ok( $tickets->Count, "found tickets" );
230 is( $ticket->FirstCustomFieldValue('IP'),
231 '172.16.1.0-172.16.1.1', 'correct value' );
234 diag "search tickets by IP range" if $ENV{'TEST_VERBOSE'};
236 my $val = '172.16.2/26';
237 ok $agent->goto_create_ticket($q), "go to create ticket";
238 my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
240 form_name => 'TicketCreate',
242 Subject => 'test ip',
247 my ($id) = $agent->content =~ /Ticket (\d+) created/;
248 ok( $id, "created ticket $id" );
250 my $ticket = RT::Ticket->new($RT::SystemUser);
252 ok( $ticket->id, 'loaded ticket' );
254 my $tickets = RT::Tickets->new( $RT::SystemUser );
255 $tickets->FromSQL("id = $id AND CF.{IP} = '172.16.2.0-172.16.2.255'");
256 ok( $tickets->Count, "found tickets" );
258 is( $ticket->FirstCustomFieldValue('IP'),
259 '172.16.2.0-172.16.2.63', 'correct value' );
262 diag "create two tickets with different IPs and check several searches" if $ENV{'TEST_VERBOSE'};
264 ok $agent->goto_create_ticket($q), "go to create ticket";
265 my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
267 form_name => 'TicketCreate',
269 Subject => 'test ip',
270 $cf_field => '192.168.21.10',
274 my ($id1) = $agent->content =~ /Ticket (\d+) created/;
275 ok( $id1, "created first ticket $id1" );
277 ok $agent->goto_create_ticket($q), "go to create ticket";
279 form_name => 'TicketCreate',
281 Subject => 'test ip',
282 $cf_field => '192.168.22.10',
286 my ($id2) = $agent->content =~ /Ticket (\d+) created/;
287 ok( $id2, "created second ticket $id2" );
289 my $tickets = RT::Tickets->new( $RT::SystemUser );
290 $tickets->FromSQL("id = $id1 OR id = $id2");
291 is( $tickets->Count, 2, "found both tickets by 'id = x OR y'" );
294 $tickets = RT::Tickets->new( $RT::SystemUser );
295 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.10'");
296 is( $tickets->Count, 1, "found one ticket" );
297 is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.21.10', "correct value" );
298 $tickets = RT::Tickets->new( $RT::SystemUser );
299 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.22.10'");
300 is( $tickets->Count, 1, "found one ticket" );
301 is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.22.10', "correct value" );
303 # IP/32 - one address
304 $tickets = RT::Tickets->new( $RT::SystemUser );
305 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.10/32'");
306 is( $tickets->Count, 1, "found one ticket" );
307 is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.21.10', "correct value" );
308 $tickets = RT::Tickets->new( $RT::SystemUser );
309 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.22.10/32'");
310 is( $tickets->Count, 1, "found one ticket" );
311 is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.22.10', "correct value" );
314 $tickets = RT::Tickets->new( $RT::SystemUser );
315 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.0-192.168.21.255'");
316 is( $tickets->Count, 1, "found one ticket" );
317 is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.21.10', "correct value" );
318 $tickets = RT::Tickets->new( $RT::SystemUser );
319 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.22.0-192.168.22.255'");
320 is( $tickets->Count, 1, "found one ticket" );
321 is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.22.10', "correct value" );
323 # IP range, with start IP greater than end
324 $tickets = RT::Tickets->new( $RT::SystemUser );
325 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.255-192.168.21.0'");
326 is( $tickets->Count, 1, "found one ticket" );
327 is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.21.10', "correct value" );
328 $tickets = RT::Tickets->new( $RT::SystemUser );
329 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.22.255-192.168.22.0'");
330 is( $tickets->Count, 1, "found one ticket" );
331 is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.22.10', "correct value" );
334 $tickets = RT::Tickets->new( $RT::SystemUser );
335 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.0/24'");
336 is( $tickets->Count, 1, "found one ticket" );
337 is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.21.10', "correct value" );
338 $tickets = RT::Tickets->new( $RT::SystemUser );
339 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.22.0/24'");
340 is( $tickets->Count, 1, "found one ticket" );
341 is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.22.10', "correct value" );
343 # IP is not in CIDR/24
344 $tickets = RT::Tickets->new( $RT::SystemUser );
345 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} != '192.168.21.0/24'");
346 is( $tickets->Count, 1, "found one ticket" );
347 is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.22.10', "correct value" );
348 $tickets = RT::Tickets->new( $RT::SystemUser );
349 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} != '192.168.22.0/24'");
350 is( $tickets->Count, 1, "found one ticket" );
351 is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.21.10', "correct value" );
354 $tickets = RT::Tickets->new( $RT::SystemUser );
355 $tickets->FromSQL("(id = $id1 OR id = $id2) AND "
356 ."(CF.{IP} = '192.168.21.0/24' OR CF.{IP} = '192.168.22.0/24')");
357 is( $tickets->Count, 2, "found both tickets" );
360 diag "create two tickets with different IP ranges and check several searches" if $ENV{'TEST_VERBOSE'};
362 ok $agent->goto_create_ticket($q), "go to create ticket";
363 my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
365 form_name => 'TicketCreate',
367 Subject => 'test ip',
368 $cf_field => '192.168.21.0-192.168.21.127',
372 my ($id1) = $agent->content =~ /Ticket (\d+) created/;
373 ok( $id1, "created first ticket $id1" );
375 ok $agent->goto_create_ticket($q), "go to create ticket";
377 form_name => 'TicketCreate',
379 Subject => 'test ip',
380 $cf_field => '192.168.21.128-192.168.21.255',
384 my ($id2) = $agent->content =~ /Ticket (\d+) created/;
385 ok( $id2, "created ticket $id2" );
387 my $tickets = RT::Tickets->new( $RT::SystemUser );
388 $tickets->FromSQL("id = $id1 OR id = $id2");
389 is( $tickets->Count, 2, "found both tickets by 'id = x OR y'" );
392 $tickets = RT::Tickets->new( $RT::SystemUser );
393 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.0'");
394 is( $tickets->Count, 1, "found one ticket" );
395 is( $tickets->First->id, $id1, "correct value" );
396 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.64'");
397 is( $tickets->Count, 1, "found one ticket" );
398 is( $tickets->First->id, $id1, "correct value" );
399 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.127'");
400 is( $tickets->Count, 1, "found one ticket" );
401 is( $tickets->First->id, $id1, "correct value" );
402 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.128'");
403 is( $tickets->Count, 1, "found one ticket" );
404 is( $tickets->First->id, $id2, "correct value" );
405 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.191'");
406 is( $tickets->Count, 1, "found one ticket" );
407 is( $tickets->First->id, $id2, "correct value" );
408 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.255'");
409 is( $tickets->Count, 1, "found one ticket" );
410 is( $tickets->First->id, $id2, "correct value" );
412 # IP/32 - one address
413 $tickets = RT::Tickets->new( $RT::SystemUser );
414 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.63/32'");
415 is( $tickets->Count, 1, "found one ticket" );
416 is( $tickets->First->id, $id1, "correct value" );
417 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.191/32'");
418 is( $tickets->Count, 1, "found one ticket" );
419 is( $tickets->First->id, $id2, "correct value" );
421 # IP range, lower than both
422 $tickets = RT::Tickets->new( $RT::SystemUser );
423 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.20.0-192.168.20.255'");
424 is( $tickets->Count, 0, "didn't finnd ticket" ) or diag "but found ". $tickets->First->id;
426 # IP range, intersect with the first range
427 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.20.0-192.168.21.63'");
428 is( $tickets->Count, 1, "found one ticket" );
429 is( $tickets->First->id, $id1, "correct value" );
431 # IP range, equal to the first range
432 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.0-192.168.21.127'");
433 is( $tickets->Count, 1, "found one ticket" );
434 is( $tickets->First->id, $id1, "correct value" );
436 # IP range, lay inside the first range
437 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.31-192.168.21.63'");
438 is( $tickets->Count, 1, "found one ticket" );
439 is( $tickets->First->id, $id1, "correct value" );
441 # IP range, intersect with the ranges
442 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.31-192.168.21.191'");
443 is( $tickets->Count, 2, "found both tickets" );
445 # IP range, equal to range from the starting IP of the first ticket to the ending IP of the second
446 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.0-192.168.21.255'");
447 is( $tickets->Count, 2, "found both tickets" );
449 # IP range, has the both ranges inside it
450 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168/16'");
451 is( $tickets->Count, 2, "found both tickets" );
453 # IP range, greater than both
454 $tickets = RT::Tickets->new( $RT::SystemUser );
455 $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.22/24'");
456 is( $tickets->Count, 0, "didn't find ticket" ) or diag "but found ". $tickets->First->id;
460 diag "test the operators in search page" if $ENV{'TEST_VERBOSE'};
462 $agent->get_ok( $baseurl . "/Search/Build.html?Query=Queue='General'" );
463 $agent->content_contains('CF.{IP}', 'got CF.{IP}');
464 my $form = $agent->form_name('BuildQuery');
465 my $op = $form->find_input("'CF.{IP}'Op");
466 ok( $op, "found 'CF.{IP}'Op" );
467 is_deeply( [ $op->possible_values ], [ '=', '!=', '<', '>' ], 'op values' );