github.com/annchain/OG@v0.0.9/vm/code/analysis_test.go (about)

     1  // Copyright 2017 The go-ethereum Authors
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-ethereum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package code
    18  
    19  import (
    20  	ogcrypto2 "github.com/annchain/OG/deprecated/ogcrypto"
    21  	"testing"
    22  
    23  	"github.com/annchain/OG/vm/instruction"
    24  )
    25  
    26  func TestJumpDestAnalysis(t *testing.T) {
    27  	tests := []struct {
    28  		code  []byte
    29  		exp   byte
    30  		which int
    31  	}{
    32  		{[]byte{byte(instruction.PUSH1), 0x01, 0x01, 0x01}, 0x40, 0},
    33  		{[]byte{byte(instruction.PUSH1), byte(instruction.PUSH1), byte(instruction.PUSH1), byte(instruction.PUSH1)}, 0x50, 0},
    34  		{[]byte{byte(instruction.PUSH8), byte(instruction.PUSH8), byte(instruction.PUSH8), byte(instruction.PUSH8), byte(instruction.PUSH8), byte(instruction.PUSH8), byte(instruction.PUSH8), byte(instruction.PUSH8), 0x01, 0x01, 0x01}, 0x7F, 0},
    35  		{[]byte{byte(instruction.PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x80, 1},
    36  		{[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(instruction.PUSH2), byte(instruction.PUSH2), byte(instruction.PUSH2), 0x01, 0x01, 0x01}, 0x03, 0},
    37  		{[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(instruction.PUSH2), 0x01, 0x01, 0x01, 0x01, 0x01}, 0x00, 1},
    38  		{[]byte{byte(instruction.PUSH3), 0x01, 0x01, 0x01, byte(instruction.PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x74, 0},
    39  		{[]byte{byte(instruction.PUSH3), 0x01, 0x01, 0x01, byte(instruction.PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x00, 1},
    40  		{[]byte{0x01, byte(instruction.PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x3F, 0},
    41  		{[]byte{0x01, byte(instruction.PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0xC0, 1},
    42  		{[]byte{byte(instruction.PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x7F, 0},
    43  		{[]byte{byte(instruction.PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0xFF, 1},
    44  		{[]byte{byte(instruction.PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x80, 2},
    45  		{[]byte{byte(instruction.PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(instruction.PUSH1), 0x01}, 0x7f, 0},
    46  		{[]byte{byte(instruction.PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(instruction.PUSH1), 0x01}, 0xA0, 1},
    47  		{[]byte{byte(instruction.PUSH32)}, 0x7F, 0},
    48  		{[]byte{byte(instruction.PUSH32)}, 0xFF, 1},
    49  		{[]byte{byte(instruction.PUSH32)}, 0xFF, 2},
    50  	}
    51  	for _, test := range tests {
    52  		ret := CodeBitmap(test.code)
    53  		if ret[test.which] != test.exp {
    54  			t.Fatalf("expected %x, got %02x", test.exp, ret[test.which])
    55  		}
    56  	}
    57  }
    58  
    59  func BenchmarkJumpdestAnalysis_1200k(bench *testing.B) {
    60  	// 1.4 ms
    61  	code := make([]byte, 1200000)
    62  	bench.ResetTimer()
    63  	for i := 0; i < bench.N; i++ {
    64  		CodeBitmap(code)
    65  	}
    66  	bench.StopTimer()
    67  }
    68  
    69  func BenchmarkJumpdestHashing_1200k(bench *testing.B) {
    70  	// 4 ms
    71  	code := make([]byte, 1200000)
    72  	bench.ResetTimer()
    73  	for i := 0; i < bench.N; i++ {
    74  		ogcrypto2.Keccak256Hash(code)
    75  	}
    76  	bench.StopTimer()
    77  }