blob: 3ed8a106116e8f1da57af318af74ca88391db09f [file] [log] [blame]
step682980c14ec2016-02-23 14:53:52 -05001# Copyright 2016 Rackspace
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
14
15import os
16import shutil
17import subprocess
18import tempfile
19
Anna Pankiewicz0691ee52018-06-19 15:04:22 -050020from mock import patch
21try:
22 from StringIO import StringIO
23except ImportError:
24 from io import StringIO
Cao Xuan Hoang36fe23c2016-08-25 16:11:14 +070025from tempest.cmd import workspace
step682980c14ec2016-02-23 14:53:52 -050026from tempest.lib.common.utils import data_utils
27from tempest.tests import base
28
29
30class TestTempestWorkspaceBase(base.TestCase):
31 def setUp(self):
32 super(TestTempestWorkspaceBase, self).setUp()
33 self.name = data_utils.rand_uuid()
34 self.path = tempfile.mkdtemp()
35 self.addCleanup(shutil.rmtree, self.path, ignore_errors=True)
36 store_dir = tempfile.mkdtemp()
37 self.addCleanup(shutil.rmtree, store_dir, ignore_errors=True)
38 self.store_file = os.path.join(store_dir, 'workspace.yaml')
Cao Xuan Hoang36fe23c2016-08-25 16:11:14 +070039 self.workspace_manager = workspace.WorkspaceManager(
40 path=self.store_file)
step682980c14ec2016-02-23 14:53:52 -050041 self.workspace_manager.register_new_workspace(self.name, self.path)
42
43
44class TestTempestWorkspace(TestTempestWorkspaceBase):
45 def _run_cmd_gets_return_code(self, cmd, expected):
46 process = subprocess.Popen(cmd, stdout=subprocess.PIPE,
47 stderr=subprocess.PIPE)
48 stdout, stderr = process.communicate()
49 return_code = process.returncode
zhuflbedb2ad2016-06-20 11:39:01 +080050 msg = ("%s failed with:\nstdout: %s\nstderr: %s" % (' '.join(cmd),
51 stdout, stderr))
step682980c14ec2016-02-23 14:53:52 -050052 self.assertEqual(return_code, expected, msg)
53
54 def test_run_workspace_list(self):
Masayuki Igawa00effc92016-07-25 12:28:26 +090055 cmd = ['tempest', 'workspace', 'list',
56 '--workspace-path', self.store_file]
step682980c14ec2016-02-23 14:53:52 -050057 self._run_cmd_gets_return_code(cmd, 0)
58
59 def test_run_workspace_register(self):
60 name = data_utils.rand_uuid()
61 path = tempfile.mkdtemp()
62 self.addCleanup(shutil.rmtree, path, ignore_errors=True)
Masayuki Igawa00effc92016-07-25 12:28:26 +090063 cmd = ['tempest', 'workspace', 'register',
64 '--workspace-path', self.store_file,
65 '--name', name, '--path', path]
step682980c14ec2016-02-23 14:53:52 -050066 self._run_cmd_gets_return_code(cmd, 0)
67 self.assertIsNotNone(self.workspace_manager.get_workspace(name))
68
69 def test_run_workspace_rename(self):
70 new_name = data_utils.rand_uuid()
Masayuki Igawa00effc92016-07-25 12:28:26 +090071 cmd = ['tempest', 'workspace', 'rename',
72 '--workspace-path', self.store_file,
73 '--old-name', self.name, '--new-name', new_name]
step682980c14ec2016-02-23 14:53:52 -050074 self._run_cmd_gets_return_code(cmd, 0)
75 self.assertIsNone(self.workspace_manager.get_workspace(self.name))
76 self.assertIsNotNone(self.workspace_manager.get_workspace(new_name))
77
78 def test_run_workspace_move(self):
79 new_path = tempfile.mkdtemp()
80 self.addCleanup(shutil.rmtree, new_path, ignore_errors=True)
Masayuki Igawa00effc92016-07-25 12:28:26 +090081 cmd = ['tempest', 'workspace', 'move',
82 '--workspace-path', self.store_file,
83 '--name', self.name, '--path', new_path]
step682980c14ec2016-02-23 14:53:52 -050084 self._run_cmd_gets_return_code(cmd, 0)
85 self.assertEqual(
86 self.workspace_manager.get_workspace(self.name), new_path)
87
Chandan Kumarb78e2572017-06-26 19:34:34 +053088 def test_run_workspace_remove_entry(self):
Masayuki Igawa00effc92016-07-25 12:28:26 +090089 cmd = ['tempest', 'workspace', 'remove',
90 '--workspace-path', self.store_file,
91 '--name', self.name]
step682980c14ec2016-02-23 14:53:52 -050092 self._run_cmd_gets_return_code(cmd, 0)
93 self.assertIsNone(self.workspace_manager.get_workspace(self.name))
94
Chandan Kumarb78e2572017-06-26 19:34:34 +053095 def test_run_workspace_remove_directory(self):
96 cmd = ['tempest', 'workspace', 'remove',
97 '--workspace-path', self.store_file,
98 '--name', self.name, '--rmdir']
99 self._run_cmd_gets_return_code(cmd, 0)
100 self.assertIsNone(self.workspace_manager.get_workspace(self.name))
101
step682980c14ec2016-02-23 14:53:52 -0500102
103class TestTempestWorkspaceManager(TestTempestWorkspaceBase):
104 def setUp(self):
105 super(TestTempestWorkspaceManager, self).setUp()
106 self.name = data_utils.rand_uuid()
107 self.path = tempfile.mkdtemp()
108 self.addCleanup(shutil.rmtree, self.path, ignore_errors=True)
109 store_dir = tempfile.mkdtemp()
110 self.addCleanup(shutil.rmtree, store_dir, ignore_errors=True)
111 self.store_file = os.path.join(store_dir, 'workspace.yaml')
Cao Xuan Hoang36fe23c2016-08-25 16:11:14 +0700112 self.workspace_manager = workspace.WorkspaceManager(
113 path=self.store_file)
step682980c14ec2016-02-23 14:53:52 -0500114 self.workspace_manager.register_new_workspace(self.name, self.path)
115
116 def test_workspace_manager_get(self):
117 self.assertIsNotNone(self.workspace_manager.get_workspace(self.name))
118
119 def test_workspace_manager_rename(self):
120 new_name = data_utils.rand_uuid()
121 self.workspace_manager.rename_workspace(self.name, new_name)
122 self.assertIsNone(self.workspace_manager.get_workspace(self.name))
123 self.assertIsNotNone(self.workspace_manager.get_workspace(new_name))
124
125 def test_workspace_manager_move(self):
126 new_path = tempfile.mkdtemp()
127 self.addCleanup(shutil.rmtree, new_path, ignore_errors=True)
128 self.workspace_manager.move_workspace(self.name, new_path)
129 self.assertEqual(
130 self.workspace_manager.get_workspace(self.name), new_path)
131
Chandan Kumarb78e2572017-06-26 19:34:34 +0530132 def test_workspace_manager_remove_entry(self):
133 self.workspace_manager.remove_workspace_entry(self.name)
134 self.assertIsNone(self.workspace_manager.get_workspace(self.name))
135
136 def test_workspace_manager_remove_directory(self):
137 path = self.workspace_manager.remove_workspace_entry(self.name)
138 self.workspace_manager.remove_workspace_directory(path)
step682980c14ec2016-02-23 14:53:52 -0500139 self.assertIsNone(self.workspace_manager.get_workspace(self.name))
140
141 def test_path_expansion(self):
142 name = data_utils.rand_uuid()
143 path = os.path.join("~", name)
144 os.makedirs(os.path.expanduser(path))
145 self.addCleanup(shutil.rmtree, path, ignore_errors=True)
146 self.workspace_manager.register_new_workspace(name, path)
147 self.assertIsNotNone(self.workspace_manager.get_workspace(name))
Anna Pankiewicz0691ee52018-06-19 15:04:22 -0500148
149 def test_workspace_name_not_exists(self):
150 nonexistent_name = data_utils.rand_uuid()
151 with patch('sys.stdout', new_callable=StringIO) as mock_stdout:
152 ex = self.assertRaises(SystemExit,
153 self.workspace_manager._name_exists,
154 nonexistent_name)
155 self.assertEqual(1, ex.code)
156 self.assertEqual(mock_stdout.getvalue(),
157 "A workspace was not found with name: %s\n" %
158 nonexistent_name)
159
160 def test_workspace_name_already_exists(self):
161 duplicate_name = self.name
162 with patch('sys.stdout', new_callable=StringIO) as mock_stdout:
163 ex = self.assertRaises(SystemExit,
164 self.workspace_manager.
165 _workspace_name_exists,
166 duplicate_name)
167 self.assertEqual(1, ex.code)
168 self.assertEqual(mock_stdout.getvalue(),
169 "A workspace already exists with name: %s.\n"
170 % duplicate_name)
171
172 def test_workspace_manager_path_not_exist(self):
173 fake_path = "fake_path"
174 with patch('sys.stdout', new_callable=StringIO) as mock_stdout:
175 ex = self.assertRaises(SystemExit,
176 self.workspace_manager._validate_path,
177 fake_path)
178 self.assertEqual(1, ex.code)
179 self.assertEqual(mock_stdout.getvalue(),
180 "Path does not exist.\n")
181
182 def test_workspace_manager_list_workspaces(self):
183 listed = self.workspace_manager.list_workspaces()
184 self.assertEqual(1, len(listed))
185 self.assertIn(self.name, listed)
186 self.assertEqual(self.path, listed.get(self.name))