Permalink
Browse files

bounds checking stress tests

  • Loading branch information...
1 parent 123a149 commit e35b4b66cc57e2551f52df155cf3d3f4e2c67280 @russross committed Jul 3, 2011
Showing with 76 additions and 13 deletions.
  1. +21 −2 block_test.go
  2. +21 −2 inline_test.go
  3. +6 −0 markdown.go
  4. +28 −9 upskirtref_test.go
View
@@ -27,13 +27,32 @@ func runMarkdownBlock(input string, extensions int) string {
}
func doTestsBlock(t *testing.T, tests []string, extensions int) {
+ // catch and report panics
+ var candidate string
+ defer func() {
+ if err := recover(); err != nil {
+ t.Errorf("\npanic while processing [%#v]\n", candidate)
+ }
+ }()
+
for i := 0; i+1 < len(tests); i += 2 {
input := tests[i]
+ candidate = input
expected := tests[i+1]
- actual := runMarkdownBlock(input, extensions)
+ actual := runMarkdownBlock(candidate, extensions)
if actual != expected {
t.Errorf("\nInput [%#v]\nExpected[%#v]\nActual [%#v]",
- input, expected, actual)
+ candidate, expected, actual)
+ }
+
+ // now test every substring to stress test bounds checking
+ if !testing.Short() {
+ for start := 0; start < len(input); start++ {
+ for end := start + 1; end <= len(input); end++ {
+ candidate = input[start:end]
+ _ = runMarkdownBlock(candidate, extensions)
+ }
+ }
}
}
}
View
@@ -31,13 +31,32 @@ func runMarkdownInline(input string) string {
}
func doTestsInline(t *testing.T, tests []string) {
+ // catch and report panics
+ var candidate string
+ defer func() {
+ if err := recover(); err != nil {
+ t.Errorf("\npanic while processing [%#v]\n", candidate)
+ }
+ }()
+
for i := 0; i+1 < len(tests); i += 2 {
input := tests[i]
+ candidate = input
expected := tests[i+1]
- actual := runMarkdownInline(input)
+ actual := runMarkdownInline(candidate)
if actual != expected {
t.Errorf("\nInput [%#v]\nExpected[%#v]\nActual [%#v]",
- input, expected, actual)
+ candidate, expected, actual)
+ }
+
+ // now test every substring to stress test bounds checking
+ if !testing.Short() {
+ for start := 0; start < len(input); start++ {
+ for end := start + 1; end <= len(input); end++ {
+ candidate = input[start:end]
+ _ = runMarkdownInline(candidate)
+ }
+ }
}
}
}
View
@@ -270,6 +270,12 @@ func firstPass(parser *Parser, input []byte) []byte {
beg = end
}
}
+
+ // empty input?
+ if out.Len() == 0 {
+ out.WriteByte('\n')
+ }
+
return out.Bytes()
}
View
@@ -25,27 +25,46 @@ func runMarkdownReference(input string) string {
}
func doTestsReference(t *testing.T, files []string) {
+ // catch and report panics
+ var candidate string
+ defer func() {
+ if err := recover(); err != nil {
+ t.Errorf("\npanic while processing [%#v]\n", candidate)
+ }
+ }()
+
for _, basename := range files {
- fn := filepath.Join("upskirtref", basename+".text")
- actualdata, err := ioutil.ReadFile(fn)
+ filename := filepath.Join("upskirtref", basename+".text")
+ inputBytes, err := ioutil.ReadFile(filename)
if err != nil {
- t.Errorf("Couldn't open '%s', error: %v\n", fn, err)
+ t.Errorf("Couldn't open '%s', error: %v\n", filename, err)
continue
}
- fn = filepath.Join("upskirtref", basename+".html")
- expecteddata, err := ioutil.ReadFile(fn)
+ input := string(inputBytes)
+
+ filename = filepath.Join("upskirtref", basename+".html")
+ expectedBytes, err := ioutil.ReadFile(filename)
if err != nil {
- t.Errorf("Couldn't open '%s', error: %v\n", fn, err)
+ t.Errorf("Couldn't open '%s', error: %v\n", filename, err)
continue
}
+ expected := string(expectedBytes)
- actual := string(actualdata)
- actual = string(runMarkdownReference(actual))
- expected := string(expecteddata)
+ actual := string(runMarkdownReference(input))
if actual != expected {
t.Errorf("\n [%#v]\nExpected[%#v]\nActual [%#v]",
basename+".text", expected, actual)
}
+
+ // now test every substring of every input to check for
+ // bounds checking
+ if !testing.Short() {
+ start := 0
+ for end := start + 1; end <= len(input); end++ {
+ candidate = input[start:end]
+ _ = runMarkdownReference(candidate)
+ }
+ }
}
}

0 comments on commit e35b4b6

Please sign in to comment.