gitee.com/zhaochuninhefei/fabric-ca-gm@v0.0.2/lib/server_benchmarks_test.go (about) 1 /* 2 Copyright IBM Corp. 2016 All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 package lib 17 18 import ( 19 "io/ioutil" 20 "os" 21 "strconv" 22 "testing" 23 24 "gitee.com/zhaochuninhefei/gmgo/gmhttp/httptest" 25 26 http "gitee.com/zhaochuninhefei/gmgo/gmhttp" 27 28 "gitee.com/zhaochuninhefei/fabric-ca-gm/internal/pkg/api" 29 "gitee.com/zhaochuninhefei/fabric-ca-gm/internal/pkg/util" 30 ) 31 32 const ( 33 serverbPort = 7061 34 revokeUserCertEnv = "REVOKE_USER_CERT" 35 clientMspDir = testdataDir + "/msp" 36 ) 37 38 func BenchmarkServerStart(b *testing.B) { 39 b.StopTimer() 40 for i := 0; i < b.N; i++ { 41 srv := getServerForBenchmark(serverbPort, rootDir, "", -1, b) 42 b.StartTimer() 43 err := srv.Start() 44 b.StopTimer() 45 if err != nil { 46 b.Fatalf("Server failed to start: %v", err) 47 } 48 srv.Stop() 49 os.RemoveAll(rootDir) 50 } 51 } 52 53 func BenchmarkGetCACert(b *testing.B) { 54 // Stop the timer and perform all the initialization 55 b.StopTimer() 56 srv := getServerForBenchmark(serverbPort, rootDir, "", -1, b) 57 err := srv.Start() 58 if err != nil { 59 b.Fatalf("Server failed to start: %v", err) 60 } 61 defer cleanup(srv) 62 63 client := getTestClient(serverbPort) 64 infoSE := newCAInfoEndpoint(srv) 65 for i := 0; i < b.N; i++ { 66 req, err := createGetCACertRequest(client) 67 if err != nil { 68 b.Fatalf("Failed to create getCACert request: %s", err) 69 } 70 rw := httptest.NewRecorder() 71 // Start the timer now to measure getCACert handler 72 b.StartTimer() 73 infoSE.ServeHTTP(rw, req) 74 // Stop the timer 75 b.StopTimer() 76 resp := rw.Result() 77 if resp.StatusCode != http.StatusOK { 78 body, _ := ioutil.ReadAll(resp.Body) 79 b.Fatalf("GetCACert request handler returned an error: %s", body) 80 } 81 } 82 } 83 84 func BenchmarkRegister(b *testing.B) { 85 b.StopTimer() 86 srv := getServerForBenchmark(serverbPort, rootDir, "", -1, b) 87 err := srv.Start() 88 if err != nil { 89 b.Fatalf("Server failed to start: %v", err) 90 } 91 defer cleanup(srv) 92 93 client := getTestClient(serverbPort) 94 eresp, err := client.Enroll(&api.EnrollmentRequest{ 95 Name: "admin", 96 Secret: "adminpw", 97 }) 98 if err != nil { 99 b.Fatalf("Failed to enroll admin/adminpw: %s", err) 100 } 101 102 admin := eresp.Identity 103 registerSE := newRegisterEndpoint(srv) 104 for i := 0; i < b.N; i++ { 105 req, err := createRegisterRequest(admin, "registeruser"+strconv.Itoa(i)) 106 if err != nil { 107 b.Fatalf("Failed to create registration request: %s", err) 108 } 109 rw := httptest.NewRecorder() 110 b.StartTimer() 111 registerSE.ServeHTTP(rw, req) 112 b.StopTimer() 113 resp := rw.Result() 114 if resp.StatusCode != http.StatusOK { 115 body, _ := ioutil.ReadAll(resp.Body) 116 b.Fatalf("Register request handler returned an error: %s", body) 117 } 118 } 119 } 120 121 func BenchmarkEnroll(b *testing.B) { 122 b.StopTimer() 123 srv := getServerForBenchmark(serverbPort, rootDir, "", -1, b) 124 err := srv.Start() 125 if err != nil { 126 b.Fatalf("Server failed to start: %v", err) 127 } 128 defer cleanup(srv) 129 130 client := getTestClient(serverbPort) 131 eresp, err := client.Enroll(&api.EnrollmentRequest{ 132 Name: "admin", 133 Secret: "adminpw", 134 }) 135 if err != nil { 136 b.Fatalf("Failed to enroll admin/adminpw: %s", err) 137 } 138 admin := eresp.Identity 139 enrollSE := newEnrollEndpoint(srv) 140 for i := 0; i < b.N; i++ { 141 userName := "enrolluser" + strconv.Itoa(i) 142 regReq := &api.RegistrationRequest{ 143 Name: userName, 144 Type: "user", 145 Affiliation: "hyperledger.fabric.security", 146 } 147 regRes, err := admin.Register(regReq) 148 if err != nil { 149 b.Fatalf("Failed to register user %s: %s", userName, err) 150 } 151 req, err := createEnrollRequest(admin, userName, regRes) 152 if err != nil { 153 b.Fatalf("Failed to create enrollment request: %s", err) 154 } 155 rw := httptest.NewRecorder() 156 b.StartTimer() 157 enrollSE.ServeHTTP(rw, req) 158 b.StopTimer() 159 resp := rw.Result() 160 if resp.StatusCode != http.StatusOK { 161 body, _ := ioutil.ReadAll(resp.Body) 162 b.Fatalf("Enroll request handler returned an error: %s", body) 163 } 164 } 165 } 166 167 func BenchmarkReenrollOneUser(b *testing.B) { 168 b.StopTimer() 169 srv := getServerForBenchmark(serverbPort, rootDir, "", -1, b) 170 err := srv.Start() 171 if err != nil { 172 b.Fatalf("Server failed to start: %v", err) 173 } 174 defer cleanup(srv) 175 176 client := getTestClient(serverbPort) 177 eresp, err := client.Enroll(&api.EnrollmentRequest{ 178 Name: "admin", 179 Secret: "adminpw", 180 }) 181 if err != nil { 182 b.Fatalf("Failed to enroll admin/adminpw: %s", err) 183 } 184 admin := eresp.Identity 185 userName := "reenrolluser0" 186 regReq := &api.RegistrationRequest{ 187 Name: userName, 188 Type: "user", 189 Affiliation: "hyperledger.fabric.security", 190 } 191 user, err := admin.RegisterAndEnroll(regReq) 192 if err != nil { 193 b.Fatalf("Failed to register and enroll the user %s: %s", userName, err) 194 } 195 reenrollSE := newReenrollEndpoint(srv) 196 for i := 0; i < b.N; i++ { 197 req, err := createReenrollRequest(user) 198 if err != nil { 199 b.Fatalf("Failed to create reenroll request: %s", err) 200 } 201 rw := httptest.NewRecorder() 202 b.StartTimer() 203 reenrollSE.ServeHTTP(rw, req) 204 b.StopTimer() 205 resp := rw.Result() 206 if resp.StatusCode != http.StatusOK { 207 body, _ := ioutil.ReadAll(resp.Body) 208 b.Fatalf("Reenroll request handler returned an error: %s", body) 209 } 210 } 211 } 212 213 func BenchmarkReenroll(b *testing.B) { 214 b.StopTimer() 215 srv := getServerForBenchmark(serverbPort, rootDir, "", -1, b) 216 err := srv.Start() 217 if err != nil { 218 b.Fatalf("Server failed to start: %v", err) 219 } 220 defer cleanup(srv) 221 222 client := getTestClient(serverbPort) 223 eresp, err := client.Enroll(&api.EnrollmentRequest{ 224 Name: "admin", 225 Secret: "adminpw", 226 }) 227 if err != nil { 228 b.Fatalf("Failed to enroll admin/adminpw: %s", err) 229 } 230 admin := eresp.Identity 231 reenrollSE := newReenrollEndpoint(srv) 232 for i := 0; i < b.N; i++ { 233 userName := "reenrollusers" + strconv.Itoa(i) 234 regReq := &api.RegistrationRequest{ 235 Name: userName, 236 Type: "user", 237 Affiliation: "hyperledger.fabric.security", 238 } 239 user, err := admin.RegisterAndEnroll(regReq) 240 if err != nil { 241 b.Fatalf("Failed to register and enroll the user %s: %s", userName, err) 242 } 243 req, err := createReenrollRequest(user) 244 if err != nil { 245 b.Fatalf("Failed to create reenroll request: %s", err) 246 } 247 rw := httptest.NewRecorder() 248 b.StartTimer() 249 reenrollSE.ServeHTTP(rw, req) 250 b.StopTimer() 251 resp := rw.Result() 252 if resp.StatusCode != http.StatusOK { 253 body, _ := ioutil.ReadAll(resp.Body) 254 b.Fatalf("Reenroll request handler returned an error: %s", body) 255 } 256 } 257 } 258 259 func BenchmarkRevokeUserCert(b *testing.B) { 260 b.StopTimer() 261 revokeUserCertOrig := os.Getenv(revokeUserCertEnv) 262 os.Setenv(revokeUserCertEnv, "true") 263 defer os.Setenv(revokeUserCertEnv, revokeUserCertOrig) 264 invokeRevokeBenchmark(b) 265 } 266 267 func BenchmarkRevokeIdentity(b *testing.B) { 268 b.StopTimer() 269 revokeUserCertOrig := os.Getenv(revokeUserCertEnv) 270 os.Setenv(revokeUserCertEnv, "") 271 defer os.Setenv(revokeUserCertEnv, revokeUserCertOrig) 272 invokeRevokeBenchmark(b) 273 } 274 275 func BenchmarkGenCRL(b *testing.B) { 276 b.StopTimer() 277 srv := getServerForBenchmark(serverbPort, rootDir, "", -1, b) 278 err := srv.Start() 279 if err != nil { 280 b.Fatalf("Server failed to start: %v", err) 281 } 282 defer cleanup(srv) 283 284 client := getTestClient(serverbPort) 285 eresp, err := client.Enroll(&api.EnrollmentRequest{ 286 Name: "admin", 287 Secret: "adminpw", 288 }) 289 if err != nil { 290 b.Fatalf("Failed to enroll admin/adminpw: %s", err) 291 } 292 admin := eresp.Identity 293 294 for j := 0; j < 50; j++ { 295 userName := "gencrluser" + strconv.Itoa(j) 296 regReq := &api.RegistrationRequest{ 297 Name: userName, 298 Type: "user", 299 Affiliation: "hyperledger.fabric.security", 300 } 301 _, err = admin.RegisterAndEnroll(regReq) 302 if err != nil { 303 b.Fatalf("Failed to register and enroll the user %s: %s", userName, err) 304 } 305 _, err = admin.Revoke(&api.RevocationRequest{ 306 Name: userName, 307 }) 308 if err != nil { 309 b.Fatalf("Failed to revoke the user %s: %s", userName, err) 310 } 311 } 312 313 genCRLSE := newGenCRLEndpoint(srv) 314 315 for i := 0; i < b.N; i++ { 316 req, err := createGenCRLRequest(admin) 317 if err != nil { 318 b.Fatalf("Failed to create the genCRL request %s", err) 319 } 320 rw := httptest.NewRecorder() 321 b.StartTimer() 322 genCRLSE.ServeHTTP(rw, req) 323 b.StopTimer() 324 resp := rw.Result() 325 if resp.StatusCode != http.StatusOK { 326 body, _ := ioutil.ReadAll(resp.Body) 327 b.Fatalf("GenCRL request handler returned an error: %s", body) 328 } 329 } 330 } 331 332 func invokeRevokeBenchmark(b *testing.B) { 333 srv := getServerForBenchmark(serverbPort, rootDir, "", -1, b) 334 err := srv.Start() 335 if err != nil { 336 b.Fatalf("Server failed to start: %v", err) 337 } 338 defer cleanup(srv) 339 340 client := getTestClient(serverbPort) 341 eresp, err := client.Enroll(&api.EnrollmentRequest{ 342 Name: "admin", 343 Secret: "adminpw", 344 }) 345 if err != nil { 346 b.Fatalf("Failed to enroll admin/adminpw: %s", err) 347 } 348 admin := eresp.Identity 349 revokeSE := newRevokeEndpoint(srv) 350 for i := 0; i < b.N; i++ { 351 userName := "revokeuser" + strconv.Itoa(i) 352 regReq := &api.RegistrationRequest{ 353 Name: userName, 354 Type: "user", 355 Affiliation: "hyperledger.fabric.security", 356 } 357 user, err := admin.RegisterAndEnroll(regReq) 358 if err != nil { 359 b.Fatalf("Failed to register and enroll user %s: %s", userName, err) 360 } 361 req, err := createRevokeRequest(admin, user) 362 if err != nil { 363 b.Fatalf("Failed to create revoke request %s", err) 364 } 365 rw := httptest.NewRecorder() 366 b.StartTimer() 367 revokeSE.ServeHTTP(rw, req) 368 b.StopTimer() 369 resp := rw.Result() 370 if resp.StatusCode != http.StatusOK { 371 body, _ := ioutil.ReadAll(resp.Body) 372 b.Fatalf("Revoke request handler returned an error: %s", body) 373 } 374 } 375 } 376 377 func cleanup(srv *Server) { 378 srv.Stop() 379 os.RemoveAll(rootDir) 380 os.RemoveAll(clientMspDir) 381 } 382 383 func createRevokeRequest(admin *Identity, user *Identity) (*http.Request, error) { 384 revokeReq := &api.RevocationRequest{} 385 serial, aki, err := GetCertID(user.GetECert().Cert()) 386 if err != nil { 387 return nil, err 388 } 389 revokeUserCert := os.Getenv(revokeUserCertEnv) 390 if revokeUserCert == "" { 391 revokeReq.Name = user.GetName() 392 } else { 393 revokeReq.AKI = aki 394 revokeReq.Serial = serial 395 } 396 body, err := util.Marshal(revokeReq, "RevocationRequest") 397 if err != nil { 398 return nil, err 399 } 400 req, err := admin.client.newPost("revoke", body) 401 if err != nil { 402 return nil, err 403 } 404 err = admin.addTokenAuthHdr(req, body) 405 if err != nil { 406 return nil, err 407 } 408 return req, nil 409 } 410 411 func createReenrollRequest(user *Identity) (*http.Request, error) { 412 csr := &user.client.Config.CSR 413 csrPEM, _, err := user.client.GenCSR(csr, user.GetName()) 414 if err != nil { 415 return nil, err 416 } 417 reqNet := &api.ReenrollmentRequestNet{ 418 CAName: user.client.Config.CAName, 419 } 420 421 // Get the body of the request 422 if csr != nil { 423 reqNet.SignRequest.Hosts = csr.Hosts 424 } 425 reqNet.SignRequest.Request = string(csrPEM) 426 reqNet.SignRequest.Profile = user.client.Config.Enrollment.Profile 427 reqNet.SignRequest.Label = user.client.Config.Enrollment.Label 428 429 body, err := util.Marshal(reqNet, "SignRequest") 430 if err != nil { 431 return nil, err 432 } 433 req, err := user.client.newPost("reenroll", body) 434 if err != nil { 435 return nil, err 436 } 437 err = user.addTokenAuthHdr(req, body) 438 if err != nil { 439 return nil, err 440 } 441 return req, nil 442 } 443 444 func createEnrollRequest(admin *Identity, userName string, regRes *api.RegistrationResponse) (*http.Request, error) { 445 // Generate the CSR 446 csr := &admin.client.Config.CSR 447 csr.CN = userName 448 csrPEM, _, err := admin.client.GenCSR(csr, userName) 449 if err != nil { 450 return nil, err 451 } 452 453 reqNet := &api.EnrollmentRequestNet{ 454 CAName: "", 455 } 456 457 if csr != nil { 458 reqNet.SignRequest.Hosts = csr.Hosts 459 } 460 reqNet.SignRequest.Request = string(csrPEM) 461 reqNet.SignRequest.Profile = admin.client.Config.Enrollment.Profile 462 reqNet.SignRequest.Label = admin.client.Config.Enrollment.Label 463 464 body, err := util.Marshal(reqNet, "SignRequest") 465 if err != nil { 466 return nil, err 467 } 468 469 // Send the CSR to the fabric-ca server with basic auth header 470 req, err := admin.client.newPost("enroll", body) 471 if err != nil { 472 return nil, err 473 } 474 req.SetBasicAuth(userName, regRes.Secret) 475 return req, nil 476 } 477 478 func createRegisterRequest(admin *Identity, userName string) (*http.Request, error) { 479 regReq := &api.RegistrationRequest{ 480 Name: userName, 481 Type: "user", 482 Affiliation: "hyperledger.fabric.security", 483 } 484 reqBody, err := util.Marshal(regReq, "RegistrationRequest") 485 if err != nil { 486 return nil, err 487 } 488 req, err := admin.client.newPost("register", reqBody) 489 if err != nil { 490 return nil, err 491 } 492 err = admin.addTokenAuthHdr(req, reqBody) 493 if err != nil { 494 return nil, err 495 } 496 return req, nil 497 } 498 499 func createGetCACertRequest(client *Client) (*http.Request, error) { 500 body, err := util.Marshal(&api.GetCAInfoRequest{}, "GetCAInfo") 501 if err != nil { 502 return nil, err 503 } 504 cainforeq, err := client.newPost("cainfo", body) 505 if err != nil { 506 return nil, err 507 } 508 return cainforeq, nil 509 } 510 511 func createGenCRLRequest(user *Identity) (*http.Request, error) { 512 body, err := util.Marshal(&api.GenCRLRequest{CAName: ""}, "GenCRL") 513 if err != nil { 514 return nil, err 515 } 516 req, err := user.client.newPost("gencrl", body) 517 if err != nil { 518 return nil, err 519 } 520 err = user.addTokenAuthHdr(req, body) 521 if err != nil { 522 return nil, err 523 } 524 return req, nil 525 }