Improve tor_sscanf tests

* Add many new test cases, tweak/improve existing ones, reorganize them a bit
* Switch the parameters in all test_eq calls so the expected value is the first
* Change all the "r = tor_sscanf(...);\ntest_eq(1, r)" to the more compact
  "test_eq(1, tor_sscanf(...))". It may be a tiny bit harder to find the
  tor_sscanf calls (it's the long lines anyway), but it saves a lot of lines,
  which should help readability.
This commit is contained in:
Esteban Manchado Velázquez 2012-02-06 22:05:47 +01:00 committed by Nick Mathewson
parent 8a633a3ebd
commit ee317256bb

View File

@ -1150,94 +1150,114 @@ test_util_sscanf(void)
char s1[10], s2[10], s3[10], ch; char s1[10], s2[10], s3[10], ch;
int r; int r;
r = tor_sscanf("hello world", "hello world"); /* String match: success */ /* Simple tests (malformed patterns and literal matching) */
test_eq(r, 0); test_eq(-1, tor_sscanf("123", "%i", &r)); /* %i is not supported */
r = tor_sscanf("hello world 3", "hello worlb %u", &u1); /* String fail */ test_eq(-1, tor_sscanf("wrong", "%5c", s1)); /* %c cannot have a number. */
test_eq(r, 0); test_eq(-1, tor_sscanf("hello", "%s", s1)); /* %s needs a number. */
r = tor_sscanf("12345", "%u", &u1); /* Simple number */ /* No '%'-strings: always "success" */
test_eq(r, 1); test_eq(0, tor_sscanf("hello world", "hello world"));
test_eq(u1, 12345u); test_eq(0, tor_sscanf("hello world", "good bye"));
r = tor_sscanf("", "%u", &u1); /* absent number */
test_eq(r, 0); /* Numbers (ie. %u) */
r = tor_sscanf("A", "%u", &u1); /* bogus number */ test_eq(0, tor_sscanf("hello world 3", "hello worlb %u", &u1)); /* d vs b */
test_eq(r, 0); test_eq(1, tor_sscanf("12345", "%u", &u1));
r = tor_sscanf("4294967295", "%u", &u1); /* UINT32_MAX should work. */ test_eq(12345u, u1);
test_eq(r, 1); test_eq(1, tor_sscanf("12346 ", "%u", &u1));
test_eq(u1, 4294967295u); test_eq(12346u, u1);
r = tor_sscanf("4294967296", "%u", &u1); /* Always say -1 at 32 bits. */ test_eq(0, tor_sscanf(" 12347", "%u", &u1));
test_eq(r, 0); test_eq(1, tor_sscanf(" 12348", " %u", &u1));
r = tor_sscanf("123456", "%2u%u", &u1, &u2); /* Width */ test_eq(12348u, u1);
test_eq(r, 2); test_eq(1, tor_sscanf("0", "%u", &u1));
test_eq(u1, 12u); test_eq(0u, u1);
test_eq(u2, 3456u); test_eq(1, tor_sscanf("0000", "%u", &u2));
r = tor_sscanf("!12:3:456", "!%2u:%2u:%3u", &u1, &u2, &u3); /* separators */ test_eq(0u, u2);
test_eq(r, 3); test_eq(0, tor_sscanf("", "%u", &u1)); /* absent number */
test_eq(u1, 12u); test_eq(0, tor_sscanf("A", "%u", &u1)); /* bogus number */
test_eq(u2, 3u); test_eq(0, tor_sscanf("-1", "%u", &u1)); /* negative number */
test_eq(u3, 456u); test_eq(1, tor_sscanf("4294967295", "%u", &u1)); /* UINT32_MAX should work */
r = tor_sscanf("12:3:045", "%2u:%2u:%3u", &u1, &u2, &u3); /* 0s */ test_eq(4294967295u, u1);
test_eq(r, 3); test_eq(0, tor_sscanf("4294967296", "%u", &u1)); /* But not at 32 bits */
test_eq(u1, 12u); test_eq(1, tor_sscanf("4294967296", "%9u", &u1)); /* but parsing only 9... */
test_eq(u2, 3u); test_eq(429496729u, u1);
test_eq(u3, 45u);
/* Numbers with size (eg. %2u) */
test_eq(0, tor_sscanf("-1", "%2u", &u1));
test_eq(2, tor_sscanf("123456", "%2u%u", &u1, &u2));
test_eq(12u, u1);
test_eq(3456u, u2);
test_eq(1, tor_sscanf("123456", "%8u", &u1));
test_eq(123456u, u1);
test_eq(1, tor_sscanf("123457 ", "%8u", &u1));
test_eq(123457u, u1);
test_eq(0, tor_sscanf(" 123456", "%8u", &u1));
test_eq(3, tor_sscanf("!12:3:456", "!%2u:%2u:%3u", &u1, &u2, &u3));
test_eq(12u, u1);
test_eq(3u, u2);
test_eq(456u, u3);
test_eq(3, tor_sscanf("67:8:099", "%2u:%2u:%3u", &u1, &u2, &u3)); /* 0s */
test_eq(67u, u1);
test_eq(8u, u2);
test_eq(99u, u3);
/* %u does not match space.*/ /* %u does not match space.*/
r = tor_sscanf("12:3: 45", "%2u:%2u:%3u", &u1, &u2, &u3); test_eq(2, tor_sscanf("12:3: 45", "%2u:%2u:%3u", &u1, &u2, &u3));
test_eq(r, 2); test_eq(12u, u1);
test_eq(3u, u2);
/* %u does not match negative numbers. */ /* %u does not match negative numbers. */
r = tor_sscanf("12:3:-4", "%2u:%2u:%3u", &u1, &u2, &u3); test_eq(2, tor_sscanf("67:8:-9", "%2u:%2u:%3u", &u1, &u2, &u3));
test_eq(r, 2); test_eq(67u, u1);
test_eq(8u, u2);
/* Arbitrary amounts of 0-padding are okay */ /* Arbitrary amounts of 0-padding are okay */
r = tor_sscanf("12:03:000000000000000099", "%2u:%2u:%u", &u1, &u2, &u3); test_eq(3, tor_sscanf("12:03:000000000000000099", "%2u:%2u:%u",
test_eq(r, 3); &u1, &u2, &u3));
test_eq(u1, 12u); test_eq(12u, u1);
test_eq(u2, 3u); test_eq(3u, u2);
test_eq(u3, 99u); test_eq(99u, u3);
/* %x should work. */ /* Hex (ie. %x) */
r = tor_sscanf("1234 02aBcdEf", "%x %x", &u1, &u2); test_eq(3, tor_sscanf("1234 02aBcdEf ff", "%x %x %x", &u1, &u2, &u3));
test_eq(r, 2); test_eq(0x1234, u1);
test_eq(u1, 0x1234); test_eq(0x2ABCDEF, u2);
test_eq(u2, 0x2ABCDEF); test_eq(0xFF, u3);
/* Width works on %x */ /* Width works on %x */
r = tor_sscanf("f00dcafe444", "%4x%4x%u", &u1, &u2, &u3); test_eq(3, tor_sscanf("f00dcafe444", "%4x%4x%u", &u1, &u2, &u3));
test_eq(r, 3); test_eq(0xf00d, u1);
test_eq(u1, 0xf00d); test_eq(0xcafe, u2);
test_eq(u2, 0xcafe); test_eq(444, u3);
test_eq(u3, 444);
r = tor_sscanf("99% fresh", "%3u%% fresh", &u1); /* percents are scannable.*/ /* Literal '%' (ie. '%%') */
test_eq(r, 1); test_eq(1, tor_sscanf("99% fresh", "%3u%% fresh", &u1));
test_eq(u1, 99); test_eq(99, u1);
test_eq(1, tor_sscanf("% boo", "%% %3s", s1));
test_streq("boo", s1);
r = tor_sscanf("hello", "%s", s1); /* %s needs a number. */ /* Strings (ie. %s) */
test_eq(r, -1); test_eq(2, tor_sscanf("hello", "%3s%7s", s1, s2));
r = tor_sscanf("hello", "%3s%7s", s1, s2); /* %s matches characters. */
test_eq(r, 2);
test_streq(s1, "hel"); test_streq(s1, "hel");
test_streq(s2, "lo"); test_streq(s2, "lo");
r = tor_sscanf("WD40", "%2s%u", s3, &u1); /* %s%u */ test_eq(2, tor_sscanf("WD40", "%2s%u", s3, &u1)); /* %s%u */
test_eq(r, 2);
test_streq(s3, "WD"); test_streq(s3, "WD");
test_eq(u1, 40); test_eq(40, u1);
r = tor_sscanf("76trombones", "%6u%9s", &u1, s1); /* %u%s */ test_eq(2, tor_sscanf("WD40", "%3s%u", s3, &u1)); /* %s%u */
test_eq(r, 2); test_streq(s3, "WD4");
test_eq(u1, 76); test_eq(0, u1);
test_eq(2, tor_sscanf("76trombones", "%6u%9s", &u1, s1)); /* %u%s */
test_eq(76, u1);
test_streq(s1, "trombones"); test_streq(s1, "trombones");
r = tor_sscanf("hello world", "%9s %9s", s1, s2); /* %s doesn't eat space. */ /* %s doesn't eat spaces */
test_eq(r, 2); test_eq(2, tor_sscanf("hello world", "%9s %9s", s1, s2));
test_streq(s1, "hello"); test_streq(s1, "hello");
test_streq(s2, "world"); test_streq(s2, "world");
r = tor_sscanf("hi", "%9s%9s%3s", s1, s2, s3); /* %s can be empty. */ test_eq(2, tor_sscanf("bye world?", "%9s %9s", s1, s2));
test_eq(r, 3); test_streq(s1, "bye");
test_streq(s2, "");
test_eq(3, tor_sscanf("hi", "%9s%9s%3s", s1, s2, s3)); /* %s can be empty. */
test_streq(s1, "hi"); test_streq(s1, "hi");
test_streq(s2, ""); test_streq(s2, "");
test_streq(s3, ""); test_streq(s3, "");
r = tor_sscanf("1.2.3", "%u.%u.%u%c", &u1, &u2, &u3, &ch); test_eq(3, tor_sscanf("1.2.3", "%u.%u.%u%c", &u1, &u2, &u3, &ch));
test_eq(r, 3); test_eq(4, tor_sscanf("1.2.3 foobar", "%u.%u.%u%c", &u1, &u2, &u3, &ch));
r = tor_sscanf("1.2.3 foobar", "%u.%u.%u%c", &u1, &u2, &u3, &ch); test_eq(' ', ch);
test_eq(r, 4);
done: done:
; ;