Skip to content

Commit

Permalink
Merge pull request #256 from thrawn01/thrawn/develop
Browse files Browse the repository at this point in the history
MockServer now locks internal resources
  • Loading branch information
thrawn01 authored Apr 12, 2021
2 parents 4ed5a26 + dcb6f19 commit a87d271
Show file tree
Hide file tree
Showing 11 changed files with 139 additions and 1 deletion.
4 changes: 4 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [4.5.1] - 2021-04-12
### Changed
* `MockServer` now locks internal resources for thread safety.

## [4.5.0] - 2021-04-09
### Changed
* `MockServer` is now an interface, `NewMockServer()` now returns the interface.
Expand Down
16 changes: 16 additions & 0 deletions mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"net/url"
"strconv"
"strings"
"sync"

"github.com/gorilla/mux"
)
Expand Down Expand Up @@ -38,33 +39,48 @@ type mockServer struct {
routeList []Route
events []Event
webhooks WebHooksListResponse
mutex sync.Mutex
}

func (ms *mockServer) DomainIPS() []string {
defer ms.mutex.Unlock()
ms.mutex.Lock()
return ms.domainIPS
}

func (ms *mockServer) DomainList() []DomainContainer {
defer ms.mutex.Unlock()
ms.mutex.Lock()
return ms.domainList
}

func (ms *mockServer) ExportList() []Export {
defer ms.mutex.Unlock()
ms.mutex.Lock()
return ms.exportList
}

func (ms *mockServer) MailingList() []MailingListContainer {
defer ms.mutex.Unlock()
ms.mutex.Lock()
return ms.mailingList
}

func (ms *mockServer) RouteList() []Route {
defer ms.mutex.Unlock()
ms.mutex.Lock()
return ms.routeList
}

func (ms *mockServer) Events() []Event {
defer ms.mutex.Unlock()
ms.mutex.Lock()
return ms.events
}

func (ms *mockServer) Webhooks() WebHooksListResponse {
defer ms.mutex.Unlock()
ms.mutex.Lock()
return ms.webhooks
}

Expand Down
39 changes: 39 additions & 0 deletions mock_domains.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,9 @@ func (ms *mockServer) addDomainRoutes(r *mux.Router) {
}

func (ms *mockServer) listDomains(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

var list []Domain
for _, domain := range ms.domainList {
list = append(list, domain.Domain)
Expand Down Expand Up @@ -138,6 +141,9 @@ func (ms *mockServer) listDomains(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) getDomain(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

for _, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
d.Connection = nil
Expand All @@ -150,6 +156,9 @@ func (ms *mockServer) getDomain(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) createDomain(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

ms.domainList = append(ms.domainList, DomainContainer{
Domain: Domain{
CreatedAt: RFC2822Time(time.Now()),
Expand All @@ -165,6 +174,9 @@ func (ms *mockServer) createDomain(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) deleteDomain(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

result := ms.domainList[:0]
for _, domain := range ms.domainList {
if domain.Domain.Name == mux.Vars(r)["domain"] {
Expand All @@ -184,6 +196,9 @@ func (ms *mockServer) deleteDomain(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) getConnection(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

for _, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
resp := domainConnectionResponse{
Expand All @@ -198,6 +213,9 @@ func (ms *mockServer) getConnection(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) updateConnection(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

for i, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
ms.domainList[i].Connection = &DomainConnection{
Expand All @@ -213,6 +231,9 @@ func (ms *mockServer) updateConnection(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) getTracking(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

for _, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
resp := domainTrackingResponse{
Expand All @@ -227,6 +248,9 @@ func (ms *mockServer) getTracking(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) updateClickTracking(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

for i, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
ms.domainList[i].Tracking.Click.Active = stringToBool(r.FormValue("active"))
Expand All @@ -239,6 +263,9 @@ func (ms *mockServer) updateClickTracking(w http.ResponseWriter, r *http.Request
}

func (ms *mockServer) updateOpenTracking(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

for i, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
ms.domainList[i].Tracking.Open.Active = stringToBool(r.FormValue("active"))
Expand All @@ -251,6 +278,9 @@ func (ms *mockServer) updateOpenTracking(w http.ResponseWriter, r *http.Request)
}

func (ms *mockServer) updateUnsubTracking(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

for i, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
ms.domainList[i].Tracking.Unsubscribe.Active = stringToBool(r.FormValue("active"))
Expand All @@ -269,6 +299,9 @@ func (ms *mockServer) updateUnsubTracking(w http.ResponseWriter, r *http.Request
}

func (ms *mockServer) getTagLimits(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

for _, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
if d.TagLimits == nil {
Expand All @@ -285,6 +318,9 @@ func (ms *mockServer) getTagLimits(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) updateDKIMSelector(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

for _, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
if r.FormValue("dkim_selector") == "" {
Expand All @@ -300,6 +336,9 @@ func (ms *mockServer) updateDKIMSelector(w http.ResponseWriter, r *http.Request)
}

func (ms *mockServer) updateWebPrefix(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

for _, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
if r.FormValue("web_prefix") == "" {
Expand Down
2 changes: 2 additions & 0 deletions mock_events.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,8 @@ type eventsResponse struct {
}

func (ms *mockServer) listEvents(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()
var idx []string

for _, e := range ms.events {
Expand Down
6 changes: 6 additions & 0 deletions mock_exports.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ func (ms *mockServer) addExportRoutes(r *mux.Router) {
}

func (ms *mockServer) postExports(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()
e := Export{
ID: strconv.Itoa(len(ms.exportList)),
URL: r.FormValue("url"),
Expand All @@ -26,12 +28,16 @@ func (ms *mockServer) postExports(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) listExports(w http.ResponseWriter, _ *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()
toJSON(w, ExportList{
Items: ms.exportList,
})
}

func (ms *mockServer) getExport(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()
for _, export := range ms.exportList {
if export.ID == mux.Vars(r)["id"] {
toJSON(w, export)
Expand Down
6 changes: 6 additions & 0 deletions mock_ips.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,24 @@ func (ms *mockServer) getIPAddress(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) listDomainIPS(w http.ResponseWriter, _ *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()
toJSON(w, ipAddressListResponse{
TotalCount: 2,
Items: ms.domainIPS,
})
}

func (ms *mockServer) postDomainIPS(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()
ms.domainIPS = append(ms.domainIPS, r.FormValue("ip"))
toJSON(w, okResp{Message: "success"})
}

func (ms *mockServer) deleteDomainIPS(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()
result := ms.domainIPS[:0]
for _, ip := range ms.domainIPS {
if ip == mux.Vars(r)["ip"] {
Expand Down
33 changes: 33 additions & 0 deletions mock_mailing_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ func (ms *mockServer) addMailingListRoutes(r *mux.Router) {
}

func (ms *mockServer) listMailingLists(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

var list []MailingList
var idx []string

Expand Down Expand Up @@ -90,6 +93,9 @@ func (ms *mockServer) listMailingLists(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) getMailingList(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

for _, ml := range ms.mailingList {
if ml.MailingList.Address == mux.Vars(r)["address"] {
toJSON(w, mailingListResponse{MailingList: ml.MailingList})
Expand All @@ -101,6 +107,9 @@ func (ms *mockServer) getMailingList(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) deleteMailingList(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

result := ms.mailingList[:0]
for _, ml := range ms.mailingList {
if ml.MailingList.Address == mux.Vars(r)["address"] {
Expand All @@ -120,6 +129,9 @@ func (ms *mockServer) deleteMailingList(w http.ResponseWriter, r *http.Request)
}

func (ms *mockServer) updateMailingList(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

for i, d := range ms.mailingList {
if d.MailingList.Address == mux.Vars(r)["address"] {
if r.FormValue("address") != "" {
Expand All @@ -143,6 +155,9 @@ func (ms *mockServer) updateMailingList(w http.ResponseWriter, r *http.Request)
}

func (ms *mockServer) createMailingList(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

ms.mailingList = append(ms.mailingList, MailingListContainer{
MailingList: MailingList{
CreatedAt: RFC2822Time(time.Now().UTC()),
Expand All @@ -156,6 +171,9 @@ func (ms *mockServer) createMailingList(w http.ResponseWriter, r *http.Request)
}

func (ms *mockServer) listMembers(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

var list []Member
var idx []string
var found bool
Expand Down Expand Up @@ -211,6 +229,9 @@ func (ms *mockServer) listMembers(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) getMember(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

var found bool
for _, ml := range ms.mailingList {
if ml.MailingList.Address == mux.Vars(r)["address"] {
Expand All @@ -235,6 +256,9 @@ func (ms *mockServer) getMember(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) deleteMember(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

idx := -1
for i, ml := range ms.mailingList {
if ml.MailingList.Address == mux.Vars(r)["address"] {
Expand Down Expand Up @@ -267,6 +291,9 @@ func (ms *mockServer) deleteMember(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) updateMember(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

idx := -1
for i, ml := range ms.mailingList {
if ml.MailingList.Address == mux.Vars(r)["address"] {
Expand Down Expand Up @@ -304,6 +331,9 @@ func (ms *mockServer) updateMember(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) createMember(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

idx := -1
for i, ml := range ms.mailingList {
if ml.MailingList.Address == mux.Vars(r)["address"] {
Expand Down Expand Up @@ -347,6 +377,9 @@ func (ms *mockServer) createMember(w http.ResponseWriter, r *http.Request) {
}

func (ms *mockServer) bulkCreate(w http.ResponseWriter, r *http.Request) {
defer ms.mutex.Unlock()
ms.mutex.Lock()

idx := -1
for i, ml := range ms.mailingList {
if ml.MailingList.Address == mux.Vars(r)["address"] {
Expand Down
Loading

0 comments on commit a87d271

Please sign in to comment.