source: CMIP6dreq/trunk/dreqPy/simpleCheck.py @ 683

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreq/trunk/dreqPy/simpleCheck.py@683
Revision 683, 5.3 KB checked in by mjuckes, 4 years ago (diff)

01.beta.30

Line 
1from __init__ import DOC_DIR
2import string, os, sys, collections
3
4try:
5  import pkgutil
6  l = pkgutil.iter_modules()
7  ll = map( lambda x: x[1], l )
8  pkgutilFailed=False
9except:
10  pkgutilFailed=True
11  print ( 'Failed to load pkgutil .. more limited tests on available modules will be done' )
12  ll = []
13
14requiredModules = ['xml']
15confirmed = []
16installFailed = []
17missingLib = []
18for x in requiredModules:
19  if x in ll or pkgutilFailed:
20      try:
21        __import__(x)
22        confirmed.append( x )
23      except:
24        installFailed.append( x )
25        print ( 'Failed to install %s' % x )
26  else:
27      missingLib.append( x )
28
29if len( missingLib ) > 0 or len(installFailed) > 0:
30  print ( 'Could not load all required python libraries' )
31  if len(missingLib) > 0:
32    print ( 'MISSING LIBRARIES: %s' % str(missingLib) )
33  if len(installFailed) > 0:
34    print ( 'LIBRARIES PRESENT BUT FAILED TO INSTALL:%s' % str(missingLib) )
35  all = False
36  exit(0)
37else:
38  print ( 'Required libraries present' )
39  all = True
40
41import inspect
42class checkbase(object):
43  def __init__(self,lab):
44    self.lab = lab
45    self.ok = True
46    self.entryPoint = sys.argv[0].split( '/' )[-1]
47
48#document directory
49    self.docdir = DOC_DIR
50#schema location
51    self.schema = '%s/dreq2Schema.xsd' % self.docdir
52#sample xml location
53    self.sampleXml = '%s/dreq2Sample.xml' % self.docdir
54#definition document xml location
55    self.defnXml = '%s/dreq2Defn.xml' % self.docdir
56
57    ml = inspect.getmembers( self, predicate=inspect.ismethod ) 
58    ok = True
59    for tag,m in ml:
60      if tag[:3] == '_ch':
61        try:
62          self.ok = False
63          m()
64          ok &= self.ok
65        except:
66          print ( 'Failed to complete check %s' % tag )
67          raise
68    if ok:
69      print ( '%s: All checks passed' % lab )
70    else: 
71      print ( '%s: Errors detected' % lab )
72       
73class check1(checkbase):
74  def _ch01_importDreq(self):
75    import dreq
76    print ( 'Dreq software import checked' )
77    self.ok = True
78
79  def _ch02_importSample(self):
80    import dreq
81    self.dq = dreq.loadDreq( manifest='out/dreqManifest.txt'  )
82    print ( 'Dreq sample load checked' )
83    self.ok = True
84
85  def _ch03_linkCheck(self):
86    nn = 0
87    import dreq
88    self.dq = dreq.loadDreq( manifest='out/dreqManifest.txt'  )
89    for section in self.dq.coll :
90      ks=[k for k in self.dq.coll[section].attDefn.keys() if self.dq.coll[section].attDefn[k].useClass == 'internalLink']
91      nerr = 0
92      cc = collections.defaultdict( int )
93      for i in self.dq.coll[section].items:
94        for k in ks :
95          if k in i.__dict__:
96            if i.__dict__[k] not in self.dq.inx.uid:
97              nerr += 1
98              cc[k] += 1
99              ##print section, k, i.__dict__[k]
100      if nerr > 0:
101           msg = ''
102           for k in cc:
103             msg += '%s: %s; ' % (k,cc[k])
104           print ( 'Section %s: bad links: %s %s' % (section,nerr,msg) )
105           nn += nerr
106      ##print section, ks, nerr
107    if nn == 0:
108      print ( 'Dreq links checked' )
109    self.ok = nn == 0
110
111class check2(checkbase):
112
113  def _clear_ch03(self):
114    os.unlink( '.simpleCheck_check2_err.txt' )
115    os.unlink( '.simpleCheck_check2.txt' )
116
117  def _clear_ch04(self):
118    os.unlink( '.simpleCheck_check2_err.txt' )
119    os.unlink( '.simpleCheck_check2.txt' )
120
121  def _ch04_checkCmd(self):
122    import os
123    if self.entryPoint == 'drq':
124       cmd = 'drq'
125    else:
126       cmd = 'python dreqCmdl.py'
127
128    os.popen( '%s -v  2> .simpleCheck_check2_err.txt 1>.simpleCheck_check2.txt' % cmd ).readlines()
129
130    ii = open( '.simpleCheck_check2_err.txt' ).readlines()
131    if len(ii) > 0:
132      print ( 'WARNING[003]: failed to get version with command line call' )
133      self.ok = False
134      self._clear_ch04()
135      return
136
137    ii = open( '.simpleCheck_check2.txt' ).readlines()
138    if len(ii) < 1:
139      print ( 'WARNING[004]: failed to get version with command line call' )
140      self.ok = False
141      self._clear_ch04()
142      return
143
144    self.ok = True
145    return
146
147  def _ch03_checkXML(self):
148    import os
149    os.popen( 'which xmllint 2> .simpleCheck_check2_err.txt 1>.simpleCheck_check2.txt' ).readlines()
150    ii = open( '.simpleCheck_check2_err.txt' ).readlines()
151    if len(ii) > 0:
152      print ( 'WARNING[001]: failed to detect xmllint command line program' )
153      print ( 'optional checks omitted' )
154      self.ok = False
155      self._clear_ch03()
156      return
157    ii = open( '.simpleCheck_check2.txt' ).readlines()
158    if len(ii) < 1:
159      print ( 'WARNING[002]: failed to detect xmllint command line program' )
160      print ( 'Optional checks omitted' )
161      self.ok = False
162      self._clear_ch03()
163      return
164
165    cmd = 'xmllint --noout --schema %s %s  2> .simpleCheck_check2_err.txt 1>.simpleCheck_check2.txt' % (self.schema,self.sampleXml) 
166    os.popen( cmd ).readlines()
167    ii = open( '.simpleCheck_check2_err.txt' ).readlines()
168    if len(ii) == 0:
169      print ( 'WARNING[003]: Failed to capture xmllint response' )
170      print ( cmd )
171      self.ok = False
172      self._clear_ch03()
173      return
174    if ii[0].find('validates') != -1:
175      print ( 'Sample XML validated' )
176      self.ok = True
177      self._clear_ch03()
178    else:
179      print ( 'Sample XML failed to validate' )
180      print ( cmd )
181      self.ok = False
182    return
183   
184all &= check1('Suite 1 (dreq module)').ok
185all &= check2('Suite 2 (xmllint & command line)').ok
186
187if all:
188  print ( 'ALL CHECK PASSED' )
Note: See TracBrowser for help on using the repository browser.