github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/internal/coverage/cmerge/merge_test.go (about) 1 // Copyright 2022 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package cmerge_test 6 7 import ( 8 "fmt" 9 "internal/coverage" 10 "internal/coverage/cmerge" 11 "testing" 12 ) 13 14 func TestClash(t *testing.T) { 15 m := &cmerge.Merger{} 16 err := m.SetModeAndGranularity("mdf1.data", coverage.CtrModeSet, coverage.CtrGranularityPerBlock) 17 if err != nil { 18 t.Fatalf("unexpected clash") 19 } 20 err = m.SetModeAndGranularity("mdf1.data", coverage.CtrModeSet, coverage.CtrGranularityPerBlock) 21 if err != nil { 22 t.Fatalf("unexpected clash") 23 } 24 err = m.SetModeAndGranularity("mdf1.data", coverage.CtrModeCount, coverage.CtrGranularityPerBlock) 25 if err == nil { 26 t.Fatalf("expected mode clash, not found") 27 } 28 err = m.SetModeAndGranularity("mdf1.data", coverage.CtrModeSet, coverage.CtrGranularityPerFunc) 29 if err == nil { 30 t.Fatalf("expected granularity clash, not found") 31 } 32 m.ResetModeAndGranularity() 33 err = m.SetModeAndGranularity("mdf1.data", coverage.CtrModeCount, coverage.CtrGranularityPerFunc) 34 if err != nil { 35 t.Fatalf("unexpected clash after reset") 36 } 37 } 38 39 func TestBasic(t *testing.T) { 40 scenarios := []struct { 41 cmode coverage.CounterMode 42 cgran coverage.CounterGranularity 43 src, dst, res []uint32 44 iters int 45 merr bool 46 overflow bool 47 }{ 48 { 49 cmode: coverage.CtrModeSet, 50 cgran: coverage.CtrGranularityPerBlock, 51 src: []uint32{1, 0, 1}, 52 dst: []uint32{1, 1, 0}, 53 res: []uint32{1, 1, 1}, 54 iters: 2, 55 overflow: false, 56 }, 57 { 58 cmode: coverage.CtrModeCount, 59 cgran: coverage.CtrGranularityPerBlock, 60 src: []uint32{1, 0, 3}, 61 dst: []uint32{5, 7, 0}, 62 res: []uint32{6, 7, 3}, 63 iters: 1, 64 overflow: false, 65 }, 66 { 67 cmode: coverage.CtrModeCount, 68 cgran: coverage.CtrGranularityPerBlock, 69 src: []uint32{4294967200, 0, 3}, 70 dst: []uint32{4294967001, 7, 0}, 71 res: []uint32{4294967295, 7, 3}, 72 iters: 1, 73 overflow: true, 74 }, 75 } 76 77 for k, scenario := range scenarios { 78 var err error 79 var ovf bool 80 m := &cmerge.Merger{} 81 mdf := fmt.Sprintf("file%d", k) 82 err = m.SetModeAndGranularity(mdf, scenario.cmode, scenario.cgran) 83 if err != nil { 84 t.Fatalf("case %d SetModeAndGranularity failed: %v", k, err) 85 } 86 for i := 0; i < scenario.iters; i++ { 87 err, ovf = m.MergeCounters(scenario.dst, scenario.src) 88 if ovf != scenario.overflow { 89 t.Fatalf("case %d overflow mismatch: got %v want %v", k, ovf, scenario.overflow) 90 } 91 if !scenario.merr && err != nil { 92 t.Fatalf("case %d unexpected err %v", k, err) 93 } 94 if scenario.merr && err == nil { 95 t.Fatalf("case %d expected err, not received", k) 96 } 97 for i := range scenario.dst { 98 if scenario.dst[i] != scenario.res[i] { 99 t.Fatalf("case %d: bad merge at %d got %d want %d", 100 k, i, scenario.dst[i], scenario.res[i]) 101 } 102 } 103 } 104 } 105 }