[systemd-devel] [PATCH v2 09/26] dhcp: Add option append tests

Patrik Flykt patrik.flykt at linux.intel.com
Sun Nov 24 23:13:25 PST 2013


Add checks for invalid lengths and parameters when using the option
appending function. Add also checks for adding options, see to it
that the resulting array is identical to the array of options added.
---
 src/dhcp/test-dhcp-option.c |   71 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 71 insertions(+)

diff --git a/src/dhcp/test-dhcp-option.c b/src/dhcp/test-dhcp-option.c
index 83bd7b2..350cc21 100644
--- a/src/dhcp/test-dhcp-option.c
+++ b/src/dhcp/test-dhcp-option.c
@@ -289,6 +289,75 @@ static void test_options(struct option_desc *desc)
                 printf("DHCP type %s\n", dhcp_type(res));
 }
 
+static uint8_t result[64] = {
+        'A', 'B', 'C', 'D',
+};
+
+static uint8_t options[64] = {
+        'A', 'B', 'C', 'D',
+        160, 2, 0x11, 0x12,
+        0,
+        31, 8, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
+        0,
+        55, 3, 0x51, 0x52, 0x53,
+        17, 7, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+        255
+};
+
+static void test_option_set(void)
+{
+        int len, pos, oldlen, i;
+        uint8_t *opt;
+
+        assert(dhcp_option_append(NULL, NULL, 0, 0, NULL) == -EINVAL);
+
+        len = 0;
+        opt = &result[0];
+        assert(dhcp_option_append(&opt, NULL, 0, 0, NULL) == -EINVAL);
+        assert(opt == &result[0] && len == 0);
+
+        assert(dhcp_option_append(&opt, &len, DHCP_OPTION_PAD,
+                                  0, NULL) == -ENOBUFS);
+        assert(opt == &result[0] && len == 0);
+
+        opt = &result[4];
+        len = 1;
+        assert(dhcp_option_append(&opt, &len, DHCP_OPTION_PAD,
+                                    0, NULL) >= 0);
+        assert(opt == &result[5] && len == 0);
+
+        pos = 4;
+        len = 60;
+        while (pos < 64 && options[pos] != DHCP_OPTION_END) {
+                opt = &result[pos];
+                oldlen = len;
+
+                assert(dhcp_option_append(&opt, &len, options[pos],
+                                          options[pos + 1],
+                                          &options[pos + 2]) >= 0);
+
+                if (options[pos] == DHCP_OPTION_PAD) {
+                        assert(opt == &result[pos + 1]);
+                        assert(len == oldlen - 1);
+                        pos++;
+                } else {
+                        assert(opt == &result[pos + 2 + options[pos + 1]]);
+                        assert(len == oldlen - 2 - options[pos + 1]);
+                        pos += 2 + options[pos + 1];
+                }
+        }
+
+        for (i = 0; i < pos; i++) {
+                if (verbose)
+                        printf("%2d: 0x%02x(0x%02x)\n", i, result[i],
+                               options[i]);
+                assert(result[i] == options[i]);
+        }
+
+        if (verbose)
+                printf ("\n");
+}
+
 int main(int argc, char *argv[])
 {
         unsigned int i;
@@ -301,5 +370,7 @@ int main(int argc, char *argv[])
         for (i = 0; i < ELEMENTSOF(option_tests); i++)
                 test_options(&option_tests[i]);
 
+        test_option_set();
+
         return 0;
 }
-- 
1.7.10.4



More information about the systemd-devel mailing list