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  }