mirror of
https://github.com/samba-team/samba.git
synced 2025-02-02 09:47:23 +03:00
Given how core this code is, I figure it should have it's own testsuite.
Big thanks to tpot and mbp for showing how easy it can be to write a simple unit test, and for providing the STF. This also changes the strstr_m() code to use strstr_w() (avoiding duplication) and fixes it so that it passes the STF. (We now always restart before doing the unicode run, until sombody can show me why the testsuite is wrong). Andrew Bartlett (This used to be commit a893a324f37e6a171719db8ffffe66df31c2dbaa)
This commit is contained in:
parent
151faf6935
commit
32665c36c8
@ -1198,6 +1198,9 @@ bin/tdbdump@EXEEXT@: $(TDBDUMP_OBJ) bin/.dummy
|
||||
bin/t_strcmp@EXEEXT@: bin/libbigballofmud.@SHLIBEXT@ torture/t_strcmp.o
|
||||
$(CC) $(FLAGS) -o $@ $(LIBS) torture/t_strcmp.o -L ./bin -lbigballofmud
|
||||
|
||||
bin/t_strstr@EXEEXT@: bin/libbigballofmud.@SHLIBEXT@ torture/t_strstr.o
|
||||
$(CC) $(FLAGS) -o $@ $(LIBS) torture/t_strstr.o -L ./bin -lbigballofmud
|
||||
|
||||
bin/t_stringoverflow@EXEEXT@: bin/libbigballofmud.@SHLIBEXT@ torture/t_stringoverflow.o
|
||||
$(CC) $(FLAGS) -o $@ torture/t_stringoverflow.o -L./bin -lbigballofmud
|
||||
|
||||
@ -1476,4 +1479,4 @@ check: check-programs
|
||||
# These are called by the test suite and need to be built before
|
||||
# running it. For the time being we don't build all of BIN_PROGS,
|
||||
# because they're not all needed.
|
||||
check-programs: bin/t_strcmp bin/t_push_ucs2 bin/smbcontrol bin/t_snprintf
|
||||
check-programs: bin/t_strcmp bin/t_strstr bin/t_push_ucs2 bin/smbcontrol bin/t_snprintf
|
||||
|
@ -1309,6 +1309,11 @@ char *strstr_m(const char *src, const char *findstr)
|
||||
size_t findstr_len = 0;
|
||||
size_t find_w_len;
|
||||
|
||||
/* for correctness */
|
||||
if (!findstr[0]) {
|
||||
return src;
|
||||
}
|
||||
|
||||
/* Samba does single character findstr calls a *lot*. */
|
||||
if (findstr[1] == '\0')
|
||||
return strchr_m(src, *findstr);
|
||||
@ -1331,7 +1336,9 @@ char *strstr_m(const char *src, const char *findstr)
|
||||
if (!*s)
|
||||
return NULL;
|
||||
|
||||
#ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS
|
||||
#if 1 /* def BROKEN_UNICODE_COMPOSE_CHARACTERS */
|
||||
/* 'make check' fails unless we do this */
|
||||
|
||||
/* With compose characters we must restart from the beginning. JRA. */
|
||||
s = src;
|
||||
#endif
|
||||
@ -1346,18 +1353,15 @@ char *strstr_m(const char *src, const char *findstr)
|
||||
DEBUG(0,("strstr_m: find malloc fail\n"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
find_w_len = strlen_w(find_w);
|
||||
|
||||
for (p = src_w; (p = strchr_w(p, *find_w)) != NULL; p++) {
|
||||
if (strncmp_w(p, find_w, find_w_len) == 0)
|
||||
break;
|
||||
}
|
||||
p = strstr_w(src_w, find_w);
|
||||
|
||||
if (!p) {
|
||||
SAFE_FREE(src_w);
|
||||
SAFE_FREE(find_w);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*p = 0;
|
||||
if (pull_ucs2_allocate(&s2, src_w) == (size_t)-1) {
|
||||
SAFE_FREE(src_w);
|
||||
|
@ -94,8 +94,52 @@ class StrCaseCmp(comfychair.TestCase):
|
||||
for a, b, expect in cases:
|
||||
self.run_strcmp(a, b, expect)
|
||||
|
||||
class strstr_m(comfychair.TestCase):
|
||||
"""String comparisons in simple ASCII"""
|
||||
def run_strstr(self, a, b, expect):
|
||||
out, err = self.runcmd('t_strstr \"%s\" \"%s\"' % (a.encode('utf-8'), b.encode('utf-8')))
|
||||
if (out != (expect + '\n').encode('utf-8')):
|
||||
self.fail("comparison failed:\n"
|
||||
" a=%s\n"
|
||||
" b=%s\n"
|
||||
" expected=%s\n"
|
||||
" result=%s\n" % (`a`, `b`, `expect+'\n'`, `out`))
|
||||
|
||||
def runtest(self):
|
||||
# A, B, strstr_m(A, B)
|
||||
cases = [('hello', 'hello', 'hello'),
|
||||
('hello', 'goodbye', '(null)'),
|
||||
('goodbye', 'hello', '(null)'),
|
||||
('hell', 'hello', '(null)'),
|
||||
('hello', 'hell', 'hello'),
|
||||
('', '', ''),
|
||||
('a', '', 'a'),
|
||||
('', 'a', '(null)'),
|
||||
('a', 'A', '(null)'),
|
||||
('aa', 'aA', '(null)'),
|
||||
('Aa', 'aa', '(null)'),
|
||||
('%v foo', '%v', '%v foo'),
|
||||
('foo %v foo', '%v', '%v foo'),
|
||||
('foo %v', '%v', '%v'),
|
||||
('longstring ' * 100, 'longstring ' * 99, 'longstring ' * 100),
|
||||
('longstring ' * 99, 'longstring ' * 100, '(null)'),
|
||||
('longstring a' * 99, 'longstring ' * 100 + 'a', '(null)'),
|
||||
('longstring ' * 100 + 'a', 'longstring ' * 100, 'longstring ' * 100 + 'a'),
|
||||
(KATAKANA_LETTER_A, KATAKANA_LETTER_A + 'bcd', '(null)'),
|
||||
(KATAKANA_LETTER_A + 'bcde', KATAKANA_LETTER_A + 'bcd', KATAKANA_LETTER_A + 'bcde'),
|
||||
('d'+KATAKANA_LETTER_A + 'bcd', KATAKANA_LETTER_A + 'bcd', KATAKANA_LETTER_A + 'bcd'),
|
||||
('d'+KATAKANA_LETTER_A + 'bd', KATAKANA_LETTER_A + 'bcd', '(null)'),
|
||||
|
||||
('e'+KATAKANA_LETTER_A + 'bcdf', KATAKANA_LETTER_A + 'bcd', KATAKANA_LETTER_A + 'bcdf'),
|
||||
(KATAKANA_LETTER_A, KATAKANA_LETTER_A + 'bcd', '(null)'),
|
||||
(KATAKANA_LETTER_A*3, 'a', '(null)'),
|
||||
]
|
||||
for a, b, expect in cases:
|
||||
self.run_strstr(a, b, expect)
|
||||
|
||||
# Define the tests exported by this module
|
||||
tests = [StrCaseCmp,
|
||||
strstr_m,
|
||||
PushUCS2_Tests]
|
||||
|
||||
# Handle execution of this file as a main program
|
||||
|
35
source3/torture/t_strstr.c
Normal file
35
source3/torture/t_strstr.c
Normal file
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (C) 2003 by Martin Pool
|
||||
*
|
||||
* Test harness for strstr_m
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int i;
|
||||
int iters = 1;
|
||||
|
||||
char *ret;
|
||||
|
||||
/* Needed to initialize character set */
|
||||
lp_load("/dev/null", True, False, False);
|
||||
|
||||
if (argc < 3) {
|
||||
fprintf(stderr, "usage: %s STRING1 STRING2 [ITERS]\n"
|
||||
"Compares two strings, prints the results of strstr_m\n",
|
||||
argv[0]);
|
||||
return 2;
|
||||
}
|
||||
if (argc >= 4)
|
||||
iters = atoi(argv[3]);
|
||||
|
||||
for (i = 0; i < iters; i++) {
|
||||
ret = strstr_m(argv[1], argv[2]);
|
||||
}
|
||||
|
||||
printf("%s\n", ret);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user