|
@ -0,0 +1,104 @@ |
|
|
|
|
|
package main |
|
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
|
"crypto/md5" |
|
|
|
|
|
"encoding/hex" |
|
|
|
|
|
"encoding/json" |
|
|
|
|
|
"fmt" |
|
|
|
|
|
"os" |
|
|
|
|
|
"testing" |
|
|
|
|
|
"time" |
|
|
|
|
|
|
|
|
|
|
|
"github.com/pkg/errors" |
|
|
|
|
|
"github.com/stretchr/testify/require" |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
// This test tests that the output of generate tx and update tx is consistent
|
|
|
|
|
|
func TestGenerateTxUpdateTxConsistentency(t *testing.T) { |
|
|
|
|
|
cases := []struct { |
|
|
|
|
|
connIndex int |
|
|
|
|
|
startingTxNumber int |
|
|
|
|
|
txSize int |
|
|
|
|
|
hostname string |
|
|
|
|
|
numTxsToTest int |
|
|
|
|
|
}{ |
|
|
|
|
|
{0, 0, 50, "localhost:26657", 1000}, |
|
|
|
|
|
{70, 300, 10000, "localhost:26657", 1000}, |
|
|
|
|
|
{0, 50, 100000, "localhost:26657", 1000}, |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for tcIndex, tc := range cases { |
|
|
|
|
|
hostnameHash := md5.Sum([]byte(tc.hostname)) |
|
|
|
|
|
// Tx generated from update tx. This is defined outside of the loop, since we have
|
|
|
|
|
|
// to a have something initially to update
|
|
|
|
|
|
updatedTx := generateTx(tc.connIndex, tc.startingTxNumber, tc.txSize, hostnameHash) |
|
|
|
|
|
updatedHex := make([]byte, len(updatedTx)*2) |
|
|
|
|
|
hex.Encode(updatedHex, updatedTx) |
|
|
|
|
|
for i := 0; i < tc.numTxsToTest; i++ { |
|
|
|
|
|
expectedTx := generateTx(tc.connIndex, tc.startingTxNumber+i, tc.txSize, hostnameHash) |
|
|
|
|
|
expectedHex := make([]byte, len(expectedTx)*2) |
|
|
|
|
|
hex.Encode(expectedHex, expectedTx) |
|
|
|
|
|
|
|
|
|
|
|
updateTx(updatedTx, updatedHex, tc.startingTxNumber+i) |
|
|
|
|
|
|
|
|
|
|
|
// after first 32 bytes is 8 bytes of time, then purely random bytes
|
|
|
|
|
|
require.Equal(t, expectedTx[:32], updatedTx[:32], |
|
|
|
|
|
"First 32 bytes of the txs differed. tc #%d, i #%d", tcIndex, i) |
|
|
|
|
|
require.Equal(t, expectedHex[:64], updatedHex[:64], |
|
|
|
|
|
"First 64 bytes of the hex differed. tc #%d, i #%d", tcIndex, i) |
|
|
|
|
|
// Test the lengths of the txs are as expected
|
|
|
|
|
|
require.Equal(t, tc.txSize, len(expectedTx), |
|
|
|
|
|
"Length of expected Tx differed. tc #%d, i #%d", tcIndex, i) |
|
|
|
|
|
require.Equal(t, tc.txSize, len(updatedTx), |
|
|
|
|
|
"Length of expected Tx differed. tc #%d, i #%d", tcIndex, i) |
|
|
|
|
|
require.Equal(t, tc.txSize*2, len(expectedHex), |
|
|
|
|
|
"Length of expected hex differed. tc #%d, i #%d", tcIndex, i) |
|
|
|
|
|
require.Equal(t, tc.txSize*2, len(updatedHex), |
|
|
|
|
|
"Length of updated hex differed. tc #%d, i #%d", tcIndex, i) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func BenchmarkIterationOfSendLoop(b *testing.B) { |
|
|
|
|
|
var ( |
|
|
|
|
|
connIndex = 0 |
|
|
|
|
|
txSize = 25000 |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
now := time.Now() |
|
|
|
|
|
// something too far away to matter
|
|
|
|
|
|
endTime := now.Add(time.Hour) |
|
|
|
|
|
txNumber := 0 |
|
|
|
|
|
hostnameHash := md5.Sum([]byte{0}) |
|
|
|
|
|
tx := generateTx(connIndex, txNumber, txSize, hostnameHash) |
|
|
|
|
|
txHex := make([]byte, len(tx)*2) |
|
|
|
|
|
hex.Encode(txHex, tx) |
|
|
|
|
|
b.ResetTimer() |
|
|
|
|
|
for i := 0; i < b.N; i++ { |
|
|
|
|
|
updateTx(tx, txHex, txNumber) |
|
|
|
|
|
paramsJSON, err := json.Marshal(map[string]interface{}{"tx": txHex}) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
fmt.Printf("failed to encode params: %v\n", err) |
|
|
|
|
|
os.Exit(1) |
|
|
|
|
|
} |
|
|
|
|
|
_ = json.RawMessage(paramsJSON) |
|
|
|
|
|
_ = now.Add(sendTimeout) |
|
|
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
err = errors.Wrap(err, |
|
|
|
|
|
fmt.Sprintf("txs send failed on connection #%d", connIndex)) |
|
|
|
|
|
logger.Error(err.Error()) |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Cache the now operations
|
|
|
|
|
|
if i%5 == 0 { |
|
|
|
|
|
now = time.Now() |
|
|
|
|
|
if now.After(endTime) { |
|
|
|
|
|
break |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
txNumber++ |
|
|
|
|
|
} |
|
|
|
|
|
} |