Skip to content

Commit

Permalink
impl for #200 (#207)
Browse files Browse the repository at this point in the history
Signed-off-by: Sam Yuan <[email protected]>
  • Loading branch information
SamYuan1990 authored Aug 24, 2021
1 parent 2c6f3a8 commit a19e2b0
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 34 deletions.
85 changes: 51 additions & 34 deletions pkg/infra/trafficGenerator/proposal.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package trafficGenerator

import (
"bytes"
"fmt"
"math"
"math/rand"
"regexp"
Expand Down Expand Up @@ -29,41 +30,11 @@ var seededRand *rand.Rand = rand.New(
func CreateProposal(signer infra.Crypto, channel, ccname, version string, args ...string) (*peer.Proposal, error) {
var argsInByte [][]byte
for _, arg := range args {
// ref to https://ghz.sh/docs/calldata
// currently supports three kinds of random
// support for uuid
// uuid
// support for random strings
// randomString$length
// support for random int
// randomNumberMin_Max
current_arg := []byte(arg)
if arg == "uuid" {
current_arg = []byte(newUUID())
current_arg, err := ConvertString(arg)
if err != nil {
return nil, err
}
regString, _ := regexp.Compile("randomString(\\d*)")
if regString.MatchString(arg) {
length, err := strconv.Atoi(strings.TrimPrefix(arg, "randomString"))
if err != nil {
return nil, err
}
current_arg = []byte(randomString(length))
}
regNumber, _ := regexp.Compile("randomNumber(\\d*)_(\\d*)")
if regNumber.MatchString(arg) {
min_maxStr := strings.TrimPrefix(arg, "randomNumber")
min_maxArray := strings.Split(min_maxStr, "_")
min, err := strconv.Atoi(min_maxArray[0])
if err != nil {
return nil, err
}
max, err := strconv.Atoi(min_maxArray[1])
if err != nil {
return nil, err
}
current_arg = []byte(strconv.Itoa(randomInt(min, max)))
}
argsInByte = append(argsInByte, current_arg)
argsInByte = append(argsInByte, []byte(current_arg))
}

spec := &peer.ChaincodeSpec{
Expand Down Expand Up @@ -311,3 +282,49 @@ func randomString(length int) string {

return stringWithCharset(length, charset)
}

func ConvertString(arg string) (string, error) {
// ref to https://ghz.sh/docs/calldata
// currently supports three kinds of random
// support for uuid
// uuid
// support for random strings
// randomString$length
// support for random int
// randomNumberMin_Max
var current_arg = arg
regUUID, _ := regexp.Compile("uuid")
for regUUID.MatchString(current_arg) {
finds := regUUID.FindStringIndex(current_arg)
str := fmt.Sprint(arg[finds[0]:finds[1]])
current_arg = strings.Replace(current_arg, str, newUUID(), 1)
}
regString, _ := regexp.Compile("randomString(\\d*)")
for regString.MatchString(current_arg) {
finds := regString.FindStringIndex(current_arg)
str := fmt.Sprint(current_arg[finds[0]:finds[1]])
length, err := strconv.Atoi(strings.TrimPrefix(str, "randomString"))
if err != nil {
return arg, err
}
current_arg = strings.Replace(current_arg, str, randomString(length), 1)

}
regNumber, _ := regexp.Compile("randomNumber(\\d*)_(\\d*)")
for regNumber.MatchString(current_arg) {
finds := regNumber.FindStringIndex(current_arg)
str := fmt.Sprint(current_arg[finds[0]:finds[1]])
min_maxStr := strings.TrimPrefix(str, "randomNumber")
min_maxArray := strings.Split(min_maxStr, "_")
min, err := strconv.Atoi(min_maxArray[0])
if err != nil {
return arg, err
}
max, err := strconv.Atoi(min_maxArray[1])
if err != nil {
return arg, err
}
current_arg = strings.Replace(current_arg, str, strconv.Itoa(randomInt(min, max)), 1)
}
return current_arg, nil
}
64 changes: 64 additions & 0 deletions pkg/infra/trafficGenerator/proposal_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package trafficGenerator_test

import (
"regexp"
"strconv"
"tape/pkg/infra/trafficGenerator"

. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)

var _ = Describe("Proposal", func() {
Context("ConvertString", func() {
It("work accordingly for string", func() {
input := "data"
data, err := trafficGenerator.ConvertString(input)
Expect(err).NotTo(HaveOccurred())
Expect(data).To(Equal("data"))
})

It("work accordingly for random str", func() {
input := "randomString1"
data, err := trafficGenerator.ConvertString(input)
Expect(err).NotTo(HaveOccurred())
Expect(len(data)).To(Equal(1))
})

It("work accordingly for uuid", func() {
input := "uuid"
data, err := trafficGenerator.ConvertString(input)
Expect(err).NotTo(HaveOccurred())
Expect(len(data) > 0).To(BeTrue())
})

It("work accordingly for randomNumber", func() {
input := "randomNumber1_9"
data, err := trafficGenerator.ConvertString(input)
Expect(err).NotTo(HaveOccurred())
Expect(len(data)).To(Equal(1))
num, err := strconv.Atoi(data)
Expect(err).NotTo(HaveOccurred())
Expect(num > 0).To(BeTrue())
})

It("work accordingly for string mix mode", func() {
input := "{\"key\":\"randomNumber1_50\",\"key1\":\"randomNumber1_20\"}"
data, err := trafficGenerator.ConvertString(input)
Expect(err).NotTo(HaveOccurred())
regString, err := regexp.Compile("{\"key\":\"\\d*\",\"key1\":\"\\d*\"}")
Expect(err).NotTo(HaveOccurred())
Expect(regString.MatchString(data)).To(BeTrue())
})

It("work accordingly for string mix mode 2", func() {
input := "{\"k1\":\"uuid\",\"key2\":\"randomNumber10000_20000\",\"keys\":\"randomString10\"}"
data, err := trafficGenerator.ConvertString(input)
Expect(err).NotTo(HaveOccurred())
regString, err := regexp.Compile("{\"k1\":\".*\",\"key2\":\"\\d*\",\"keys\":\".*\"}")
Expect(err).NotTo(HaveOccurred())
Expect(regString.MatchString(data)).To(BeTrue())
})

})
})

0 comments on commit a19e2b0

Please sign in to comment.