Skip to content

Commit dcdf1ed

Browse files
committed
tests: a few cleanups
Removed unused imports. NodeSetGroupTest: - replaced shutil.rmtree with os.rmdir() - added missing os.rmdir() to that /tmp stays clean - skip test_yaml_permission_denied if run as root Change-Id: I85450983b66b8e9184611ed287f0525ceb26e548
1 parent 4e54a56 commit dcdf1ed

19 files changed

+101
-121
lines changed

tests/CLIConfigTest.py

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import resource
77
import os.path
88
import shutil
9-
import sys
109
import tempfile
1110
from textwrap import dedent
1211
import unittest

tests/CLIDisplayTest.py

-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33

44
"""Unit test for CLI.Display"""
55

6-
import os
7-
import sys
86
import tempfile
97
import unittest
108
from io import BytesIO

tests/CLINodesetTest.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from ClusterShell.CLI.Nodeset import main
1212

1313
from ClusterShell.NodeUtils import GroupResolverConfig
14-
from ClusterShell.NodeSet import std_group_resolver, set_std_group_resolver
14+
from ClusterShell.NodeSet import set_std_group_resolver
1515

1616

1717
class CLINodesetTestBase(unittest.TestCase):

tests/CLIOptionParserTest.py

-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44
"""Unit test for CLI.OptionParser"""
55

66
from optparse import OptionConflictError
7-
import os
8-
import sys
9-
import tempfile
107
import unittest
118

129
from ClusterShell.CLI.OptionParser import OptionParser

tests/DefaultsTest.py

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
"""Unit test for ClusterShell.Defaults"""
55

66
from textwrap import dedent
7-
import sys
87
import unittest
98

109
from TLib import make_temp_file

tests/MisusageTest.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@
33

44
"""Unit test for ClusterShell common library misusages"""
55

6-
import sys
76
import unittest
87

98
from TLib import HOSTNAME
109
from ClusterShell.Event import EventHandler
1110
from ClusterShell.Worker.Popen import WorkerPopen
1211
from ClusterShell.Worker.Ssh import WorkerSsh
1312
from ClusterShell.Worker.Worker import WorkerError
14-
from ClusterShell.Task import Task, task_self, AlreadyRunningError
13+
from ClusterShell.Task import task_self, AlreadyRunningError
1514

1615

1716
class MisusageTest(unittest.TestCase):

tests/NodeSetGroupTest.py

+93-73
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
Unit test for NodeSet with Group support
33
"""
44

5-
import copy
6-
import shutil
5+
import os
76
import sys
87
from textwrap import dedent
98
import unittest
@@ -749,7 +748,7 @@ def testConfigGroupsDirExists(self):
749748
finally:
750749
f2.close()
751750
f.close()
752-
shutil.rmtree(dname, ignore_errors=True)
751+
os.rmdir(dname)
753752

754753
def testConfigGroupsMultipleDirs(self):
755754
"""test groups with multiple confdir defined"""
@@ -797,8 +796,8 @@ def testConfigGroupsMultipleDirs(self):
797796
fs2.close()
798797
fs1.close()
799798
f.close()
800-
shutil.rmtree(dname2, ignore_errors=True)
801-
shutil.rmtree(dname1, ignore_errors=True)
799+
os.rmdir(dname2)
800+
os.rmdir(dname1)
802801

803802
def testConfigGroupsDirDupConfig(self):
804803
"""test groups with duplicate in groupsdir"""
@@ -836,7 +835,7 @@ def testConfigGroupsDirDupConfig(self):
836835
f3.close()
837836
f2.close()
838837
f.close()
839-
shutil.rmtree(dname, ignore_errors=True)
838+
os.rmdir(dname)
840839

841840
def testConfigGroupsDirExistsNoOther(self):
842841
"""test groups with groupsdir defined (real, no other)"""
@@ -864,8 +863,8 @@ def testConfigGroupsDirExistsNoOther(self):
864863
finally:
865864
f2.close()
866865
f.close()
867-
shutil.rmtree(dname1, ignore_errors=True)
868-
shutil.rmtree(dname2, ignore_errors=True)
866+
os.rmdir(dname1)
867+
os.rmdir(dname2)
869868

870869
def testConfigGroupsDirNotADirectory(self):
871870
"""test groups with groupsdir defined (not a directory)"""
@@ -883,7 +882,7 @@ def testConfigGroupsDirNotADirectory(self):
883882
finally:
884883
fdummy.close()
885884
f.close()
886-
shutil.rmtree(dname, ignore_errors=True)
885+
os.rmdir(dname)
887886

888887
def testConfigIllegalChars(self):
889888
"""test groups with illegal characters"""
@@ -1453,48 +1452,52 @@ def test_yaml_basic(self):
14531452
foo: example[1-4,91-100],example90
14541453
bar: example[5-89]
14551454
""").encode('ascii'), suffix=".yaml", dir=dname)
1455+
try:
1456+
res = GroupResolverConfig(f.name)
14561457

1457-
res = GroupResolverConfig(f.name)
1458-
1459-
# Group resolution
1460-
nodeset = NodeSet("@foo", resolver=res)
1461-
self.assertEqual(str(nodeset), "example[1-4,90-100]")
1462-
nodeset = NodeSet("@bar", resolver=res)
1463-
self.assertEqual(str(nodeset), "example[5-89]")
1464-
nodeset = NodeSet("@foo,@bar", resolver=res)
1465-
self.assertEqual(str(nodeset), "example[1-100]")
1466-
nodeset = NodeSet("@unknown", resolver=res)
1467-
self.assertEqual(len(nodeset), 0)
1468-
1469-
# Regroup
1470-
nodeset = NodeSet("example[1-4,90-100]", resolver=res)
1471-
self.assertEqual(str(nodeset), "example[1-4,90-100]")
1472-
self.assertEqual(nodeset.regroup(), "@foo")
1473-
self.assertEqual(list(nodeset.groups().keys()), ["@foo"])
1474-
self.assertEqual(str(NodeSet("@foo", resolver=res)), "example[1-4,90-100]")
1475-
1476-
# No 'all' defined: all_nodes() should raise an error
1477-
self.assertRaises(GroupSourceError, res.all_nodes)
1478-
# but then NodeSet falls back to the union of all groups
1479-
nodeset = NodeSet.fromall(resolver=res)
1480-
self.assertEqual(str(nodeset), "example[1-100]")
1481-
# regroup doesn't use @all in that case
1482-
self.assertEqual(nodeset.regroup(), "@bar,@foo")
1458+
# Group resolution
1459+
nodeset = NodeSet("@foo", resolver=res)
1460+
self.assertEqual(str(nodeset), "example[1-4,90-100]")
1461+
nodeset = NodeSet("@bar", resolver=res)
1462+
self.assertEqual(str(nodeset), "example[5-89]")
1463+
nodeset = NodeSet("@foo,@bar", resolver=res)
1464+
self.assertEqual(str(nodeset), "example[1-100]")
1465+
nodeset = NodeSet("@unknown", resolver=res)
1466+
self.assertEqual(len(nodeset), 0)
1467+
1468+
# Regroup
1469+
nodeset = NodeSet("example[1-4,90-100]", resolver=res)
1470+
self.assertEqual(str(nodeset), "example[1-4,90-100]")
1471+
self.assertEqual(nodeset.regroup(), "@foo")
1472+
self.assertEqual(list(nodeset.groups().keys()), ["@foo"])
1473+
self.assertEqual(str(NodeSet("@foo", resolver=res)),
1474+
"example[1-4,90-100]")
1475+
1476+
# No 'all' defined: all_nodes() should raise an error
1477+
self.assertRaises(GroupSourceError, res.all_nodes)
1478+
# but then NodeSet falls back to the union of all groups
1479+
nodeset = NodeSet.fromall(resolver=res)
1480+
self.assertEqual(str(nodeset), "example[1-100]")
1481+
# regroup doesn't use @all in that case
1482+
self.assertEqual(nodeset.regroup(), "@bar,@foo")
14831483

1484-
# No 'reverse' defined: node_groups() should raise an error
1485-
self.assertRaises(GroupSourceError, res.node_groups, "example1")
1484+
# No 'reverse' defined: node_groups() should raise an error
1485+
self.assertRaises(GroupSourceError, res.node_groups, "example1")
14861486

1487-
# regroup with rest
1488-
nodeset = NodeSet("example[1-101]", resolver=res)
1489-
self.assertEqual(nodeset.regroup(), "@bar,@foo,example101")
1487+
# regroup with rest
1488+
nodeset = NodeSet("example[1-101]", resolver=res)
1489+
self.assertEqual(nodeset.regroup(), "@bar,@foo,example101")
14901490

1491-
# regroup incomplete
1492-
nodeset = NodeSet("example[50-200]", resolver=res)
1493-
self.assertEqual(nodeset.regroup(), "example[50-200]")
1491+
# regroup incomplete
1492+
nodeset = NodeSet("example[50-200]", resolver=res)
1493+
self.assertEqual(nodeset.regroup(), "example[50-200]")
14941494

1495-
# regroup no matching
1496-
nodeset = NodeSet("example[102-200]", resolver=res)
1497-
self.assertEqual(nodeset.regroup(), "example[102-200]")
1495+
# regroup no matching
1496+
nodeset = NodeSet("example[102-200]", resolver=res)
1497+
self.assertEqual(nodeset.regroup(), "example[102-200]")
1498+
finally:
1499+
yamlfile.close()
1500+
os.rmdir(dname)
14981501

14991502
def test_yaml_fromall(self):
15001503
"""test groups special all group"""
@@ -1510,12 +1513,15 @@ def test_yaml_fromall(self):
15101513
bar: example[5-89]
15111514
all: example[90-100]
15121515
""").encode('ascii'), suffix=".yaml", dir=dname)
1513-
1514-
res = GroupResolverConfig(f.name)
1515-
nodeset = NodeSet.fromall(resolver=res)
1516-
self.assertEqual(str(nodeset), "example[90-100]")
1517-
# regroup uses @all if it is defined
1518-
self.assertEqual(nodeset.regroup(), "@all")
1516+
try:
1517+
res = GroupResolverConfig(f.name)
1518+
nodeset = NodeSet.fromall(resolver=res)
1519+
self.assertEqual(str(nodeset), "example[90-100]")
1520+
# regroup uses @all if it is defined
1521+
self.assertEqual(nodeset.regroup(), "@all")
1522+
finally:
1523+
yamlfile.close()
1524+
os.rmdir(dname)
15191525

15201526
def test_yaml_invalid_groups_not_dict(self):
15211527
"""test groups with an invalid YAML config file (1)"""
@@ -1528,9 +1534,12 @@ def test_yaml_invalid_groups_not_dict(self):
15281534
yamlfile = make_temp_file(b"""
15291535
yaml: bar
15301536
""", suffix=".yaml", dir=dname)
1531-
1532-
resolver = GroupResolverConfig(f.name)
1533-
self.assertRaises(GroupResolverConfigError, resolver.grouplist)
1537+
try:
1538+
resolver = GroupResolverConfig(f.name)
1539+
self.assertRaises(GroupResolverConfigError, resolver.grouplist)
1540+
finally:
1541+
yamlfile.close()
1542+
os.rmdir(dname)
15341543

15351544
def test_yaml_invalid_root_dict(self):
15361545
"""test groups with an invalid YAML config file (2)"""
@@ -1545,9 +1554,12 @@ def test_yaml_invalid_root_dict(self):
15451554
- North by Northwest
15461555
- The Man Who Wasn't There
15471556
""", suffix=".yaml", dir=dname)
1548-
1549-
resolver = GroupResolverConfig(f.name)
1550-
self.assertRaises(GroupResolverConfigError, resolver.grouplist)
1557+
try:
1558+
resolver = GroupResolverConfig(f.name)
1559+
self.assertRaises(GroupResolverConfigError, resolver.grouplist)
1560+
finally:
1561+
yamlfile.close()
1562+
os.rmdir(dname)
15511563

15521564
def test_yaml_invalid_not_yaml(self):
15531565
"""test groups with an invalid YAML config file (3)"""
@@ -1563,9 +1575,12 @@ def test_yaml_invalid_not_yaml(self):
15631575
two: deux
15641576
three: trois
15651577
""", suffix=".yaml", dir=dname)
1566-
1567-
resolver = GroupResolverConfig(f.name)
1568-
self.assertRaises(GroupResolverConfigError, resolver.grouplist)
1578+
try:
1579+
resolver = GroupResolverConfig(f.name)
1580+
self.assertRaises(GroupResolverConfigError, resolver.grouplist)
1581+
finally:
1582+
yamlfile.close()
1583+
os.rmdir(dname)
15691584

15701585
def test_wrong_autodir(self):
15711586
"""test wrong autodir (doesn't exist)"""
@@ -1591,25 +1606,30 @@ def test_wrong_autodir_is_file(self):
15911606
[local]
15921607
map: node
15931608
""" % fe.name).encode('ascii'))
1594-
15951609
resolver = GroupResolverConfig(f.name)
15961610
self.assertRaises(GroupResolverConfigError, resolver.grouplist)
15971611

15981612
def test_yaml_permission_denied(self):
15991613
"""test groups when not allowed to read some YAML config file"""
1614+
1615+
# This test doesn't work if run as root, as root can read the
1616+
# yaml group file even with restricted file permissions...
1617+
if os.geteuid() == 0:
1618+
return
1619+
16001620
dname = make_temp_dir()
1601-
try:
1602-
f = make_temp_file(dedent("""
1603-
[Main]
1604-
default: yaml1
1605-
autodir: %s
1606-
""" % dname).encode('ascii'))
1621+
f = make_temp_file(dedent("""
1622+
[Main]
1623+
default: yaml1
1624+
autodir: %s
1625+
""" % dname).encode('ascii'))
16071626

1608-
yamlfile1 = make_temp_file(b'yaml1: {foo: "example[1-4]"}',
1609-
suffix=".yaml", dir=dname)
1610-
yamlfile2 = make_temp_file(b'yaml2: {bar: "example[5-8]"}',
1611-
suffix=".yaml", dir=dname)
1627+
yamlfile1 = make_temp_file(b'yaml1: {foo: "example[1-4]"}',
1628+
suffix=".yaml", dir=dname)
1629+
yamlfile2 = make_temp_file(b'yaml2: {bar: "example[5-8]"}',
1630+
suffix=".yaml", dir=dname)
16121631

1632+
try:
16131633
# do not allow read access to yamlfile2
16141634
os.chmod(yamlfile2.name, 0)
16151635
self.assertFalse(os.access(yamlfile2.name, os.R_OK))
@@ -1626,4 +1646,4 @@ def test_yaml_permission_denied(self):
16261646
finally:
16271647
yamlfile1.close()
16281648
yamlfile2.close()
1629-
shutil.rmtree(dname, ignore_errors=True)
1649+
os.rmdir(dname)

tests/RangeSetTest.py

-2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44
"""Unit test for RangeSet"""
55

66
import binascii
7-
import copy
87
import pickle
9-
import sys
108
import unittest
119

1210
from ClusterShell.RangeSet import RangeSet, RangeSetParseError

tests/TaskDistantMixin.py

-3
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,12 @@
33

44
"""Unit test for ClusterShell Task (distant)"""
55

6-
import copy
76
import pwd
87
import shutil
9-
import sys
108
import warnings
119

1210
from TLib import HOSTNAME, make_temp_filename, make_temp_dir
1311
from ClusterShell.Event import EventHandler
14-
from ClusterShell.NodeSet import NodeSet
1512
from ClusterShell.Task import *
1613
from ClusterShell.Worker.Ssh import WorkerSsh
1714
from ClusterShell.Worker.EngineClient import *

tests/TaskDistantPdshMixin.py

-2
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44
"""Unit test for ClusterShell Task (distant, pdsh worker)"""
55

66
import shutil
7-
import sys
87

98
from TLib import HOSTNAME, make_temp_filename, make_temp_dir
109
from ClusterShell.Event import EventHandler
11-
from ClusterShell.NodeSet import NodeSet
1210
from ClusterShell.Task import *
1311
from ClusterShell.Worker.Worker import WorkerBadArgumentError
1412
from ClusterShell.Worker.Pdsh import WorkerPdsh

tests/TaskLocalMixin.py

+4-14
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,19 @@
66
import copy
77
import os
88
import signal
9-
import sys
9+
import socket
10+
import threading
1011
import time
11-
12-
import ClusterShell
12+
import warnings
1313

1414
from ClusterShell.Defaults import DEFAULTS
1515
from ClusterShell.Event import EventHandler
16-
from ClusterShell.NodeSet import NodeSet
1716
from ClusterShell.Task import *
1817
from ClusterShell.Worker.Exec import ExecWorker
19-
from ClusterShell.Worker.Worker import StreamWorker, WorkerSimple, WorkerError
18+
from ClusterShell.Worker.Worker import StreamWorker, WorkerSimple
2019
from ClusterShell.Worker.Worker import WorkerBadArgumentError
2120
from ClusterShell.Worker.Worker import FANOUT_UNLIMITED
2221

23-
# private import
24-
from ClusterShell.Engine.Engine import E_READ, E_WRITE
25-
26-
import socket
27-
import threading
28-
import tempfile
29-
import warnings
30-
31-
3222

3323
def _test_print_debug(task, s):
3424
# Use custom task info (prefix 'user_' is recommended)

0 commit comments

Comments
 (0)