func AreFilesIdentical()

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
}