swift/test/unit/cli/test_form_signature.py
Samuel Merritt 2b55709625 Make swift-form-signature output a sample form
swift-form-signature would give you the required expiration-time and
HMAC signature, but it wouldn't help you actually construct the HTML
form. To do that, you had to go look at the formpost middleware's doc
string and make up a form yourself.

For convenience, this commit makes swift-form-signature output a
sample form with the computed values filled in already; the user only
needs to fill in the Swift cluster's hostname.

Change-Id: I70d70a648b78b382dbfbe8ff918e6158a7f6a0ab
2014-08-05 11:11:03 -07:00

75 lines
2.5 KiB
Python

# -*- coding: utf-8 -*-
# Copyright (c) 2014 Samuel Merritt <sam@swiftstack.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import hashlib
import hmac
import mock
import unittest
from StringIO import StringIO
from swift.cli import form_signature
class TestFormSignature(unittest.TestCase):
def test_prints_signature(self):
the_time = 1406143563.020043
key = 'secret squirrel'
expires = 3600
path = '/v1/a/c/o'
redirect = 'https://example.com/done.html'
max_file_size = str(int(1024 * 1024 * 1024 * 3.14159)) # π GiB
max_file_count = '3'
expected_signature = hmac.new(
key,
"\n".join((
path, redirect, max_file_size, max_file_count,
str(int(the_time + expires)))),
hashlib.sha1).hexdigest()
out = StringIO()
with mock.patch('swift.cli.form_signature.time', lambda: the_time):
with mock.patch('sys.stdout', out):
exitcode = form_signature.main([
'/path/to/swift-form-signature',
path, redirect, max_file_size,
max_file_count, str(expires), key])
self.assertEqual(exitcode, 0)
self.assertTrue("Signature: %s" % expected_signature
in out.getvalue())
self.assertTrue("Expires: %d" % (the_time + expires,)
in out.getvalue())
sig_input = ('<input type="hidden" name="signature" value="%s" />'
% expected_signature)
self.assertTrue(sig_input in out.getvalue())
def test_too_few_args(self):
out = StringIO()
with mock.patch('sys.stdout', out):
exitcode = form_signature.main([
'/path/to/swift-form-signature',
'/v1/a/c/o', '', '12', '34', '3600'])
self.assertNotEqual(exitcode, 0)
usage = 'Syntax: swift-form-signature <path>'
self.assertTrue(usage in out.getvalue())
if __name__ == '__main__':
unittest.main()