--- /dev/null
+* Test Anti-Patterns
+
+OK, there are a few patterns that have been found over and over in the
+testing code base which makes the tests flaky. Here is an incomplete
+list. Don't do that.
+
+1) Using pidof to wait for a background application (by name) to
+ disappear.
+
+ Why is it flaky ?
+
+ The application may be delayed after being forked, but not executed
+ yet. Therefore, pidof will not find it. Use "wait" instead.
+
+2) Using sleep as delay-based optimistic synchronization technique.
+
+ Why is it flaky ?
+
+ Everything that needs to happen before/after other things need to
+ be explicitly synchronized using e.g. a file (used as a flag).
+ Sleep is just an indicator of a minimum arbitrary delay, but
+ machine load and scheduling can actually mess up the real delay
+ between applications. Use explicit synchronization points. Never
+ sleep.
+
+3) Using killall on a background application.
+
+ Why is it flaky ?
+
+ Similarly to pidof, killall may run before the background application
+ executes, thus failing to find it. Store the application PID after it
+ it launched in background into a temporary variable for later use
+ by kill and wait.
+
+4) Using wait ${!} to wait for completion of many background
+ applications.
+
+ Why is it flaky ?
+
+ It just waits for the last application put in background. Use
+ "wait" to wait for all background applications.
+
+5) Forgetting wait at the end (or error return path) of a test phase
+ that has background applications.
+
+ Why is it flaky ?
+
+ Those application may interact with the following testing phases,
+ thus skewing the results.
+
+6) Not grepping into the entire code base for similar patterns.
+
+ When you find a problematic coding pattern, chances are it appears
+ elsewhere in the testing code base. Please fix it everywhere!
+
+7) Introducing a utility abstraction without changing all open coded
+ similar code path.
+
+ When an abstraction for e.g. starting and stopping the session daemon
+ is introduced as a utility (e.g. utils.sh), future changes will
+ assume that all the testing code base is using this abstraction.
+ Leaving a few custom open-coded sites of duplicated code around is a
+ good way to make it a pain to update the abstraction in the future.