Skip to content

Commit ad902a6

Browse files
author
number571
committed
update
1 parent 62f1691 commit ad902a6

File tree

9 files changed

+852
-519
lines changed

9 files changed

+852
-519
lines changed

cmd/hidden_lake/service/internal/config/config_test.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/number571/go-peer/pkg/crypto/asymmetric"
1010
"github.com/number571/go-peer/pkg/errors"
1111
"github.com/number571/go-peer/pkg/filesystem"
12+
testutils "github.com/number571/go-peer/test/_data"
1213
)
1314

1415
const (
@@ -29,7 +30,7 @@ const (
2930
tcServiceName2 = "test_service2"
3031
tcMessageSize = (1 << 20)
3132
tcWorkSize = 20
32-
tcKeySize = 4096
33+
tcKeySize = 1024
3334
tcQueuePeriod = 1000
3435
tcLimitVoidSize = (1 << 20)
3536
tcMessagesCapacity = 2048
@@ -45,8 +46,8 @@ var (
4546
"test_backup_connect2",
4647
}
4748
tgPubKeys = map[string]string{
48-
tcPubKeyAlias1: `PubKey(go-peer/rsa){3082020A0282020100C62F3CFA3D9809EE6DD77EBBFD38BC6796ABA76B795B3C76D3449F0AC808E01EDA8B2B08C58E508C306B2D842A2D317FF6B6D4A13EB76C7BBD5B157B663C3390B227476F4985EF649510D8CCA38FAB9FFCD67916FE73DB77595AB64FBE66D85892708A2DBCA94447A628F183FA6328136FCF158688CB6664EBA91F4C41621741786D50E3286AF9CAB81C101BDB19ACF42E10041CFDA5C6F30ACBBC4251E3D13C0E0781CBDC622E4ED490DD76BBA04D0A9C0012EBDAA77BD9F23183205A9D533C95A6C1FAAD8AB7C3B21FA4C76F7A3FB8EAEB231083ED925C1F71D23671E8C90E460C673A0DCD82ECFA956DF315200554571A99D79EB1E744681B9652389DBA6B9937CE476EBCAC34D02AEACF381DA40469B2F23E4F3DBFD5D8E04031708E46C31E3DC94342298E6F83CF7869C1209ACE2EA04FDB011D0FE265C8D51CF7D90C947160415B3415DFF9D1B16D5A9961F896109223B1408E740C421C6F413FA7B3D7094144DE4A0211DCAF043BC1A9FDE120251CBD654E705795D692A912F0543FF2F13EC733BD1E3AB83B915F95D3540EAA809C1E6E8C248A1EA1AE1D3B29C804F855167F64DA0AB06E5D89080D77D95A6E7199B079925922EA8735DF7654A01B350D67472F25B79DE5FF65B7E9156AEFC8818A1D9216BC4BE527DDC7D88F249B8745CF7DF1610A8237EB4BC1325C64FF47BD34B32CFE59720EC7FB52608D9009C70203010001}`,
49-
tcPubKeyAlias2: `PubKey(go-peer/rsa){3082020A0282020100C17B6FA53983050B0339A0AB60D20A8A5FF5F8210564464C45CD2FAC2F266E8DDBA3B36C6F356AE57D1A71EED7B612C4CBC808557E4FCBAF6EDCFCECE37494144F09D65C7533109CE2F9B9B31D754453CA636A4463594F2C38303AE1B7BFFE738AC57805C782193B4854FF3F3FACA2C6BF9F75428DF6C583FBC29614C0B3329DF50F7B6399E1CC1F12BED77F29F885D7137ADFADE74A43451BB97A32F2301BE8EA866AFF34D6C7ED7FF1FAEA11FFB5B1034602B67E7918E42CA3D20E3E68AA700BE1B55A78C73A1D60D0A3DED3A6E5778C0BA68BAB9C345462131B9DC554D1A189066D649D7E167621815AB5B93905582BF19C28BCA6018E0CD205702968885E92A3B1E3DB37A25AC26FA4D2A47FF024ECD401F79FA353FEF2E4C2183C44D1D44B44938D32D8DBEDDAF5C87D042E4E9DAD671BE9C10DD8B3FE0A7C29AFE20843FE268C6A8F14949A04FF25A3EEE1EBE0027A99CE1C4DC561697297EA9FD9E23CF2E190B58CA385B66A235290A23CBB3856108EFFDD775601B3DE92C06C9EA2695C2D25D7897FD9D43C1AE10016E51C46C67F19AC84CD25F47DE2962A48030BCD8A0F14FFE4135A2893F62AC3E15CC61EC2E4ACADE0736C9A8DBC17D439248C42C5C0C6E08612414170FBE5AA6B52AE64E4CCDAE6FD3066BED5C200E07DBB0167D74A9FAD263AF253DFA870F44407F8EF3D9F12B8D910C4D803AD82ABA136F93F0203010001}`,
49+
tcPubKeyAlias1: testutils.TgPubKeys[0],
50+
tcPubKeyAlias2: testutils.TgPubKeys[1],
5051
}
5152
tgServices = map[string]string{
5253
tcServiceName1: "test_address1",

cmd/hidden_lake/service/internal/config/editor.go

+11-9
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ type sEditor struct {
2121

2222
func newEditor(pCfg IConfig) IEditor {
2323
if pCfg == nil {
24-
return nil
24+
panic("cfg = nil")
2525
}
2626
v, ok := pCfg.(*SConfig)
2727
if !ok {
28-
return nil
28+
panic("cfg is invalid")
2929
}
3030
return &sEditor{
3131
fConfig: v,
@@ -121,8 +121,12 @@ func (p *sEditor) UpdateFriends(pFriends map[string]asymmetric.IPubKey) error {
121121
return errors.WrapError(err, "load config (update friends)")
122122
}
123123

124+
if hasDuplicatePubKeys(pFriends) {
125+
return errors.NewError("has duplicates public keys")
126+
}
127+
124128
cfg := icfg.(*SConfig)
125-
cfg.fFriends = deleteDuplicatePubKeys(pFriends)
129+
cfg.fFriends = pFriends
126130
cfg.FFriends = pubKeysToStrings(pFriends)
127131
err = filesystem.OpenFile(filepath).Write(encoding.Serialize(cfg, true))
128132
if err != nil {
@@ -145,18 +149,16 @@ func pubKeysToStrings(pPubKeys map[string]asymmetric.IPubKey) map[string]string
145149
return result
146150
}
147151

148-
func deleteDuplicatePubKeys(pPubKeys map[string]asymmetric.IPubKey) map[string]asymmetric.IPubKey {
149-
result := make(map[string]asymmetric.IPubKey, len(pPubKeys))
152+
func hasDuplicatePubKeys(pPubKeys map[string]asymmetric.IPubKey) bool {
150153
mapping := make(map[string]struct{})
151-
for name, pubKey := range pPubKeys {
154+
for _, pubKey := range pPubKeys {
152155
pubStr := pubKey.GetAddress().ToString()
153156
if _, ok := mapping[pubStr]; ok {
154-
continue
157+
return true
155158
}
156159
mapping[pubStr] = struct{}{}
157-
result[name] = pubKey
158160
}
159-
return result
161+
return false
160162
}
161163

162164
func deleteDuplicateStrings(pStrs []string) []string {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,241 @@
1+
package config
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"testing"
7+
8+
logger "github.com/number571/go-peer/internal/logger/std"
9+
"github.com/number571/go-peer/pkg/crypto/asymmetric"
10+
"github.com/number571/go-peer/pkg/crypto/random"
11+
"github.com/number571/go-peer/pkg/stringtools"
12+
testutils "github.com/number571/go-peer/test/_data"
13+
)
14+
15+
const (
16+
tcNewNetworkKey = "abc_network_key"
17+
)
18+
19+
var (
20+
tgNewConnections = []string{"a", "b", "c", "b"}
21+
tgNewBackupConnections = []string{"x", "y", "z", "y"}
22+
tgNewFriends = map[string]asymmetric.IPubKey{
23+
"a": asymmetric.LoadRSAPubKey(testutils.TgPubKeys[2]),
24+
"b": asymmetric.LoadRSAPubKey(testutils.TgPubKeys[3]),
25+
}
26+
27+
// diff size of keys: 1024, 4096 bits
28+
tgNewIncorrect1Friends = map[string]asymmetric.IPubKey{
29+
"a": asymmetric.LoadRSAPubKey(testutils.TgPubKeys[2]),
30+
"b": asymmetric.LoadRSAPubKey(`PubKey(go-peer/rsa){3082020A0282020100C62F3CFA3D9809EE6DD77EBBFD38BC6796ABA76B795B3C76D3449F0AC808E01EDA8B2B08C58E508C306B2D842A2D317FF6B6D4A13EB76C7BBD5B157B663C3390B227476F4985EF649510D8CCA38FAB9FFCD67916FE73DB77595AB64FBE66D85892708A2DBCA94447A628F183FA6328136FCF158688CB6664EBA91F4C41621741786D50E3286AF9CAB81C101BDB19ACF42E10041CFDA5C6F30ACBBC4251E3D13C0E0781CBDC622E4ED490DD76BBA04D0A9C0012EBDAA77BD9F23183205A9D533C95A6C1FAAD8AB7C3B21FA4C76F7A3FB8EAEB231083ED925C1F71D23671E8C90E460C673A0DCD82ECFA956DF315200554571A99D79EB1E744681B9652389DBA6B9937CE476EBCAC34D02AEACF381DA40469B2F23E4F3DBFD5D8E04031708E46C31E3DC94342298E6F83CF7869C1209ACE2EA04FDB011D0FE265C8D51CF7D90C947160415B3415DFF9D1B16D5A9961F896109223B1408E740C421C6F413FA7B3D7094144DE4A0211DCAF043BC1A9FDE120251CBD654E705795D692A912F0543FF2F13EC733BD1E3AB83B915F95D3540EAA809C1E6E8C248A1EA1AE1D3B29C804F855167F64DA0AB06E5D89080D77D95A6E7199B079925922EA8735DF7654A01B350D67472F25B79DE5FF65B7E9156AEFC8818A1D9216BC4BE527DDC7D88F249B8745CF7DF1610A8237EB4BC1325C64FF47BD34B32CFE59720EC7FB52608D9009C70203010001}`),
31+
}
32+
33+
// duplicated public keys
34+
tgNewIncorrect2Friends = map[string]asymmetric.IPubKey{
35+
"a": asymmetric.LoadRSAPubKey(testutils.TgPubKeys[2]),
36+
"b": asymmetric.LoadRSAPubKey(testutils.TgPubKeys[2]),
37+
}
38+
)
39+
40+
type tsConfig struct{}
41+
42+
var (
43+
_ IConfig = &tsConfig{}
44+
)
45+
46+
func (p *tsConfig) GetSettings() IConfigSettings { return nil }
47+
func (p *tsConfig) GetLogging() logger.ILogging { return nil }
48+
func (p *tsConfig) GetAddress() IAddress { return nil }
49+
func (p *tsConfig) GetNetworkKey() string { return "" }
50+
func (p *tsConfig) GetConnections() []string { return nil }
51+
func (p *tsConfig) GetBackupConnections() []string { return nil }
52+
func (p *tsConfig) GetFriends() map[string]asymmetric.IPubKey { return nil }
53+
func (p *tsConfig) GetService(_ string) (string, bool) { return "", false }
54+
55+
func TestPanicEditor(t *testing.T) {
56+
t.Parallel()
57+
58+
for i := 0; i < 2; i++ {
59+
testPanicEditor(t, i)
60+
}
61+
}
62+
63+
func testPanicEditor(t *testing.T, n int) {
64+
defer func() {
65+
if r := recover(); r == nil {
66+
t.Error("nothing panics")
67+
return
68+
}
69+
}()
70+
switch n {
71+
case 0:
72+
_ = newEditor(nil)
73+
case 1:
74+
_ = newEditor(&tsConfig{})
75+
}
76+
}
77+
78+
func TestEditor(t *testing.T) {
79+
t.Parallel()
80+
81+
configFile := fmt.Sprintf(tcConfigFileTemplate, 4)
82+
defer os.Remove(configFile)
83+
84+
testConfigDefaultInit(configFile)
85+
cfg, err := LoadConfig(configFile)
86+
if err != nil {
87+
t.Error(err)
88+
return
89+
}
90+
91+
wrapper := NewWrapper(cfg)
92+
93+
config := wrapper.GetConfig()
94+
editor := wrapper.GetEditor()
95+
96+
beforeNetworkKey := config.GetNetworkKey()
97+
beforeConnections := config.GetConnections()
98+
beforeBackupConnections := config.GetBackupConnections()
99+
beforeFriends := config.GetFriends()
100+
101+
if err := editor.UpdateNetworkKey(tcNewNetworkKey); err != nil {
102+
t.Error(err)
103+
return
104+
}
105+
afterNetworkKey := config.GetNetworkKey()
106+
if beforeNetworkKey == afterNetworkKey {
107+
t.Error("beforeNetworkKey == afterNetworkKey")
108+
return
109+
}
110+
if afterNetworkKey != tcNewNetworkKey {
111+
t.Error("afterNetworkKey != tcNewNetworkKey")
112+
return
113+
}
114+
115+
if err := editor.UpdateConnections(tgNewConnections); err != nil {
116+
t.Error(err)
117+
return
118+
}
119+
afterConnections := config.GetConnections()
120+
if len(afterConnections) != 3 {
121+
t.Error("failed deduplicate strings (connections)")
122+
return
123+
}
124+
hasNewConn := false
125+
for _, ac := range afterConnections {
126+
if !stringtools.HasInSlice(beforeConnections, ac) {
127+
hasNewConn = true
128+
break
129+
}
130+
}
131+
if !hasNewConn {
132+
t.Error("beforeConnections == afterConnections")
133+
return
134+
}
135+
for _, nc := range tgNewConnections {
136+
if !stringtools.HasInSlice(afterConnections, nc) {
137+
t.Error("afterConnections != tgNewConnections")
138+
return
139+
}
140+
}
141+
142+
if err := editor.UpdateBackupConnections(tgNewBackupConnections); err != nil {
143+
t.Error(err)
144+
return
145+
}
146+
afterBackupConnections := config.GetBackupConnections()
147+
if len(afterBackupConnections) != 3 {
148+
t.Error("failed deduplicate strings (backup connections)")
149+
return
150+
}
151+
hasNewBackupConn := false
152+
for _, ac := range afterBackupConnections {
153+
if !stringtools.HasInSlice(beforeBackupConnections, ac) {
154+
hasNewBackupConn = true
155+
break
156+
}
157+
}
158+
if !hasNewBackupConn {
159+
t.Error("beforeBackupConnections == afterBackupConnections")
160+
return
161+
}
162+
for _, nc := range tgNewBackupConnections {
163+
if !stringtools.HasInSlice(afterBackupConnections, nc) {
164+
t.Error("afterBackupConnections != tgNewBackupConnections")
165+
return
166+
}
167+
}
168+
169+
if err := editor.UpdateFriends(tgNewFriends); err != nil {
170+
t.Error(err)
171+
return
172+
}
173+
afterFriends := config.GetFriends()
174+
if len(afterFriends) != 2 {
175+
t.Error("failed deduplicate public keys (friends)")
176+
return
177+
}
178+
for af := range afterFriends {
179+
if _, ok := beforeFriends[af]; ok {
180+
t.Error("beforeFriends == afterFriends")
181+
return
182+
}
183+
}
184+
for nf := range tgNewFriends {
185+
if _, ok := afterFriends[nf]; !ok {
186+
t.Error("afterFriends != tgNewFriends")
187+
return
188+
}
189+
}
190+
191+
if err := editor.UpdateFriends(tgNewIncorrect2Friends); err == nil {
192+
t.Error("success update friends with duplicates")
193+
return
194+
}
195+
}
196+
197+
func TestIncorrectFilepathEditor(t *testing.T) {
198+
t.Parallel()
199+
200+
configFile := fmt.Sprintf(tcConfigFileTemplate, 5)
201+
defer os.Remove(configFile)
202+
203+
testConfigDefaultInit(configFile)
204+
cfg, err := LoadConfig(configFile)
205+
if err != nil {
206+
t.Error(err)
207+
return
208+
}
209+
210+
wrapper := NewWrapper(cfg)
211+
212+
config := wrapper.GetConfig().(*SConfig)
213+
editor := wrapper.GetEditor()
214+
215+
config.fFilepath = random.NewStdPRNG().GetString(32)
216+
217+
if err := editor.UpdateNetworkKey(tcNewNetworkKey); err == nil {
218+
t.Error("success update network key with incorrect filepath")
219+
return
220+
}
221+
222+
if err := editor.UpdateConnections(tgNewConnections); err == nil {
223+
t.Error("success update connections with incorrect filepath")
224+
return
225+
}
226+
227+
if err := editor.UpdateBackupConnections(tgNewBackupConnections); err == nil {
228+
t.Error("success update backup connections with incorrect filepath")
229+
return
230+
}
231+
232+
if err := editor.UpdateFriends(tgNewIncorrect1Friends); err == nil {
233+
t.Error("success update friends with incorrect key sizes")
234+
return
235+
}
236+
237+
if err := editor.UpdateFriends(tgNewFriends); err == nil {
238+
t.Error("success update friends with incorrect filepath")
239+
return
240+
}
241+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package config
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"testing"
7+
8+
hls_settings "github.com/number571/go-peer/cmd/hidden_lake/service/pkg/settings"
9+
"github.com/number571/go-peer/pkg/filesystem"
10+
)
11+
12+
func TestInit(t *testing.T) {
13+
configFile := fmt.Sprintf(tcConfigFileTemplate, 6)
14+
defer os.Remove(configFile)
15+
16+
testConfigDefaultInit(configFile)
17+
18+
config1, err := InitConfig(configFile, nil)
19+
if err != nil {
20+
t.Error(err)
21+
return
22+
}
23+
24+
if config1.GetAddress().GetTCP() != tcAddressTCP {
25+
t.Error("got invalid field with exist config (1)")
26+
return
27+
}
28+
29+
os.Remove(configFile)
30+
31+
if err := filesystem.OpenFile(configFile).Write([]byte("abc")); err != nil {
32+
t.Error(err)
33+
return
34+
}
35+
36+
if _, err := InitConfig(configFile, nil); err == nil {
37+
t.Error("success init config with invalid config structure (1)")
38+
return
39+
}
40+
41+
os.Remove(configFile)
42+
43+
if _, err := InitConfig(configFile, &SConfig{}); err == nil {
44+
t.Error("success init config with invalid config structure (2)")
45+
return
46+
}
47+
48+
os.Remove(configFile)
49+
50+
config2, err := InitConfig(configFile, config1.(*SConfig))
51+
if err != nil {
52+
t.Error(err)
53+
return
54+
}
55+
56+
if config2.GetAddress().GetTCP() != tcAddressTCP {
57+
t.Error("got invalid field with exist config (2)")
58+
return
59+
}
60+
61+
os.Remove(configFile)
62+
63+
config3, err := InitConfig(configFile, nil)
64+
if err != nil {
65+
t.Error(err)
66+
return
67+
}
68+
69+
if config3.GetAddress().GetTCP() != hls_settings.CDefaultTCPAddress {
70+
t.Error("got invalid field with exist config (3)")
71+
return
72+
}
73+
}

0 commit comments

Comments
 (0)