input.New refactor and test
parent
6e1bfc177d
commit
adabc4eb98
|
|
@ -3,6 +3,7 @@ package input
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"os"
|
"os"
|
||||||
|
"syscall"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Input interface {
|
type Input interface {
|
||||||
|
|
@ -11,19 +12,46 @@ type Input interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(ctx context.Context) Input {
|
func New(ctx context.Context) Input {
|
||||||
foo := randomCharFromRange('a', 'g')
|
return newNew(ctx)()
|
||||||
if p, ok := os.LookupEnv("INPUT_RANDOM_WEIGHT_FILE"); ok && len(p) > 0 {
|
}
|
||||||
foo = randomCharFromWeightFile(p)
|
|
||||||
}
|
func newNew(ctx context.Context) func() Input {
|
||||||
var result Input = NewRandom(foo)
|
maker := newSourceFunc()
|
||||||
if os.Getenv("INPUT_KEYBOARD") == "true" {
|
|
||||||
result = NewKeyboard()
|
if os.Getenv("INPUT_BUFFERED") == "true" {
|
||||||
}
|
oldMaker := maker
|
||||||
if os.Getenv("INPUT_BUFFERED") == "true" {
|
maker = func() Input {
|
||||||
result = NewBuffered(ctx, result)
|
return NewBuffered(ctx, oldMaker())
|
||||||
}
|
}
|
||||||
if p, ok := os.LookupEnv("INPUT_REMAP_FILE"); ok && len(p) > 0 {
|
}
|
||||||
result = NewRemapFromFile(result, p)
|
if p := os.Getenv("INPUT_REMAP_FILE"); p != "" {
|
||||||
}
|
oldMaker := maker
|
||||||
return result
|
maker = func() Input {
|
||||||
|
return NewRemapFromFile(oldMaker(), p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if os.Getenv("INPUT_REFRESH_ON_SIGUSR1") != "" {
|
||||||
|
oldMaker := maker
|
||||||
|
c := NewRefreshCh(syscall.SIGUSR1)
|
||||||
|
maker = func() Input {
|
||||||
|
return NewRefresh(oldMaker, c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return maker
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSourceFunc() func() Input {
|
||||||
|
if os.Getenv("INPUT_KEYBOARD") == "true" {
|
||||||
|
singletonKeyboard := NewKeyboard()
|
||||||
|
return func() Input {
|
||||||
|
return singletonKeyboard
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return func() Input {
|
||||||
|
generator := randomCharFromRange('a', 'g')
|
||||||
|
if p, ok := os.LookupEnv("INPUT_RANDOM_WEIGHT_FILE"); ok && len(p) > 0 {
|
||||||
|
generator = randomCharFromWeightFile(p)
|
||||||
|
}
|
||||||
|
return NewRandom(generator)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,10 @@
|
||||||
package input
|
package input
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"context"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
func TestInput(t *testing.T) {
|
func TestInput(t *testing.T) {
|
||||||
var _ Input = &Random{}
|
var _ Input = &Random{}
|
||||||
|
|
@ -9,3 +13,20 @@ func TestInput(t *testing.T) {
|
||||||
var _ Input = Remap{}
|
var _ Input = Remap{}
|
||||||
var _ Input = &Refresh{}
|
var _ Input = &Refresh{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNewNew(t *testing.T) {
|
||||||
|
t.Run("refreshing", func(t *testing.T) {
|
||||||
|
ctx, can := context.WithCancel(context.Background())
|
||||||
|
defer can()
|
||||||
|
os.Setenv("INPUT_BUFFERED", "true")
|
||||||
|
os.Setenv("INPUT_REFRESH_ON_SIGUSR1", "true")
|
||||||
|
foo := New(ctx)
|
||||||
|
if refresh, ok := foo.(*Refresh); !ok {
|
||||||
|
t.Errorf("%T", foo)
|
||||||
|
} else if buffered, ok := refresh.input.(*Buffered); !ok {
|
||||||
|
t.Errorf("%T", refresh.input)
|
||||||
|
} else if _, ok := buffered.input.(*Random); !ok {
|
||||||
|
t.Errorf("%T", buffered.input)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,12 +25,15 @@ func NewRefresh(newInput func() Input, ch <-chan os.Signal) *Refresh {
|
||||||
input: newInput(),
|
input: newInput(),
|
||||||
}
|
}
|
||||||
go func() {
|
go func() {
|
||||||
select {
|
defer log.Println("refreshing done")
|
||||||
case <-ctx.Done():
|
for {
|
||||||
return
|
select {
|
||||||
case sig := <-ch:
|
case <-ctx.Done():
|
||||||
log.Println("refreshing for", sig)
|
return
|
||||||
result.input = newInput()
|
case sig := <-ch:
|
||||||
|
log.Println("refreshing for", sig)
|
||||||
|
result.input = newInput()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
return result
|
return result
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue