From 164cdd5cd5f8173120e056bc27232d90eab504dc Mon Sep 17 00:00:00 2001
From: Pierre LALET <pierre.lalet@cea.fr>
Date: Wed, 4 Jan 2017 13:47:32 +0100
Subject: [PATCH] UTScapy: fix keywords handling / inheritance

---
 scapy/tools/UTscapy.py | 26 +++++++++++++++++---------
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/scapy/tools/UTscapy.py b/scapy/tools/UTscapy.py
index 97ca2a84..515e0ede 100755
--- a/scapy/tools/UTscapy.py
+++ b/scapy/tools/UTscapy.py
@@ -112,11 +112,17 @@ class Format(EnumClass):
 class TestClass:
     def __getitem__(self, item):
         return getattr(self, item)
-    def add_keywords(self, kw):
-        if kw is str:
-            self.keywords.append(kw)
-        else:
-            self.keywords += kw
+    def add_keywords(self, kws):
+        if isinstance(kws, basestring):
+            kws = [kws]
+        for kwd in kws:
+            if kwd.startswith('-'):
+                try:
+                    self.keywords.remove(kwd[1:])
+                except KeyError:
+                    pass
+            else:
+                self.keywords.add(kwd)
 
 class TestCampaign(TestClass):
     def __init__(self, title):
@@ -124,13 +130,14 @@ class TestCampaign(TestClass):
         self.filename = None
         self.headcomments = ""
         self.campaign = []
-        self.keywords = []
+        self.keywords = set()
         self.crc = None
         self.sha = None
         self.preexec = None
         self.preexec_output = None
     def add_testset(self, testset):
         self.campaign.append(testset)
+        testset.keywords.update(self.keywords)
     def __iter__(self):
         return self.campaign.__iter__()
     def all_tests(self):
@@ -143,11 +150,12 @@ class TestSet(TestClass):
         self.name = name
         self.tests = []
         self.comments = ""
-        self.keywords = []
+        self.keywords = set()
         self.crc = None
         self.expand = 1
     def add_test(self, test):
         self.tests.append(test)
+        test.keywords.update(self.keywords)
     def __iter__(self):
         return self.tests.__iter__()
 
@@ -160,7 +168,7 @@ class UnitTest(TestClass):
         self.res = True  # must be True at init to have a different truth value than None
         self.output = ""
         self.num = -1
-        self.keywords = []
+        self.keywords = set()
         self.crc = None
         self.expand = 1
     def __nonzero__(self):
@@ -180,7 +188,7 @@ def parse_campaign_file(campaign_file):
         if l[0] == '#':
             continue
         if l[0] == "~":
-            (test or testset or campaign_file).add_keywords(l[1:].split())
+            (test or testset or test_campaign).add_keywords(l[1:].split())
         elif l[0] == "%":
             test_campaign.title = l[1:].strip()
         elif l[0] == "+":
-- 
GitLab