Skip to content

Commit

Permalink
🧹 AdjustScore builds risk factor results into score (#1183)
Browse files Browse the repository at this point in the history
Signed-off-by: Dominik Richter <[email protected]>
  • Loading branch information
arlimus authored Mar 18, 2024
1 parent 8f5cd7f commit 87dea15
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 97 deletions.
34 changes: 21 additions & 13 deletions policy/risk_factor.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

package policy

func (r *RiskFactor) AdjustScore(score *Score, isDetected bool) *ScoredRiskFactor {
func (r *RiskFactor) AdjustScore(score *Score, isDetected bool) {
// Absolute risk factors only play a role when they are detected.
if r.IsAbsolute {
if isDetected {
Expand All @@ -16,38 +16,46 @@ func (r *RiskFactor) AdjustScore(score *Score, isDetected bool) *ScoredRiskFacto
score.Value = uint32(nu)
}

return &ScoredRiskFactor{
score.RiskFactors = append(score.RiskFactors, &ScoredRiskFactor{
Id: r.Uid,
Risk: r.Magnitude,
IsAbsolute: true,
}
} else {
return nil
})
return
}
// We don't adjust anything in case an absolute risk factor is not detected
return
}

if r.Magnitude < 0 {
if isDetected {
score.Value = uint32(100 - float32(100-score.Value)*(1+r.Magnitude))
return &ScoredRiskFactor{
score.RiskFactors = append(score.RiskFactors, &ScoredRiskFactor{
Id: r.Uid,
Risk: r.Magnitude,
}
} else {
return nil
})
return
}
// Relative risk factors that only decrease risk don't get flagged in
// case they are not detected
return
}

// For relative risk factors we have to adjust both the detected and
// not detected score. The non-detected score needs to be decreased,
// since it's a relative risk factors. The detected score just needs
// the flag to indicate its risk was "increased" (relative to non-detected)
if isDetected {
return &ScoredRiskFactor{
score.RiskFactors = append(score.RiskFactors, &ScoredRiskFactor{
Id: r.Uid,
Risk: r.Magnitude,
}
})
return
}

score.Value = uint32(100 - float32(100-score.Value)*(1-r.Magnitude))
return &ScoredRiskFactor{
score.RiskFactors = append(score.RiskFactors, &ScoredRiskFactor{
Id: r.Uid,
Risk: -r.Magnitude,
}
})
}
140 changes: 56 additions & 84 deletions policy/risk_factor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,112 +12,86 @@ import (

func TestRiskFactor_AdjustScore(t *testing.T) {
tests := []struct {
risk RiskFactor
score Score
onDetect *ScoredRiskFactor
onDetectScore Score
onFail *ScoredRiskFactor
onFailScore Score
risk RiskFactor
score Score
onDetect Score
onFail Score
}{
// Relative, increase risk
{
risk: RiskFactor{Magnitude: 0.4},
score: Score{Value: 40},
onDetect: &ScoredRiskFactor{Risk: 0.4},
onDetectScore: Score{Value: 40},
onFail: &ScoredRiskFactor{Risk: -0.4},
onFailScore: Score{Value: 64},
risk: RiskFactor{Magnitude: 0.4},
score: Score{Value: 40},
onDetect: Score{Value: 40, RiskFactors: []*ScoredRiskFactor{{Risk: 0.4}}},
onFail: Score{Value: 64, RiskFactors: []*ScoredRiskFactor{{Risk: -0.4}}},
},
{
risk: RiskFactor{Magnitude: 0.4},
score: Score{Value: 10},
onDetect: &ScoredRiskFactor{Risk: 0.4},
onDetectScore: Score{Value: 10},
onFail: &ScoredRiskFactor{Risk: -0.4},
onFailScore: Score{Value: 45},
risk: RiskFactor{Magnitude: 0.4},
score: Score{Value: 10},
onDetect: Score{Value: 10, RiskFactors: []*ScoredRiskFactor{{Risk: 0.4}}},
onFail: Score{Value: 45, RiskFactors: []*ScoredRiskFactor{{Risk: -0.4}}},
},
{
risk: RiskFactor{Magnitude: 0.4},
score: Score{Value: 90},
onDetect: &ScoredRiskFactor{Risk: 0.4},
onDetectScore: Score{Value: 90},
onFail: &ScoredRiskFactor{Risk: -0.4},
onFailScore: Score{Value: 94},
risk: RiskFactor{Magnitude: 0.4},
score: Score{Value: 90},
onDetect: Score{Value: 90, RiskFactors: []*ScoredRiskFactor{{Risk: 0.4}}},
onFail: Score{Value: 94, RiskFactors: []*ScoredRiskFactor{{Risk: -0.4}}},
},
// Absolute, decrease risk
{
risk: RiskFactor{Magnitude: -0.4},
score: Score{Value: 40},
onDetect: &ScoredRiskFactor{Risk: -0.4},
onDetectScore: Score{Value: 64},
onFail: nil,
onFailScore: Score{Value: 40},
risk: RiskFactor{Magnitude: -0.4},
score: Score{Value: 40},
onDetect: Score{Value: 64, RiskFactors: []*ScoredRiskFactor{{Risk: -0.4}}},
onFail: Score{Value: 40},
},
{
risk: RiskFactor{Magnitude: -0.4},
score: Score{Value: 10},
onDetect: &ScoredRiskFactor{Risk: -0.4},
onDetectScore: Score{Value: 45},
onFail: nil,
onFailScore: Score{Value: 10},
risk: RiskFactor{Magnitude: -0.4},
score: Score{Value: 10},
onDetect: Score{Value: 45, RiskFactors: []*ScoredRiskFactor{{Risk: -0.4}}},
onFail: Score{Value: 10},
},
{
risk: RiskFactor{Magnitude: -0.4},
score: Score{Value: 90},
onDetect: &ScoredRiskFactor{Risk: -0.4},
onDetectScore: Score{Value: 94},
onFail: nil,
onFailScore: Score{Value: 90},
risk: RiskFactor{Magnitude: -0.4},
score: Score{Value: 90},
onDetect: Score{Value: 94, RiskFactors: []*ScoredRiskFactor{{Risk: -0.4}}},
onFail: Score{Value: 90},
},
// Absolute, increase risk
{
risk: RiskFactor{Magnitude: 0.2, IsAbsolute: true},
score: Score{Value: 40},
onDetect: &ScoredRiskFactor{Risk: 0.2, IsAbsolute: true},
onDetectScore: Score{Value: 20},
onFail: nil,
onFailScore: Score{Value: 40},
risk: RiskFactor{Magnitude: 0.2, IsAbsolute: true},
score: Score{Value: 40},
onDetect: Score{Value: 20, RiskFactors: []*ScoredRiskFactor{{Risk: 0.2, IsAbsolute: true}}},
onFail: Score{Value: 40},
},
{
risk: RiskFactor{Magnitude: 0.2, IsAbsolute: true},
score: Score{Value: 10},
onDetect: &ScoredRiskFactor{Risk: 0.2, IsAbsolute: true},
onDetectScore: Score{Value: 0},
onFail: nil,
onFailScore: Score{Value: 10},
risk: RiskFactor{Magnitude: 0.2, IsAbsolute: true},
score: Score{Value: 10},
onDetect: Score{Value: 0, RiskFactors: []*ScoredRiskFactor{{Risk: 0.2, IsAbsolute: true}}},
onFail: Score{Value: 10},
},
{
risk: RiskFactor{Magnitude: 0.2, IsAbsolute: true},
score: Score{Value: 90},
onDetect: &ScoredRiskFactor{Risk: 0.2, IsAbsolute: true},
onDetectScore: Score{Value: 70},
onFail: nil,
onFailScore: Score{Value: 90},
risk: RiskFactor{Magnitude: 0.2, IsAbsolute: true},
score: Score{Value: 90},
onDetect: Score{Value: 70, RiskFactors: []*ScoredRiskFactor{{Risk: 0.2, IsAbsolute: true}}},
onFail: Score{Value: 90},
},
// Absolute, decrease risk
{
risk: RiskFactor{Magnitude: -0.2, IsAbsolute: true},
score: Score{Value: 40},
onDetect: &ScoredRiskFactor{Risk: -0.2, IsAbsolute: true},
onDetectScore: Score{Value: 60},
onFail: nil,
onFailScore: Score{Value: 40},
risk: RiskFactor{Magnitude: -0.2, IsAbsolute: true},
score: Score{Value: 40},
onDetect: Score{Value: 60, RiskFactors: []*ScoredRiskFactor{{Risk: -0.2, IsAbsolute: true}}},
onFail: Score{Value: 40},
},
{
risk: RiskFactor{Magnitude: -0.2, IsAbsolute: true},
score: Score{Value: 10},
onDetect: &ScoredRiskFactor{Risk: -0.2, IsAbsolute: true},
onDetectScore: Score{Value: 30},
onFail: nil,
onFailScore: Score{Value: 10},
risk: RiskFactor{Magnitude: -0.2, IsAbsolute: true},
score: Score{Value: 10},
onDetect: Score{Value: 30, RiskFactors: []*ScoredRiskFactor{{Risk: -0.2, IsAbsolute: true}}},
onFail: Score{Value: 10},
},
{
risk: RiskFactor{Magnitude: -0.2, IsAbsolute: true},
score: Score{Value: 90},
onDetect: &ScoredRiskFactor{Risk: -0.2, IsAbsolute: true},
onDetectScore: Score{Value: 100},
onFail: nil,
onFailScore: Score{Value: 90},
risk: RiskFactor{Magnitude: -0.2, IsAbsolute: true},
score: Score{Value: 90},
onDetect: Score{Value: 100, RiskFactors: []*ScoredRiskFactor{{Risk: -0.2, IsAbsolute: true}}},
onFail: Score{Value: 90},
},
}

Expand All @@ -126,14 +100,12 @@ func TestRiskFactor_AdjustScore(t *testing.T) {
cur := tests[i]

okScore := cur.score
okRF := cur.risk.AdjustScore(&okScore, true)
assert.Equal(t, cur.onDetect, okRF, "ok risk factors match")
assert.Equal(t, cur.onDetectScore, okScore, "ok scores match")
cur.risk.AdjustScore(&okScore, true)
assert.Equal(t, cur.onDetect, okScore, "ok scores match")

nokScore := cur.score
nokRF := cur.risk.AdjustScore(&nokScore, false)
assert.Equal(t, cur.onFail, nokRF, "fail risk factors match")
assert.Equal(t, cur.onFailScore, nokScore, "fail scores match")
cur.risk.AdjustScore(&nokScore, false)
assert.Equal(t, cur.onFail, nokScore, "fail scores match")
})
}
}

0 comments on commit 87dea15

Please sign in to comment.