summaryrefslogtreecommitdiff
path: root/doc/html/newtest.html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/html/newtest.html')
-rw-r--r--doc/html/newtest.html198
1 files changed, 198 insertions, 0 deletions
diff --git a/doc/html/newtest.html b/doc/html/newtest.html
new file mode 100644
index 0000000..eafcdda
--- /dev/null
+++ b/doc/html/newtest.html
@@ -0,0 +1,198 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<HTML>
+
+<HEAD>
+ <TITLE>adding new tests to glean</TITLE>
+ <META NAME="description" CONTENT="adding new tests to glean">
+ <META NAME="author" CONTENT="Allen Akin">
+ <LINK REV="made" HREF="mailto:glean@pobox.com">
+</HEAD>
+
+<BODY TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"
+ BGCOLOR="#FFFFFF">
+
+<H1>Adding new tests to <I>glean</I></H1>
+
+<P>
+On this page, we'll consider some general testing principles and
+suggest areas in which new tests are needed.
+When you're ready to implement a new test, check out the
+<A HREF="overview.html">overview of <I>glean</I> internals</A>.
+
+<H2>Guidelines for writing <I>glean</I> tests</H2>
+
+<P>
+To define a new test, first create a new test class derived from
+<B>Test</B>. Most of the time you'll want to write tests
+that run on all drawing surface configurations and are portable
+(in the sense that they don't use any OS- or window-system-dependent
+data structures exposed in the <B>Environment</B>, <B>WindowSystem</B>,
+and <B>DrawingSurface</B> classes). Starting from <B>BasicTest</B> may
+be easiest in those cases.
+
+<P>
+Once you've created a new test class, create one or more global
+objects of that class. The constructor for <B>Test</B> ensures that
+all such objects are automatically linked onto the master list of
+tests. (Creating test objects dynamically isn't recommended, but if
+you can make a good argument for it we can figure out the rules needed to
+make it work.) Every test must have a good description; it's very much
+worthwhile to add text that will help the user understand the results
+or debug the problem if something goes wrong.
+
+<P>
+The first workhorse method in any test class is <B>run()</B>.
+Here are some things to remember about it:
+<UL TYPE=DISC>
+ <LI>
+ Every run must produce at least one PASS, FAIL, or NOTE message in the
+ log.
+ <LI>
+ In the case of failure, never just report failure and assume the user
+ will go add debugging code to the source to figure out exactly what failure
+ occurred. Ideally, provide enough information so that a driver
+ developer could start debugging his code without having to look at
+ the <I>glean</I> source first.
+ <LI>
+ Each test is producing two kinds of result: The result that goes into
+ the results database, and the result that remains in memory, accessible
+ through the test object. Eventually there will be tests that refer
+ back to the results of previous tests! (This is the reason for the
+ <B>hasRun</B> mechanism in the <B>Test</B> class; one test may be
+ forced to run another as a prerequisite, but we never need to run a
+ test twice.)
+ <LI>
+ Try to keep most test runs short. Eventually there will be a lot of
+ tests, and some machines will have a lot of drawing surface
+ configurations, and runtime will add up.
+ <LI>
+ Whenever possible, avoid tests that just generate images for the
+ user to check, rather than determining for themselves whether they
+ pass or fail. Even experts find it hard to tell which of two
+ complicated images is correct, and when some subtle part of the
+ OpenGL driver changes (like the precision with which colors are
+ computed) the user might be faced with comparing hundreds or
+ thousands of images for all existing tests.
+ <LI>
+ Prefer statistical summaries of error to simple pass/fail results.
+ They provide a lot more useful information, and in some cases they
+ make writing test comparisons much easier and more effective.
+</UL>
+
+<P>
+The second major method is <B>compare()</B>. Some things to keep in mind:
+<UL TYPE=DISC>
+ <LI>
+ When two test results are the same (whatever that means for the
+ particular test in question), don't report that they are the same
+ unless the user has requested verbose output. Ideally, if two
+ test runs are identical, <I>glean</I> should report nothing.
+ <LI>
+ Subject to the constraint in the previous item, every comparison
+ must yield at least one SAME or DIFF message in the log.
+ <LI>
+ As with <B>run()</B>, statistical summaries are preferable to simple
+ pass/fail assessments.
+</UL>
+
+<H2>New tests</H2>
+
+<P>
+Here are some suggestions for tests that could be added to <I>glean</I>.
+(These are not listed in any particular order; any of them would be
+worthwhile.)
+
+<UL TYPE=DISC>
+ <LI>
+ Quake3 Arena.
+ <BR>
+ We could use a set of tests that check everything John Carmack mentioned
+ in <A HREF="http://www.quake3arena.com/news/glopt.html">
+ http://www.quake3arena.com/news/glopt.html</A>.
+ <LI>
+ Default state check.
+ <BR>
+ The OpenGL spec defines initial values for all state variables, and
+ many programs (including <I>glean</I>!) depend on those initial
+ values being correct. It would be great to have a test that actually
+ verified them.
+ <LI>
+ Enumerant coverage check.
+ <BR>
+ It would be good to verify that each OpenGL command actually accepts
+ all the argument values that it's supposed to accept, without generating
+ an error. Conversely, it would be nice to know that errors are
+ generated appropriately when illegal arguments are used.
+ <LI>
+ Regression tests.
+ <BR>
+ (This is especially relevant to everyone working on Mesa.)
+ Regression tests simply check that a previously-discovered bug or
+ performance problem doesn't reappear after later changes to an OpenGL
+ driver. Regression tests are really valuable, because bugs tend to
+ appear in the parts of the driver that are the most difficult to
+ implement correctly. Therefore, writing tests in response to each bug
+ report tends to cluster tests in precisely the area where they're most
+ needed. As a general principle, whenever you report a bug or fix a bug,
+ you could write a <I>glean</I> test to make sure that bug will never
+ reappear.
+ <LI>
+ Stress tests.
+ <BR>
+ Stress tests assess the robustness of an OpenGL implementation. Some
+ possibilities are: create and download many texture objects, then
+ switch rapidly from one to another; perform many buffer swaps in
+ rapid succession; execute ten thousand glClear() operations and see
+ whether the hardware FIFO times out; and create a large number of windows
+ and rendering contexts and randomly bind arbitrary pairs of them.
+ <LI>
+ Limits tests.
+ <BR>
+ Every OpenGL implementation has limits (sometimes enforced by the graphics
+ hardware) and these often determine how applications must be written.
+ For example, it would be good to know the maximum acceptable texture
+ size for a variety of texture formats; the largest image that can
+ be passed to glDrawPixels(); the maximum number of vertices that can
+ be placed in a triangle strip or vertex array; and the maximum number of
+ windows or rendering contexts that can be created.
+ <LI>
+ Window-system binding tests.
+ <BR>
+ Most tests concentrate on OpenGL itself, but an area that must not be
+ overlooked is the window system binding (GLX or WGL). It would be useful
+ to test the window system binding's extension string and all the basic
+ operations like context creation, copy, and deletion. Sharing texture
+ objects and display lists is important to test.
+ <LI>
+ Core OpenGL correctness tests.
+ <BR>
+ Most OpenGL implementations have been checked with the OpenGL
+ conformance tests. However, the conformance tests are lax in some
+ areas due to historical reasons. One way to address this would be
+ to add some correctness tests to <I>glean</I>. Check the contents
+ page of the OpenGL spec; each heading is a good suggestion for a
+ test.
+</UL>
+
+
+<HR>
+<SMALL>
+ <UL TYPE=DISC>
+ <LI> <A HREF="whatis.html">What is <I>glean</I>?</A>
+ <LI> <A HREF="build.html">How do I build <I>glean</I>?</A>
+ <LI> <A HREF="run.html">How do I run <I>glean</I>?</A>
+ <LI> <A HREF="next.html">Where do we go from here?</A>
+ <UL TYPE=CIRCLE>
+ <LI> <A HREF="newtest.html">Adding new tests</A>
+ <LI> <A HREF="newfeat.html">Adding new infrastructure features</A>
+ <LI> <A HREF="overview.html">Overview of <I>glean</I> internals</A>
+ <LI> <A HREF="repo.html">Creating a repository of results</A>
+ <LI> <A HREF="port.html">Porting <I>glean</I></A>
+ <LI> <A HREF="cleanup.html">Cleaning up loose ends</A>
+ </UL>
+ <LI> <A HREF="changes.html">What has changed recently?</A>
+ </UL>
+</SMALL>
+
+</BODY>
+</HTML>