Merge pull request #93 from prometheus/fix-cow-set

Fix pointer receiver in COWMetric.Set().
This commit is contained in:
Julius Volz 2015-03-10 23:41:37 +01:00
commit 8c63c28aef
2 changed files with 50 additions and 1 deletions

View File

@ -101,7 +101,7 @@ type COWMetric struct {
// Set sets a label name in the wrapped Metric to a given value and copies the // Set sets a label name in the wrapped Metric to a given value and copies the
// Metric initially, if it is not already a copy. // Metric initially, if it is not already a copy.
func (m COWMetric) Set(ln LabelName, lv LabelValue) { func (m *COWMetric) Set(ln LabelName, lv LabelValue) {
m.doCOW() m.doCOW()
m.Metric[ln] = lv m.Metric[ln] = lv
} }

View File

@ -70,3 +70,52 @@ func BenchmarkMetric(b *testing.B) {
testMetric(b) testMetric(b)
} }
} }
func TestCOWMetric(t *testing.T) {
testMetric := Metric{
"to_delete": "test1",
"to_change": "test2",
}
scenarios := []struct {
fn func(*COWMetric)
out Metric
}{
{
fn: func(cm *COWMetric) {
cm.Delete("to_delete")
},
out: Metric{
"to_change": "test2",
},
},
{
fn: func(cm *COWMetric) {
cm.Set("to_change", "changed")
},
out: Metric{
"to_delete": "test1",
"to_change": "changed",
},
},
}
for i, s := range scenarios {
orig := testMetric.Clone()
cm := &COWMetric{
Metric: orig,
}
s.fn(cm)
// Test that the original metric was not modified.
if !orig.Equal(testMetric) {
t.Fatalf("%d. original metric changed; expected %v, got %v", i, testMetric, orig)
}
// Test that the new metric has the right changes.
if !cm.Metric.Equal(s.out) {
t.Fatalf("%d. copied metric doesn't contain expected changes; expected %v, got %v", i, s.out, cm.Metric)
}
}
}