tests: refactor pcap file deletion to improve robustness

Type: test

Change-Id: I504c079126bd8b33c5e217a1b9086788a8c778e5
Signed-off-by: Dave Wallace <dwallacelf@gmail.com>
diff --git a/test/asf/asfframework.py b/test/asf/asfframework.py
index 9839ff5..ab7141e 100644
--- a/test/asf/asfframework.py
+++ b/test/asf/asfframework.py
@@ -815,6 +815,26 @@
         """Allow subclass specific teardown logging additions."""
         self.logger.info("--- No test specific show commands provided. ---")
 
+    def unlink_testcase_file(self, path):
+        MAX_ATTEMPTS = 9
+        retries = MAX_ATTEMPTS
+        while retries > 0:
+            retries = retries - 1
+            self.logger.debug(f"Unlinking {path}")
+            try:
+                path.unlink()
+            # Loop until unlink() fails with FileNotFoundError to ensure file is removed
+            except FileNotFoundError:
+                break
+            except OSError:
+                self.logger.debug(f"OSError: unlinking {path}")
+                self.sleep(0.25, f"{retries} retries left")
+        if retries == 0 and os.path.isfile(path):
+            self.logger.error(
+                f"Unable to delete testcase file in {MAX_ATTEMPTS} attempts: {path}"
+            )
+            raise OSError
+
     def tearDown(self):
         """Show various debug prints after each test"""
         self.logger.debug(
@@ -853,17 +873,7 @@
         if hasattr(self, "pg_interfaces") and len(self.pg_interfaces) > 0:
             testcase_dir = os.path.dirname(self.pg_interfaces[0].out_path)
             for p in Path(testcase_dir).glob("pg*.pcap"):
-                retries = 8
-                while retries > 0:
-                    retries = retries - 1
-                    self.logger.debug(f"Unlinking {p}")
-                    try:
-                        p.unlink()
-                        break
-                    except OSError:
-                        self.logger.debug(f"OSError: unlinking {p}")
-                        self.sleep(0.25, f"{retries} retries left")
-
+                self.unlink_testcase_file(p)
         self.logger.debug(
             f"--- END tearDown() {self.__class__.__name__}.{self._testMethodName}('{self._testMethodDoc}') ---"
         )
diff --git a/test/vpp_pg_interface.py b/test/vpp_pg_interface.py
index cb17e2d..cdb91ed 100644
--- a/test/vpp_pg_interface.py
+++ b/test/vpp_pg_interface.py
@@ -172,11 +172,8 @@
             )
 
     def remove_old_pcap_file(self, path):
-        try:
-            self.test.logger.debug(f"Removing {path}")
-            os.remove(path)
-        except OSError:
-            self.test.logger.debug(f"OSError: Could not remove {path}")
+        self.wait_for_pg_stop()
+        self.test.unlink_testcase_file(self.test, Path(path))
         return
 
     def decode_pcap_files(self, pcap_dir, filename_prefix):