From 9959d37f389caf62a4869de0e9fd25af98f716ca Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Wed, 15 Aug 2012 11:05:13 -0700 Subject: [PATCH] Add stress tests from "apitrace trim". The trim_stress directory makes it simple to stress test "apitrace trim" by simply dropping new trace files into this directory. The stress testing ensures that creating a new trace by trimming to a single frame still generates the same image as that frame from the original trace. It performs this test exhaustively for each frame of each trace. This testing ensures that trimming doesn't break the rendered results of any frame. It does not do anything to test that trimming actually discards anything. So the existing cli tests are still independendently useful for verifying that expected content is discarded. --- CMakeLists.txt | 1 + trim_stress/.gitignore | 5 ++ trim_stress/CMakeLists.txt | 16 ++++++ trim_stress/README.markdown | 19 +++++++ trim_stress/glxsimple.trace | Bin 0 -> 42592 bytes trim_stress_driver.py | 98 ++++++++++++++++++++++++++++++++++++ 6 files changed, 139 insertions(+) create mode 100644 trim_stress/.gitignore create mode 100644 trim_stress/CMakeLists.txt create mode 100644 trim_stress/README.markdown create mode 100644 trim_stress/glxsimple.trace create mode 100644 trim_stress_driver.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 1096158..7c55f76 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,4 +103,5 @@ add_subdirectory (traces) # condition here. if (OPENGL_FOUND) add_subdirectory (cli) + add_subdirectory (trim_stress) endif () diff --git a/trim_stress/.gitignore b/trim_stress/.gitignore new file mode 100644 index 0000000..2c3a0d6 --- /dev/null +++ b/trim_stress/.gitignore @@ -0,0 +1,5 @@ +!*.trace +*-ref/ +*-out +*-index.html +*.trace.trim diff --git a/trim_stress/CMakeLists.txt b/trim_stress/CMakeLists.txt new file mode 100644 index 0000000..652590d --- /dev/null +++ b/trim_stress/CMakeLists.txt @@ -0,0 +1,16 @@ +file (GLOB traces RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.trace) + +list (SORT traces) + +foreach (trace ${traces}) + if (APITRACE_EXECUTABLE AND APITRACE_SOURCE_DIR) + add_test( + NAME trim-stress-${trace} + COMMAND + python ${CMAKE_SOURCE_DIR}/trim_stress_driver.py + --apitrace ${APITRACE_EXECUTABLE} + --apitrace-source ${APITRACE_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/${trace} + ) + endif () +endforeach (trace) diff --git a/trim_stress/README.markdown b/trim_stress/README.markdown new file mode 100644 index 0000000..adab8dc --- /dev/null +++ b/trim_stress/README.markdown @@ -0,0 +1,19 @@ +This directory performs stress testing of "apitrace trim". + +For each trace file in this directory the trim_stress.py test driver +will perform the following operations: + +Given .trace: + + 1. Generate snapshots of original trace in ./-ref/ + + 2. For each frame of the trace: + + 1. Use "apitrace trim" to trim .trace to a + single-frame trace in -trim.trace + + 2. Generate a snapshot of the trimmed trace to + ./-out/.png + + 3. Use "apitrace diff-images" to compare all snapshots in + ./-out with those in ./-ref diff --git a/trim_stress/glxsimple.trace b/trim_stress/glxsimple.trace new file mode 100644 index 0000000000000000000000000000000000000000..9c22592ea950878603fb42b10027f191edc315f8 GIT binary patch literal 42592 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
    Q^V6jCY%=Oqwj9U8DMZfVP~@9}nwB2qYg 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 Wce_Khj1^{AKJRi>?r(UAU7^1cYP(MW literal 0 HcmV?d00001 diff --git a/trim_stress_driver.py b/trim_stress_driver.py new file mode 100644 index 0000000..5b10f14 --- /dev/null +++ b/trim_stress_driver.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python + +# Copyright 2012 Intel Corporation +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +'''Stress test driver for apitrace trimp.''' + +import os, errno, shutil, subprocess + +from base_driver import * + +def rm_and_mkdir(dir): + + # Operate only on local directories + dir = './' + dir + + # Failing to delete a directory that doesn't exist is no failure + def rmtree_onerror(function, path, excinfo): + if excinfo[0] == OSError and excinfo[1].errno != errno.ENOENT: + raise + + shutil.rmtree(dir, onerror = rmtree_onerror) + os.makedirs(dir) + +class TrimStressDriver(Driver): + + def trim_stress(self, trace_file): + "Execute an apitrace-trim stress test for the given trace." + + (dir, file_name) = os.path.split(trace_file) + (name, extension) = file_name.rsplit('.', 1) + + ref_dir = name + '-ref/' + out_dir = name + '-out/' + trim_file = name + '.trace.trim' + + rm_and_mkdir(ref_dir) + rm_and_mkdir(out_dir) + + subprocess.check_call([self.options.apitrace, "dump-images", "--call-nos=no", "--output=" + ref_dir, trace_file]); + + # Count the number of frame snapshots generated + frames = 0 + for dirpath, dirs, files in os.walk(ref_dir): + # Don't descend into any sub-directories (not that there + # should be any) + del dirs[:] + frames = len(files) + + for frame in range(frames): + try: + subprocess.check_call([self.options.apitrace, "trim", "--frame=%d" % (frame), "--output=" + trim_file, trace_file]) + except: + print "An error occurred while trimming frame %d from %s" % (frame, trace_file) + fail() + try: + subprocess.check_call([self.options.apitrace, "dump-images", "--call-nos=no", "--output=" + out_dir + "frame", trim_file]) + except: + print "An error occurred replaying %s to generate a frame snapshot" % (trim_file) + fail() + os.rename("%s/frame0000000000.png" % (out_dir), "%s/%010d.png" % (out_dir, frame)) + + try: + subprocess.check_call([self.options.apitrace, "diff-images", "-v", ref_dir, out_dir]) + except: + print "Trimmed frames did not match reference images. See " + name + "-index.html" + fail() + finally: + os.rename("index.html", name + "-index.html") + + def run(self): + self.parseOptions() + + self.trim_stress(self.args[0]) + + pass_() + +if __name__ == '__main__': + TrimStressDriver().run() -- 2.43.0