func TestPeerFromReq(t *testing.T) { defer os.RemoveAll(testutil.InitDir(t)) ocCred := cred.NewOcCred() btcConf, err := util.LoadBitcoindConf("") if err != nil { t.Fatal(err) } // TODO(ortutay): this test is flakey, as we may not have any BTC at all btcCreds, err := cred.GetBtcCredInRange(0, util.B2S(1000), btcConf) if err != nil { t.Fatal(err) } req := calc.NewCalcReq([]string{"1 2 +"}) err = ocCred.SignOcReq(req) if err != nil { t.Fatal(err) } for _, bc := range *btcCreds { err = bc.SignOcReq(req, btcConf) if err != nil { t.Fatal(err) } } p, err := NewPeerFromReq(req, btcConf) if err != nil { t.Fatal(err) } if p.ID != req.ID { t.FailNow() } }
func TestPeerFromReqCoinReuse(t *testing.T) { defer os.RemoveAll(testutil.InitDir(t)) ocCred1 := cred.NewOcCred() ocCred2 := cred.NewOcCred() btcConf, err := util.LoadBitcoindConf("") if err != nil { t.Fatal(err) } // TODO(ortutay): this test is flakey, as we may not have any BTC at all btcCreds, err := cred.GetBtcCredInRange(0, util.B2S(1000), btcConf) if err != nil { t.Fatal(err) } req1 := calc.NewCalcReq([]string{"1 2 +"}) err = ocCred1.SignOcReq(req1) if err != nil { t.Fatal(err) } req2 := calc.NewCalcReq([]string{"1 2 +"}) err = ocCred2.SignOcReq(req2) if err != nil { t.Fatal(err) } for _, bc := range *btcCreds { err = bc.SignOcReq(req1, btcConf) err = bc.SignOcReq(req2, btcConf) if err != nil { t.Fatal(err) } } p1, err := NewPeerFromReq(req1, btcConf) if err != nil { t.Fatal(err) } if p1.ID != req1.ID { t.FailNow() } p2, err := NewPeerFromReq(req2, btcConf) if err == nil || err != COIN_REUSE { t.Fatal("Expected COIN_REUSE error") } if p2 != nil { t.FailNow() } }
func main() { goopt.Parse(nil) util.SetAppDir(*fAppDir) ocCred, err := cred.NewOcCredLoadOrCreate("") if err != nil { log.Fatal(err.Error()) } bConf, err := util.LoadBitcoindConf("") if err != nil { log.Fatal(err.Error()) } pvLower, err := msg.NewPaymentValueParseString(*fCoinsLower) if err != nil { log.Fatal(err) } pvUpper, err := msg.NewPaymentValueParseString(*fCoinsUpper) if err != nil { log.Fatal(err) } coins, err := cred.GetBtcCredInRange(pvLower.Amount, pvUpper.Amount, bConf) if err != nil { log.Fatal(err.Error()) } c := node.Client{ BtcConf: bConf, Cred: cred.Cred{ OcCred: *ocCred, BtcConf: bConf, Coins: *coins, }, } var body []byte if !termutil.Isatty(os.Stdin.Fd()) { var err error body, err = ioutil.ReadAll(os.Stdin) util.Ferr(err) } cmdArgs := make([]string, 0) for _, arg := range os.Args[1:] { if arg[0] != '-' { cmdArgs = append(cmdArgs, arg) } } if len(cmdArgs) == 0 { // TODO(ortutay): print usage info return } var req *msg.OcReq switch cmdArgs[0] { case "quote": qReq, err := makeQuoteReq(cmdArgs[1:]) if err != nil { log.Fatal(err.Error()) } resp := sendRequest(&c, qReq) if resp.Status == msg.OK { var pv msg.PaymentValue err := json.Unmarshal(resp.Body, &pv) if err != nil { panic(err) } fmt.Printf("\n%v%v\n", util.S2B(pv.Amount), pv.Currency) } case "call": req, err = makeReq(cmdArgs[1:], body) if err != nil { log.Fatal(err.Error()) } resp := sendRequest(&c, req) switch fmt.Sprintf("%v.%v", req.Service, req.Method) { case "payment.balance": { var br payment.BalanceResponse err := json.Unmarshal(resp.Body, &br) if err != nil { log.Fatalf("malformed response") } fmt.Printf("\nServer reports balance of %v%v (max allowed is %v%v)\n", util.S2B(br.Balance.Amount), br.Balance.Currency, util.S2B(br.MaxBalance.Amount), br.MaxBalance.Currency) } } case "pay": payBtc(&c, cmdArgs) case "listrep": sel := rep.Record{} if len(cmdArgs) > 1 { selJson := cmdArgs[1] err := json.Unmarshal([]byte(selJson), &sel) if err != nil { log.Fatal(err.Error()) } fmt.Printf("sel json: %v %v\n", selJson, sel) } err := rep.PrettyPrint(&sel) if err != nil { log.Fatal(err.Error()) } default: fmt.Printf("unrecognized command: %v", cmdArgs) } }