1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
.PHONY: help docker docker-push realize qa critic vet codegen integration
GO = go
GOGET = $(GO) get -u
GOTEST ?= go test
BASEPKGS = system compose messaging
IMAGES = corteza-server-system corteza-server-compose corteza-server-messaging corteza-server
TESTABLE = messaging system compose pkg internal
# Run watcher with a different event-trigger delay, eg:
# $> WATCH_DELAY=5s make watch.test.integration
WATCH_DELAY ?= 1s
# Run go test cmd with flags, eg:
# $> TEST_FLAGS="-v" make test.integration
# $> TEST_FLAGS="-v -run SpecialTest" make test.integration
TEST_FLAGS ?=
COVER_MODE ?= count
COVER_PROFILE ?= .cover.out
COVER_FLAGS ?= -covermode=$(COVER_MODE) -coverprofile=$(COVER_PROFILE)
# Cover package maps for tests tasks
COVER_PKGS_messaging = ./messaging/...
COVER_PKGS_system = ./system/...
COVER_PKGS_compose = ./compose/...
COVER_PKGS_pkg = ./pkg/...
COVER_PKGS_all = $(COVER_PKGS_pkg),$(COVER_PKGS_messaging),$(COVER_PKGS_system),$(COVER_PKGS_compose)
COVER_PKGS_integration = $(COVER_PKGS_all)
TEST_SUITE_pkg = ./pkg/...
TEST_SUITE_services = ./compose/... ./messaging/... ./system/...
TEST_SUITE_unit = $(TEST_SUITE_pkg) $(TEST_SUITE_services)
TEST_SUITE_integration = ./tests/...
TEST_SUITE_all = $(TEST_SUITE_unit) $(TEST_SUITE_integration)
DEV_MINIO_PORT ?= 9000
########################################################################################################################
# Tool bins
REALIZE = ${GOPATH}/bin/realize
GOCRITIC = ${GOPATH}/bin/gocritic
MOCKGEN = ${GOPATH}/bin/mockgen
STATICCHECK = ${GOPATH}/bin/staticcheck
PROTOGEN = ${GOPATH}/bin/protoc-gen-go
# Using nodemon in development environment for "watch.*" tasks
# https://nodemon.io
NODEMON = /usr/local/bin/nodemon
WATCHER = $(NODEMON) --delay ${WATCH_DELAY} -e go -w . --exec
help:
@echo
@echo Usage: make [target]
@echo
@echo - docker-images: builds docker images locally
@echo - docker-push: push built images
@echo
@echo - vet - run go vet on all code
@echo - critic - run go critic on all code
@echo - test.all - run all tests
@echo - test.unit - run all unit tests
@echo - test.integration - run all integration tests
@echo
@echo See tests/README.md for more info
@echo
docker-images: $(IMAGES:%=docker-image.%)
docker-image.%: Dockerfile.%
@ docker build --no-cache --rm -f Dockerfile.$* -t cortezaproject/$*:latest .
docker-push: $(IMAGES:%=docker-push.%)
docker-push.%: Dockerfile.%
@ docker push cortezaproject/$*:latest
########################################################################################################################
# Development
realize: $(REALIZE)
$(REALIZE) start
codegen: $(PROTOGEN)
./codegen.sh
mailhog.up:
docker run --rm --publish 8025:8025 --publish 1025:1025 mailhog/mailhog
minio.up:
# Runs temp minio server
# No volume because we do not want the data to persist
docker run --rm --publish 9000:$(DEV_MINIO_PORT) --env-file .env minio/minio server /data
watch.test.%: $(NODEMON)
# Development helper - watches for file
# changes & reruns tests
$(WATCHER) "make test.$* || exit 0"
########################################################################################################################
# Quality Assurance
# Adds -coverprofile flag to test flags
# and executes test.cover... task
test.coverprofile.%:
@ TEST_FLAGS="$(TEST_FLAGS) -coverprofile=$(COVER_PROFILE)" make test.cover.$*
# Adds -coverpkg flag
test.cover.%:
@ TEST_FLAGS="$(TEST_FLAGS) -coverpkg=$(COVER_PKGS_$*)" make test.$*
# Runs integration tests
test.integration:
$(GOTEST) $(TEST_FLAGS) $(TEST_SUITE_integration)
# Runs one suite from integration tests
test.integration.%:
$(GOTEST) $(TEST_FLAGS) ./tests/$*/...
# Runs ALL tests
test.all:
$(GOTEST) $(TEST_FLAGS) $(TEST_SUITE_all)
# Unit testing testing messaging, system or compose
test.unit.%:
$(GOTEST) $(TEST_FLAGS) ./$*/...
# Runs ALL tests
test.unit:
$(GOTEST) $(TEST_FLAGS) $(TEST_SUITE_unit)
# Testing pkg
test.pkg:
$(GOTEST) $(TEST_FLAGS) $(TEST_SUITE_pkg)
test: test.unit
# Outputs cross-package imports that should not be there.
test.cross-dep:
@ grep -rE "github.com/cortezaproject/corteza-server/(compose|messaging)/" system || exit 0
@ grep -rE "github.com/cortezaproject/corteza-server/(system|messaging)/" compose || exit 0
@ grep -rE "github.com/cortezaproject/corteza-server/(system|compose)/" messaging || exit 0
@ grep -rE "github.com/cortezaproject/corteza-server/(system|compose|messaging)/" pkg || exit 0
vet:
$(GO) vet ./...
critic: $(GOCRITIC)
$(GOCRITIC) check-project .
staticcheck: $(STATICCHECK)
$(STATICCHECK) ./pkg/... ./system/... ./messaging/... ./compose/...
qa: vet critic test
mocks: $(MOCKGEN)
# Cleanup all pre-generated
rm -rf system/repository/mocks && mkdir -p system/repository/mocks
rm -rf compose/service/mocks && mkdir -p compose/service/mocks
$(MOCKGEN) -package repository -source system/repository/user.go -destination system/repository/mocks/user.go
$(MOCKGEN) -package repository -source system/repository/credentials.go -destination system/repository/mocks/credentials.go
$(MOCKGEN) -package mail -source pkg/mail/mail.go -destination pkg/mail/mail_mock_test.go
########################################################################################################################
# Toolset
$(REALIZE):
$(GOGET) github.com/tockins/realize
$(GOCRITIC):
$(GOGET) github.com/go-critic/go-critic/...
$(MOCKGEN):
$(GOGET) github.com/golang/mock/mockgen
$(STATICCHECK):
$(GOGET) honnef.co/go/tools/cmd/staticcheck
$(PROTOGEN):
$(GOGET) github.com/golang/protobuf/protoc-gen-go
$(NODEMON):
npm install -g nodemon
clean:
rm -f $(REALIZE) $(GOCRITIC)