ccan-lca-2011.git
10 years agoAdd slides images. master
Rusty Russell [Thu, 27 Jan 2011 07:15:13 +0000 (17:45 +1030)]
Add slides images.

10 years agolca2011: slight insanity.
Rusty Russell [Tue, 25 Jan 2011 00:27:42 +0000 (10:57 +1030)]
lca2011: slight insanity.

10 years agolca2011: use max_clients field to control dynamic length of clients array.
Rusty Russell [Tue, 25 Jan 2011 02:12:43 +0000 (12:42 +1030)]
lca2011: use max_clients field to control dynamic length of clients array.

10 years agolca2011: add dummy max_clients field.
Rusty Russell [Tue, 25 Jan 2011 01:56:22 +0000 (12:26 +1030)]
lca2011: add dummy max_clients field.

10 years agolca2011: dump, re-exec with --restore on restart.
Rusty Russell [Tue, 25 Jan 2011 00:32:12 +0000 (11:02 +1030)]
lca2011: dump, re-exec with --restore on restart.

10 years agolca2011: oserver_restore to restore talloc hierarchy.
Rusty Russell [Fri, 21 Jan 2011 03:55:12 +0000 (14:25 +1030)]
lca2011: oserver_restore to restore talloc hierarchy.

10 years agolca2011: oserver_restore to restore fields we labelled CDUMP_IGNORE.
Rusty Russell [Fri, 21 Jan 2011 03:54:55 +0000 (14:24 +1030)]
lca2011: oserver_restore to restore fields we labelled CDUMP_IGNORE.

10 years agolca2011: oserver_restore.
Rusty Russell [Sat, 22 Jan 2011 03:40:51 +0000 (14:10 +1030)]
lca2011: oserver_restore.

10 years agolca2011: dump on SIGHUP.
Rusty Russell [Tue, 25 Jan 2011 00:31:48 +0000 (11:01 +1030)]
lca2011: dump on SIGHUP.

10 years agolca2011: avoid loops during dumping.
Rusty Russell [Tue, 25 Jan 2011 00:31:25 +0000 (11:01 +1030)]
lca2011: avoid loops during dumping.

CDUMP_IGNORE the client->oserver back-pointer, and switch the subclient
and oracle to be indices into oserver->clients[] rather than pointers.

10 years agolca2011: simple cdump tool to generate cdump header and body.
Rusty Russell [Mon, 24 Jan 2011 11:11:51 +0000 (21:41 +1030)]
lca2011: simple cdump tool to generate cdump header and body.

10 years agolca2011: mark types in header with CDUMP annotations.
Rusty Russell [Sat, 22 Jan 2011 03:40:51 +0000 (14:10 +1030)]
lca2011: mark types in header with CDUMP annotations.

Header from folded patch 'cdump-avoid-fde.patch':

lca2011: ignore unknown tevent_fd fields.

10 years agolca2011: move types out to a separate header.
Rusty Russell [Sat, 22 Jan 2011 03:40:51 +0000 (14:10 +1030)]
lca2011: move types out to a separate header.

Preparation for cdump.

10 years agolca2011: dump talloc tree in child.
Rusty Russell [Fri, 21 Jan 2011 03:50:45 +0000 (14:20 +1030)]
lca2011: dump talloc tree in child.

Avoids stopping the entire server just for debug dumps.

10 years agolca2011: dump talloc tree on SIGUSR1
Rusty Russell [Fri, 21 Jan 2011 03:50:02 +0000 (14:20 +1030)]
lca2011: dump talloc tree on SIGUSR1

Useful for finding runtime memory leaks.

10 years agolca2011: fix client disconnect during answer (poorly).
Rusty Russell [Tue, 25 Jan 2011 00:29:15 +0000 (10:59 +1030)]
lca2011: fix client disconnect during answer (poorly).

We seek an oracle or a client when we need one, and unset when we
are destroyed.  This can cause crossed answers; better would be to
actually move the questions/answers around.

10 years agolca2011: test client disconnect.
Rusty Russell [Fri, 21 Jan 2011 03:47:57 +0000 (14:17 +1030)]
lca2011: test client disconnect.

10 years agolca2011: turn it into a true Usenet Oracle.
Rusty Russell [Fri, 21 Jan 2011 05:29:34 +0000 (15:59 +1030)]
lca2011: turn it into a true Usenet Oracle.

We switch the port, since we keep the previous parrot version running.

This version crashes on client disconnect.

10 years agolca2011: make our server parrot the last answer it got.
Rusty Russell [Fri, 21 Jan 2011 05:29:42 +0000 (15:59 +1030)]
lca2011: make our server parrot the last answer it got.

Include my own fairly lame attempt to match up with the woodchuck question.

10 years agolca2011: add greeting and prefix states.
Rusty Russell [Tue, 25 Jan 2011 00:28:10 +0000 (10:58 +1030)]
lca2011: add greeting and prefix states.

10 years agolca2011: valgrind catches an error for us.
Rusty Russell [Fri, 21 Jan 2011 04:42:21 +0000 (15:12 +1030)]
lca2011: valgrind catches an error for us.

When we moved the clients[] array into oserver, we didn't initialize it.
Before, it was a static, so implicitly set to NULL.

10 years agolca2011: don't use void * for the handle.
Rusty Russell [Sat, 22 Jan 2011 03:40:51 +0000 (14:10 +1030)]
lca2011: don't use void * for the handle.

And don't keep global state: it's messy, and you can never invoke two of them.

10 years agolca2011: rewrite to a serious server
Rusty Russell [Sat, 22 Jan 2011 03:40:51 +0000 (14:10 +1030)]
lca2011: rewrite to a serious server

This uses tevent and callback, and a simple state machine.

10 years agolca2011: add option parsing using ccan/opt.
Rusty Russell [Fri, 21 Jan 2011 03:41:51 +0000 (14:11 +1030)]
lca2011: add option parsing using ccan/opt.

10 years agolca2011: use failtest
Rusty Russell [Fri, 21 Jan 2011 03:41:35 +0000 (14:11 +1030)]
lca2011: use failtest

This gives us one more line of coverate for very little cost.

10 years agolca2011: simpler testing by not having oserver_setup exit.
Rusty Russell [Fri, 21 Jan 2011 03:41:16 +0000 (14:11 +1030)]
lca2011: simpler testing by not having oserver_setup exit.

Note the use of close_noerr here to preserve the errno.

10 years agolca2011: simpler testing by not having oserver_serve exit.
Rusty Russell [Fri, 21 Jan 2011 03:40:45 +0000 (14:10 +1030)]
lca2011: simpler testing by not having oserver_serve exit.

This makes it easier to test error paths, too.

10 years agolca2011: enhance test/run to use ccan/foreach
Rusty Russell [Fri, 21 Jan 2011 03:38:50 +0000 (14:08 +1030)]
lca2011: enhance test/run to use ccan/foreach

10 years agolca2011: enhance test/run to try multiple inputs.
Rusty Russell [Fri, 21 Jan 2011 03:38:35 +0000 (14:08 +1030)]
lca2011: enhance test/run to try multiple inputs.

10 years agolca2011: header documentation.
Rusty Russell [Fri, 21 Jan 2011 03:40:03 +0000 (14:10 +1030)]
lca2011: header documentation.

Particularly, the example sections (compile-tested thanks to ccanlint).

10 years agolca2011: test
Rusty Russell [Fri, 21 Jan 2011 03:37:27 +0000 (14:07 +1030)]
lca2011: test

10 years agolca2011: oserver _info file.
Rusty Russell [Sun, 23 Jan 2011 12:03:46 +0000 (22:33 +1030)]
lca2011: oserver _info file.

Header from folded patch 'ccanlint-idempotent-and-license.patch':

lca2011: oserver idempotent and license link and tag.

Header from folded patch 'ccanlint-fix-control-reaches-end.patch':

lca2011: mark oserver_serve NORETURN.

10 years agolca2011: The initial server.
Rusty Russell [Sun, 23 Jan 2011 12:04:10 +0000 (22:34 +1030)]
lca2011: The initial server.

Actually written as a CCAN module (ie. library).

10 years agocdump: features which weren't in genparser
Rusty Russell [Fri, 21 Jan 2011 03:36:26 +0000 (14:06 +1030)]
cdump: features which weren't in genparser

1) size_t bundling an unbundling.
2) CDUMP_IGNORE to avoid saving struct members.
3) const handling (ie. ignore the keyword).

10 years agocdump: first cut of translation of Tridge's genstruct junkcode.
Rusty Russell [Fri, 21 Jan 2011 03:35:08 +0000 (14:05 +1030)]
cdump: first cut of translation of Tridge's genstruct junkcode.

Mainly, all new bugs.

10 years agolca2011: hacky import of tevent.
Rusty Russell [Sat, 22 Jan 2011 03:39:59 +0000 (14:09 +1030)]
lca2011: hacky import of tevent.

10 years agolca2011: links and preparation
Rusty Russell [Wed, 26 Jan 2011 23:42:50 +0000 (10:12 +1030)]
lca2011: links and preparation

10 years agoccanlint: protect against the function element in the doc section being null
Brad Hards [Wed, 19 Jan 2011 06:03:32 +0000 (17:03 +1100)]
ccanlint: protect against the function element in the doc section being null

This can happen if the documentation doesn't have a properly formatted summary line,
and it causes the examples_relevant test to segfault.

10 years agoccanlint: always print \n at end of error message.
Rusty Russell [Sat, 22 Jan 2011 02:02:54 +0000 (12:32 +1030)]
ccanlint: always print \n at end of error message.

Brad Hards fixed a two places where score->error was not \n-terminated,
and then I found a few more, so make it automatic.

10 years agoccanlint: don't collect results from test children
Rusty Russell [Thu, 20 Jan 2011 01:01:11 +0000 (11:31 +1030)]
ccanlint: don't collect results from test children

This confuses the output, and makes us sometimes see spurious
failure.  At least we will still catch valgrind errors in
children of failtest, thanks to --error-exitcode=101.

10 years agoopt: correct description, and neaten main header order.
Rusty Russell [Tue, 18 Jan 2011 07:21:51 +0000 (17:51 +1030)]
opt: correct description, and neaten main header order.

Reordering header makes it more readable, and we don't rely on
getopt_long any more.

10 years agoccanlint: fix _info option handling
Rusty Russell [Tue, 18 Jan 2011 01:47:17 +0000 (12:17 +1030)]
ccanlint: fix _info option handling

Two places were using a bogus ccanlint struct: the side-effect was
that valgrind options didn't work, nor did license fixups.

Make REGISTER_TEST do the extern declaration, and remove the bogus
ones.

10 years agostrsplit: remove nump argument
Rusty Russell [Tue, 18 Jan 2011 00:44:46 +0000 (11:14 +1030)]
strsplit: remove nump argument

You can use talloc_array_length() to get the length of a tallocated array.

10 years agotalloc: talloc_array_length()
Rusty Russell [Tue, 18 Jan 2011 00:36:23 +0000 (11:06 +1030)]
talloc: talloc_array_length()

I originally called this talloc_length(), but SAMBA upstream uses
talloc_array_length.

10 years agoccanlint: -k all
Rusty Russell [Sun, 9 Jan 2011 02:50:14 +0000 (13:20 +1030)]
ccanlint: -k all

Use this to preserve the entire working directory.

10 years agoccanlint: -k should not pollute module directory.
Rusty Russell [Sun, 9 Jan 2011 02:49:15 +0000 (13:19 +1030)]
ccanlint: -k should not pollute module directory.

It leads to numerous problems, such as the next ccanlint getting confused
trying to compile examples, and "-k examples_compile -k examples_exist"
giving bogus errors.

So instead we leave the temporary dir lying around and delete
individual files which aren't marked "keep".

10 years agofailtest: free up everything on exit.
Rusty Russell [Tue, 18 Jan 2011 00:35:37 +0000 (11:05 +1030)]
failtest: free up everything on exit.

Otherwise valgrind will report that tests leak memory.

10 years agofailtest: failtest_restore.h as an antidote to function overload.
Rusty Russell [Tue, 18 Jan 2011 00:38:34 +0000 (11:08 +1030)]
failtest: failtest_restore.h as an antidote to function overload.

This makes some cases simpler, where you no longer want malloc etc.
to fail.

10 years agowwviaudio: spelling fix
Brad Hards [Sun, 16 Jan 2011 06:50:51 +0000 (17:50 +1100)]
wwviaudio: spelling fix

10 years agotdb2: spelling fix
Brad Hards [Sun, 16 Jan 2011 06:50:24 +0000 (17:50 +1100)]
tdb2: spelling fix

10 years agotdb: spelling fixes
Brad Hards [Sun, 16 Jan 2011 06:50:03 +0000 (17:50 +1100)]
tdb: spelling fixes

10 years agotap: spelling fix
Brad Hards [Sun, 16 Jan 2011 06:49:20 +0000 (17:49 +1100)]
tap: spelling fix

10 years agotalloc: spelling fix.
Brad Hards [Sun, 16 Jan 2011 06:48:53 +0000 (17:48 +1100)]
talloc: spelling fix.

10 years agorbtree: spelling fixes
Brad Hards [Sun, 16 Jan 2011 06:48:20 +0000 (17:48 +1100)]
rbtree: spelling fixes

10 years agoopt: spelling fixes.
Brad Hards [Sun, 16 Jan 2011 06:22:39 +0000 (17:22 +1100)]
opt: spelling fixes.

10 years agonfs: spelling fixes.
Brad Hards [Sun, 16 Jan 2011 06:22:14 +0000 (17:22 +1100)]
nfs: spelling fixes.

10 years agolist: spelling fixes
Brad Hards [Sun, 16 Jan 2011 06:21:39 +0000 (17:21 +1100)]
list: spelling fixes

10 years agoiscsi: spelling fixes.
Brad Hards [Sun, 16 Jan 2011 06:21:12 +0000 (17:21 +1100)]
iscsi: spelling fixes.

10 years agohash: spelling fix
Brad Hards [Sun, 16 Jan 2011 06:19:51 +0000 (17:19 +1100)]
hash: spelling fix

10 years agobtree: spelling fix
Brad Hards [Sun, 16 Jan 2011 06:19:12 +0000 (17:19 +1100)]
btree: spelling fix

10 years agociniparser: spelling fixes
Brad Hards [Sun, 16 Jan 2011 06:17:36 +0000 (17:17 +1100)]
ciniparser: spelling fixes

10 years agojunkcode: spelling fixes.
Brad Hards [Sun, 16 Jan 2011 06:16:46 +0000 (17:16 +1100)]
junkcode: spelling fixes.

10 years agoarray: spelling fixes.
Brad Hards [Sun, 16 Jan 2011 06:15:32 +0000 (17:15 +1100)]
array: spelling fixes.

10 years agostr: change example to match function being explained.
Brad Hards [Sun, 16 Jan 2011 05:22:46 +0000 (16:22 +1100)]
str: change example to match function being explained.

Looks like the example was copy-n-pasted from the previous entry.

10 years agoccanlint: check examples actually mention thing they are demonstrating.
Rusty Russell [Mon, 17 Jan 2011 05:50:15 +0000 (16:20 +1030)]
ccanlint: check examples actually mention thing they are demonstrating.

Brad suggested this after finding one such cut & paste in str:

rusty@vivaldi:~/devel/cvs/ccan/ccan/str$ ../../tools/ccanlint/ccanlint
Example: sections demonstrate appropriate function (examples_relevant): FAIL
/home/rusty/devel/cvs/ccan/ccan/str/str.h:64:Example for strcount doesn't mention it
Total score: 37/38

10 years agoccanlint: fix trailing / in -d.
Rusty Russell [Mon, 17 Jan 2011 05:49:13 +0000 (16:19 +1030)]
ccanlint: fix trailing / in -d.

Before:
$ tools/ccanlint/ccanlint -d ccan/talloc/
Module's source code has no trailing whitespace (no_trailing_whitespace): FAIL
: Total score: 0/1

After:
$ tools/ccanlint/ccanlint -d ccan/talloc/
Module's source code has no trailing whitespace (no_trailing_whitespace): FAIL
talloc: Total score: 0/1

10 years agoccanlint: score_file_error() takes printf-format
Rusty Russell [Mon, 17 Jan 2011 05:47:49 +0000 (16:17 +1030)]
ccanlint: score_file_error() takes printf-format

We simply build up the error string in score_file_error; a bit different
but simpler than current behaviour.  We keep around struct file_error
because some tests need it.

10 years agoccanlint: fix score for info_summary_single_line
Rusty Russell [Mon, 17 Jan 2011 05:34:42 +0000 (16:04 +1030)]
ccanlint: fix score for info_summary_single_line

My refactoring introduced a bug: we need to set score=1 for the success case.

10 years agociniparser: Separate summary line and description text for metadata
Brad Hards [Mon, 17 Jan 2011 03:02:36 +0000 (13:32 +1030)]
ciniparser: Separate summary line and description text for metadata

10 years agoblock_pool: Change metadata layout so initial description is all on one line.
Brad Hards [Mon, 17 Jan 2011 03:02:36 +0000 (13:32 +1030)]
block_pool: Change metadata layout so initial description is all on one line.

With the original layout, we got:
Summary:
An efficient allocator for blocks that don't need to be
....
Description:
resized or freed.

10 years agoccanlint: neaten info_summary_single_line with new doc_section info.
Rusty Russell [Mon, 17 Jan 2011 03:52:29 +0000 (14:22 +1030)]
ccanlint: neaten info_summary_single_line with new doc_section info.

10 years agoccanlint: keep mapping back to original source line for doc_extract
Rusty Russell [Mon, 17 Jan 2011 03:44:43 +0000 (14:14 +1030)]
ccanlint: keep mapping back to original source line for doc_extract

Makes reporting of documentation easier.

10 years agoccanlint: add test case for metadata summary line on a single separate line.
Brad Hards [Mon, 17 Jan 2011 03:02:36 +0000 (13:32 +1030)]
ccanlint: add test case for metadata summary line on a single separate line.

10 years agohtable: fix type of cmpfn in htable_type
Rusty Russell [Thu, 13 Jan 2011 08:55:01 +0000 (19:25 +1030)]
htable: fix type of cmpfn in htable_type

It in fact takes an object and a key to compare, not two keys.

The test case had the key as first element of the object, so it worked,
but ccanlint lost track of module dependencies due to this bug, and thus
would build submodules multiple times.

10 years agorbtree: fix allocation failre paths.
Rusty Russell [Mon, 10 Jan 2011 05:55:22 +0000 (16:25 +1030)]
rbtree: fix allocation failre paths.

10 years agorbtree: don't use temporary context to destroy rbtree
Rusty Russell [Mon, 10 Jan 2011 05:17:24 +0000 (15:47 +1030)]
rbtree: don't use temporary context to destroy rbtree

It leads to a memory leak if the allocation fails (as we reparent onto NULL).
Also, the extra allocation in the failure path increases test time for
failtest (under valgrind) by a factor of 2.

10 years agorbtree: use failtest to check handling of allocation failures.
Rusty Russell [Mon, 10 Jan 2011 05:53:46 +0000 (16:23 +1030)]
rbtree: use failtest to check handling of allocation failures.

Unfortunately this means we have to reduce run-many from 1000 nodes to 100
(as forking under valgrind is really slow: test takes about 2 minutes with
100 nodes).

10 years agorbtree: fix memory leak in tests
Rusty Russell [Mon, 10 Jan 2011 05:51:24 +0000 (16:21 +1030)]
rbtree: fix memory leak in tests

The data is not made a child of the tree: the nodes are made children of the
data.  So we must explicitly free the data objects.

10 years agorbtree: vary insert and delete orders in test
Rusty Russell [Mon, 10 Jan 2011 05:55:48 +0000 (16:25 +1030)]
rbtree: vary insert and delete orders in test

This covers more code than simply doing an ordered delete/insert.

10 years agotalloc: allow replacement allocator
Rusty Russell [Mon, 10 Jan 2011 03:36:40 +0000 (14:06 +1030)]
talloc: allow replacement allocator

This allows us to both allocators which handle failure themselves, and
allocators which insert failures.

10 years agotalloc: fixed a use after free error
Rusty Russell [Mon, 10 Jan 2011 05:32:03 +0000 (16:02 +1030)]
talloc: fixed a use after free error

(Import from SAMBA commit 6f51a1f45bf4de062cce7a562477e8140630a53d):

this is the minimal fix for the problem Rusty found. I previously
thought that the best fix would be to change tc->parent to be valid
for all pointers, but that is expensive for realloc with large numbers
of child pointers, which is much more commmon than I expected it to
be.

10 years agotalloc: use failtest to test failure paths.
Rusty Russell [Mon, 10 Jan 2011 03:31:47 +0000 (14:01 +1030)]
talloc: use failtest to test failure paths.

10 years agofailtest: new module.
Rusty Russell [Mon, 10 Jan 2011 04:12:38 +0000 (14:42 +1030)]
failtest: new module.

A module designed to help test "never fails" functions like malloc.

10 years agotap: add fail callback
Rusty Russell [Mon, 10 Jan 2011 05:30:48 +0000 (16:00 +1030)]
tap: add fail callback

This is useful for failtest, so we can abort on first failure.

10 years agoccanlint: fix and simplify depends-accurate (with strreg)
Rusty Russell [Sun, 9 Jan 2011 01:26:41 +0000 (11:56 +1030)]
ccanlint: fix and simplify depends-accurate (with strreg)

10 years agoccanlint: fix total score for running examples
Rusty Russell [Sat, 8 Jan 2011 09:39:25 +0000 (20:09 +1030)]
ccanlint: fix total score for running examples

Don't count examples which didn't compile (expected, as we mangle them in
various different ways).

10 years agoccanlint: fix uninitialized variable
Rusty Russell [Sat, 8 Jan 2011 10:13:59 +0000 (20:43 +1030)]
ccanlint: fix uninitialized variable

10 years agoccanlint: use strreg for section extraction.
Rusty Russell [Sat, 8 Jan 2011 08:07:19 +0000 (18:37 +1030)]
ccanlint: use strreg for section extraction.

Makes it simpler and clearer.

10 years agoMakefile: append git revision to "make scores"
Rusty Russell [Sat, 8 Jan 2011 08:06:56 +0000 (18:36 +1030)]
Makefile: append git revision to "make scores"

Good for testing ccanlint changes.

10 years agostr_talloc: strreg
Rusty Russell [Sat, 8 Jan 2011 02:45:35 +0000 (13:15 +1030)]
str_talloc: strreg

Useful wrapper for extended POSIX regular expressions.

10 years agostr: strcount
Rusty Russell [Fri, 7 Jan 2011 23:47:37 +0000 (10:17 +1030)]
str: strcount

Useful routine to count number of matches in a string.

10 years agostr: clean up tests so ccanlint doesn't complain about memory leaking.
Rusty Russell [Thu, 6 Jan 2011 03:50:26 +0000 (14:20 +1030)]
str: clean up tests so ccanlint doesn't complain about memory leaking.

10 years agoccanlint: use positive description for test_pass_valgrind_noleaks
Rusty Russell [Fri, 7 Jan 2011 11:51:29 +0000 (22:21 +1030)]
ccanlint: use positive description for test_pass_valgrind_noleaks

A bit more awkward, but more consistent with everything else.

10 years agoccanlint: print keys in output
Rusty Russell [Fri, 7 Jan 2011 11:50:44 +0000 (22:20 +1030)]
ccanlint: print keys in output

Since test keys are used for --target=, this is useful.

10 years agoccanlint: rename files to match keys
Rusty Russell [Fri, 7 Jan 2011 11:50:13 +0000 (22:20 +1030)]
ccanlint: rename files to match keys

10 years agoccanlint: rename structures to match keys
Rusty Russell [Fri, 7 Jan 2011 11:50:04 +0000 (22:20 +1030)]
ccanlint: rename structures to match keys

10 years agoccanlint: list dependencies by key
Rusty Russell [Fri, 7 Jan 2011 11:49:49 +0000 (22:19 +1030)]
ccanlint: list dependencies by key

Joey Adams also pointed out that we should use strings for the dependency
lists.  Moving them into the structure also somewhat simplifies it.

10 years agoccanlint: rename test keys
Rusty Russell [Fri, 7 Jan 2011 11:48:41 +0000 (22:18 +1030)]
ccanlint: rename test keys

Joey Adams rightly points out that the current keys are a mess: ideally the
filenames, test keys and structure names in ccanlint should be the same.

First step is to make the test names all regular, of basic form <noun>_<verb>
(eg "tests_exist" rather than "has-tests").

10 years agoAdd scores/ directory to .gitignore.
Rusty Russell [Fri, 7 Jan 2011 02:52:43 +0000 (13:22 +1030)]
Add scores/ directory to .gitignore.

10 years agoccanlint: added --test-dep-graph option
Joey Adams [Thu, 6 Jan 2011 20:35:51 +0000 (15:35 -0500)]
ccanlint: added --test-dep-graph option

This option prints the dependency graph of ccanlint's tests
in Graphviz .dot format.

Sample usage:

ccanlint --test-dep-graph | dot -Tpng > out.png && eog out.png