blob: 516226a9f682bce57801c097275e5e465d791be0 [file] [log] [blame]
#!/usr/bin/env python
#
# Copyright 2007 Google Inc.
#
# 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.
#
"""Tests for google.apphosting.tools.devappserver2.devappserver2."""
import argparse
import getpass
import itertools
import os
import os.path
import sys
import tempfile
import unittest
import google
import mox
from google.appengine.tools.devappserver2 import devappserver2
class WinError(Exception):
pass
class GenerateStoragePathsTest(unittest.TestCase):
"""Tests for devappserver._generate_storage_paths."""
def setUp(self):
self.mox = mox.Mox()
self.mox.StubOutWithMock(getpass, 'getuser')
self.mox.StubOutWithMock(tempfile, 'gettempdir')
def tearDown(self):
self.mox.UnsetStubs()
@unittest.skipUnless(sys.platform.startswith('win'), 'Windows only')
def test_windows(self):
tempfile.gettempdir().AndReturn('/tmp')
self.mox.ReplayAll()
self.assertEqual(
[os.path.join('/tmp', 'appengine.myapp'),
os.path.join('/tmp', 'appengine.myapp.1'),
os.path.join('/tmp', 'appengine.myapp.2')],
list(itertools.islice(devappserver2._generate_storage_paths('myapp'),
3)))
self.mox.VerifyAll()
@unittest.skipIf(sys.platform.startswith('win'), 'not on Windows')
def test_working_getuser(self):
getpass.getuser().AndReturn('johndoe')
tempfile.gettempdir().AndReturn('/tmp')
self.mox.ReplayAll()
self.assertEqual(
[os.path.join('/tmp', 'appengine.myapp.johndoe'),
os.path.join('/tmp', 'appengine.myapp.johndoe.1'),
os.path.join('/tmp', 'appengine.myapp.johndoe.2')],
list(itertools.islice(devappserver2._generate_storage_paths('myapp'),
3)))
self.mox.VerifyAll()
@unittest.skipIf(sys.platform.startswith('win'), 'not on Windows')
def test_broken_getuser(self):
getpass.getuser().AndRaise(Exception())
tempfile.gettempdir().AndReturn('/tmp')
self.mox.ReplayAll()
self.assertEqual(
[os.path.join('/tmp', 'appengine.myapp'),
os.path.join('/tmp', 'appengine.myapp.1'),
os.path.join('/tmp', 'appengine.myapp.2')],
list(itertools.islice(devappserver2._generate_storage_paths('myapp'),
3)))
self.mox.VerifyAll()
class GetStoragePathTest(unittest.TestCase):
"""Tests for devappserver._get_storage_path."""
def setUp(self):
self.mox = mox.Mox()
self.mox.StubOutWithMock(devappserver2, '_generate_storage_paths')
def tearDown(self):
self.mox.UnsetStubs()
def test_no_path_given_directory_does_not_exist(self):
path = tempfile.mkdtemp()
os.rmdir(path)
devappserver2._generate_storage_paths('example.com_myapp').AndReturn([path])
self.mox.ReplayAll()
self.assertEqual(
path,
devappserver2._get_storage_path(None, 'dev~example.com:myapp'))
self.mox.VerifyAll()
self.assertTrue(os.path.isdir(path))
def test_no_path_given_directory_exists(self):
path1 = tempfile.mkdtemp()
os.chmod(path1, 0777)
path2 = tempfile.mkdtemp() # Made with mode 0700.
devappserver2._generate_storage_paths('example.com_myapp').AndReturn(
[path1, path2])
self.mox.ReplayAll()
if sys.platform == 'win32':
expected_path = path1
else:
expected_path = path2
self.assertEqual(
expected_path,
devappserver2._get_storage_path(None, 'dev~example.com:myapp'))
self.mox.VerifyAll()
def test_path_given_does_not_exist(self):
path = tempfile.mkdtemp()
os.rmdir(path)
self.assertEqual(
path,
devappserver2._get_storage_path(path, 'dev~example.com:myapp'))
self.assertTrue(os.path.isdir(path))
def test_path_given_not_directory(self):
_, path = tempfile.mkstemp()
self.assertRaises(
IOError,
devappserver2._get_storage_path, path, 'dev~example.com:myapp')
def test_path_given_exists(self):
path = tempfile.mkdtemp()
self.assertEqual(
path,
devappserver2._get_storage_path(path, 'dev~example.com:myapp'))
class PortParserTest(unittest.TestCase):
def test_valid_port(self):
self.assertEqual(8080, devappserver2.PortParser()('8080'))
def test_port_zero_allowed(self):
self.assertEqual(0, devappserver2.PortParser()('0'))
def test_port_zero_not_allowed(self):
self.assertRaises(argparse.ArgumentTypeError,
devappserver2.PortParser(allow_port_zero=False), '0')
def test_negative_port(self):
self.assertRaises(argparse.ArgumentTypeError, devappserver2.PortParser(),
'-1')
def test_port_too_high(self):
self.assertRaises(argparse.ArgumentTypeError, devappserver2.PortParser(),
'65536')
def test_port_max_value(self):
self.assertEqual(65535, devappserver2.PortParser()('65535'))
def test_not_an_int(self):
self.assertRaises(argparse.ArgumentTypeError, devappserver2.PortParser(),
'a port')
class ParseMaxServerInstancesTest(unittest.TestCase):
def test_single_valid_arg(self):
self.assertEqual(1, devappserver2.parse_max_module_instances('1'))
def test_single_zero_arg(self):
self.assertRaisesRegexp(argparse.ArgumentTypeError,
'count must be greater than zero',
devappserver2.parse_max_module_instances, '0')
def test_single_negative_arg(self):
self.assertRaisesRegexp(argparse.ArgumentTypeError,
'count must be greater than zero',
devappserver2.parse_max_module_instances, '-1')
def test_single_nonint_arg(self):
self.assertRaisesRegexp(argparse.ArgumentTypeError,
'Invalid max instance count:',
devappserver2.parse_max_module_instances, 'cat')
def test_multiple_valid_args(self):
self.assertEqual(
{'default': 10,
'foo': 5},
devappserver2.parse_max_module_instances('default:10,foo:5'))
def test_multiple_non_colon(self):
self.assertRaisesRegexp(
argparse.ArgumentTypeError,
'Expected "module:max_instance_count"',
devappserver2.parse_max_module_instances, 'default:10,foo')
def test_multiple_non_int(self):
self.assertRaisesRegexp(
argparse.ArgumentTypeError,
'Expected "module:max_instance_count"',
devappserver2.parse_max_module_instances, 'default:cat')
def test_duplicate_modules(self):
self.assertRaisesRegexp(
argparse.ArgumentTypeError,
'Duplicate max instance count',
devappserver2.parse_max_module_instances, 'default:5,default:10')
def test_multiple_with_zero(self):
self.assertRaisesRegexp(
argparse.ArgumentTypeError,
'count for module zero must be greater than zero',
devappserver2.parse_max_module_instances, 'default:5,zero:0')
def test_multiple_with_negative(self):
self.assertRaisesRegexp(
argparse.ArgumentTypeError,
'count for module negative must be greater than zero',
devappserver2.parse_max_module_instances, 'default:5,negative:-1')
def test_multiple_missing_name(self):
self.assertEqual(
{'default': 10},
devappserver2.parse_max_module_instances(':10'))
def test_multiple_missing_count(self):
self.assertRaisesRegexp(
argparse.ArgumentTypeError,
'Expected "module:max_instance_count"',
devappserver2.parse_max_module_instances, 'default:')
class ParseThreadsafeOverrideTest(unittest.TestCase):
def test_single_valid_arg(self):
self.assertTrue(devappserver2.parse_threadsafe_override('True'))
self.assertFalse(devappserver2.parse_threadsafe_override('No'))
def test_single_nonbool_art(self):
self.assertRaisesRegexp(
argparse.ArgumentTypeError, 'Invalid threadsafe override',
devappserver2.parse_threadsafe_override, 'okaydokey')
def test_multiple_valid_args(self):
self.assertEqual(
{'default': False,
'foo': True},
devappserver2.parse_threadsafe_override('default:False,foo:True'))
def test_multiple_non_colon(self):
self.assertRaisesRegexp(
argparse.ArgumentTypeError, 'Expected "module:threadsafe_override"',
devappserver2.parse_threadsafe_override, 'default:False,foo')
def test_multiple_non_int(self):
self.assertRaisesRegexp(
argparse.ArgumentTypeError, 'Expected "module:threadsafe_override"',
devappserver2.parse_threadsafe_override, 'default:okaydokey')
def test_duplicate_modules(self):
self.assertRaisesRegexp(
argparse.ArgumentTypeError,
'Duplicate threadsafe override value',
devappserver2.parse_threadsafe_override, 'default:False,default:True')
def test_multiple_missing_name(self):
self.assertEqual(
{'default': False},
devappserver2.parse_threadsafe_override(':No'))
class FakeApplicationConfiguration(object):
def __init__(self, modules):
self.modules = modules
class FakeModuleConfiguration(object):
def __init__(self, module_name):
self.module_name = module_name
class CreateModuleToSettingTest(unittest.TestCase):
def setUp(self):
self.application_configuration = FakeApplicationConfiguration([
FakeModuleConfiguration('m1'), FakeModuleConfiguration('m2'),
FakeModuleConfiguration('m3')])
def testNone(self):
self.assertEquals(
{},
devappserver2.DevelopmentServer._create_module_to_setting(
None, self.application_configuration, '--option'))
def testDict(self):
self.assertEquals(
{'m1': 3, 'm3': 1},
devappserver2.DevelopmentServer._create_module_to_setting(
{'m1': 3, 'm3': 1}, self.application_configuration, '--option'))
def testSingleValue(self):
self.assertEquals(
{'m1': True, 'm2': True, 'm3': True},
devappserver2.DevelopmentServer._create_module_to_setting(
True, self.application_configuration, '--option'))
def testDictWithUnknownModules(self):
self.assertEquals(
{'m1': 3.5},
devappserver2.DevelopmentServer._create_module_to_setting(
{'m1': 3.5, 'm4': 2.7}, self.application_configuration, '--option'))
if __name__ == '__main__':
unittest.main()