in tools/integration_tests/util/operations/file_operations.go [385:454]
func AreFilesIdentical(filepath1, filepath2 string) (bool, error) {
if filepath1 == "" || filepath2 == "" {
return false, fmt.Errorf("one or both files being diff'ed have empty path")
} else if filepath1 == filepath2 {
return true, nil
}
fstat1, err := StatFile(filepath1)
if err != nil {
return false, err
}
fstat2, err := StatFile(filepath2)
if err != nil {
return false, err
}
file1size := (*fstat1).Size()
file2size := (*fstat2).Size()
if file1size != file2size {
return false, fmt.Errorf("files don't match in size: %s (%d bytes), %s (%d bytes)", filepath1, file1size, filepath2, file2size)
}
if file1size == 0 {
return true, nil
}
f1, err := OpenFileAsReadonly(filepath1)
if err != nil {
return false, err
}
defer CloseFile(f1)
f2, err := OpenFileAsReadonly(filepath2)
if err != nil {
return false, err
}
defer CloseFile(f2)
sizeRemaining := int(file1size)
b1 := make([]byte, ChunkSizeForContentComparison)
b2 := make([]byte, ChunkSizeForContentComparison)
numBytesBeingRead := ChunkSizeForContentComparison
for sizeRemaining > 0 {
if sizeRemaining < ChunkSizeForContentComparison {
numBytesBeingRead = sizeRemaining
}
err := readBytesFromFile(f1, numBytesBeingRead, b1)
if err != nil {
return false, err
}
err = readBytesFromFile(f2, numBytesBeingRead, b2)
if err != nil {
return false, err
}
if !bytes.Equal(b1[:numBytesBeingRead], b2[:numBytesBeingRead]) {
return false, fmt.Errorf("files don't match in content: %s, %s", filepath1, filepath2)
}
sizeRemaining -= numBytesBeingRead
}
return true, nil
}