func TestBroker(t *testing.T) { url := os.Getenv("REDIS_URL") if url == "" { t.Skip("REDIS_URL not defined") } b := NewBroker(broker.Addrs(url)) // Only setting options. b.Init() if err := b.Connect(); err != nil { t.Fatal(err) } defer b.Disconnect() // Large enough buffer to not block. msgs := make(chan string, 10) go func() { s1 := subscribe(t, b, "test", func(p broker.Publication) error { m := p.Message() msgs <- fmt.Sprintf("s1:%s", string(m.Body)) return nil }) s2 := subscribe(t, b, "test", func(p broker.Publication) error { m := p.Message() msgs <- fmt.Sprintf("s2:%s", string(m.Body)) return nil }) publish(t, b, "test", &broker.Message{ Body: []byte("hello"), }) publish(t, b, "test", &broker.Message{ Body: []byte("world"), }) unsubscribe(t, s1) publish(t, b, "test", &broker.Message{ Body: []byte("other"), }) unsubscribe(t, s2) publish(t, b, "test", &broker.Message{ Body: []byte("none"), }) close(msgs) }() var actual []string for msg := range msgs { actual = append(actual, msg) } exp := []string{ "s1:hello", "s2:hello", "s1:world", "s2:world", "s2:other", } // Order is not guaranteed. sort.Strings(actual) sort.Strings(exp) if !reflect.DeepEqual(actual, exp) { t.Fatalf("expected %v, got %v", exp, actual) } }
func (c *cmd) Before(ctx *cli.Context) error { // If flags are set then use them otherwise do nothing var serverOpts []server.Option var clientOpts []client.Option // Set the broker if name := ctx.String("broker"); len(name) > 0 || len(ctx.String("broker_address")) > 0 { if len(name) == 0 { name = defaultBroker } if b, ok := c.opts.Brokers[name]; ok { n := b(broker.Addrs(strings.Split(ctx.String("broker_address"), ",")...)) *c.opts.Broker = n } else { return fmt.Errorf("Broker %s not found", name) } serverOpts = append(serverOpts, server.Broker(*c.opts.Broker)) clientOpts = append(clientOpts, client.Broker(*c.opts.Broker)) } // Set the registry if name := ctx.String("registry"); len(name) > 0 || len(ctx.String("registry_address")) > 0 { if len(name) == 0 { name = defaultRegistry } if r, ok := c.opts.Registries[name]; ok { n := r(registry.Addrs(strings.Split(ctx.String("registry_address"), ",")...)) *c.opts.Registry = n } else { return fmt.Errorf("Registry %s not found", name) } serverOpts = append(serverOpts, server.Registry(*c.opts.Registry)) clientOpts = append(clientOpts, client.Registry(*c.opts.Registry)) (*c.opts.Selector).Init(selector.Registry(*c.opts.Registry)) clientOpts = append(clientOpts, client.Selector(*c.opts.Selector)) (*c.opts.Broker).Init(broker.Registry(*c.opts.Registry)) } // Set the selector if name := ctx.String("selector"); len(name) > 0 { if s, ok := c.opts.Selectors[name]; ok { n := s(selector.Registry(*c.opts.Registry)) *c.opts.Selector = n } else { return fmt.Errorf("Selector %s not found", name) } // No server option here. Should there be? clientOpts = append(clientOpts, client.Selector(*c.opts.Selector)) } // Set the transport if name := ctx.String("transport"); len(name) > 0 || len(ctx.String("transport_address")) > 0 { if len(name) == 0 { name = defaultTransport } if t, ok := c.opts.Transports[name]; ok { n := t(transport.Addrs(strings.Split(ctx.String("transport_address"), ",")...)) *c.opts.Transport = n } else { return fmt.Errorf("Transport %s not found", name) } serverOpts = append(serverOpts, server.Transport(*c.opts.Transport)) clientOpts = append(clientOpts, client.Transport(*c.opts.Transport)) } // Parse the server options metadata := make(map[string]string) for _, d := range ctx.StringSlice("server_metadata") { var key, val string parts := strings.Split(d, "=") key = parts[0] if len(parts) > 1 { val = strings.Join(parts[1:], "=") } metadata[key] = val } if len(metadata) > 0 { serverOpts = append(serverOpts, server.Metadata(metadata)) } if len(ctx.String("server_name")) > 0 { serverOpts = append(serverOpts, server.Name(ctx.String("server_name"))) } if len(ctx.String("server_version")) > 0 { serverOpts = append(serverOpts, server.Version(ctx.String("server_version"))) } if len(ctx.String("server_id")) > 0 { serverOpts = append(serverOpts, server.Id(ctx.String("server_id"))) } if len(ctx.String("server_address")) > 0 { serverOpts = append(serverOpts, server.Address(ctx.String("server_address"))) } if len(ctx.String("server_advertise")) > 0 { serverOpts = append(serverOpts, server.Advertise(ctx.String("server_advertise"))) } // client opts if r := ctx.Int("client_retries"); r > 0 { clientOpts = append(clientOpts, client.Retries(r)) } if t := ctx.String("client_request_timeout"); len(t) > 0 { d, err := time.ParseDuration(t) if err != nil { return fmt.Errorf("failed to parse client_request_timeout: %v", t) } clientOpts = append(clientOpts, client.RequestTimeout(d)) } if r := ctx.Int("client_pool_size"); r > 0 { clientOpts = append(clientOpts, client.PoolSize(r)) } if t := ctx.String("client_pool_ttl"); len(t) > 0 { d, err := time.ParseDuration(t) if err != nil { return fmt.Errorf("failed to parse client_pool_ttl: %v", t) } clientOpts = append(clientOpts, client.PoolTTL(d)) } // We have some command line opts for the server. // Lets set it up if len(serverOpts) > 0 { (*c.opts.Server).Init(serverOpts...) } // Use an init option? if len(clientOpts) > 0 { (*c.opts.Client).Init(clientOpts...) } return nil }