go.dedis.ch/onet/v4@v4.0.0-pre1/app/config_test.go (about) 1 package app 2 3 import ( 4 "bytes" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "path" 9 "strings" 10 "testing" 11 12 "github.com/stretchr/testify/require" 13 "go.dedis.ch/kyber/v4/pairing" 14 "go.dedis.ch/kyber/v4/suites" 15 "go.dedis.ch/onet/v4" 16 "go.dedis.ch/onet/v4/log" 17 "go.dedis.ch/onet/v4/network" 18 ) 19 20 var o bytes.Buffer 21 22 const testServiceName = "OnetConfigTestService" 23 24 func registerService() { 25 onet.RegisterNewServiceWithSuite(testServiceName, pairing.NewSuiteBn256(), func(c *onet.Context) (onet.Service, error) { 26 return nil, nil 27 }) 28 } 29 30 func unregisterService() { 31 onet.UnregisterService(testServiceName) 32 } 33 34 func TestMain(m *testing.M) { 35 out = &o 36 log.MainTest(m) 37 } 38 39 var serverGroup = `Description = "Default Dedis Cothority" 40 41 [[servers]] 42 Address = "tcp://5.135.161.91:2000" 43 Public = "94b8255379e11df5167b8a7ae3b85f7e7eb5f13894abee85bd31b3270f1e4c65" 44 Description = "Nikkolasg's server: spreading the love of singing" 45 [servers.Services] 46 [servers.Services.OnetConfigTestService] 47 Suite = "bn256.adapter" 48 Public = "593c700babf825b6056a2339ce437f73f717226a77d618a5e8f0251c00273b38557c3cda8dbde5431d062804275f8757a2c942d888ac09f2df34f806e35e660a3c6f13dc64a7cf112865807450ccbd9f75bb3aadb98599f7034cf377a9b976045df374f840e9ee617631257fc9611def6c7c2e5cf23f5ab36cf72f68f14b6686" 49 [servers.Services.abc] 50 Suite = "Ed25519" 51 Public = "94b8255379e11df5167b8a7ae3b85f7e7eb5f13894abee85bd31b3270f1e4c65" 52 53 [[servers]] 54 Address = "tcp://185.26.156.40:61117" 55 Suite = "Ed25519" 56 Public = "6a921638a4ade8970ebcd9e371570f08d71a24987f90f12391b9f6c525be5be4" 57 Description = "Ismail's server" 58 URL = "https://ismail.example.com/conode" 59 ` 60 61 func TestReadGroupDescToml(t *testing.T) { 62 registerService() 63 defer unregisterService() 64 65 group, err := ReadGroupDescToml(strings.NewReader(serverGroup)) 66 if err != nil { 67 t.Fatal(err) 68 } 69 70 if len(group.Roster.List) != 2 { 71 t.Fatal("Should have 2 ServerIdentities") 72 } 73 nikkoAddr := group.Roster.List[0].Address 74 if !nikkoAddr.Valid() || nikkoAddr != network.NewTCPAddress("5.135.161.91:2000") { 75 t.Fatal("Address not valid " + group.Roster.List[0].Address.String()) 76 } 77 if len(group.Description) != 2 { 78 t.Fatal("Should have 2 descriptions") 79 } 80 if group.Description[group.Roster.List[1]] != "Ismail's server" { 81 t.Fatal("This should be Ismail's server") 82 } 83 if group.Roster.List[1].URL != "https://ismail.example.com/conode" { 84 t.Fatal("Did not find expected URL.") 85 } 86 87 require.Equal(t, 1, len(group.Roster.List[0].ServiceIdentities)) 88 require.Equal(t, "bn256.adapter", group.Roster.List[0].ServiceIdentities[0].Suite) 89 } 90 91 // TestReadGroupWithWrongSuite checks if an error is returned when the wrong suite 92 // is used in the service configuration 93 func TestReadGroupWithWrongSuite(t *testing.T) { 94 registerService() 95 defer unregisterService() 96 97 const group = ` 98 [[servers]] 99 Address = "tcp://5.135.161.91:2000" 100 Public = "94b8255379e11df5167b8a7ae3b85f7e7eb5f13894abee85bd31b3270f1e4c65" 101 Description = "Nikkolasg's server: spreading the love of singing" 102 [servers.Services] 103 [servers.Services.OnetConfigTestService] 104 Suite = "fake_name" 105 Public = "" 106 ` 107 108 require.Panics(t, func() { ReadGroupDescToml(strings.NewReader(group)) }) 109 } 110 111 // TestSaveGroup checks that the group is correctly written into the file 112 func TestSaveGroup(t *testing.T) { 113 registerService() 114 defer unregisterService() 115 116 group, err := ReadGroupDescToml(strings.NewReader(serverGroup)) 117 require.NoError(t, err) 118 119 tmp, err := ioutil.TempDir("", "") 120 require.NoError(t, err) 121 defer os.RemoveAll(tmp) 122 123 filename := path.Join(tmp, "public.toml") 124 125 suite := suites.MustFind("ed25519") 126 err = group.Save(suite, filename) 127 require.NoError(t, err) 128 129 data, err := ioutil.ReadFile(filename) 130 require.NoError(t, err) 131 fmt.Print(string(data)) 132 require.Contains(t, string(data), serverGroup[strings.LastIndex(serverGroup, "[[servers]]"):]) 133 } 134 135 func TestParseCothority(t *testing.T) { 136 registerService() 137 defer unregisterService() 138 139 suite := "Ed25519" 140 public := "6a921638a4ade8970ebcd9e371570f08d71a24987f90f12391b9f6c525be5be4" 141 private := "6a921638a4ade8970ebcd9e371570f08d71a24987f90f12391b9f6c525be5be4" 142 address := "tcp://1.2.3.4:1234" 143 listenAddr := "127.0.0.1:0" 144 description := "This is a description." 145 scPublic := "593c700babf825b6056a2339ce437f73f717226a77d618a5e8f0251c00273b38557c3cda8dbde5431d062804275f8757a2c942d888ac09f2df34f806e35e660a3c6f13dc64a7cf112865807450ccbd9f75bb3aadb98599f7034cf377a9b976045df374f840e9ee617631257fc9611def6c7c2e5cf23f5ab36cf72f68f14b6686" 146 scPrivate := "622f20fbc7995dd48bab00b0f3d7d13220a9d71716c6be7a45b4b284836041a8" 147 148 privateInfo := fmt.Sprintf(`Suite = "%s" 149 Public = "%s" 150 Private = "%s" 151 Address = "%s" 152 ListenAddress = "%s" 153 Description = "%s" 154 [services] 155 [services.%s] 156 suite = "bn256.adapter" 157 public = "%s" 158 private = "%s" 159 [services.abc] 160 suite = "Ed25519" 161 public = "6a921638a4ade8970ebcd9e371570f08d71a24987f90f12391b9f6c525be5be4"`, 162 suite, public, private, address, listenAddr, 163 description, testServiceName, scPublic, scPrivate) 164 165 privateToml, err := ioutil.TempFile("", "temp_private.toml") 166 require.Nil(t, err) 167 168 privateToml.WriteString(privateInfo) 169 privateToml.Close() 170 171 cothConfig, srv, err := ParseCothority(privateToml.Name()) 172 require.Nil(t, err) 173 174 // Check basic information 175 require.Equal(t, suite, cothConfig.Suite) 176 require.Equal(t, public, cothConfig.Public) 177 require.Equal(t, private, cothConfig.Private) 178 require.Equal(t, address, cothConfig.Address.String()) 179 require.Equal(t, listenAddr, cothConfig.ListenAddress) 180 require.Equal(t, description, cothConfig.Description) 181 require.Equal(t, 1, len(srv.ServerIdentity.ServiceIdentities)) 182 require.Equal(t, "bn256.adapter", cothConfig.Services[testServiceName].Suite) 183 require.Equal(t, scPublic, cothConfig.Services[testServiceName].Public) 184 require.Equal(t, scPrivate, cothConfig.Services[testServiceName].Private) 185 186 srv.Close() 187 } 188 189 func TestParseCothorityWithTLSWebSocket(t *testing.T) { 190 suite := "Ed25519" 191 public := "6a921638a4ade8970ebcd9e371570f08d71a24987f90f12391b9f6c525be5be4" 192 private := "6a921638a4ade8970ebcd9e371570f08d71a24987f90f12391b9f6c525be5be4" 193 address := "tcp://1.2.3.4:1234" 194 listenAddr := "127.0.0.1:0" 195 description := "This is a description." 196 197 // Certificate and key examples taken from 198 // 'https://gist.github.com/blinksmith/579b2650a09f128a03ca' 199 wsTLSCert := `-----BEGIN CERTIFICATE----- 200 MIICEzCCAXygAwIBAgIQMIMChMLGrR+QvmQvpwAU6zANBgkqhkiG9w0BAQsFADAS 201 MRAwDgYDVQQKEwdBY21lIENvMCAXDTcwMDEwMTAwMDAwMFoYDzIwODQwMTI5MTYw 202 MDAwWjASMRAwDgYDVQQKEwdBY21lIENvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB 203 iQKBgQDuLnQAI3mDgey3VBzWnB2L39JUU4txjeVE6myuDqkM/uGlfjb9SjY1bIw4 204 iA5sBBZzHi3z0h1YV8QPuxEbi4nW91IJm2gsvvZhIrCHS3l6afab4pZBl2+XsDul 205 rKBxKKtD1rGxlG4LjncdabFn9gvLZad2bSysqz/qTAUStTvqJQIDAQABo2gwZjAO 206 BgNVHQ8BAf8EBAMCAqQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUw 207 AwEB/zAuBgNVHREEJzAlggtleGFtcGxlLmNvbYcEfwAAAYcQAAAAAAAAAAAAAAAA 208 AAAAATANBgkqhkiG9w0BAQsFAAOBgQCEcetwO59EWk7WiJsG4x8SY+UIAA+flUI9 209 tyC4lNhbcF2Idq9greZwbYCqTTTr2XiRNSMLCOjKyI7ukPoPjo16ocHj+P3vZGfs 210 h1fIw3cSS2OolhloGw/XM6RWPWtPAlGykKLciQrBru5NAPvCMsb/I1DAceTiotQM 211 fblo6RBxUQ== 212 -----END CERTIFICATE-----` 213 wsTLSCertKey := `-----BEGIN RSA PRIVATE KEY----- 214 MIICXgIBAAKBgQDuLnQAI3mDgey3VBzWnB2L39JUU4txjeVE6myuDqkM/uGlfjb9 215 SjY1bIw4iA5sBBZzHi3z0h1YV8QPuxEbi4nW91IJm2gsvvZhIrCHS3l6afab4pZB 216 l2+XsDulrKBxKKtD1rGxlG4LjncdabFn9gvLZad2bSysqz/qTAUStTvqJQIDAQAB 217 AoGAGRzwwir7XvBOAy5tM/uV6e+Zf6anZzus1s1Y1ClbjbE6HXbnWWF/wbZGOpet 218 3Zm4vD6MXc7jpTLryzTQIvVdfQbRc6+MUVeLKwZatTXtdZrhu+Jk7hx0nTPy8Jcb 219 uJqFk541aEw+mMogY/xEcfbWd6IOkp+4xqjlFLBEDytgbIECQQDvH/E6nk+hgN4H 220 qzzVtxxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLmQcj2PprIMmPcQrooz8vp 221 jy4SHEg1AkEA/v13/5M47K9vCxmb8QeD/asydfsgS5TeuNi8DoUBEmiSJwma7FXY 222 fFUtxuvL7XvjwjN5B30pNEbc6Iuyt7y4MQJBAIt21su4b3sjXNueLKH85Q+phy2U 223 fQtuUE9txblTu14q3N7gHRZB4ZMhFYyDy8CKrN2cPg/Fvyt0Xlp/DoCzjA0CQQDU 224 y2ptGsuSmgUtWj3NM9xuwYPm+Z/F84K6+ARYiZ6PYj013sovGKUFfYAqVXVlxtIX 225 qyUBnu3X9ps8ZfjLZO7BAkEAlT4R5Yl6cGhaJQYZHOde3JEMhNRcVFMO8dJDaFeo 226 f9Oeos0UUothgiDktdQHxdNEwLjQf7lJJBzV+5OtwswCWA== 227 -----END RSA PRIVATE KEY-----` 228 229 // Write files containing cert and key (+ be sure to delete them at the end) 230 certFile, err := ioutil.TempFile("", "temp_cert.pem") 231 defer func() { 232 err := os.Remove(certFile.Name()) 233 require.Nil(t, err) 234 }() 235 require.Nil(t, err) 236 certFile.WriteString(wsTLSCert) 237 certFile.Close() 238 239 keyFile, err := ioutil.TempFile("", "temp_key.pem") 240 defer func() { 241 err := os.Remove(keyFile.Name()) 242 require.Nil(t, err) 243 }() 244 require.Nil(t, err) 245 keyFile.WriteString(wsTLSCertKey) 246 keyFile.Close() 247 248 // Testing different ways of putting TLS info. 249 privateInfos := []string{ 250 fmt.Sprintf(`Suite = "%s" 251 Public = "%s" 252 Private = "%s" 253 Address = "%s" 254 ListenAddress = "%s" 255 Description = "%s" 256 WebSocketTLSCertificate = """string://%s""" 257 WebSocketTLSCertificateKey = """string://%s"""`, 258 suite, public, private, address, listenAddr, 259 description, wsTLSCert, wsTLSCertKey), 260 fmt.Sprintf(`Suite = "%s" 261 Public = "%s" 262 Private = "%s" 263 Address = "%s" 264 ListenAddress = "%s" 265 Description = "%s" 266 WebSocketTLSCertificate = "file://%s" 267 WebSocketTLSCertificateKey = "file://%s"`, 268 suite, public, private, address, listenAddr, 269 description, certFile.Name(), keyFile.Name()), 270 fmt.Sprintf(`Suite = "%s" 271 Public = "%s" 272 Private = "%s" 273 Address = "%s" 274 ListenAddress = "%s" 275 Description = "%s" 276 WebSocketTLSCertificate = "%s" 277 WebSocketTLSCertificateKey = "%s"`, 278 suite, public, private, address, listenAddr, 279 description, certFile.Name(), keyFile.Name()), 280 } 281 282 for i, privateInfo := range privateInfos { 283 privateToml, err := ioutil.TempFile("", "temp_private.toml") 284 require.Nil(t, err) 285 286 privateToml.WriteString(privateInfo) 287 privateToml.Close() 288 289 cothConfig, srv, err := ParseCothority(privateToml.Name()) 290 require.Nil(t, err) 291 292 // Check basic information 293 require.Equal(t, suite, cothConfig.Suite) 294 require.Equal(t, public, cothConfig.Public) 295 require.Equal(t, private, cothConfig.Private) 296 require.Equal(t, address, cothConfig.Address.String()) 297 require.Equal(t, listenAddr, cothConfig.ListenAddress) 298 require.Equal(t, description, cothConfig.Description) 299 300 // Check content of certificate and key 301 certContent, err := cothConfig.WebSocketTLSCertificate.Content() 302 require.Nil(t, err) 303 require.Equal(t, wsTLSCert, string(certContent)) 304 305 keyContent, err := cothConfig.WebSocketTLSCertificateKey.Content() 306 require.Nil(t, err) 307 require.Equal(t, wsTLSCertKey, string(keyContent)) 308 309 if i != 0 { 310 // Check when the certificate is a file. 311 require.NotNil(t, srv.WebSocket.TLSConfig.GetCertificate) 312 313 cert, err := srv.WebSocket.TLSConfig.GetCertificate(nil) 314 require.NoError(t, err) 315 require.NotNil(t, cert) 316 } 317 318 srv.Close() 319 320 err = os.Remove(privateToml.Name()) 321 require.Nil(t, err) 322 } 323 }