forked from lug/matterbridge
		
	Make config.Config more unit-test friendly (#586)
This commit is contained in:
		| @@ -22,7 +22,7 @@ type Bridge struct { | |||||||
| 	Channels map[string]config.ChannelInfo | 	Channels map[string]config.ChannelInfo | ||||||
| 	Joined   map[string]bool | 	Joined   map[string]bool | ||||||
| 	Log      *log.Entry | 	Log      *log.Entry | ||||||
| 	Config   *config.Config | 	Config   config.Config | ||||||
| 	General  *config.Protocol | 	General  *config.Protocol | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -69,36 +69,41 @@ func (b *Bridge) joinChannels(channels map[string]config.ChannelInfo, exists map | |||||||
| } | } | ||||||
|  |  | ||||||
| func (b *Bridge) GetBool(key string) bool { | func (b *Bridge) GetBool(key string) bool { | ||||||
| 	if b.Config.GetBool(b.Account + "." + key) { | 	val, ok := b.Config.GetBool(b.Account + "." + key) | ||||||
| 		return b.Config.GetBool(b.Account + "." + key) | 	if !ok { | ||||||
|  | 		val, _ = b.Config.GetBool("general." + key) | ||||||
| 	} | 	} | ||||||
| 	return b.Config.GetBool("general." + key) | 	return val | ||||||
| } | } | ||||||
|  |  | ||||||
| func (b *Bridge) GetInt(key string) int { | func (b *Bridge) GetInt(key string) int { | ||||||
| 	if b.Config.GetInt(b.Account+"."+key) != 0 { | 	val, ok := b.Config.GetInt(b.Account + "." + key) | ||||||
| 		return b.Config.GetInt(b.Account + "." + key) | 	if !ok { | ||||||
|  | 		val, _ = b.Config.GetInt("general." + key) | ||||||
| 	} | 	} | ||||||
| 	return b.Config.GetInt("general." + key) | 	return val | ||||||
| } | } | ||||||
|  |  | ||||||
| func (b *Bridge) GetString(key string) string { | func (b *Bridge) GetString(key string) string { | ||||||
| 	if b.Config.GetString(b.Account+"."+key) != "" { | 	val, ok := b.Config.GetString(b.Account + "." + key) | ||||||
| 		return b.Config.GetString(b.Account + "." + key) | 	if !ok { | ||||||
|  | 		val, _ = b.Config.GetString("general." + key) | ||||||
| 	} | 	} | ||||||
| 	return b.Config.GetString("general." + key) | 	return val | ||||||
| } | } | ||||||
|  |  | ||||||
| func (b *Bridge) GetStringSlice(key string) []string { | func (b *Bridge) GetStringSlice(key string) []string { | ||||||
| 	if len(b.Config.GetStringSlice(b.Account+"."+key)) != 0 { | 	val, ok := b.Config.GetStringSlice(b.Account + "." + key) | ||||||
| 		return b.Config.GetStringSlice(b.Account + "." + key) | 	if !ok { | ||||||
|  | 		val, _ = b.Config.GetStringSlice("general." + key) | ||||||
| 	} | 	} | ||||||
| 	return b.Config.GetStringSlice("general." + key) | 	return val | ||||||
| } | } | ||||||
|  |  | ||||||
| func (b *Bridge) GetStringSlice2D(key string) [][]string { | func (b *Bridge) GetStringSlice2D(key string) [][]string { | ||||||
| 	if len(b.Config.GetStringSlice2D(b.Account+"."+key)) != 0 { | 	val, ok := b.Config.GetStringSlice2D(b.Account + "." + key) | ||||||
| 		return b.Config.GetStringSlice2D(b.Account + "." + key) | 	if !ok { | ||||||
|  | 		val, _ = b.Config.GetStringSlice2D("general." + key) | ||||||
| 	} | 	} | ||||||
| 	return b.Config.GetStringSlice2D("general." + key) | 	return val | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,7 +2,9 @@ package config | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bytes" | 	"bytes" | ||||||
|  | 	"fmt" | ||||||
| 	"io/ioutil" | 	"io/ioutil" | ||||||
|  | 	"os" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"sync" | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
| @@ -177,13 +179,23 @@ type ConfigValues struct { | |||||||
| 	SameChannelGateway []SameChannelGateway | 	SameChannelGateway []SameChannelGateway | ||||||
| } | } | ||||||
|  |  | ||||||
| type Config struct { | type Config interface { | ||||||
| 	v *viper.Viper | 	ConfigValues() *ConfigValues | ||||||
| 	*ConfigValues | 	GetBool(key string) (bool, bool) | ||||||
| 	sync.RWMutex | 	GetInt(key string) (int, bool) | ||||||
|  | 	GetString(key string) (string, bool) | ||||||
|  | 	GetStringSlice(key string) ([]string, bool) | ||||||
|  | 	GetStringSlice2D(key string) ([][]string, bool) | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewConfig(cfgfile string) *Config { | type config struct { | ||||||
|  | 	v *viper.Viper | ||||||
|  | 	sync.RWMutex | ||||||
|  |  | ||||||
|  | 	cv *ConfigValues | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func NewConfig(cfgfile string) Config { | ||||||
| 	log.SetFormatter(&prefixed.TextFormatter{PrefixPadding: 13, DisableColors: true, FullTimestamp: false}) | 	log.SetFormatter(&prefixed.TextFormatter{PrefixPadding: 13, DisableColors: true, FullTimestamp: false}) | ||||||
| 	flog := log.WithFields(log.Fields{"prefix": "config"}) | 	flog := log.WithFields(log.Fields{"prefix": "config"}) | ||||||
| 	viper.SetConfigFile(cfgfile) | 	viper.SetConfigFile(cfgfile) | ||||||
| @@ -191,9 +203,9 @@ func NewConfig(cfgfile string) *Config { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Fatal(err) | 		log.Fatal(err) | ||||||
| 	} | 	} | ||||||
| 	mycfg := NewConfigFromString(input) | 	mycfg := newConfigFromString(input) | ||||||
| 	if mycfg.ConfigValues.General.MediaDownloadSize == 0 { | 	if mycfg.cv.General.MediaDownloadSize == 0 { | ||||||
| 		mycfg.ConfigValues.General.MediaDownloadSize = 1000000 | 		mycfg.cv.General.MediaDownloadSize = 1000000 | ||||||
| 	} | 	} | ||||||
| 	viper.WatchConfig() | 	viper.WatchConfig() | ||||||
| 	viper.OnConfigChange(func(e fsnotify.Event) { | 	viper.OnConfigChange(func(e fsnotify.Event) { | ||||||
| @@ -211,8 +223,11 @@ func getFileContents(filename string) ([]byte, error) { | |||||||
| 	return input, nil | 	return input, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewConfigFromString(input []byte) *Config { | func NewConfigFromString(input []byte) Config { | ||||||
| 	var cfg ConfigValues | 	return newConfigFromString(input) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func newConfigFromString(input []byte) *config { | ||||||
| 	viper.SetConfigType("toml") | 	viper.SetConfigType("toml") | ||||||
| 	viper.SetEnvPrefix("matterbridge") | 	viper.SetEnvPrefix("matterbridge") | ||||||
| 	viper.AddConfigPath(".") | 	viper.AddConfigPath(".") | ||||||
| @@ -222,45 +237,51 @@ func NewConfigFromString(input []byte) *Config { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Fatal(err) | 		log.Fatal(err) | ||||||
| 	} | 	} | ||||||
| 	err = viper.Unmarshal(&cfg) |  | ||||||
|  | 	cfg := &ConfigValues{} | ||||||
|  | 	err = viper.Unmarshal(cfg) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Fatal(err) | 		log.Fatal(err) | ||||||
| 	} | 	} | ||||||
| 	mycfg := new(Config) | 	return &config{ | ||||||
| 	mycfg.v = viper.GetViper() | 		v:  viper.GetViper(), | ||||||
| 	mycfg.ConfigValues = &cfg | 		cv: cfg, | ||||||
| 	return mycfg | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *Config) GetBool(key string) bool { | func (c *config) ConfigValues() *ConfigValues { | ||||||
|  | 	return c.cv | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *config) GetBool(key string) (bool, bool) { | ||||||
| 	c.RLock() | 	c.RLock() | ||||||
| 	defer c.RUnlock() | 	defer c.RUnlock() | ||||||
| 	//	log.Debugf("getting bool %s = %#v", key, c.v.GetBool(key)) | 	//	log.Debugf("getting bool %s = %#v", key, c.v.GetBool(key)) | ||||||
| 	return c.v.GetBool(key) | 	return c.v.GetBool(key), c.v.IsSet(key) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *Config) GetInt(key string) int { | func (c *config) GetInt(key string) (int, bool) { | ||||||
| 	c.RLock() | 	c.RLock() | ||||||
| 	defer c.RUnlock() | 	defer c.RUnlock() | ||||||
| 	//	log.Debugf("getting int %s = %d", key, c.v.GetInt(key)) | 	//	log.Debugf("getting int %s = %d", key, c.v.GetInt(key)) | ||||||
| 	return c.v.GetInt(key) | 	return c.v.GetInt(key), c.v.IsSet(key) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *Config) GetString(key string) string { | func (c *config) GetString(key string) (string, bool) { | ||||||
| 	c.RLock() | 	c.RLock() | ||||||
| 	defer c.RUnlock() | 	defer c.RUnlock() | ||||||
| 	//	log.Debugf("getting String %s = %s", key, c.v.GetString(key)) | 	//	log.Debugf("getting String %s = %s", key, c.v.GetString(key)) | ||||||
| 	return c.v.GetString(key) | 	return c.v.GetString(key), c.v.IsSet(key) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *Config) GetStringSlice(key string) []string { | func (c *config) GetStringSlice(key string) ([]string, bool) { | ||||||
| 	c.RLock() | 	c.RLock() | ||||||
| 	defer c.RUnlock() | 	defer c.RUnlock() | ||||||
| 	// log.Debugf("getting StringSlice %s = %#v", key, c.v.GetStringSlice(key)) | 	// log.Debugf("getting StringSlice %s = %#v", key, c.v.GetStringSlice(key)) | ||||||
| 	return c.v.GetStringSlice(key) | 	return c.v.GetStringSlice(key), c.v.IsSet(key) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *Config) GetStringSlice2D(key string) [][]string { | func (c *config) GetStringSlice2D(key string) ([][]string, bool) { | ||||||
| 	c.RLock() | 	c.RLock() | ||||||
| 	defer c.RUnlock() | 	defer c.RUnlock() | ||||||
| 	result := [][]string{} | 	result := [][]string{} | ||||||
| @@ -272,9 +293,9 @@ func (c *Config) GetStringSlice2D(key string) [][]string { | |||||||
| 			} | 			} | ||||||
| 			result = append(result, result2) | 			result = append(result, result2) | ||||||
| 		} | 		} | ||||||
| 		return result | 		return result, true | ||||||
| 	} | 	} | ||||||
| 	return result | 	return result, false | ||||||
| } | } | ||||||
|  |  | ||||||
| func GetIconURL(msg *Message, iconURL string) string { | func GetIconURL(msg *Message, iconURL string) string { | ||||||
| @@ -286,3 +307,46 @@ func GetIconURL(msg *Message, iconURL string) string { | |||||||
| 	iconURL = strings.Replace(iconURL, "{PROTOCOL}", protocol, -1) | 	iconURL = strings.Replace(iconURL, "{PROTOCOL}", protocol, -1) | ||||||
| 	return iconURL | 	return iconURL | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type TestConfig struct { | ||||||
|  | 	Config | ||||||
|  |  | ||||||
|  | 	Overrides map[string]interface{} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *TestConfig) GetBool(key string) (bool, bool) { | ||||||
|  | 	val, ok := c.Overrides[key] | ||||||
|  | 	fmt.Fprintln(os.Stderr, "DEBUG:", c.Overrides, key, ok, val) | ||||||
|  | 	if ok { | ||||||
|  | 		return val.(bool), true | ||||||
|  | 	} | ||||||
|  | 	return c.Config.GetBool(key) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *TestConfig) GetInt(key string) (int, bool) { | ||||||
|  | 	if val, ok := c.Overrides[key]; ok { | ||||||
|  | 		return val.(int), true | ||||||
|  | 	} | ||||||
|  | 	return c.Config.GetInt(key) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *TestConfig) GetString(key string) (string, bool) { | ||||||
|  | 	if val, ok := c.Overrides[key]; ok { | ||||||
|  | 		return val.(string), true | ||||||
|  | 	} | ||||||
|  | 	return c.Config.GetString(key) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *TestConfig) GetStringSlice(key string) ([]string, bool) { | ||||||
|  | 	if val, ok := c.Overrides[key]; ok { | ||||||
|  | 		return val.([]string), true | ||||||
|  | 	} | ||||||
|  | 	return c.Config.GetStringSlice(key) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (c *TestConfig) GetStringSlice2D(key string) ([][]string, bool) { | ||||||
|  | 	if val, ok := c.Overrides[key]; ok { | ||||||
|  | 		return val.([][]string), true | ||||||
|  | 	} | ||||||
|  | 	return c.Config.GetStringSlice2D(key) | ||||||
|  | } | ||||||
|   | |||||||
| @@ -33,7 +33,8 @@ import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| type Gateway struct { | type Gateway struct { | ||||||
| 	*config.Config | 	config.Config | ||||||
|  |  | ||||||
| 	Router         *Router | 	Router         *Router | ||||||
| 	MyConfig       *config.Gateway | 	MyConfig       *config.Gateway | ||||||
| 	Bridges        map[string]*bridge.Bridge | 	Bridges        map[string]*bridge.Bridge | ||||||
| @@ -107,7 +108,7 @@ func (gw *Gateway) AddBridge(cfg *config.Bridge) error { | |||||||
| 	if br == nil { | 	if br == nil { | ||||||
| 		br = bridge.New(cfg) | 		br = bridge.New(cfg) | ||||||
| 		br.Config = gw.Router.Config | 		br.Config = gw.Router.Config | ||||||
| 		br.General = &gw.General | 		br.General = &gw.ConfigValues().General | ||||||
| 		// set logging | 		// set logging | ||||||
| 		br.Log = log.WithFields(log.Fields{"prefix": "bridge"}) | 		br.Log = log.WithFields(log.Fields{"prefix": "bridge"}) | ||||||
| 		brconfig := &bridge.Config{Remote: gw.Message, Log: log.WithFields(log.Fields{"prefix": br.Protocol}), Bridge: br} | 		brconfig := &bridge.Config{Remote: gw.Message, Log: log.WithFields(log.Fields{"prefix": br.Protocol}), Bridge: br} | ||||||
| @@ -278,7 +279,7 @@ func (gw *Gateway) handleMessage(msg config.Message, dest *bridge.Bridge) []*BrM | |||||||
|  |  | ||||||
| 	// Get the ID of the parent message in thread | 	// Get the ID of the parent message in thread | ||||||
| 	var canonicalParentMsgID string | 	var canonicalParentMsgID string | ||||||
| 	if msg.ParentID != "" && (gw.Config.General.PreserveThreading || dest.GetBool("PreserveThreading")) { | 	if msg.ParentID != "" && (gw.ConfigValues().General.PreserveThreading || dest.GetBool("PreserveThreading")) { | ||||||
| 		thisParentMsgID := dest.Protocol + " " + msg.ParentID | 		thisParentMsgID := dest.Protocol + " " + msg.ParentID | ||||||
| 		canonicalParentMsgID = gw.FindCanonicalMsgID(thisParentMsgID) | 		canonicalParentMsgID = gw.FindCanonicalMsgID(thisParentMsgID) | ||||||
| 	} | 	} | ||||||
| @@ -391,13 +392,13 @@ func (gw *Gateway) ignoreMessage(msg *config.Message) bool { | |||||||
| func (gw *Gateway) modifyUsername(msg config.Message, dest *bridge.Bridge) string { | func (gw *Gateway) modifyUsername(msg config.Message, dest *bridge.Bridge) string { | ||||||
| 	br := gw.Bridges[msg.Account] | 	br := gw.Bridges[msg.Account] | ||||||
| 	msg.Protocol = br.Protocol | 	msg.Protocol = br.Protocol | ||||||
| 	if gw.Config.General.StripNick || dest.GetBool("StripNick") { | 	if gw.ConfigValues().General.StripNick || dest.GetBool("StripNick") { | ||||||
| 		re := regexp.MustCompile("[^a-zA-Z0-9]+") | 		re := regexp.MustCompile("[^a-zA-Z0-9]+") | ||||||
| 		msg.Username = re.ReplaceAllString(msg.Username, "") | 		msg.Username = re.ReplaceAllString(msg.Username, "") | ||||||
| 	} | 	} | ||||||
| 	nick := dest.GetString("RemoteNickFormat") | 	nick := dest.GetString("RemoteNickFormat") | ||||||
| 	if nick == "" { | 	if nick == "" { | ||||||
| 		nick = gw.Config.General.RemoteNickFormat | 		nick = gw.ConfigValues().General.RemoteNickFormat | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// loop to replace nicks | 	// loop to replace nicks | ||||||
| @@ -436,7 +437,7 @@ func (gw *Gateway) modifyUsername(msg config.Message, dest *bridge.Bridge) strin | |||||||
| } | } | ||||||
|  |  | ||||||
| func (gw *Gateway) modifyAvatar(msg config.Message, dest *bridge.Bridge) string { | func (gw *Gateway) modifyAvatar(msg config.Message, dest *bridge.Bridge) string { | ||||||
| 	iconurl := gw.Config.General.IconURL | 	iconurl := gw.ConfigValues().General.IconURL | ||||||
| 	if iconurl == "" { | 	if iconurl == "" { | ||||||
| 		iconurl = dest.GetString("IconURL") | 		iconurl = dest.GetString("IconURL") | ||||||
| 	} | 	} | ||||||
| @@ -477,7 +478,9 @@ func (gw *Gateway) handleFiles(msg *config.Message) { | |||||||
| 	reg := regexp.MustCompile("[^a-zA-Z0-9]+") | 	reg := regexp.MustCompile("[^a-zA-Z0-9]+") | ||||||
|  |  | ||||||
| 	// If we don't have a attachfield or we don't have a mediaserver configured return | 	// If we don't have a attachfield or we don't have a mediaserver configured return | ||||||
| 	if msg.Extra == nil || (gw.Config.General.MediaServerUpload == "" && gw.Config.General.MediaDownloadPath == "") { | 	if msg.Extra == nil || | ||||||
|  | 		(gw.ConfigValues().General.MediaServerUpload == "" && | ||||||
|  | 			gw.ConfigValues().General.MediaDownloadPath == "") { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -499,10 +502,10 @@ func (gw *Gateway) handleFiles(msg *config.Message) { | |||||||
|  |  | ||||||
| 		sha1sum := fmt.Sprintf("%x", sha1.Sum(*fi.Data))[:8] | 		sha1sum := fmt.Sprintf("%x", sha1.Sum(*fi.Data))[:8] | ||||||
|  |  | ||||||
| 		if gw.Config.General.MediaServerUpload != "" { | 		if gw.ConfigValues().General.MediaServerUpload != "" { | ||||||
| 			// Use MediaServerUpload. Upload using a PUT HTTP request and basicauth. | 			// Use MediaServerUpload. Upload using a PUT HTTP request and basicauth. | ||||||
|  |  | ||||||
| 			url := gw.Config.General.MediaServerUpload + "/" + sha1sum + "/" + fi.Name | 			url := gw.ConfigValues().General.MediaServerUpload + "/" + sha1sum + "/" + fi.Name | ||||||
|  |  | ||||||
| 			req, err := http.NewRequest("PUT", url, bytes.NewReader(*fi.Data)) | 			req, err := http.NewRequest("PUT", url, bytes.NewReader(*fi.Data)) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| @@ -521,7 +524,7 @@ func (gw *Gateway) handleFiles(msg *config.Message) { | |||||||
| 		} else { | 		} else { | ||||||
| 			// Use MediaServerPath. Place the file on the current filesystem. | 			// Use MediaServerPath. Place the file on the current filesystem. | ||||||
|  |  | ||||||
| 			dir := gw.Config.General.MediaDownloadPath + "/" + sha1sum | 			dir := gw.ConfigValues().General.MediaDownloadPath + "/" + sha1sum | ||||||
| 			err := os.Mkdir(dir, os.ModePerm) | 			err := os.Mkdir(dir, os.ModePerm) | ||||||
| 			if err != nil && !os.IsExist(err) { | 			if err != nil && !os.IsExist(err) { | ||||||
| 				flog.Errorf("mediaserver path failed, could not mkdir: %s %#v", err, err) | 				flog.Errorf("mediaserver path failed, could not mkdir: %s %#v", err, err) | ||||||
| @@ -539,7 +542,7 @@ func (gw *Gateway) handleFiles(msg *config.Message) { | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		// Download URL. | 		// Download URL. | ||||||
| 		durl := gw.Config.General.MediaServerDownload + "/" + sha1sum + "/" + fi.Name | 		durl := gw.ConfigValues().General.MediaServerDownload + "/" + sha1sum + "/" + fi.Name | ||||||
|  |  | ||||||
| 		flog.Debugf("mediaserver download URL = %s", durl) | 		flog.Debugf("mediaserver download URL = %s", durl) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,27 +2,32 @@ package gateway | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/42wim/matterbridge/bridge" | 	"github.com/42wim/matterbridge/bridge" | ||||||
| 	"github.com/42wim/matterbridge/bridge/config" | 	"github.com/42wim/matterbridge/bridge/config" | ||||||
| 	samechannelgateway "github.com/42wim/matterbridge/gateway/samechannel" | 	samechannelgateway "github.com/42wim/matterbridge/gateway/samechannel" | ||||||
| 	//	"github.com/davecgh/go-spew/spew" |  | ||||||
| 	"time" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type Router struct { | type Router struct { | ||||||
|  | 	config.Config | ||||||
|  |  | ||||||
| 	Gateways         map[string]*Gateway | 	Gateways         map[string]*Gateway | ||||||
| 	Message          chan config.Message | 	Message          chan config.Message | ||||||
| 	MattermostPlugin chan config.Message | 	MattermostPlugin chan config.Message | ||||||
| 	*config.Config |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewRouter(cfg *config.Config) (*Router, error) { | func NewRouter(cfg config.Config) (*Router, error) { | ||||||
| 	r := &Router{Message: make(chan config.Message), MattermostPlugin: make(chan config.Message), Gateways: make(map[string]*Gateway), Config: cfg} | 	r := &Router{ | ||||||
|  | 		Config:           cfg, | ||||||
|  | 		Message:          make(chan config.Message), | ||||||
|  | 		MattermostPlugin: make(chan config.Message), | ||||||
|  | 		Gateways:         make(map[string]*Gateway), | ||||||
|  | 	} | ||||||
| 	sgw := samechannelgateway.New(cfg) | 	sgw := samechannelgateway.New(cfg) | ||||||
| 	gwconfigs := sgw.GetConfig() | 	gwconfigs := sgw.GetConfig() | ||||||
|  |  | ||||||
| 	for _, entry := range append(gwconfigs, cfg.Gateway...) { | 	for _, entry := range append(gwconfigs, cfg.ConfigValues().Gateway...) { | ||||||
| 		if !entry.Enable { | 		if !entry.Enable { | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -5,17 +5,17 @@ import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| type SameChannelGateway struct { | type SameChannelGateway struct { | ||||||
| 	*config.Config | 	config.Config | ||||||
| } | } | ||||||
|  |  | ||||||
| func New(cfg *config.Config) *SameChannelGateway { | func New(cfg config.Config) *SameChannelGateway { | ||||||
| 	return &SameChannelGateway{Config: cfg} | 	return &SameChannelGateway{Config: cfg} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (sgw *SameChannelGateway) GetConfig() []config.Gateway { | func (sgw *SameChannelGateway) GetConfig() []config.Gateway { | ||||||
| 	var gwconfigs []config.Gateway | 	var gwconfigs []config.Gateway | ||||||
| 	cfg := sgw.Config | 	cfg := sgw.Config | ||||||
| 	for _, gw := range cfg.SameChannelGateway { | 	for _, gw := range cfg.ConfigValues().SameChannelGateway { | ||||||
| 		gwconfig := config.Gateway{Name: gw.Name, Enable: gw.Enable} | 		gwconfig := config.Gateway{Name: gw.Name, Enable: gw.Enable} | ||||||
| 		for _, account := range gw.Accounts { | 		for _, account := range gw.Accounts { | ||||||
| 			for _, channel := range gw.Channels { | 			for _, channel := range gw.Channels { | ||||||
|   | |||||||
| @@ -1,16 +1,13 @@ | |||||||
| package samechannelgateway | package samechannelgateway | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" |  | ||||||
|  |  | ||||||
| 	"github.com/42wim/matterbridge/bridge/config" | 	"github.com/42wim/matterbridge/bridge/config" | ||||||
| 	"github.com/BurntSushi/toml" |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
|  |  | ||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var testconfig = ` | const testConfig = ` | ||||||
| [mattermost.test] | [mattermost.test] | ||||||
| [slack.test] | [slack.test] | ||||||
|  |  | ||||||
| @@ -21,12 +18,56 @@ var testconfig = ` | |||||||
|       channels = [ "testing","testing2","testing10"] |       channels = [ "testing","testing2","testing10"] | ||||||
| ` | ` | ||||||
|  |  | ||||||
| func TestGetConfig(t *testing.T) { | var ( | ||||||
| 	var cfg *config.Config | 	expectedConfig = config.Gateway{ | ||||||
| 	if _, err := toml.Decode(testconfig, &cfg); err != nil { | 		Name:   "blah", | ||||||
| 		fmt.Println(err) | 		Enable: true, | ||||||
|  | 		In:     []config.Bridge(nil), | ||||||
|  | 		Out:    []config.Bridge(nil), | ||||||
|  | 		InOut: []config.Bridge{ | ||||||
|  | 			{ | ||||||
|  | 				Account:     "mattermost.test", | ||||||
|  | 				Channel:     "testing", | ||||||
|  | 				Options:     config.ChannelOptions{Key: ""}, | ||||||
|  | 				SameChannel: true, | ||||||
|  | 			}, | ||||||
|  | 			{ | ||||||
|  | 				Account:     "mattermost.test", | ||||||
|  | 				Channel:     "testing2", | ||||||
|  | 				Options:     config.ChannelOptions{Key: ""}, | ||||||
|  | 				SameChannel: true, | ||||||
|  | 			}, | ||||||
|  | 			{ | ||||||
|  | 				Account:     "mattermost.test", | ||||||
|  | 				Channel:     "testing10", | ||||||
|  | 				Options:     config.ChannelOptions{Key: ""}, | ||||||
|  | 				SameChannel: true, | ||||||
|  | 			}, | ||||||
|  | 			{ | ||||||
|  | 				Account:     "slack.test", | ||||||
|  | 				Channel:     "testing", | ||||||
|  | 				Options:     config.ChannelOptions{Key: ""}, | ||||||
|  | 				SameChannel: true, | ||||||
|  | 			}, | ||||||
|  | 			{ | ||||||
|  | 				Account:     "slack.test", | ||||||
|  | 				Channel:     "testing2", | ||||||
|  | 				Options:     config.ChannelOptions{Key: ""}, | ||||||
|  | 				SameChannel: true, | ||||||
|  | 			}, | ||||||
|  | 			{ | ||||||
|  | 				Account:     "slack.test", | ||||||
|  | 				Channel:     "testing10", | ||||||
|  | 				Options:     config.ChannelOptions{Key: ""}, | ||||||
|  | 				SameChannel: true, | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
| 	} | 	} | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func TestGetConfig(t *testing.T) { | ||||||
|  | 	cfg := config.NewConfigFromString([]byte(testConfig)) | ||||||
| 	sgw := New(cfg) | 	sgw := New(cfg) | ||||||
| 	configs := sgw.GetConfig() | 	configs := sgw.GetConfig() | ||||||
| 	assert.Equal(t, []config.Gateway{{Name: "blah", Enable: true, In: []config.Bridge(nil), Out: []config.Bridge(nil), InOut: []config.Bridge{{Account: "mattermost.test", Channel: "testing", Options: config.ChannelOptions{Key: ""}, SameChannel: true}, {Account: "mattermost.test", Channel: "testing2", Options: config.ChannelOptions{Key: ""}, SameChannel: true}, {Account: "mattermost.test", Channel: "testing10", Options: config.ChannelOptions{Key: ""}, SameChannel: true}, {Account: "slack.test", Channel: "testing", Options: config.ChannelOptions{Key: ""}, SameChannel: true}, {Account: "slack.test", Channel: "testing2", Options: config.ChannelOptions{Key: ""}, SameChannel: true}, {Account: "slack.test", Channel: "testing10", Options: config.ChannelOptions{Key: ""}, SameChannel: true}}}}, configs) | 	assert.Equal(t, []config.Gateway{expectedConfig}, configs) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -44,7 +44,7 @@ func main() { | |||||||
| 		flog.Println("WARNING: THIS IS A DEVELOPMENT VERSION. Things may break.") | 		flog.Println("WARNING: THIS IS A DEVELOPMENT VERSION. Things may break.") | ||||||
| 	} | 	} | ||||||
| 	cfg := config.NewConfig(*flagConfig) | 	cfg := config.NewConfig(*flagConfig) | ||||||
| 	cfg.General.Debug = *flagDebug | 	cfg.ConfigValues().General.Debug = *flagDebug | ||||||
| 	r, err := gateway.NewRouter(cfg) | 	r, err := gateway.NewRouter(cfg) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		flog.Fatalf("Starting gateway failed: %s", err) | 		flog.Fatalf("Starting gateway failed: %s", err) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Duco van Amstel
					Duco van Amstel