App-MtAws

 view release on metacpan or  search on metacpan

t/integration/metadata.t  view on Meta::CPAN

		$old_encoded_lenth = $encoded_length;
		$old_strlen = $strlen;
	}
}

# test increment of length of resulting data
{
	for my $str1 (qw/ ! a b c d e f _ ß µ Ũ  а б в г д е ё ж з и к л м н о п р с т у ф ц ч ш щ э ю я А Б В Г Д Е Ё Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я/) {
		for my $str2 (qw/a hello/, qq!file1/file2/file3/file4!, qq!длинный русский текст!, qq!/!) {
			my $source = $str1.$str2;
			my $encoded = App::MtAws::MetaData::meta_encode($source, 1234);
			my ($decoded, $mtime) = App::MtAws::MetaData::meta_decode($encoded);
			ok $source eq $decoded;
			ok $mtime = 1234;
		}
	}
}

sub test_undefined
{
	my ($str, $msg) = @_;
	ok !defined App::MtAws::MetaData::meta_decode($str), "$msg (scalar)";
	my @a = App::MtAws::MetaData::meta_decode($str);
	is scalar @a, 0, "$msg (array)";
}

# test error catch while decoding
{
	test_undefined 'zzz', 'should return undef if no marker present';
	test_undefined 'mt2 zzz', 'should return undef if utf is broken';
	test_undefined 'mt2 !!!!', 'should return undef if base64 is broken';
	test_undefined 'mt2 z+z', 'should return undef if base64 is broken';
	ok defined App::MtAws::MetaData::meta_decode('mt2 '._encode_base64url('{ "filename": "a", "mtime": "20080102T222324Z"}').'=='), 'should allow base64 padding';
	ok defined App::MtAws::MetaData::meta_decode('mt2 '._encode_base64url('{ "filename": "a", "mtime": "20080102T222324Z"}').'='), 'should allow base64 padding';
	test_undefined 'mt2 '._encode_base64url('{ "filename": "a", "mtime": "20081515T222324Z"}'), 'should return undef if mtime is broken';
	test_undefined 'mt2 '._encode_base64url('ff'), 'should return undef if json is broken';
	test_undefined 'mt2 '._encode_base64url('{ "a": 1, "x": 2}'), 'should return undef if filename and mtime missed';
	test_undefined 'mt2 '._encode_base64url('{ "filename": "f", "x": 2}'), 'should return undef if mtime missed';
	test_undefined 'mt2 '._encode_base64url('{ "x": 1, "mtime": 2}'), 'should return undef if filename missed';
	test_undefined 'mt2 '._encode_base64url('{ "filename": "a", "mtime": "zzz"}'), 'should return undef if time is broken';
	test_undefined 'mt2 '._encode_base64url('{ "filename": "'.('x' x 1024).'", "mtime": 1}'), 'should return undef if b64 too big';
	test_undefined 'mt2 '._encode_base64url('{ "filename": "f", "mtime": "20081302T222324Z"}'), 'should return undef if b64 too big';

	test_undefined '', 'should return undef, without warning, if input is empty string';
	test_undefined ' ', 'should return undef, without warning, if input is space';
	test_undefined '  ', 'should return undef, without warning, if input is multiple spaces';
	test_undefined undef, 'should return undef, without warning, if input is undef';
	ok !defined App::MtAws::MetaData::meta_decode(), 'should return undef, without warning, if input is empty list';

	for (qw/mt1 mt2/) {
		ok !defined App::MtAws::MetaData::meta_decode("$_"), 'should return undef, without warning, if input is marker plus empty string';
		ok !defined App::MtAws::MetaData::meta_decode("$_ "), 'should return undef, without warning, if input is marker plus space';
		ok !defined App::MtAws::MetaData::meta_decode("$_ "), 'should return undef, without warning, if input is marker plus multiple spaces';
	}

	ok defined App::MtAws::MetaData::meta_decode('mt2   '._encode_base64url('{ "filename": "a", "mtime": "20080102T222324Z"}')), 'should allow few spaces';
	ok defined App::MtAws::MetaData::meta_decode("mt2\t\t"._encode_base64url('{ "filename": "a", "mtime": "20080102T222324Z"}')), 'should allow tabs';
	ok defined App::MtAws::MetaData::meta_decode(" \tmt2\t\t "._encode_base64url('{ "filename": "a", "mtime": "20080102T222324Z"}')), 'should allow leading spaces';

	eval { App::MtAws::MetaData::meta_decode('zzz') };
	ok $@ eq '', 'should not override eval code'; # it looks now that those tests are broken

	eval { App::MtAws::MetaData::meta_decode('mt2 zzz') };
	ok $@ eq '', 'should not override eval code'; # it looks now that those tests are broken




}


# test error cacth while encoding
{
	ok defined App::MtAws::MetaData::meta_encode('filename', -1), 'should not catch negative mtime';
	ok !defined App::MtAws::MetaData::meta_encode('filename', -30639629694), 'should disallow time before Y1000';
	ok !defined App::MtAws::MetaData::meta_encode('filename'), 'should catche missed mtime';
	ok !defined App::MtAws::MetaData::meta_encode(undef, 4), 'should catche missed filename';
	ok defined App::MtAws::MetaData::meta_encode('filename', 0), 'should allow 0 mtime';
	ok !defined App::MtAws::MetaData::meta_encode('f' x 1024, 0), 'should catch too big string';
	ok defined App::MtAws::MetaData::meta_encode('я' x 350, 0), 'should allow 350 UTF 2 bytes characters';
	ok defined App::MtAws::MetaData::meta_encode('z' x 700, 0), 'should allow 700 ASCII characters';
}


# check catching for undef - warning duplicate test found in unit tests
{
	my $called;
	local *App::MtAws::MetaData::decode = sub { $called = 1 };
	ok defined App::MtAws::MetaData::_decode_utf8 encode("UTF-8", "тест");
	ok ($called, "_decode_utf8 calls App::MtAws::MetaData::decode (which is Encode::decode)");
	$called = 0;
	ok !defined App::MtAws::MetaData::_decode_utf8 undef;
	ok !$called, "_decode_utf8 retruns undef even without calling Encode::decode";
}

#
# testing jobs metadata
#

ok App::MtAws::MetaData::meta_job_encode("x");
ok ! defined App::MtAws::MetaData::meta_job_encode("x" x 1024);

for (qw/full 0 x тест µ/, '') {
	cmp_deeply [App::MtAws::MetaData::meta_job_decode(App::MtAws::MetaData::meta_job_encode($_))], [$_], "should decode jobs metadata";
}
cmp_deeply [App::MtAws::MetaData::meta_job_decode('mtijob1 eyJ0eXBlIjoiZnVsbCJ9')], ['full'], "should decode jobs metadata";

{
	my $without_type = "mtijob1 ".App::MtAws::MetaData::_encode_b64(App::MtAws::MetaData::_encode_json({ x => 'y' }));
	ok ! defined App::MtAws::MetaData::meta_job_decode($without_type), "should return undef in case there is no type";
	my @r = App::MtAws::MetaData::meta_job_decode($without_type);
	is scalar @r, 0, "should return empty list in case there is no type";
}

ok ! defined App::MtAws::MetaData::meta_job_decode(undef), 'should return undef if input undef';
ok ! defined App::MtAws::MetaData::meta_job_decode(), 'should return undef if input empty';
ok ! defined App::MtAws::MetaData::meta_job_decode('mtijob11 eyJ0eXBlIjoiZnVsbCJ9'), 'should return undef if wrong marker';
ok ! defined App::MtAws::MetaData::meta_job_decode('mt1 eyJ0eXBlIjoiZnVsbCJ9'), 'should return undef if wrong marker';
ok ! defined App::MtAws::MetaData::meta_job_decode('zzz'), 'should return undef if no marker present';
ok ! defined App::MtAws::MetaData::meta_job_decode('mtijob1 zzz'), 'should return undef if utf is broken';
ok ! defined App::MtAws::MetaData::meta_job_decode('mtijob1 !!!!'), 'should return undef if base64 is broken';
ok ! defined App::MtAws::MetaData::meta_job_decode('mtijob1 z+z'), 'should return undef if base64 is broken';
ok ! defined App::MtAws::MetaData::meta_job_decode('mtijob1 '._encode_base64url('ff')), 'should return undef if json is broken';



( run in 1.010 second using v1.01-cache-2.11-cpan-ceb78f64989 )