// ClosestDigest returns the closest digest of type 'label' to 'digest', or "" if there aren't any positive digests. // // If no digest of type 'label' is found then Closest.Digest is the empty string. func ClosestDigest(test string, digest string, exp *expstorage.Expectations, tallies tally.Tally, diffStore diff.DiffStore, label types.Label) *Closest { ret := newClosest() unavailableDigests := diffStore.UnavailableDigests() if unavailableDigests[digest] { return ret } selected := []string{} for d, _ := range tallies { if !unavailableDigests[d] && (exp.Classification(test, d) == label) { selected = append(selected, d) } } if len(selected) == 0 { return ret } if diffMetrics, err := diffStore.Get(digest, selected); err != nil { glog.Errorf("ClosestDigest: Failed to get diff: %s", err) return ret } else { for digest, diff := range diffMetrics { if delta := combinedDiffMetric(diff.PixelDiffPercent, diff.MaxRGBADiffs); delta < ret.Diff { ret.Digest = digest ret.Diff = delta ret.DiffPixels = diff.PixelDiffPercent ret.MaxRGBA = diff.MaxRGBADiffs } } return ret } }