diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..42e7c34 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +bin/* +!bin/.gitkeep diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ecff9d0 --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +GOARCH ?= $(subst x86_64,amd64,$(patsubst i%86,386,$(shell uname -m))) +GOOS ?= $(shell uname | tr A-Z a-z) +GO ?= GOOS=$(GOOS) GOARCH=$(GOARCH) go + +PKGS := $(shell go list -f '{{.Dir}}' ./...) +SOURCES := $(foreach dir, $(PKGS), $(wildcard $(dir)/*.go)) + +.DEFAULT_GOAL := build + +.PHONY: test +test: + $(GO) test -race -v $(PKGS) + +.PHONY: build +build: bin/evbundler + +bin/evbundler: $(SOURCES) + CGO_ENABLED=0 $(GO) build -o ./$@ ./cmd/evbundler + +clean: + @rm -f bin/* diff --git a/README.md b/README.md index f499000..9b4f1ad 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,12 @@ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) evundler is a performance testing framework written in Go. + + +## Installation +``` +go get -u github.com/github.com/go-loadtest/evbundler/cmd/evbundler +``` + +## Usage +`t.b.d` diff --git a/bin/.gitkeep b/bin/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/cmd/evbundler/internal/base/base.go b/cmd/evbundler/internal/base/base.go new file mode 100644 index 0000000..0137bec --- /dev/null +++ b/cmd/evbundler/internal/base/base.go @@ -0,0 +1,20 @@ +package base + +import ( + "flag" + "fmt" + "os" +) + +type Command struct { + Name string + Doc string + Run func(args []string) error + Flags flag.FlagSet +} + +func (c *Command) Usage() { + fmt.Fprintf(os.Stderr, "Usage of %s\n\n", c.Name) + c.Flags.PrintDefaults() + os.Exit(2) +} diff --git a/cmd/evbundler/internal/ping/ping.go b/cmd/evbundler/internal/ping/ping.go new file mode 100644 index 0000000..7edbe21 --- /dev/null +++ b/cmd/evbundler/internal/ping/ping.go @@ -0,0 +1,46 @@ +package ping + +import ( + "context" + "time" + + "github.com/go-loadtest/evbundler" + "github.com/go-loadtest/evbundler/cmd/evbundler/internal/base" + "github.com/go-loadtest/evbundler/dispatcher" + "github.com/go-loadtest/evbundler/event" +) + +const name = "ping" + +var Cmd = &base.Command{ + Name: name, + Doc: "icmpv4 event generator", +} + +func init() { + Cmd.Run = run +} + +var ( + target = Cmd.Flags.String("target", "", `send to host or ip`) + interval = Cmd.Flags.String("interval", "1s", `interval of send each packets e.g. 1s, 300ms, 1m`) +) + +func run(args []string) error { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + d, err := time.ParseDuration(*interval) + if err != nil { + return err + } + evCh := evbundler.TickerProducer(ctx, d, func(t time.Time, evCh chan evbundler.Event) { + evCh <- event.NewICMPv4Event(1, "0.0.0.0", *target) + }) + + wp := evbundler.NewWorkerPool(10, nil) + disp := dispatcher.NewGoChannel(wp) + _ = disp.Dispatch(ctx, evCh) + + return nil +} diff --git a/cmd/evbundler/main.go b/cmd/evbundler/main.go new file mode 100644 index 0000000..221dfe8 --- /dev/null +++ b/cmd/evbundler/main.go @@ -0,0 +1,49 @@ +package main + +import ( + "flag" + "fmt" + "os" + + "github.com/go-loadtest/evbundler/cmd/evbundler/internal/base" + "github.com/go-loadtest/evbundler/cmd/evbundler/internal/ping" +) + +type Commands []*base.Command + +func (cs Commands) Usage() { + usage := ` +Usage of evbundler: + + evbundler [arguments] + +The commands are: + +` + fmt.Fprint(os.Stderr, usage) + for i := range cs { + fmt.Fprintf(os.Stderr, "\t\t%s\t%s\n", cs[i].Name, cs[i].Doc) + } + os.Exit(2) +} + +func main() { + commands := Commands{ + ping.Cmd, + } + + flag.Usage = commands.Usage + flag.Parse() + args := flag.Args() + if len(args) < 1 { + commands.Usage() + } + + for _, c := range commands { + if c.Name == args[0] { + c.Flags.Usage = c.Usage + _ = c.Flags.Parse(args[1:]) + _ = c.Run(c.Flags.Args()) + } + } +} diff --git a/event/http.go b/event/http.go index b066bbc..0960b56 100644 --- a/event/http.go +++ b/event/http.go @@ -25,7 +25,7 @@ type HTTPEvent struct { // Name is Event name each event types func (he HTTPEvent) Name() string { - return "HTTP" + return "http" } // Fire execute a Event by parameters diff --git a/event/icmpv4.go b/event/icmpv4.go index e751c64..a609e19 100644 --- a/event/icmpv4.go +++ b/event/icmpv4.go @@ -23,7 +23,7 @@ func NewICMPv4Event(seq int, listenAddr, addr string) *ICMPv4Event { } func (e ICMPv4Event) Name() string { - return "ICMPv4" + return "ping" } func (e ICMPv4Event) Fire(ctx context.Context) error {