-
Notifications
You must be signed in to change notification settings - Fork 3
/
client_mock.go
86 lines (68 loc) · 2.03 KB
/
client_mock.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package etherface
import (
"context"
"errors"
"fmt"
"os"
"strings"
"github.com/syndtr/goleveldb/leveldb"
)
type MockClient interface {
Lookup(ctx context.Context, hash string) (string, error)
}
var _ Client = (*mockEtherfaceClient)(nil)
// mockEtherfaceClient is a client for querying the etherface database
type mockEtherfaceClient struct {
db *leveldb.DB
}
// Lookup queries the etherface database for the function name of a given hash
func (h *mockEtherfaceClient) Lookup(ctx context.Context, hash string) (string, error) {
functionName, err := h.query(ctx, hash)
if err != nil {
return "", fmt.Errorf("failed to lookup hash: %w", err)
}
return functionName, nil
}
// query queries the etherface database for the function name of a given hash
func (h *mockEtherfaceClient) query(_ context.Context, hash string) (string, error) {
normalizedHash := hash
if strings.HasPrefix(hash, "0x") {
normalizedHash = hash[2:]
}
data, err := h.db.Get([]byte(normalizedHash), nil)
if errors.Is(err, leveldb.ErrNotFound) {
return "", ErrorNoResults
} else if err != nil {
return "", fmt.Errorf("failed to get data from leveldb: %w", err)
}
return string(data), nil
}
// NewMockEtherfaceClient creates a new Etherface client based on leveldb
func NewMockEtherfaceClient() (MockClient, error) {
tempDir, err := os.MkdirTemp("", "leveldb_mock")
if err != nil {
return nil, fmt.Errorf("failed to create temp directory for leveldb: %w", err)
}
database, err := initLevelDB(tempDir)
if err != nil {
return nil, fmt.Errorf("failed to initialize leveldb: %w", err)
}
instance := &mockEtherfaceClient{
db: database,
}
return instance, nil
}
// initLevelDB initializes a new leveldb database
func initLevelDB(tempDir string) (*leveldb.DB, error) {
// open the database
database, err := leveldb.OpenFile(tempDir, nil)
if err != nil {
return nil, fmt.Errorf("failed to open leveldb: %w", err)
}
// mock data
err = database.Put([]byte("8f283970"), []byte("changeAdmin"), nil)
if err != nil {
return nil, err
}
return database, nil
}