Newer
Older
////////////////////////////////////////////////////////////////////////////////
// Copyright © 2022 xx foundation //
// //
// Use of this source code is governed by a license that can be found in the //
// LICENSE file. //
////////////////////////////////////////////////////////////////////////////////

Jono Wenger
committed
//go:build js && wasm

Richard T. Carback III
committed
"gitlab.com/elixxir/client/v4/bindings"
"gitlab.com/elixxir/crypto/channel"
"gitlab.com/elixxir/xxdk-wasm/utils"
"gitlab.com/xx_network/crypto/csprng"
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
"testing"
)
// Tests that the map representing ChannelsManager returned by
// newChannelsManagerJS contains all of the methods on ChannelsManager.
func Test_newChannelsManagerJS(t *testing.T) {
cmType := reflect.TypeOf(&ChannelsManager{})
e2e := newChannelsManagerJS(&bindings.ChannelsManager{})
if len(e2e) != cmType.NumMethod() {
t.Errorf("ChannelsManager JS object does not have all methods."+
"\nexpected: %d\nreceived: %d", cmType.NumMethod(), len(e2e))
}
for i := 0; i < cmType.NumMethod(); i++ {
method := cmType.Method(i)
if _, exists := e2e[method.Name]; !exists {
t.Errorf("Method %s does not exist.", method.Name)
}
}
}
// Tests that ChannelsManager has all the methods that
// [bindings.ChannelsManager] has.
func Test_ChannelsManagerMethods(t *testing.T) {
cmType := reflect.TypeOf(&ChannelsManager{})
binCmType := reflect.TypeOf(&bindings.ChannelsManager{})
if binCmType.NumMethod() != cmType.NumMethod() {
t.Errorf("WASM ChannelsManager object does not have all methods from "+
"bindings.\nexpected: %d\nreceived: %d",
binCmType.NumMethod(), cmType.NumMethod())
}
for i := 0; i < binCmType.NumMethod(); i++ {
method := binCmType.Method(i)
if _, exists := cmType.MethodByName(method.Name); !exists {
t.Errorf("Method %s does not exist.", method.Name)
}
}
}
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// Tests that the map representing ChannelDbCipher returned by
// newChannelDbCipherJS contains all of the methods on ChannelDbCipher.
func Test_newChannelDbCipherJS(t *testing.T) {
cipherType := reflect.TypeOf(&ChannelDbCipher{})
cipher := newChannelDbCipherJS(&bindings.ChannelDbCipher{})
if len(cipher) != cipherType.NumMethod() {
t.Errorf("ChannelDbCipher JS object does not have all methods."+
"\nexpected: %d\nreceived: %d", cipherType.NumMethod(), len(cipher))
}
for i := 0; i < cipherType.NumMethod(); i++ {
method := cipherType.Method(i)
if _, exists := cipher[method.Name]; !exists {
t.Errorf("Method %s does not exist.", method.Name)
}
}
}
// Tests that ChannelDbCipher has all the methods that
// [bindings.ChannelDbCipher] has.
func Test_ChannelDbCipherMethods(t *testing.T) {
cipherType := reflect.TypeOf(&ChannelDbCipher{})
binCipherType := reflect.TypeOf(&bindings.ChannelDbCipher{})
if binCipherType.NumMethod() != cipherType.NumMethod() {
t.Errorf("WASM ChannelDbCipher object does not have all methods from "+
"bindings.\nexpected: %d\nreceived: %d",
binCipherType.NumMethod(), cipherType.NumMethod())
}
for i := 0; i < binCipherType.NumMethod(); i++ {
method := binCipherType.Method(i)
if _, exists := cipherType.MethodByName(method.Name); !exists {
t.Errorf("Method %s does not exist.", method.Name)
}
}
}
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
type jsIdentity struct {
pubKey js.Value
codeset js.Value
}
// Benchmark times the ConstructIdentity, which uses a sync.Map to increase
// efficiency for previously generated identities.
func BenchmarkConstructIdentity(b *testing.B) {
const n = 100_000
identities, j := make([]jsIdentity, 1000), 0
for i := 0; i < n; i++ {
pi, err := channel.GenerateIdentity(csprng.NewSystemRNG())
if err != nil {
b.Fatalf("%+v", err)
}
pubKey := utils.CopyBytesToJS(pi.PubKey)
codeset := js.ValueOf(int(pi.CodesetVersion))
ConstructIdentity(js.Value{}, []js.Value{pubKey, codeset})
if i%(n/len(identities)) == 0 {
identities[j] = jsIdentity{pubKey, codeset}
j++
}
}
b.ResetTimer()
for i := range identities {
go func(identity jsIdentity) {
ConstructIdentity(
js.Value{}, []js.Value{identity.pubKey, identity.codeset})
}(identities[i])
}
}
// Benchmark times the constructIdentity, which generates each new identity.
func Benchmark_constructIdentity(b *testing.B) {
identities := make([]jsIdentity, b.N)
for i := range identities {
pi, err := channel.GenerateIdentity(csprng.NewSystemRNG())
if err != nil {
b.Fatalf("%+v", err)
}
pubKey := utils.CopyBytesToJS(pi.PubKey)
codeset := js.ValueOf(int(pi.CodesetVersion))
identities[i] = jsIdentity{pubKey, codeset}
}
b.ResetTimer()
for i := range identities {
go func(identity jsIdentity) {
constructIdentity(
js.Value{}, []js.Value{identity.pubKey, identity.codeset})
}(identities[i])
}
}