1<?xml version="1.0" standalone="no"?> 2<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 3"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" 4[ 5]> 6 7<article id="index"> 8 <articleinfo> 9 <title>D-Bus Test Plan</title> 10 <date>14 February 2003</date> 11 <authorgroup> 12 <author> 13 <firstname>Anders</firstname> 14 <surname>Carlsson</surname> 15 <affiliation> 16 <orgname>CodeFactory AB</orgname> 17 <address><email>andersca@codefactory.se</email></address> 18 </affiliation> 19 </author> 20 </authorgroup> 21 </articleinfo> 22 <sect1 id="introduction"> 23 <title>Introduction</title> 24 <para> 25 This document tries to explain the details of the test plan for D-Bus 26 </para> 27 <sect2 id="importance-of-testing"> 28 <title>The importance of testing</title> 29 <para> 30 As with any big library or program, testing is important. It 31 can help find bugs and regressions and make the code better 32 overall. 33 </para> 34 <para> 35 D-Bus is a large and complex piece of software (about 25,000 36 lines of code for the client library, and 2,500 lines of code 37 for the bus daemon) and it's therefore important to try to make sure 38 that all parts of the software is functioning correctly. 39 </para> 40 <para> 41 D-Bus can be built with support for testing by passing 42 <literal>--enable-tests</literal>. to the configure script. It 43 is recommended that production systems build without testing 44 since that reduces the D-Bus client library size. 45 </para> 46 </sect2> 47 </sect1> 48 <sect1 id="client-library"> 49 <title>Testing the D-Bus client library</title> 50 <para> 51 The tests for the client library consist of the dbus-test 52 program which is a unit test for all aspects of the client 53 library. Whenever a bug in the client library is found and 54 fixed, a test is added to make sure that the bug won't occur again. 55 </para> 56 <sect2 id="data-structures"> 57 <title>Data Structures</title> 58 <para> 59 The D-Bus client library consists of some data structures that 60 are used internally; a linked list class, a hashtable class and 61 a string class. All aspects of those are tested by dbus-test. 62 </para> 63 </sect2> 64 <sect2 id="message-loader"> 65 <title>Message loader</title> 66 <para> 67 The message loader is the part of D-Bus that takes messages in 68 raw character form and parses them, turning them into DBusMessages. 69 </para> 70 <para> 71 This is one of the parts of D-Bus that 72 <emphasis>must</emphasis> be absolutely bug-free and 73 robust. The message loader should be able to handle invalid 74 and incomplete messages without crashing. Not doing so is a 75 serious issue and can easily result in D-Bus being exploitable 76 to DoS attacks. 77 </para> 78 <para> 79 To solve these problems, there is a testing feature called the 80 Message Builder. The message builder can take a serialized 81 message in string-form and convert it into a raw character 82 string which can then be loaded by the message loader. 83 </para> 84 <figure> 85 <title>Example of a message in string form</title> 86 <programlisting> 87 # Standard org.freedesktop.DBus.Hello message 88 89 VALID_HEADER 90 FIELD_NAME name 91 TYPE STRING 92 STRING 'org.freedesktop.DBus.Hello' 93 FIELD_NAME srvc 94 TYPE STRING 95 STRING 'org.freedesktop.DBus' 96 ALIGN 8 97 END_LENGTH Header 98 START_LENGTH Body 99 END_LENGTH Body 100 </programlisting> 101 </figure> 102 <para> 103 The file format of messages in string form is documented in 104 the D-Bus Reference Manual. 105 </para> 106 <para> 107 The message test part of dbus-test is using the message 108 builder to build different kinds of messages, both valid, 109 invalid, and invalid ones, to make sure that the loader won't 110 crash or leak memory of any of those, and that the loader 111 knows if a message is valid or not. 112 </para> 113 <para> 114 There is also a test program called 115 <literal>break-loader</literal> that loads a message in 116 string-form into raw character form using the message 117 builder. It then randomly changes the message, it can for 118 example replace single bytes of data or modify the length of 119 the message. This is to simulate network errors. The 120 break-loader program saves all the messages leading to errors 121 so it can easily be run for a long period of time. 122 </para> 123 </sect2> 124 <sect2 id="authentication"> 125 <title>Authentication</title> 126 <para> 127 For testing authentication, there is a testing feature that 128 can read authentication sequences from a file and play them 129 back to a dummy server and client to make sure that 130 authentication is working according to the specification. 131 </para> 132 <figure> 133 <title>Example of an authentication script</title> 134 <programlisting> 135 ## this tests a successful auth of type EXTERNAL 136 137 SERVER 138 SEND 'AUTH EXTERNAL USERNAME_HEX' 139 EXPECT_COMMAND OK 140 EXPECT_STATE WAITING_FOR_INPUT 141 SEND 'BEGIN' 142 EXPECT_STATE AUTHENTICATED 143 </programlisting> 144 </figure> 145 </sect2> 146 </sect1> 147 <sect1 id="daemon"> 148 <title>Testing the D-Bus bus daemon</title> 149 <para> 150 Since the D-Bus bus daemon is using the D-Bus client library it 151 will benefit from all tests done on the client library, but 152 there is still the issue of testing client-server communication. 153 This is more complicated since it it may require another process 154 running. 155 </para> 156 <sect2 id="debug-transport"> 157 <title>The debug transport</title> 158 <para> 159 In D-Bus, a <emphasis>transport</emphasis> is a class that 160 handles sending and receiving raw data over a certain 161 medium. The transport that is used most in D-Bus is the UNIX 162 transport with sends and recevies data over a UNIX socket. A 163 transport that tunnels data through X11 client messages is 164 also under development. 165 </para> 166 <para> 167 The D-Bus debug transport is a specialized transport that 168 works in-process. This means that a client and server that 169 exists in the same process can talk to eachother without using 170 a socket. 171 </para> 172 </sect2> 173 <sect2 id="bus-test"> 174 <title>The bus-test program</title> 175 <para> 176 The bus-test program is a program that is used to test various 177 parts of the D-Bus bus daemon; robustness and that it conforms 178 to the specifications. 179 </para> 180 <para> 181 The test program has the necessary code from the bus daemon 182 linked in, and it uses the debug transport for 183 communication. This means that the bus daemon code can be 184 tested without the real bus actually running, which makes 185 testing easier. 186 </para> 187 <para> 188 The bus-test program should test all major features of the 189 bus, such as service registration, notification when things 190 occurs and message matching. 191 </para> 192 </sect2> 193 </sect1> 194 <sect1 id="other-tests"> 195 <title>Other tests</title> 196 197 <sect2 id="oom-robustness"> 198 <title>Out-Of-Memory robustness</title> 199 <para> 200 Since D-Bus should be able to be used in embedded devices, and 201 also as a system service, it should be able to cope with 202 low-memory situations without exiting or crashing. 203 </para> 204 <para> 205 In practice, this means that both the client and server code 206 must be able to handle dbus_malloc returning NULL. 207 </para> 208 <para> 209 To test this, two environment variables 210 exist. <literal>DBUS_MALLOC_FAIL_NTH</literal> will make every 211 nth call to dbus_malloc return NULL, and 212 <literal>DBUS_MALLOC_FAIL_GREATER_THAN</literal> will make any 213 dbus_malloc call with a request for more than the specified 214 number of bytes fail. 215 </para> 216 </sect2> 217 218 <sect2 id="leaks-and-other-stuff"> 219 <title>Memory leaks and code robustness</title> 220 <para> 221 Naturally there are some things that tests can't be written 222 for, for example things like memory leaks and out-of-bounds 223 memory reading or writing. 224 </para> 225 <para> 226 Luckily there exists good tools for catching such errors. One 227 free good tool is <ulink url="http://devel-home.kde.org/~sewardj/">Valgrind</ulink>, which runs the program in a 228 virtual CPU which makes catching errors easy. All test programs can be run under Valgrind, 229 </para> 230 </sect2> 231 </sect1> 232</article> 233