2121
2222# pylint: disable=missing-docstring
2323
24- import unittest
25-
2624import qubesadmin
2725import qubesadmin .vm
2826import qubesadmin .tools .qvm_ls
@@ -44,34 +42,13 @@ def __init__(self):
4442
4543class TC_00_Column (qubesadmin .tests .QubesTestCase ):
4644 def test_100_init (self ):
45+ '''Column registers itself in Column.columns on init.'''
4746 try :
48- testcolumn = qubesadmin .tools .qvm_ls .Column ('TESTCOLUMN' )
49- self .assertEqual (testcolumn .ls_head , 'TESTCOLUMN' )
47+ testcolumn = qubesadmin .tools .qvm_ls .Column (
48+ 'TESTCOLUMN' , attr = lambda vm : None )
49+ self .assertEqual (testcolumn .head , 'TESTCOLUMN' )
5050 finally :
51- try :
52- qubesadmin .tools .qvm_ls .Column .columns ['TESTCOLUMN' ]
53- except KeyError :
54- pass
55-
56-
57- class TC_10_globals (qubesadmin .tests .QubesTestCase ):
58- def test_100_simple_flag (self ):
59- flag = qubesadmin .tools .qvm_ls .simple_flag (1 , 'T' , 'internal' )
60-
61- # TODO after serious testing of QubesVM and Qubes app, this should be
62- # using normal components
63- vm = TestVM ('test-vm' , internal = False )
64-
65- self .assertFalse (flag (None , vm ))
66- vm .internal = True
67- self .assertTrue (flag (None , vm ))
68-
69- @unittest .skip ('column list generated dynamically' )
70- def test_900_formats_columns (self ):
71- for cols in qubesadmin .tools .qvm_ls .formats .values ():
72- for col in cols :
73- self .assertIn (col .upper (),
74- qubesadmin .tools .qvm_ls .Column .columns )
51+ del qubesadmin .tools .qvm_ls .Column .columns ['TESTCOLUMN' ]
7552
7653
7754class TC_50_List (qubesadmin .tests .QubesTestCase ):
@@ -228,6 +205,37 @@ def test_110_network_tree(self):
228205 ' └─test-vm-3 Running TestVM - - test-vm-proxy\n '
229206 '└─test-vm-4 Running TestVM - - test-vm-net-2\n ' )
230207
208+ def test_105_flags (self ):
209+ '''FLAGS column encodes type, power state and boolean attributes.'''
210+ app = TestApp ()
211+ vm = app .domains ['test-vm' ]
212+ vm .klass = 'AppVM'
213+ vm .updateable = True
214+ vm .provides_network = False
215+ vm .installed_by_rpm = False
216+ vm .internal = False
217+ vm .debug = True
218+ vm .autostart = False
219+ with qubesadmin .tests .tools .StdoutBuffer () as stdout :
220+ qubesadmin .tools .qvm_ls .main (['--fields' , 'name,flags' ,
221+ 'test-vm' ], app = app )
222+ # arU---D-: AppVM, running, updateable, debug
223+ self .assertEqual (stdout .getvalue (),
224+ 'NAME FLAGS\n '
225+ 'test-vm arU---D-\n ' )
226+
227+ def test_106_raw_data (self ):
228+ '''--raw-data produces pipe-separated values with no header.'''
229+ app = TestApp ()
230+ app .domains ['test-vm' ].klass = 'AppVM'
231+ with qubesadmin .tests .tools .StdoutBuffer () as stdout :
232+ qubesadmin .tools .qvm_ls .main (['--raw-data' , '--fields=name,class' ,
233+ 'dom0' , 'test-vm' ], app = app )
234+ self .assertEqual (stdout .getvalue (),
235+ 'dom0|TestVM\n '
236+ 'test-vm|AppVM\n ' )
237+
238+
231239class TC_70_Tags (qubesadmin .tests .QubesTestCase ):
232240 def setUp (self ):
233241 self .app = TestApp ()
@@ -427,6 +435,7 @@ def setUp(self):
427435 )
428436
429437 def test_101_sort_string (self ):
438+ '''--sort with --reverse and --ignore-case sorts case-insensitively.'''
430439 with qubesadmin .tests .tools .StdoutBuffer () as stdout :
431440 qubesadmin .tools .qvm_ls .main (
432441 ['--sort' , 'NAME' , '--reverse' , '--ignore-case' ], app = self .app )
@@ -438,6 +447,7 @@ def test_101_sort_string(self):
438447 'a Running TestVM red - -\n ' )
439448
440449 def test_102_sort_numeric (self ):
450+ '''Numeric columns are sorted by value, not lexicographically.'''
441451 with qubesadmin .tests .tools .StdoutBuffer () as stdout :
442452 qubesadmin .tools .qvm_ls .main (
443453 ['--field' , 'NAME,MAXMEM' , '--sort' , 'MAXMEM' ], app = self .app )
@@ -448,6 +458,18 @@ def test_102_sort_numeric(self):
448458 'c 300\n '
449459 'B 1000\n ' )
450460
461+ def test_103_sort_column_not_in_output (self ):
462+ '''--sort on a column absent from output leaves order unchanged.'''
463+ with qubesadmin .tests .tools .StdoutBuffer () as stdout :
464+ qubesadmin .tools .qvm_ls .main (
465+ ['--fields' , 'NAME,CLASS' , '--sort' , 'STATE' ], app = self .app )
466+ self .assertEqual (stdout .getvalue (),
467+ 'NAME CLASS\n '
468+ 'B TestVM\n '
469+ 'a TestVM\n '
470+ 'c TestVM\n '
471+ 'dom0 TestVM\n ' )
472+
451473
452474class TC_110_Filtering (qubesadmin .tests .QubesTestCase ):
453475 def test_111_filter_class (self ):
0 commit comments