aboutsummaryrefslogtreecommitdiffstats
path: root/ethutil
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-03-03 18:35:35 +0800
committerobscuren <geffobscura@gmail.com>2014-03-03 18:35:35 +0800
commit5b1613d65b0c3471b80990120022b5a745ecab86 (patch)
treeaddbb87cc82cca07e8ac8aa810d810e1de02b2a5 /ethutil
parentd7c5936ac4ee8ae3156e0bc9813db61b990aa686 (diff)
parentc1d0ea7366f1bad134c985dbe1f272d376e5ec9b (diff)
downloadgo-tangerine-5b1613d65b0c3471b80990120022b5a745ecab86.tar
go-tangerine-5b1613d65b0c3471b80990120022b5a745ecab86.tar.gz
go-tangerine-5b1613d65b0c3471b80990120022b5a745ecab86.tar.bz2
go-tangerine-5b1613d65b0c3471b80990120022b5a745ecab86.tar.lz
go-tangerine-5b1613d65b0c3471b80990120022b5a745ecab86.tar.xz
go-tangerine-5b1613d65b0c3471b80990120022b5a745ecab86.tar.zst
go-tangerine-5b1613d65b0c3471b80990120022b5a745ecab86.zip
Merge branch 'master' into develop
Diffstat (limited to 'ethutil')
-rw-r--r--ethutil/common_test.go43
-rw-r--r--ethutil/reactor.go86
-rw-r--r--ethutil/reactor_test.go30
3 files changed, 151 insertions, 8 deletions
diff --git a/ethutil/common_test.go b/ethutil/common_test.go
index 3a6a37ff5..b5c733ff3 100644
--- a/ethutil/common_test.go
+++ b/ethutil/common_test.go
@@ -1,17 +1,44 @@
package ethutil
import (
- "fmt"
"math/big"
"testing"
)
func TestCommon(t *testing.T) {
- fmt.Println(CurrencyToString(BigPow(10, 19)))
- fmt.Println(CurrencyToString(BigPow(10, 16)))
- fmt.Println(CurrencyToString(BigPow(10, 13)))
- fmt.Println(CurrencyToString(BigPow(10, 10)))
- fmt.Println(CurrencyToString(BigPow(10, 7)))
- fmt.Println(CurrencyToString(BigPow(10, 4)))
- fmt.Println(CurrencyToString(big.NewInt(10)))
+ ether := CurrencyToString(BigPow(10, 19))
+ finney := CurrencyToString(BigPow(10, 16))
+ szabo := CurrencyToString(BigPow(10, 13))
+ vito := CurrencyToString(BigPow(10, 10))
+ turing := CurrencyToString(BigPow(10, 7))
+ eins := CurrencyToString(BigPow(10, 4))
+ wei := CurrencyToString(big.NewInt(10))
+
+ if ether != "10 Ether" {
+ t.Error("Got", ether)
+ }
+
+ if finney != "10 Finney" {
+ t.Error("Got", finney)
+ }
+
+ if szabo != "10 Szabo" {
+ t.Error("Got", szabo)
+ }
+
+ if vito != "10 Vito" {
+ t.Error("Got", vito)
+ }
+
+ if turing != "10 Turing" {
+ t.Error("Got", turing)
+ }
+
+ if eins != "10 Eins" {
+ t.Error("Got", eins)
+ }
+
+ if wei != "10 Wei" {
+ t.Error("Got", wei)
+ }
}
diff --git a/ethutil/reactor.go b/ethutil/reactor.go
new file mode 100644
index 000000000..f8084986c
--- /dev/null
+++ b/ethutil/reactor.go
@@ -0,0 +1,86 @@
+package ethutil
+
+import (
+ "sync"
+)
+
+type ReactorEvent struct {
+ mut sync.Mutex
+ event string
+ chans []chan React
+}
+
+// Post the specified reactor resource on the channels
+// currently subscribed
+func (e *ReactorEvent) Post(react React) {
+ e.mut.Lock()
+ defer e.mut.Unlock()
+
+ for _, ch := range e.chans {
+ go func(ch chan React) {
+ ch <- react
+ }(ch)
+ }
+}
+
+// Add a subscriber to this event
+func (e *ReactorEvent) Add(ch chan React) {
+ e.mut.Lock()
+ defer e.mut.Unlock()
+
+ e.chans = append(e.chans, ch)
+}
+
+// Remove a subscriber
+func (e *ReactorEvent) Remove(ch chan React) {
+ e.mut.Lock()
+ defer e.mut.Unlock()
+
+ for i, c := range e.chans {
+ if c == ch {
+ e.chans = append(e.chans[:i], e.chans[i+1:]...)
+ }
+ }
+}
+
+// Basic reactor resource
+type React struct {
+ Resource interface{}
+}
+
+// The reactor basic engine. Acts as bridge
+// between the events and the subscribers/posters
+type ReactorEngine struct {
+ patterns map[string]*ReactorEvent
+}
+
+func NewReactorEngine() *ReactorEngine {
+ return &ReactorEngine{patterns: make(map[string]*ReactorEvent)}
+}
+
+// Subscribe a channel to the specified event
+func (reactor *ReactorEngine) Subscribe(event string, ch chan React) {
+ ev := reactor.patterns[event]
+ // Create a new event if one isn't available
+ if ev == nil {
+ ev = &ReactorEvent{event: event}
+ reactor.patterns[event] = ev
+ }
+
+ // Add the channel to reactor event handler
+ ev.Add(ch)
+}
+
+func (reactor *ReactorEngine) Unsubscribe(event string, ch chan React) {
+ ev := reactor.patterns[event]
+ if ev != nil {
+ ev.Remove(ch)
+ }
+}
+
+func (reactor *ReactorEngine) Post(event string, resource interface{}) {
+ ev := reactor.patterns[event]
+ if ev != nil {
+ ev.Post(React{Resource: resource})
+ }
+}
diff --git a/ethutil/reactor_test.go b/ethutil/reactor_test.go
new file mode 100644
index 000000000..48c2f0df3
--- /dev/null
+++ b/ethutil/reactor_test.go
@@ -0,0 +1,30 @@
+package ethutil
+
+import "testing"
+
+func TestReactorAdd(t *testing.T) {
+ engine := NewReactorEngine()
+ ch := make(chan React)
+ engine.Subscribe("test", ch)
+ if len(engine.patterns) != 1 {
+ t.Error("Expected patterns to be 1, got", len(engine.patterns))
+ }
+}
+
+func TestReactorEvent(t *testing.T) {
+ engine := NewReactorEngine()
+
+ // Buffer 1, so it doesn't block for this test
+ ch := make(chan React, 1)
+ engine.Subscribe("test", ch)
+ engine.Post("test", "hello")
+
+ value := <-ch
+ if val, ok := value.Resource.(string); ok {
+ if val != "hello" {
+ t.Error("Expected Resource to be 'hello', got", val)
+ }
+ } else {
+ t.Error("Unable to cast")
+ }
+}