Skip to content

Commit 35a7427

Browse files
vshah23tothszabi
andauthored
redactwriter (#181)
* Copy filterwriter from bitrise * Update filterwriter to use go-utils logger * Fix linter errors * Move mocks to root level * Fix linter errors * Exclude filterwriter tests from race detector * Rename package to redactwriter --------- Co-authored-by: Szabolcs Toth <[email protected]>
1 parent 06a0eeb commit 35a7427

File tree

8 files changed

+1051
-2
lines changed

8 files changed

+1051
-2
lines changed

analytics/client_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import (
88
"testing"
99
"time"
1010

11-
"github.com/bitrise-io/go-utils/v2/analytics/mocks"
11+
"github.com/bitrise-io/go-utils/v2/mocks"
12+
1213
"github.com/stretchr/testify/assert"
1314
"github.com/stretchr/testify/mock"
1415
)

analytics/track_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import (
66
"testing"
77
"time"
88

9-
"github.com/bitrise-io/go-utils/v2/analytics/mocks"
9+
"github.com/bitrise-io/go-utils/v2/mocks"
10+
1011
"github.com/stretchr/testify/mock"
1112
)
1213

File renamed without changes.
File renamed without changes.

redactwriter/range.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package redactwriter
2+
3+
import (
4+
"bytes"
5+
"sort"
6+
)
7+
8+
type matchRange struct{ first, last int }
9+
10+
// allRanges returns every indexes of instance of pattern in b, or nil if pattern is not present in b.
11+
func allRanges(b, pattern []byte) (ranges []matchRange) {
12+
i := 0
13+
for {
14+
sub := b[i:]
15+
idx := bytes.Index(sub, pattern)
16+
if idx == -1 {
17+
return
18+
}
19+
20+
ranges = append(ranges, matchRange{first: idx + i, last: idx + i + len(pattern)})
21+
22+
i += idx + 1
23+
if i > len(b)-1 {
24+
return
25+
}
26+
}
27+
}
28+
29+
// mergeAllRanges merges every overlapping ranges in r.
30+
func mergeAllRanges(r []matchRange) []matchRange {
31+
sort.Slice(r, func(i, j int) bool { return r[i].first < r[j].first })
32+
for i := 0; i < len(r)-1; i++ {
33+
for i+1 < len(r) && r[i+1].first <= r[i].last {
34+
if r[i+1].last > r[i].last {
35+
r[i].last = r[i+1].last
36+
}
37+
r = append(r[:i+1], r[i+2:]...)
38+
}
39+
}
40+
return r
41+
}

redactwriter/range_test.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package redactwriter
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestAllRanges(t *testing.T) {
11+
{
12+
ranges := allRanges([]byte("test"), []byte("t"))
13+
require.Equal(t, []matchRange{{first: 0, last: 1}, {first: 3, last: 4}}, ranges)
14+
}
15+
16+
{
17+
ranges := allRanges([]byte("test rangetest"), []byte("test"))
18+
require.Equal(t, []matchRange{{first: 0, last: 4}, {first: 10, last: 14}}, ranges)
19+
}
20+
21+
{
22+
ranges := allRanges([]byte("\n"), []byte("\n"))
23+
require.Equal(t, []matchRange{{first: 0, last: 1}}, ranges)
24+
}
25+
26+
{
27+
ranges := allRanges([]byte("test\n"), []byte("\n"))
28+
require.Equal(t, []matchRange{{first: 4, last: 5}}, ranges)
29+
}
30+
31+
{
32+
ranges := allRanges([]byte("\n\ntest\n"), []byte("\n"))
33+
require.Equal(t, []matchRange{{first: 0, last: 1}, {first: 1, last: 2}, {first: 6, last: 7}}, ranges)
34+
}
35+
36+
{
37+
ranges := allRanges([]byte("\n\ntest\n"), []byte("test\n"))
38+
require.Equal(t, []matchRange{{first: 2, last: 7}}, ranges)
39+
}
40+
}
41+
42+
func TestMergeAllRanges(t *testing.T) {
43+
var testCases = []struct {
44+
name string
45+
ranges []matchRange
46+
want []matchRange
47+
}{
48+
{
49+
name: "merges overlapping ranges",
50+
ranges: []matchRange{{0, 2}, {1, 3}},
51+
want: []matchRange{{0, 3}},
52+
},
53+
{
54+
name: "does not merge distinct ranges",
55+
ranges: []matchRange{{0, 2}, {3, 5}},
56+
want: []matchRange{{0, 2}, {3, 5}},
57+
},
58+
{
59+
name: "returns the wider range",
60+
ranges: []matchRange{{0, 2}, {1, 2}},
61+
want: []matchRange{{0, 2}},
62+
},
63+
{
64+
name: "complex test",
65+
ranges: []matchRange{{11, 15}, {0, 2}, {11, 13}, {2, 4}, {6, 9}, {5, 10}},
66+
want: []matchRange{{0, 4}, {5, 10}, {11, 15}},
67+
},
68+
}
69+
for _, tc := range testCases {
70+
t.Run(tc.name, func(t *testing.T) {
71+
if got := mergeAllRanges(tc.ranges); !reflect.DeepEqual(got, tc.want) {
72+
t.Errorf("got %v, want %v", got, tc.want)
73+
}
74+
})
75+
}
76+
77+
}

0 commit comments

Comments
 (0)