hn-classics/_stories/1998/14129646.md

77 lines
5.4 KiB
Markdown

---
created_at: '2017-04-17T07:16:50.000Z'
title: Hellandizing (1998)
url: http://www.multicians.org/thvv/hellandizing.html
author: signa11
points: 72
story_text:
comment_text:
num_comments: 7
story_id:
story_title:
story_url:
parent_id:
created_at_i: 1492413410
_tags:
- story
- author_signa11
- story_14129646
objectID: '14129646'
year: 1998
---
[Source](http://www.multicians.org/thvv/hellandizing.html "Permalink to Hellandizing")
# Hellandizing
Software Engineering Stories
# Hellandizing
I had the privilege of working with ![][1][ Pat Helland][2] at ![][1][ Tandem][3] in the 1980s. His intelligence, creativity, good humor, and ebullience were a rare gift to his colleagues. (Pat had done great work at ![][1][ BTI Computer Systems][4], now largely forgotten.)
In 1984, Pat invented a technique to help test server programs. We called the method _Hellandizing_ a program to be tested. It involves placing **test points** at all significant locations in a program. When the program reaches a test point, it consults a master debug-mode switch to see if testing is enabled, and just continues if not. If testing is turned on, the test point checks a **control vector** for instructions. Each test point has an entry in the vector, which instructs the program to perform one of a set of actions:
* Continue
* Abort the program
* Reset the test point and abort the program
* Crash the CPU
* Reset the test point and crash the CPU
* Sleep for a short time
* Wait for a signal
* Invoke the debugger
* Enter a trace message in the debug log
* Count occurrences of the test point
and so on. An interface program allows the programmer to examine and change the test vector from outside the program, by means depending on the program environment; for processes operating in privileged mode, low-level message facilities were used.
The particular program Pat was testing was a fault tolerant server consisting of two processes running on different CPUs. As the primary process executed, it sent checkpoint messages to the backup process, so that the backup process could take over if the primary process or its CPU died. (Tandem called these "NonStop" programs.) Checkpoint calls were placed just before every call by which a process affected the rest of the world, whether by file I/O or by sending a message to another process.
Pat placed test points at each checkpoint. For a program that doesn't have a backup, the principle is the same: place a test point just before every operation that reveals the internal state of the program.
Hellandizing makes disciplined testing possible for server programs even though their state is concealed, their logic complex, and their timing dependent on interaction with other processes. The test points identify the places where the program interacts with the outside world and give the tester a handle on each one. We used to test NonStop programs by "walking" a breakpoint down the code of a program 100 locations at a time, and forcing a take-over at each breakpoint: but why 100? Forcing a takeover at each test point ensures that every distinguishable state of the process has been tried. To test timing dependencies, we can set the control vector to stop or delay the program at each critical point.
In a system of interacting processes, the ability to have a process under test wait for a signal from a utility program invoked from a test driver means that every critical race can be opened up, and all important sequences of events can be reproducibly tried. The test script can simulate intervening events or cause external failures before allowing the program under test to continue. We can use this approach to answer questions like "what if the communications line failed before we reached this point in the code?"
Test points make it possible to design systematic test libraries which explore every combination of object state and operation, provided that the test designers can get deep understanding of the code. Thorough analysis of the program being tested is still necessary in order to enumerate the number of cases that must be tested, and to understand what cases each test covers.
Copyright (c) 1998 by Tom Van Vleck
[Home][5] | [Resume][6] | [Multics][7] | [CTSS][8]
[SE Stories][9] | [Mulvaney][10] | [Mushrooms][11] | [Photoshop][12] | [Borges][13] | [Tools][14]
[1]: http://www.multicians.org/vvimg/tinyglob.gif
[2]: https://www.linkedin.com/pub/pat-helland/0/529/964 "new window: https://www.linkedin.com/pub/pat-helland/0/529/964"
[3]: http://www.markwhitfield.net/TandemComputersTimelineHistoryHPNonStop/tabid/180/Default.aspx "new window: http://www.markwhitfield.net/TandemComputersTimelineHistoryHPNonStop/tabid/180/Default.aspx"
[4]: http://www.btihistory.org/index.html "new window: http://www.btihistory.org/index.html"
[5]: tvv-home.html?1 "Home Page"
[6]: tvvvita.html?1 "Vita"
[7]: http://www.multicians.org/multics.html "Multics site home page"
[8]: 7094.html?1 "The IBM 7094 computer, and MIT Computation Center's CTSS timesharing system."
[9]: tvvswe.html?1 "Stories about software engineering practices and lessons."
[10]: mulvaney.html?1 "Cartoon booklet about bomb disposal from World War II."
[11]: mushrooms.html?1 "Lessons about hunting mushrooms."
[12]: photoshop.html?1 "How to use Photoshop to prepare web graphics."
[13]: borges-animals.html?1 "Jorge Luis Borges' essay on classification of animals."
[14]: tvvtools.html?1 "Programming tools for web site management and security."