1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
package hotline
import (
"cmp"
"encoding/binary"
"encoding/hex"
"github.com/stretchr/testify/assert"
"log/slog"
"os"
"slices"
"testing"
)
func NewTestLogger() *slog.Logger {
return slog.New(slog.NewTextHandler(os.Stdout, nil))
}
// assertTransferBytesEqual takes a string with a hexdump in the same format that `hexdump -C` produces and compares with
// a hexdump for the bytes in got, after stripping the create/modify timestamps.
// I don't love this, but as git does not preserve file create/modify timestamps, we either need to fully mock the
// filesystem interactions or work around in this way.
// TODO: figure out a better solution
func assertTransferBytesEqual(t *testing.T, wantHexDump string, got []byte) bool {
if wantHexDump == "" {
return true
}
var clean []byte
clean = append(clean, got[:92]...) // keep the first 92 bytes
clean = append(clean, make([]byte, 16)...) // replace the next 16 bytes for create/modify timestamps
clean = append(clean, got[108:]...) // keep the rest
return assert.Equal(t, wantHexDump, hex.Dump(clean))
}
var tranSortFunc = func(a, b Transaction) int {
return cmp.Compare(
binary.BigEndian.Uint16(a.clientID[:]),
binary.BigEndian.Uint16(b.clientID[:]),
)
}
// tranAssertEqual compares equality of transactions slices after stripping out the random transaction ID
func tranAssertEqual(t *testing.T, tran1, tran2 []Transaction) bool {
var newT1 []Transaction
var newT2 []Transaction
for _, trans := range tran1 {
trans.ID = [4]byte{0, 0, 0, 0}
var fs []Field
for _, field := range trans.Fields {
if field.ID == [2]byte{0x00, 0x6b} { // FieldRefNum
continue
}
if field.ID == [2]byte{0x00, 0x72} { // FieldChatID
continue
}
fs = append(fs, field)
}
trans.Fields = fs
newT1 = append(newT1, trans)
}
for _, trans := range tran2 {
trans.ID = [4]byte{0, 0, 0, 0}
var fs []Field
for _, field := range trans.Fields {
if field.ID == [2]byte{0x00, 0x6b} { // FieldRefNum
continue
}
if field.ID == [2]byte{0x00, 0x72} { // FieldChatID
continue
}
fs = append(fs, field)
}
trans.Fields = fs
newT2 = append(newT2, trans)
}
slices.SortFunc(newT1, tranSortFunc)
slices.SortFunc(newT2, tranSortFunc)
return assert.Equal(t, newT1, newT2)
}
|