File Coverage

S3TestUtils.pm
Criterion Covered Total %
statement 36 82 43.9
branch 4 18 22.2
condition 3 19 15.7
subroutine 11 16 68.7
pod 0 7 0.0
total 54 142 38.0


line stmt bran cond sub pod time code
1             package S3TestUtils;
2              
3 4     4   711592 use strict;
  4         8  
  4         161  
4 4     4   25 use warnings;
  4         10  
  4         246  
5              
6 4     4   705 use Data::Dumper;
  4         11946  
  4         322  
7 4     4   27 use English qw(-no_match_vars);
  4         24  
  4         36  
8 4     4   1885 use List::Util qw(any);
  4         20  
  4         419  
9 4     4   3624 use Readonly;
  4         18720  
  4         256  
10 4     4   1250 use Test::More;
  4         213349  
  4         48  
11              
12 4     4   2109 use parent qw(Exporter);
  4         372  
  4         40  
13              
14             # chars
15             Readonly our $EMPTY => q{};
16             Readonly our $SLASH => q{/};
17              
18             # booleans
19             Readonly our $TRUE => 1;
20             Readonly our $FALSE => 0;
21              
22             # mocking services
23             Readonly our $DEFAULT_LOCAL_STACK_HOST => 'localhost:4566';
24             Readonly our $DEFAULT_MINIO_HOST => 'localhost:9000';
25              
26             # http codes
27             Readonly our $HTTP_OK => '200';
28             Readonly our $HTTP_FORBIDDEN => '403';
29             Readonly our $HTTP_CONFLICT => '409';
30              
31             # misc
32             Readonly our $TEST_BUCKET_PREFIX => 'net-amazon-s3-test';
33              
34             # create a domain name for this if AMAZON_S3_DNS_BUCKET_NAMES is true
35             Readonly our $MOCK_SERVICES_BUCKET_NAME => $TEST_BUCKET_PREFIX . '-test';
36              
37             Readonly our $PUBLIC_READ_POLICY => <
38            
39            
40             xsi:type="Group">
41             http://acs.amazonaws.com/groups/global/AllUsers
42            
43             READ
44            
45             END_OF_POLICY
46              
47             our %EXPORT_TAGS = (
48             constants => [
49             qw(
50             $EMPTY
51             $SLASH
52             $TRUE
53             $FALSE
54             $DEFAULT_LOCAL_STACK_HOST
55             $HTTP_OK
56             $HTTP_CONFLICT
57             $HTTP_FORBIDDEN
58             $TEST_BUCKET_PREFIX
59             $MOCK_SERVICES_BUCKET_NAME
60             $PUBLIC_READ_POLICY
61             )
62             ],
63             subs => [
64             qw(
65             add_keys
66             check_test_bucket
67             create_bucket
68             get_s3_service
69             is_aws
70             make_bucket_name
71             set_s3_host
72             )
73             ],
74             );
75              
76             our @EXPORT_OK = map { @{ $EXPORT_TAGS{$_} } } ( keys %EXPORT_TAGS );
77              
78             ########################################################################
79             sub make_bucket_name {
80             ########################################################################
81 1 50   1 0 6 return $MOCK_SERVICES_BUCKET_NAME
82             if !is_aws();
83              
84 1         9 my $suffix = eval {
85 1         835 require Data::UUID;
86              
87 1         1511 return lc Data::UUID->new->create_str();
88             };
89              
90 0         0 $suffix //= join $EMPTY, map { ( 'A' .. 'Z', 'a' .. 'z', 0 .. 9 )[$_] }
91 1   33     5 map { int rand 62 } ( 0 .. 15 );
  0         0  
92              
93 1         9 my $bucket_name = sprintf '%s-%s', $TEST_BUCKET_PREFIX, $suffix;
94              
95 1         11 return $bucket_name;
96             }
97              
98             ########################################################################
99             sub is_aws {
100             ########################################################################
101             return ( $ENV{AMAZON_S3_LOCALSTACK} || $ENV{AMAZON_S3_MINIO} )
102 1 50 33 1 0 14 ? $FALSE
103             : $TRUE;
104             }
105              
106             ########################################################################
107             sub check_test_bucket {
108             ########################################################################
109 0     0 0 0 my ($s3) = @_;
110              
111             # list all buckets that I own
112 0         0 my $response = eval { return $s3->buckets; };
  0         0  
113              
114 0 0 0     0 if ( $EVAL_ERROR || !$response ) {
115 0         0 diag( Dumper( [ error => [ $response, $s3->err, $s3->errstr, $s3->error ] ] ) );
116              
117 0         0 BAIL_OUT($EVAL_ERROR);
118             }
119              
120             my ( $owner_id, $owner_displayname )
121 0         0 = @{$response}{qw(owner_id owner_displayname)};
  0         0  
122              
123 0         0 my $bucket_name = make_bucket_name();
124              
125 0         0 my @buckets = map { $_->{bucket} } @{ $response->{buckets} };
  0         0  
  0         0  
126              
127 0 0   0   0 if ( any { $_ =~ /$bucket_name/xsm } @buckets ) {
  0         0  
128 0         0 BAIL_OUT( 'test bucket already exists: ' . $bucket_name );
129             }
130              
131 0         0 return ( $owner_id, $owner_displayname );
132             }
133              
134             ########################################################################
135             sub set_s3_host {
136             ########################################################################
137 4     4 0 899877 my $host = $ENV{AMAZON_S3_HOST};
138              
139 4   50     39 $host //= 's3.amazonaws.com';
140              
141             ## no critic (RequireLocalizedPunctuationVars)
142              
143 4 50       29 if ( $ENV{AMAZON_S3_LOCALSTACK} ) {
    50          
144              
145 0   0     0 $host //= $DEFAULT_LOCAL_STACK_HOST;
146              
147 0         0 $ENV{AWS_ACCESS_KEY_ID} = 'test';
148              
149 0         0 $ENV{AWS_SECRET_ACCESS_KEY} = 'test';
150              
151 0         0 $ENV{AMAZON_S3_SKIP_ACLS} = $TRUE;
152              
153 0         0 $ENV{AMAZON_S3_EXPENSIVE_TESTS} = $TRUE;
154             }
155             elsif ( exists $ENV{AMAZON_S3_MINIO} ) {
156              
157 0   0     0 $host //= $DEFAULT_MINIO_HOST;
158              
159 0         0 $ENV{AMAZON_S3_SKIP_ACLS} = $TRUE;
160              
161 0         0 $ENV{AMAZON_S3_EXPENSIVE_TESTS} = $TRUE;
162              
163 0         0 $ENV{AMAZON_S3_SKIP_REGION_CONSTRAINT_TEST} = $TRUE;
164             }
165              
166 4         18 return $host;
167             }
168              
169             ########################################################################
170             sub get_s3_service {
171             ########################################################################
172 0     0 0   my ($host) = @_;
173              
174 0           my $s3 = eval {
175              
176 0 0         if ( $ENV{AMAZON_S3_CREDENTIALS} ) {
177 0           require Amazon::Credentials;
178              
179             return Amazon::S3->new(
180             { credentials => Amazon::Credentials->new,
181             host => $host,
182             secure => is_aws(),
183             dns_bucket_names => $ENV{AMAZON_S3_DNS_BUCKET_NAMES},
184 0 0         level => $ENV{DEBUG} ? 'trace' : 'error',
185             }
186             );
187              
188             }
189             else {
190             return Amazon::S3->new(
191             { aws_access_key_id => $ENV{AWS_ACCESS_KEY_ID},
192             aws_secret_access_key => $ENV{AWS_SECRET_ACCESS_KEY},
193             token => $ENV{AWS_SESSION_TOKEN},
194             host => $host,
195             secure => is_aws(),
196             dns_bucket_names => $ENV{AMAZON_S3_DNS_BUCKET_NAMES},
197 0 0         level => $ENV{DEBUG} ? 'trace' : 'error',
198             }
199             );
200             }
201             };
202              
203 0           return $s3;
204             }
205              
206             ########################################################################
207             sub create_bucket {
208             ########################################################################
209 0     0 0   my ( $s3, $bucket_name ) = @_;
210              
211 0           $bucket_name = $SLASH . $bucket_name;
212              
213             my $bucket_obj
214 0           = eval { return $s3->add_bucket( { bucket => $bucket_name } ); };
  0            
215              
216 0           return $bucket_obj;
217             }
218              
219             ########################################################################
220             sub add_keys {
221             ########################################################################
222 0     0 0   my ( $bucket_obj, $max_keys, $prefix ) = @_;
223              
224 0   0       $prefix //= q{};
225              
226 0           foreach my $key ( 1 .. $max_keys ) {
227 0           my $keyname = sprintf '%stesting-%02d.txt', $prefix, $key;
228 0           my $value = 'T';
229              
230 0           $bucket_obj->add_key( $keyname, $value );
231             }
232              
233 0           return $max_keys;
234             }
235              
236             1;