1#!/usr/bin/perl -wT
2
3# Before `make install' is performed this script should be runnable with
4# `make test'. After `make install' it should work as `perl Mail-OpenDKIM.t'
5
6#########################
7
8use Test::More tests => 15;
9use Error qw(:try);
10BEGIN { use_ok('Mail::OpenDKIM') };
11
12#########################
13
14OpenDKIM: {
15
16my $msg = <<'EOF';
17From: Nigel Horne <njh@example.com>
18To: Self <njh@example.com>
19Subject: Testing
20
21Can you hear me, Mother?
22EOF
23
24	my $o = new_ok('Mail::OpenDKIM');
25	ok($o->dkim_init());
26
27	my $d;
28
29	try {
30		$d = $o->dkim_sign({
31			id => 'MLM',
32			secretkey => '11111',
33			selector => 'example',
34			domain => 'example.com',
35			hdrcanon_alg => DKIM_CANON_RELAXED,
36			bodycanon_alg => DKIM_CANON_RELAXED,
37			sign_alg => DKIM_SIGN_RSASHA1,
38			length => -1,
39		});
40
41		ok(defined($d));
42
43		# d is a Mail::OpenDKIM::DKIM object
44	} catch Error with {
45		my $ex = shift;
46		fail($ex->stringify);
47	};
48
49	isa_ok($d, 'Mail::OpenDKIM::DKIM');
50
51	$msg =~ s/\n/\r\n/g;
52
53	ok($d->dkim_chunk({ chunkp => $msg, len => length($msg) }) == DKIM_STAT_OK);
54
55	# Flag no more data to come
56	ok($d->dkim_chunk({ chunkp => '', len => 0 }) == DKIM_STAT_OK);
57
58	# Will fail because the secret key isn't valid
59	ok($d->dkim_eom() == DKIM_STAT_NORESOURCE);
60
61	ok($d->dkim_geterror() eq 'd2i_PrivateKey_bio() failed');
62
63	my $args = {
64		buf => 0 x 256,
65		len => 10,
66		initial => 0
67	};
68
69	my $version = Mail::OpenDKIM::dkim_libversion();
70
71	if($version >= 0x2040000) {
72		# Will fail because the private key failed to load
73		ok($d->dkim_getsighdr($args) == DKIM_STAT_INVALID);
74	} else {
75		# 10 characters isn't long enough for a DKIM_SIGNATURE header
76		ok($d->dkim_getsighdr($args) == DKIM_STAT_NORESOURCE);
77	}
78
79	$args->{len} = 256;
80
81	if($version >= 2040000) {
82		# Will fail because the private key failed to load
83		ok($d->dkim_getsighdr($args) == DKIM_STAT_INVALID);
84		like($d->dkim_geterror(), qr/private key load failure/);
85		ok(1);
86	} else {
87		ok($d->dkim_getsighdr($args) == DKIM_STAT_OK);
88
89		# diag("Buf = $$args{buf}");
90
91		like($$args{buf}, qr/a=rsa-sha1/);
92		like($$args{buf}, qr/d=example.com/);
93	}
94
95	ok($d->dkim_free() == DKIM_STAT_OK);
96
97	$o->dkim_close();
98
99	try {
100		$o->dkim_close();
101		fail();
102	} catch Error with {
103		my $ex = shift;
104		like($ex, qr/dkim_close called before dkim_init/);
105	};
106}
107