2017-09-23 01:03:27 +02:00
|
|
|
package mocks
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
"sync"
|
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
"github.com/mainflux/mainflux/clients"
|
2017-09-23 01:03:27 +02:00
|
|
|
)
|
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
var _ clients.ChannelRepository = (*channelRepositoryMock)(nil)
|
2017-09-23 01:03:27 +02:00
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
const chanID = "123e4567-e89b-12d3-a456-"
|
2018-04-18 22:36:24 +02:00
|
|
|
|
2017-09-23 01:03:27 +02:00
|
|
|
type channelRepositoryMock struct {
|
|
|
|
mu sync.Mutex
|
|
|
|
counter int
|
2018-05-10 23:53:25 +02:00
|
|
|
channels map[string]clients.Channel
|
|
|
|
clients clients.ClientRepository
|
2017-09-23 01:03:27 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// NewChannelRepository creates in-memory channel repository.
|
2018-05-10 23:53:25 +02:00
|
|
|
func NewChannelRepository(repo clients.ClientRepository) clients.ChannelRepository {
|
2017-09-23 01:03:27 +02:00
|
|
|
return &channelRepositoryMock{
|
2018-05-10 23:53:25 +02:00
|
|
|
channels: make(map[string]clients.Channel),
|
|
|
|
clients: repo,
|
2017-09-23 01:03:27 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
func (crm *channelRepositoryMock) Save(channel clients.Channel) (string, error) {
|
2018-03-11 18:06:01 +01:00
|
|
|
crm.mu.Lock()
|
|
|
|
defer crm.mu.Unlock()
|
2017-09-23 01:03:27 +02:00
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
crm.counter++
|
|
|
|
channel.ID = fmt.Sprintf("%s%012d", chanID, crm.counter)
|
2017-09-23 01:03:27 +02:00
|
|
|
|
2018-03-11 18:06:01 +01:00
|
|
|
crm.channels[key(channel.Owner, channel.ID)] = channel
|
2017-09-23 01:03:27 +02:00
|
|
|
|
|
|
|
return channel.ID, nil
|
|
|
|
}
|
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
func (crm *channelRepositoryMock) Update(channel clients.Channel) error {
|
2018-03-11 18:06:01 +01:00
|
|
|
crm.mu.Lock()
|
|
|
|
defer crm.mu.Unlock()
|
2017-09-23 01:03:27 +02:00
|
|
|
|
|
|
|
dbKey := key(channel.Owner, channel.ID)
|
|
|
|
|
2018-03-11 18:06:01 +01:00
|
|
|
if _, ok := crm.channels[dbKey]; !ok {
|
2018-05-10 23:53:25 +02:00
|
|
|
return clients.ErrNotFound
|
2017-09-23 01:03:27 +02:00
|
|
|
}
|
|
|
|
|
2018-03-11 18:06:01 +01:00
|
|
|
crm.channels[dbKey] = channel
|
2017-09-23 01:03:27 +02:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
func (crm *channelRepositoryMock) One(owner, id string) (clients.Channel, error) {
|
2018-03-11 18:06:01 +01:00
|
|
|
if c, ok := crm.channels[key(owner, id)]; ok {
|
2017-09-23 01:03:27 +02:00
|
|
|
return c, nil
|
|
|
|
}
|
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
return clients.Channel{}, clients.ErrNotFound
|
2017-09-23 01:03:27 +02:00
|
|
|
}
|
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
func (crm *channelRepositoryMock) All(owner string, offset, limit int) []clients.Channel {
|
2018-03-11 18:06:01 +01:00
|
|
|
// This obscure way to examine map keys is enforced by the key structure
|
|
|
|
// itself (see mocks/commons.go).
|
2017-09-23 01:03:27 +02:00
|
|
|
prefix := fmt.Sprintf("%s-", owner)
|
2018-05-10 23:53:25 +02:00
|
|
|
channels := make([]clients.Channel, 0)
|
2017-09-23 01:03:27 +02:00
|
|
|
|
2018-04-18 22:36:24 +02:00
|
|
|
if offset < 0 || limit <= 0 {
|
|
|
|
return channels
|
|
|
|
}
|
|
|
|
|
2018-04-23 15:17:30 +02:00
|
|
|
// Since IDs starts from 1, shift everything by one.
|
2018-05-10 23:53:25 +02:00
|
|
|
first := fmt.Sprintf("%s%012d", chanID, offset+1)
|
|
|
|
last := fmt.Sprintf("%s%012d", chanID, offset+limit+1)
|
2018-04-18 22:36:24 +02:00
|
|
|
|
2018-03-11 18:06:01 +01:00
|
|
|
for k, v := range crm.channels {
|
2018-04-23 15:17:30 +02:00
|
|
|
if strings.HasPrefix(k, prefix) && v.ID >= first && v.ID < last {
|
2017-09-23 01:03:27 +02:00
|
|
|
channels = append(channels, v)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return channels
|
|
|
|
}
|
|
|
|
|
2018-03-11 18:06:01 +01:00
|
|
|
func (crm *channelRepositoryMock) Remove(owner, id string) error {
|
|
|
|
delete(crm.channels, key(owner, id))
|
2017-09-23 01:03:27 +02:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
func (crm *channelRepositoryMock) Connect(owner, chanID, clientID string) error {
|
|
|
|
channel, err := crm.One(owner, chanID)
|
2018-03-11 18:06:01 +01:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
client, err := crm.clients.One(owner, clientID)
|
2018-04-08 22:57:56 +02:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
channel.Clients = append(channel.Clients, client)
|
2018-03-11 18:06:01 +01:00
|
|
|
return crm.Update(channel)
|
|
|
|
}
|
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
func (crm *channelRepositoryMock) Disconnect(owner, chanID, clientID string) error {
|
|
|
|
channel, err := crm.One(owner, chanID)
|
2018-03-11 18:06:01 +01:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
if !crm.HasClient(chanID, clientID) {
|
|
|
|
return clients.ErrNotFound
|
2018-03-11 18:06:01 +01:00
|
|
|
}
|
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
connected := make([]clients.Client, len(channel.Clients)-1)
|
2018-03-11 18:06:01 +01:00
|
|
|
for _, client := range channel.Clients {
|
2018-05-10 23:53:25 +02:00
|
|
|
if client.ID != clientID {
|
2018-03-11 18:06:01 +01:00
|
|
|
connected = append(connected, client)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
channel.Clients = connected
|
|
|
|
return crm.Update(channel)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (crm *channelRepositoryMock) HasClient(channel, client string) bool {
|
|
|
|
// This obscure way to examine map keys is enforced by the key structure
|
|
|
|
// itself (see mocks/commons.go).
|
2017-09-23 01:03:27 +02:00
|
|
|
suffix := fmt.Sprintf("-%s", channel)
|
|
|
|
|
2018-03-11 18:06:01 +01:00
|
|
|
for k, v := range crm.channels {
|
2017-09-23 01:03:27 +02:00
|
|
|
if strings.HasSuffix(k, suffix) {
|
2018-03-11 18:06:01 +01:00
|
|
|
for _, c := range v.Clients {
|
|
|
|
if c.ID == client {
|
2017-09-23 01:03:27 +02:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
2018-03-11 18:06:01 +01:00
|
|
|
break
|
2017-09-23 01:03:27 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|