summaryrefslogtreecommitdiff
path: root/qualityattenuation
diff options
context:
space:
mode:
authorBjørn Ivar Teigen <[email protected]>2023-05-19 21:08:12 +0200
committerBjørn Ivar Teigen <[email protected]>2023-05-19 21:08:12 +0200
commit372640ea973d318443427c2468b00b54e116dfb0 (patch)
treefc0eb0ba16c4b0398d7b5b7fb33ffb3ca835fc83 /qualityattenuation
parent1dc9c660ca8829bd386688a56b7047644789eb9a (diff)
Added basic tests of qualityattenuation
Diffstat (limited to 'qualityattenuation')
-rw-r--r--qualityattenuation/qualityattenuation.go8
-rw-r--r--qualityattenuation/qualityattenuation_test.go65
2 files changed, 69 insertions, 4 deletions
diff --git a/qualityattenuation/qualityattenuation.go b/qualityattenuation/qualityattenuation.go
index 67143a7..9782925 100644
--- a/qualityattenuation/qualityattenuation.go
+++ b/qualityattenuation/qualityattenuation.go
@@ -70,12 +70,12 @@ func (qa *SimpleQualityAttenuation) GetPercentile(percentile float64) float64 {
}
func (qa *SimpleQualityAttenuation) GetAverage() float64 {
- return qa.Offset_sum/float64(qa.Number_of_samples) + qa.Offset
+ return qa.Offset_sum/float64(qa.Number_of_samples-qa.Number_of_losses) + qa.Offset
}
func (qa *SimpleQualityAttenuation) GetVariance() float64 {
number_of_latency_samples := float64(qa.Number_of_samples) - float64(qa.Number_of_losses)
- return (qa.Offset_sum_of_squares - (qa.Offset_sum * qa.Offset_sum / number_of_latency_samples)) / (number_of_latency_samples - 1)
+ return (qa.Offset_sum_of_squares - (qa.Offset_sum * qa.Offset_sum / number_of_latency_samples)) / (number_of_latency_samples)
}
func (qa *SimpleQualityAttenuation) GetStandardDeviation() float64 {
@@ -95,11 +95,11 @@ func (qa *SimpleQualityAttenuation) GetMedian() float64 {
}
func (qa *SimpleQualityAttenuation) GetLossPercentage() float64 {
- return float64(qa.Number_of_losses) / float64(qa.Number_of_samples)
+ return 100 * float64(qa.Number_of_losses) / float64(qa.Number_of_samples)
}
func (qa *SimpleQualityAttenuation) GetRPM() float64 {
- return 60 / qa.GetAverage()
+ return 60.0 / qa.GetAverage()
}
func (qa *SimpleQualityAttenuation) GetPDV(percentile float64) float64 {
diff --git a/qualityattenuation/qualityattenuation_test.go b/qualityattenuation/qualityattenuation_test.go
new file mode 100644
index 0000000..862dc28
--- /dev/null
+++ b/qualityattenuation/qualityattenuation_test.go
@@ -0,0 +1,65 @@
+package qualityattenuation
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestBasicSimpleQualityAttenuation(t *testing.T) {
+ qa := NewSimpleQualityAttenuation()
+ qa.AddSample(1.0)
+ qa.AddSample(2.0)
+ qa.AddSample(3.0)
+ assert.Equal(t, qa.Number_of_samples, int64(3))
+ assert.Equal(t, qa.Number_of_losses, int64(0))
+ assert.InEpsilon(t, 1.0, qa.Minimum_latency, 0.000001)
+ assert.InEpsilon(t, 3.0, qa.Maximum_latency, 0.000001)
+ assert.InEpsilon(t, 5.7, qa.Offset_sum, 0.000001)
+ assert.InEpsilon(t, 12.83, qa.Offset_sum_of_squares, 0.000001)
+ assert.InEpsilon(t, 1.0, qa.EmpiricalDistribution.Quantile(0.1), 0.000001)
+ assert.InEpsilon(t, 2.0, qa.EmpiricalDistribution.Quantile(0.5), 0.000001)
+ assert.InEpsilon(t, 3.0, qa.EmpiricalDistribution.Quantile(0.9), 0.000001)
+ //Test the get functions
+ assert.Equal(t, qa.GetNumberOfSamples(), int64(3))
+ assert.Equal(t, qa.GetNumberOfLosses(), int64(0))
+ assert.InEpsilon(t, 1.0, qa.GetMinimum(), 0.000001)
+ assert.InEpsilon(t, 3.0, qa.GetMaximum(), 0.000001)
+ assert.InEpsilon(t, 2.0, qa.GetAverage(), 0.000001)
+ assert.InEpsilon(t, 1.0, qa.GetVariance(), 0.000001)
+ assert.InEpsilon(t, 1.0, qa.GetStandardDeviation(), 0.000001)
+ assert.InEpsilon(t, 2.0, qa.GetMedian(), 0.000001)
+ assert.InEpsilon(t, 1.0, qa.GetLossPercentage()+1.000000000, 0.000001)
+ assert.InEpsilon(t, 30, qa.GetRPM(), 0.000001)
+ assert.InEpsilon(t, 1.0, qa.GetPercentile(10.0), 0.000001)
+ assert.InEpsilon(t, 2.0, qa.GetPercentile(50.0), 0.000001)
+ assert.InEpsilon(t, 3.0, qa.GetPercentile(90.0), 0.000001)
+ assert.InEpsilon(t, 2.0, qa.GetPDV(90), 0.000001)
+}
+
+func TestManySamples(t *testing.T) {
+ qa := NewSimpleQualityAttenuation()
+ for i := 1; i < 160000; i++ {
+ qa.AddSample(float64(i) / 10000.0) //Linear ramp from 0.0001 to 16.0
+ }
+ assert.Equal(t, qa.Number_of_samples, int64(160000-1))
+ assert.Equal(t, qa.Number_of_losses, int64(10000-1)) //Samples from 15.0001 to 16.0 are lost
+ assert.InEpsilon(t, 0.0001, qa.Minimum_latency, 0.000001)
+ assert.InEpsilon(t, 15.0000, qa.Maximum_latency, 0.000001)
+ assert.InEpsilon(t, 1110007.5, qa.Offset_sum, 0.000001)
+ assert.InEpsilon(t, 11026611.00024998, qa.Offset_sum_of_squares, 0.000001)
+ assert.InEpsilon(t, 1.50005, qa.EmpiricalDistribution.Quantile(0.1), 0.000001)
+ assert.InEpsilon(t, 7.500049, qa.EmpiricalDistribution.Quantile(0.5), 0.000001)
+ assert.InEpsilon(t, 13.50005, qa.EmpiricalDistribution.Quantile(0.9), 0.000001)
+ //Test the get functions
+ assert.Equal(t, qa.GetNumberOfSamples(), int64(160000-1))
+ assert.Equal(t, qa.GetNumberOfLosses(), int64(10000-1))
+ assert.InEpsilon(t, 0.0001, qa.GetMinimum(), 0.000001)
+ assert.InEpsilon(t, 15.0000, qa.GetMaximum(), 0.000001)
+ assert.InEpsilon(t, 7.500049, qa.GetAverage(), 0.000001)
+ assert.InEpsilon(t, 18.749750, qa.GetVariance(), 0.001)
+ assert.InEpsilon(t, 4.330098, qa.GetStandardDeviation(), 0.001)
+ assert.InEpsilon(t, 7.500049, qa.GetMedian(), 0.000001)
+ assert.InEpsilon(t, 6.249414, qa.GetLossPercentage(), 0.000001)
+ assert.InEpsilon(t, 7.999947, qa.GetRPM(), 0.000001)
+}