From fd73b28bfe68c6b20d2ce446de94819bdcfe8d36 Mon Sep 17 00:00:00 2001 From: Kurt Jung Date: Thu, 8 Oct 2015 14:19:39 -0400 Subject: Compare bytes of PDFs generated as examples with reference copies. Differences in the CreationDate values are effectively ignored in the comparison. --- internal/example/example.go | 55 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'internal') diff --git a/internal/example/example.go b/internal/example/example.go index d6a114c..3a60a1e 100644 --- a/internal/example/example.go +++ b/internal/example/example.go @@ -18,9 +18,12 @@ package example import ( + "bytes" "fmt" + "io/ioutil" "os" "path/filepath" + "regexp" "strings" ) @@ -87,11 +90,63 @@ func Filename(baseStr string) string { return PdfFile(baseStr + ".pdf") } +var ( + // 00000230 44 46 20 31 2e 37 29 0a 2f 43 72 65 61 74 69 6f |DF 1.7)./Creatio| + // 00000240 6e 44 61 74 65 20 28 44 3a 32 30 31 35 31 30 30 |nDate (D:2015100| + // 00000250 38 31 32 33 30 34 35 29 0a 3e 3e 0a 65 6e 64 6f |8123045).>>.endo| + creationDateRe *regexp.Regexp = regexp.MustCompile("/CreationDate \\(D:\\d{14}\\)") + fixDate []byte = []byte("/CreationDate (D:20000101000000)") +) + +// referenceCompare compares the specified file with the file's reference copy +// located in the 'reference' subdirectory. All bytes of the two files are +// compared except for the value of the /CreationDate field in the PDF. An +// error is returned if the two files do not match. If the file does not exist, +// a copy of the specified file is made and a non-nil error is returned only if +// this copy fails. +func referenceCompare(fileStr string) (err error) { + var fileBuf, refFileBuf []byte + var refFileStr, refDirStr, dirStr, baseFileStr string + dirStr, baseFileStr = filepath.Split(fileStr) + refDirStr = filepath.Join(dirStr, "reference") + err = os.MkdirAll(refDirStr, 0755) + if err == nil { + refFileStr = filepath.Join(refDirStr, baseFileStr) + fileBuf, err = ioutil.ReadFile(fileStr) + if err == nil { + // Replace the creation timestamp of this PDF with a fixed value + fileBuf = creationDateRe.ReplaceAll(fileBuf, fixDate) + refFileBuf, err = ioutil.ReadFile(refFileStr) + if err == nil { + if len(fileBuf) == len(refFileBuf) { + if bytes.Equal(fileBuf, refFileBuf) { + // Files match + } else { + err = fmt.Errorf("%s differs from %s", fileStr, refFileStr) + } + } else { + err = fmt.Errorf("size of %s (%d) does not match size of %s (%d)", + fileStr, len(fileBuf), refFileStr, len(refFileBuf)) + } + } else { + // Reference file is missing. Create it with a copy of the newly produced + // file in which the creation date has been fixed. Overwrite error with copy + // error. + err = ioutil.WriteFile(refFileStr, fileBuf, 0644) + } + } + } + return +} + // Summary generates a predictable report for use by test examples. If the // specified error is nil, the filename delimiters are normalized and the // filename printed to standard output with a success message. If the specified // error is not nil, its String() value is printed to standard output. func Summary(err error, fileStr string) { + if err == nil { + err = referenceCompare(fileStr) + } if err == nil { fileStr = filepath.ToSlash(fileStr) fmt.Printf("Successfully generated %s\n", fileStr) -- cgit v1.2.1-24-ge1ad