Cleanup: tests: name all temporary files to better identify leakage
[lttng-tools.git] / tests / regression / ust / overlap / test_overlap
CommitLineData
26b53d3b 1#!/bin/bash
ecce1eb6 2#
9d16b343 3# Copyright (C) 2012 David Goulet <dgoulet@efficios.com>
ecce1eb6 4#
9d16b343
MJ
5# SPDX-License-Identifier: LGPL-2.1-only
6
ecce1eb6 7TEST_DESC="UST - Wildcard overlap"
26b53d3b 8
ecce1eb6
CB
9CURDIR=$(dirname $0)/
10TESTDIR=$CURDIR/../../..
11SESSION_NAME="wildcard-overlap"
26b53d3b 12
ecce1eb6
CB
13DEMO_EVENT1="ust_tests_demo:starting"
14DEMO_EVENT1_2="ust_tests_demo:done"
15DEMO_EVENT2="ust_tests_demo2:loop"
16DEMO_EVENT3="ust_tests_demo3:done"
26b53d3b 17
ecce1eb6
CB
18NUM_DEMO1_EVENT=1
19NUM_DEMO1_2_EVENT=1
20NUM_DEMO2_EVENT=5
21NUM_DEMO3_EVENT=1
26b53d3b 22
7972aab2 23NUM_TESTS=259
ecce1eb6
CB
24
25source $TESTDIR/utils/utils.sh
26
ecce1eb6
CB
27# MUST set TESTDIR before calling those functions
28
29run_demo_app()
30{
31 cd $CURDIR/demo
32
33 # Start test
5402fe87 34 diag "Running application"
ecce1eb6 35 ./demo-trace >/dev/null 2>&1
5402fe87 36 ok $? "Application done"
ecce1eb6
CB
37
38 cd -
39}
40
41# Ease our life a bit ;)
42trace_match_demo1_events()
43{
44 trace_matches "$DEMO_EVENT1" $NUM_DEMO1_EVENT $TRACE_PATH
45 trace_matches "$DEMO_EVENT1_2" $NUM_DEMO1_EVENT $TRACE_PATH
46}
47
48# Ease our life a bit ;)
49trace_match_all_demo_events()
50{
51 trace_match_demo1_events
52 trace_matches "$DEMO_EVENT2" $NUM_DEMO2_EVENT $TRACE_PATH
53 trace_matches "$DEMO_EVENT3" $NUM_DEMO3_EVENT $TRACE_PATH
54}
55
56# Ease our life a bit ;)
57trace_match_no_demo_events()
26b53d3b 58{
ecce1eb6
CB
59 trace_matches "$DEMO_EVENT1" 0 $TRACE_PATH
60 trace_matches "$DEMO_EVENT1_2" 0 $TRACE_PATH
61 trace_matches "$DEMO_EVENT2" 0 $TRACE_PATH
62 trace_matches "$DEMO_EVENT3" 0 $TRACE_PATH
26b53d3b
DG
63}
64
ecce1eb6
CB
65# Expect all "demo" events, no duplicate.
66test_enable_simple_wildcard()
67{
68 local event_wild1="us*"
69 local event_wild2="ust*"
70
71 diag "Simple wildcard overlap"
72
c4926bb5
JR
73 enable_ust_lttng_event_ok $SESSION_NAME "$event_wild1"
74 enable_ust_lttng_event_ok $SESSION_NAME "$event_wild2"
ecce1eb6 75
e563bbdb 76 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
77
78 run_demo_app
79
96340a01 80 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
81
82 trace_match_all_demo_events
83
84 return $?
85}
86
87# Expect all "demo" events, no duplicate.
88test_enable_wildcard_filter()
89{
90 local event_wild1="us*"
91 local event_wild2="ust*"
92
93 diag "Wildcard overlap with filter"
94
95 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild1" "1==1"
96 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild2" "1==0"
97
e563bbdb 98 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
99
100 run_demo_app
101
96340a01 102 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
103
104 trace_match_all_demo_events
105 return $?
106}
107
108# Expect all "demo" events, no duplicate.
109test_enable_wildcard_filter_2()
110{
111 local event_wild1="us*"
112 local event_wild2="ust*"
113
114 diag "Wildcard overlap with filter 2"
115
116 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild1" "1==0"
117 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild2" "1==1"
118
e563bbdb 119 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
120
121 run_demo_app
122
96340a01 123 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
124
125 trace_match_all_demo_events
126 return $?
127}
128
129# Expect all "demo" events, no duplicate.
130test_enable_wildcard_filter_3()
131{
132 local event_wild1="us*"
133 local event_wild2="ust*"
134
135 diag "Wildcard overlap with filter 3"
136
137 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild1" "1==1"
138 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild2" "1==1"
139
e563bbdb 140 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
141
142 run_demo_app
143
96340a01 144 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
145
146 trace_match_all_demo_events
147 return $?
148}
149
150# Expected: No events.
151test_enable_wildcard_filter_4()
152{
153 local event_wild1="us*"
154 local event_wild2="ust*"
155
156 diag "Wildcard overlap with filter 4"
157
158 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild1" "1==0"
159 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild2" "1==0"
160
e563bbdb 161 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
162
163 run_demo_app
164
96340a01 165 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
166
167 trace_match_no_demo_events
168 return $?
169}
170
171# Expect all "demo" events, no duplicate.
172test_enable_wildcard_filter_5()
173{
174 local event_wild1="us*"
175 local event_wild2="$DEMO_EVENT1"
176
177 diag "Wildcard overlap with filter 5"
178
179 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild1" "1==1"
180 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild2" "1==0"
181
e563bbdb 182 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
183
184 run_demo_app
185
96340a01 186 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
187
188 trace_match_all_demo_events
189 return $?
190}
191
192# Expect all $DEMO_EVENT1 events, no duplicate.
193test_enable_wildcard_filter_6()
194{
195 local event_wild1="us*"
196 local event_wild2="$DEMO_EVENT1"
197
198 diag "Wildcard overlap with filter 6"
199
200 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild1" "1==0"
201 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild2" "1==1"
202
e563bbdb 203 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
204
205 run_demo_app
206
96340a01 207 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
208
209 trace_matches $DEMO_EVENT1 $NUM_DEMO1_EVENT $TRACE_PATH
210 trace_matches $DEMO_EVENT1_2 0 $TRACE_PATH
211 trace_matches $DEMO_EVENT2 0 $TRACE_PATH
212 trace_matches $DEMO_EVENT3 0 $TRACE_PATH
213 return $?
214}
215
216# Expect all events, no duplicate.
217test_enable_wildcard_filter_7()
218{
219 local event_wild1="us*"
220 local event_wild2="$DEMO_EVENT1"
221
222 diag "Wildcard overlap with filter 7"
223
224 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild1" "1==1"
225 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild2" "1==1"
226
e563bbdb 227 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
228
229 run_demo_app
230
96340a01 231 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
232
233 trace_match_all_demo_events
234 return $?
235}
236
237# Expected: No events.
238test_enable_wildcard_filter_8()
239{
240 local event_wild1="us*"
241 local event_wild2="$DEMO_EVENT1"
242
243 diag "Wildcard overlap with filter 8"
244
245 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild1" "1==0"
246 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild2" "1==0"
247
e563bbdb 248 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
249
250 run_demo_app
251
96340a01 252 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
253
254 trace_match_no_demo_events
255 return $?
256}
257
258# Expect all events.
259test_enable_same_wildcard_filter()
260{
261 local event_wild1="ust*"
262 local event_wild2="ust*"
263
264 diag "Same wildcard overlap with filter"
265
266 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild1" "1==1&&1==1"
267 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild2" "1==1"
268
e563bbdb 269 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
270
271 run_demo_app
272
96340a01 273 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
274
275 trace_match_all_demo_events
276 return $?
277}
278
279# Expect all events.
280test_enable_same_wildcard_filter_2()
281{
282 local event_wild1="ust*"
283 local event_wild2="ust*"
284
285 diag "Same wildcard overlap with filter 2"
286
287 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild1" "1==1"
288
7972aab2 289 # Enabling the same events with same filters should fail. This one is expected to fail.
ecce1eb6 290 $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event "$event_wild2" -s $SESSION_NAME -u --filter "1==1" >/dev/null 2>&1
7972aab2 291 if [ $? -ne 0 ]; then
ecce1eb6
CB
292 pass "Enable event $event_name with filtering for session $sess_name twice failure detected"
293 else
7972aab2 294 fail "Enable event $event_name with filtering for session $sess_name twice failure NOT detected"
ecce1eb6
CB
295 fi
296
e563bbdb 297 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
298
299 run_demo_app
300
96340a01 301 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
302
303 trace_match_all_demo_events
304 return $?
305}
306
307# Expect all events.
308test_enable_same_wildcard_filter_3()
309{
310 local event_wild1="ust*"
311 local event_wild2="ust*"
312
313 diag "Same wildcard overlap with filter 3"
314
315 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild1" "1==1"
316 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild2" "1==0"
317
e563bbdb 318 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
319
320 run_demo_app
321
96340a01 322 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
323
324 trace_match_all_demo_events
325 return $?
326}
327
328# Expected: No events.
329test_enable_same_wildcard_filter_4()
330{
331 local event_wild1="ust*"
332 local event_wild2="ust*"
333
334 diag "Same wildcard overlap with filter 4"
335
336 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild1" "1==0&&1==0"
337 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild2" "1==0"
338
e563bbdb 339 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
340
341 run_demo_app
342
96340a01 343 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
344
345 trace_match_no_demo_events
346 return $?
347}
348
349# Expected: Only $DEMO_EVENT1
350test_enable_same_event_filter()
351{
352 local event_wild1="$DEMO_EVENT1"
353 local event_wild2="$DEMO_EVENT1"
354
355 diag "Enable same event with filter."
356
357 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild1" "1==1&&1==1"
358 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild2" "1==1"
359
e563bbdb 360 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
361
362 run_demo_app
363
96340a01 364 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
365
366 trace_matches $DEMO_EVENT1 $NUM_DEMO1_EVENT $TRACE_PATH
367 trace_matches $DEMO_EVENT1_2 0 $TRACE_PATH
368 trace_matches $DEMO_EVENT2 0 $TRACE_PATH
369 trace_matches $DEMO_EVENT3 0 $TRACE_PATH
370 return $?
371}
372
373# Expected: No events.
374test_disable_same_wildcard_filter()
375{
376 local event_wild1="ust*"
377 local event_wild2="ust*"
378
379 diag "Disable same wildcard with filter."
380
381 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild1" "1==1&&1==1"
382 enable_ust_lttng_event_filter $SESSION_NAME "$event_wild2" "1==1"
383
384 disable_ust_lttng_event $SESSION_NAME "ust*"
385
e563bbdb 386 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
387
388 run_demo_app
389
96340a01 390 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
391
392 trace_match_no_demo_events
393 return $?
394}
395
396# Expect no events
397test_enable_bad_wildcard()
398{
399 # Invalid event
400 local event_wild1="ust_tests_demo"
401 local event_wild2="ust_tests_demo2"
402 local event_wild3="ust_tests_demo3"
403
404 diag "Enable bad wildcard"
405
c4926bb5
JR
406 enable_ust_lttng_event_ok $SESSION_NAME "$event_wild1"
407 enable_ust_lttng_event_ok $SESSION_NAME "$event_wild2"
408 enable_ust_lttng_event_ok $SESSION_NAME "$event_wild3"
ecce1eb6 409
e563bbdb 410 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
411
412 run_demo_app
413
96340a01 414 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
415
416 trace_match_no_demo_events
417 return $?
418}
419
420# Expect all "demo" events, no duplicate.
421test_enable_simple_wildcard_2()
422{
423 local event_wild1="us*"
424 local event_wild2="$DEMO_EVENT1"
425
426 diag "Simple wildcard 2"
427
c4926bb5
JR
428 enable_ust_lttng_event_ok $SESSION_NAME "$event_wild1"
429 enable_ust_lttng_event_ok $SESSION_NAME "$event_wild2"
ecce1eb6 430
e563bbdb 431 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
432
433 run_demo_app
434
96340a01 435 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
436
437 trace_match_all_demo_events
438 return $?
439}
440
441# Expected: all CRIT events, + all warning events.
442test_enable_loglevel_overlap()
443{
444 local event_wild1="us*"
445 local event_wild2="ust*"
446
447 diag "Enable loglevel overlap"
448
449 enable_ust_lttng_event_loglevel $SESSION_NAME "$event_wild1" "TRACE_WARNING"
450 enable_ust_lttng_event_loglevel $SESSION_NAME "$event_wild2" "TRACE_CRIT"
451
e563bbdb 452 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
453
454 run_demo_app
455
96340a01 456 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
457
458 trace_match_all_demo_events
459 return $?
460}
461
462# Expected: all CRIT events, + all warning events.
463test_enable_loglevel_only_overlap()
464{
465 local event_wild1="us*"
466 local event_wild2="ust*"
467
468 diag "Enable loglevel only overlap"
469
470 enable_ust_lttng_event_loglevel $SESSION_NAME "$event_wild1" "TRACE_WARNING"
471 enable_ust_lttng_event_loglevel_only $SESSION_NAME "$event_wild2" "TRACE_CRIT"
472
e563bbdb 473 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
474
475 run_demo_app
476
96340a01 477 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
478
479 trace_match_all_demo_events
480 return $?
481}
482
483# Expected: all events
484test_enable_loglevel_overlap_2()
485{
486 local event_wild1="us*"
487 local event_wild2="$DEMO_EVENT2"
488
489 diag "Enable loglevel overlap 2"
490
491 enable_ust_lttng_event_loglevel $SESSION_NAME "$event_wild1" "TRACE_WARNING"
492 enable_ust_lttng_event_loglevel $SESSION_NAME "$event_wild2" "TRACE_CRIT"
493
e563bbdb 494 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
495
496 run_demo_app
497
96340a01 498 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
499
500 trace_match_all_demo_events
501 return $?
502}
503
504# Expected only ust_tests_demo* events.
505test_enable_same_wildcard_loglevels()
506{
507 local event_wild1="ust*"
508 local event_wild2="ust*"
509
510 diag "Enable same wildcard with different loglevels"
511
512 enable_ust_lttng_event_loglevel $SESSION_NAME "$event_wild1" "TRACE_CRIT"
513 enable_ust_lttng_event_loglevel $SESSION_NAME "$event_wild2" "TRACE_WARNING"
514
e563bbdb 515 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
516
517 run_demo_app
518
96340a01 519 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
520
521 trace_match_all_demo_events
522 return $?
523}
524
525# Expected only ust_tests_demo:starting events.
526test_enable_same_event_loglevels()
527{
528 local event_wild1="$DEMO_EVENT1"
529 local event_wild2="$DEMO_EVENT1"
530
531 diag "Enable same event with different loglevels"
532
533 enable_ust_lttng_event_loglevel $SESSION_NAME "$event_wild1" "TRACE_CRIT"
534 enable_ust_lttng_event_loglevel $SESSION_NAME "$event_wild2" "TRACE_WARNING"
535
e563bbdb 536 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
537
538 run_demo_app
539
96340a01 540 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
541
542 trace_matches $DEMO_EVENT1 $NUM_DEMO1_EVENT $TRACE_PATH
543 trace_matches $DEMO_EVENT1_2 0 $TRACE_PATH
544 trace_matches $DEMO_EVENT2 0 $TRACE_PATH
545 trace_matches $DEMO_EVENT3 0 $TRACE_PATH
546 return $?
547}
548
549# Expect 0 event
550test_disable_simple_wildcard()
551{
552 local event_wild1="us*"
553 local event_wild2="$DEMO_EVENT1"
554
555 diag "Disable simple wildcard"
556
c4926bb5
JR
557 enable_ust_lttng_event_ok $SESSION_NAME "$event_wild1"
558 enable_ust_lttng_event_ok $SESSION_NAME "$event_wild2"
ecce1eb6
CB
559
560 disable_ust_lttng_event $SESSION_NAME "$event_wild1"
561 disable_ust_lttng_event $SESSION_NAME "$event_wild2"
562
e563bbdb 563 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
564
565 run_demo_app
566
96340a01 567 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
568
569 # No events are expected.
570 trace_match_no_demo_events
571 return $?
572}
573
574# Expect only "ust_tests_demo" events.
575test_disable_wildcard_overlap()
576{
577 local event_wild1="us*"
578 local event_wild2="$DEMO_EVENT1"
579
580 diag "Disable wildcard overlap"
581
c4926bb5
JR
582 enable_ust_lttng_event_ok $SESSION_NAME "$event_wild1"
583 enable_ust_lttng_event_ok $SESSION_NAME "$event_wild2"
ecce1eb6
CB
584
585 disable_ust_lttng_event $SESSION_NAME "$event_wild1"
586
e563bbdb 587 start_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
588
589 run_demo_app
590
96340a01 591 stop_lttng_tracing_ok $SESSION_NAME
ecce1eb6
CB
592
593 # Expect only "ust_tests_demo" events.
594 trace_matches "$DEMO_EVENT1" $NUM_DEMO1_EVENT $TRACE_PATH
595 trace_matches "$DEMO_EVENT1_2" 0 $TRACE_PATH
596 trace_matches "$DEMO_EVENT2" 0 $TRACE_PATH
597 trace_matches "$DEMO_EVENT3" 0 $TRACE_PATH
598 return $?
599}
600
601plan_tests $NUM_TESTS
602
e3bef725
CB
603print_test_banner "$TEST_DESC"
604
f37e092d
MD
605if [ -x "$CURDIR/demo/demo" ]; then
606 foundbin=1
607else
608 foundbin=0
609fi
610
611skip $foundbin "No UST nevents binary detected. Skipping all tests." $NUM_TESTS && exit 0
612
ecce1eb6
CB
613TESTS=(
614 "test_enable_wildcard_filter"
615 "test_enable_wildcard_filter_2"
616 "test_enable_wildcard_filter_3"
617 "test_enable_wildcard_filter_4"
618 "test_enable_wildcard_filter_5"
619 "test_enable_wildcard_filter_6"
620 "test_enable_wildcard_filter_7"
621 "test_enable_wildcard_filter_8"
622 "test_enable_same_wildcard_filter"
623 "test_enable_same_wildcard_filter_2"
624 "test_enable_same_wildcard_filter_3"
625 "test_enable_same_wildcard_filter_4"
626 "test_enable_same_event_filter"
627 "test_enable_loglevel_only_overlap"
628 "test_enable_same_event_loglevels"
629 "test_enable_same_wildcard_loglevels"
630 "test_enable_bad_wildcard"
631 "test_enable_loglevel_overlap_2"
632 "test_enable_simple_wildcard"
633 "test_enable_simple_wildcard_2"
634 "test_enable_loglevel_overlap"
635 "test_disable_simple_wildcard"
636 "test_disable_wildcard_overlap"
637)
638
639TEST_COUNT=${#TESTS[@]}
640i=0
641
642start_lttng_sessiond
643
644while [ "$i" -lt "$TEST_COUNT" ]; do
645
33e55711 646 TRACE_PATH=$(mktemp --tmpdir -d -t tmp.test_overlap.XXXXXX)
ecce1eb6 647
bf6ae429 648 create_lttng_session_ok $SESSION_NAME $TRACE_PATH
ecce1eb6
CB
649
650 # Execute test
651 ${TESTS[$i]}
ecce1eb6 652
67b4c664 653 destroy_lttng_session_ok $SESSION_NAME
ecce1eb6
CB
654
655 rm -rf $TRACE_PATH
656
657 let "i++"
658done
26b53d3b 659
ecce1eb6 660stop_lttng_sessiond
This page took 0.068621 seconds and 4 git commands to generate.