import unittest
import glob
import json
import sys
import difflib
import re
class TestJsonLint(unittest.TestCase):
@unittest.skipIf(sys.version_info < (3, 6, 0),
"json.dumps force-sorts on python 3.5")
def test_json_lint(self):
valid = True
for f in glob.glob("freewvsdb/*.json"):
fp = open(f, "r")
orig = fp.read()
fp.close()
tmp = json.loads(orig)
new = json.dumps(tmp, indent=2)
if orig != new:
print("json %s not valid" % f)
sys.stdout.writelines(difflib.unified_diff(orig, new))
valid = False
self.assertTrue(valid)
def test_json_values(self):
jconfig = []
for cfile in glob.glob('freewvsdb/*.json'):
with open(cfile) as json_file:
jconfig += json.load(json_file)
mkeys = set(['name', 'url', 'safe', 'vuln', 'detection'])
for item in jconfig:
# check for all mandatory keys
self.assertEqual(mkeys.intersection(item.keys()), mkeys,
msg="Missing key in %s" % item['name'])
# check we have at least one detection
self.assertTrue(len(item['detection']) >= 1,
msg="No detection in %s" % item['name'])
# vuln needs to be CVE or HTTPS URL
self.assertTrue(re.match("^CVE-[0-9]*-[0-9]*$", item['vuln'])
or item['vuln'].startswith("https://"),
msg="%s: Invalid vuln %s" %
(item['name'], item['vuln']))
if __name__ == '__main__':