OSDN Git Service

new repo
[bytom/vapor.git] / vendor / github.com / btcsuite / btcd / btcjson / walletsvrwsntfns_test.go
1 // Copyright (c) 2014 The btcsuite developers
2 // Use of this source code is governed by an ISC
3 // license that can be found in the LICENSE file.
4
5 package btcjson_test
6
7 import (
8         "bytes"
9         "encoding/json"
10         "fmt"
11         "reflect"
12         "testing"
13
14         "github.com/btcsuite/btcd/btcjson"
15 )
16
17 // TestWalletSvrWsNtfns tests all of the chain server websocket-specific
18 // notifications marshal and unmarshal into valid results include handling of
19 // optional fields being omitted in the marshalled command, while optional
20 // fields with defaults have the default assigned on unmarshalled commands.
21 func TestWalletSvrWsNtfns(t *testing.T) {
22         t.Parallel()
23
24         tests := []struct {
25                 name         string
26                 newNtfn      func() (interface{}, error)
27                 staticNtfn   func() interface{}
28                 marshalled   string
29                 unmarshalled interface{}
30         }{
31                 {
32                         name: "accountbalance",
33                         newNtfn: func() (interface{}, error) {
34                                 return btcjson.NewCmd("accountbalance", "acct", 1.25, true)
35                         },
36                         staticNtfn: func() interface{} {
37                                 return btcjson.NewAccountBalanceNtfn("acct", 1.25, true)
38                         },
39                         marshalled: `{"jsonrpc":"1.0","method":"accountbalance","params":["acct",1.25,true],"id":null}`,
40                         unmarshalled: &btcjson.AccountBalanceNtfn{
41                                 Account:   "acct",
42                                 Balance:   1.25,
43                                 Confirmed: true,
44                         },
45                 },
46                 {
47                         name: "btcdconnected",
48                         newNtfn: func() (interface{}, error) {
49                                 return btcjson.NewCmd("btcdconnected", true)
50                         },
51                         staticNtfn: func() interface{} {
52                                 return btcjson.NewBtcdConnectedNtfn(true)
53                         },
54                         marshalled: `{"jsonrpc":"1.0","method":"btcdconnected","params":[true],"id":null}`,
55                         unmarshalled: &btcjson.BtcdConnectedNtfn{
56                                 Connected: true,
57                         },
58                 },
59                 {
60                         name: "walletlockstate",
61                         newNtfn: func() (interface{}, error) {
62                                 return btcjson.NewCmd("walletlockstate", true)
63                         },
64                         staticNtfn: func() interface{} {
65                                 return btcjson.NewWalletLockStateNtfn(true)
66                         },
67                         marshalled: `{"jsonrpc":"1.0","method":"walletlockstate","params":[true],"id":null}`,
68                         unmarshalled: &btcjson.WalletLockStateNtfn{
69                                 Locked: true,
70                         },
71                 },
72                 {
73                         name: "newtx",
74                         newNtfn: func() (interface{}, error) {
75                                 return btcjson.NewCmd("newtx", "acct", `{"account":"acct","address":"1Address","category":"send","amount":1.5,"bip125-replaceable":"unknown","fee":0.0001,"confirmations":1,"trusted":true,"txid":"456","walletconflicts":[],"time":12345678,"timereceived":12345876,"vout":789,"otheraccount":"otheracct"}`)
76                         },
77                         staticNtfn: func() interface{} {
78                                 result := btcjson.ListTransactionsResult{
79                                         Abandoned:         false,
80                                         Account:           "acct",
81                                         Address:           "1Address",
82                                         BIP125Replaceable: "unknown",
83                                         Category:          "send",
84                                         Amount:            1.5,
85                                         Fee:               btcjson.Float64(0.0001),
86                                         Confirmations:     1,
87                                         TxID:              "456",
88                                         WalletConflicts:   []string{},
89                                         Time:              12345678,
90                                         TimeReceived:      12345876,
91                                         Trusted:           true,
92                                         Vout:              789,
93                                         OtherAccount:      "otheracct",
94                                 }
95                                 return btcjson.NewNewTxNtfn("acct", result)
96                         },
97                         marshalled: `{"jsonrpc":"1.0","method":"newtx","params":["acct",{"abandoned":false,"account":"acct","address":"1Address","amount":1.5,"bip125-replaceable":"unknown","category":"send","confirmations":1,"fee":0.0001,"time":12345678,"timereceived":12345876,"trusted":true,"txid":"456","vout":789,"walletconflicts":[],"otheraccount":"otheracct"}],"id":null}`,
98                         unmarshalled: &btcjson.NewTxNtfn{
99                                 Account: "acct",
100                                 Details: btcjson.ListTransactionsResult{
101                                         Abandoned:         false,
102                                         Account:           "acct",
103                                         Address:           "1Address",
104                                         BIP125Replaceable: "unknown",
105                                         Category:          "send",
106                                         Amount:            1.5,
107                                         Fee:               btcjson.Float64(0.0001),
108                                         Confirmations:     1,
109                                         TxID:              "456",
110                                         WalletConflicts:   []string{},
111                                         Time:              12345678,
112                                         TimeReceived:      12345876,
113                                         Trusted:           true,
114                                         Vout:              789,
115                                         OtherAccount:      "otheracct",
116                                 },
117                         },
118                 },
119         }
120
121         t.Logf("Running %d tests", len(tests))
122         for i, test := range tests {
123                 // Marshal the notification as created by the new static
124                 // creation function.  The ID is nil for notifications.
125                 marshalled, err := btcjson.MarshalCmd(nil, test.staticNtfn())
126                 if err != nil {
127                         t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i,
128                                 test.name, err)
129                         continue
130                 }
131
132                 if !bytes.Equal(marshalled, []byte(test.marshalled)) {
133                         t.Errorf("Test #%d (%s) unexpected marshalled data - "+
134                                 "got %s, want %s", i, test.name, marshalled,
135                                 test.marshalled)
136                         continue
137                 }
138
139                 // Ensure the notification is created without error via the
140                 // generic new notification creation function.
141                 cmd, err := test.newNtfn()
142                 if err != nil {
143                         t.Errorf("Test #%d (%s) unexpected NewCmd error: %v ",
144                                 i, test.name, err)
145                 }
146
147                 // Marshal the notification as created by the generic new
148                 // notification creation function.    The ID is nil for
149                 // notifications.
150                 marshalled, err = btcjson.MarshalCmd(nil, cmd)
151                 if err != nil {
152                         t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i,
153                                 test.name, err)
154                         continue
155                 }
156
157                 if !bytes.Equal(marshalled, []byte(test.marshalled)) {
158                         t.Errorf("Test #%d (%s) unexpected marshalled data - "+
159                                 "got %s, want %s", i, test.name, marshalled,
160                                 test.marshalled)
161                         continue
162                 }
163
164                 var request btcjson.Request
165                 if err := json.Unmarshal(marshalled, &request); err != nil {
166                         t.Errorf("Test #%d (%s) unexpected error while "+
167                                 "unmarshalling JSON-RPC request: %v", i,
168                                 test.name, err)
169                         continue
170                 }
171
172                 cmd, err = btcjson.UnmarshalCmd(&request)
173                 if err != nil {
174                         t.Errorf("UnmarshalCmd #%d (%s) unexpected error: %v", i,
175                                 test.name, err)
176                         continue
177                 }
178
179                 if !reflect.DeepEqual(cmd, test.unmarshalled) {
180                         t.Errorf("Test #%d (%s) unexpected unmarshalled command "+
181                                 "- got %s, want %s", i, test.name,
182                                 fmt.Sprintf("(%T) %+[1]v", cmd),
183                                 fmt.Sprintf("(%T) %+[1]v\n", test.unmarshalled))
184                         continue
185                 }
186         }
187 }