CI changes (#457)

* make tests more resilient

* adjust drone for v1.x and dev-box, remove travis support

* add backend build step on branch for drone

* fix from email

* change notif email

* less demanding test wait

* add settings section to drone plugins

* adjust branch build

* convert all drone ci docker confs

* rename drone targets
This commit is contained in:
Umputun
2019-10-31 20:20:18 -05:00
committed by GitHub
parent 3a7ae4f616
commit 776b9117fc
19 changed files with 168 additions and 149 deletions
+78 -67
View File
@@ -1,92 +1,103 @@
workspace:
base: /go
path: src/github.com/umputun/remark
kind: pipeline
name: default
type: docker
pipeline:
build:
image: golang:1.12-alpine
steps:
- name: build server
image: umputun/baseimage:buildgo-latest
commands:
- cd backend/app
- go build -v ./...
- go build -mod=vendor
- echo "build completed"
docker_master:
- name: docker master
image: plugins/docker
repo: umputun/remark42
secrets: [ docker_username, docker_password]
build_args:
- DRONE=${DRONE}
- DRONE_TAG=${DRONE_TAG}
- DRONE_COMMIT=${DRONE_COMMIT}
- DRONE_BRANCH=${DRONE_BRANCH}
tags:
- ${DRONE_COMMIT_BRANCH/\//-}
settings:
repo: umputun/remark42
username:
from_secret: docker_username
password:
from_secret: docker_password
build_args:
- DRONE=${DRONE}
- DRONE_TAG=${DRONE_TAG}
- DRONE_COMMIT=${DRONE_COMMIT}
- DRONE_BRANCH=${DRONE_BRANCH}
tags:
- ${DRONE_COMMIT_BRANCH/\//-}
when:
branch: [master, release/*]
branch: [master]
event: push
docker_tag:
- name: docker tag
image: plugins/docker
repo: umputun/remark42
secrets: [ docker_username, docker_password ]
build_args:
- DRONE=${DRONE}
- DRONE_TAG=${DRONE_TAG}
- DRONE_COMMIT=${DRONE_COMMIT}
tags:
- ${DRONE_TAG}
- latest
settings:
repo: umputun/remark42
username:
from_secret: docker_username
password:
from_secret: docker_password
build_args:
- DRONE=${DRONE}
- DRONE_TAG=${DRONE_TAG}
- DRONE_COMMIT=${DRONE_COMMIT}
tags:
- ${DRONE_TAG}
- latest
when:
event: tag
artifacts_tag:
- name: docker branch
image: plugins/docker
dockerfile: Dockerfile.artifacts
build_args:
- DRONE=${DRONE}
- DRONE_TAG=${DRONE_TAG}
- DRONE_COMMIT=${DRONE_COMMIT}
- GITHUB_TOKEN=${GITHUB_TOKEN}
when:
event: tag
docker_branch:
image: plugins/docker
repo: umputun/remark42
secrets: [ docker_username, docker_password ]
build_args:
- DRONE=${DRONE}
- DRONE_COMMIT=${DRONE_COMMIT}
- DRONE_BRANCH=${DRONE_BRANCH}
tags:
- ${DRONE_COMMIT_BRANCH/\//-}
settings:
repo: umputun/remark42
username:
from_secret: docker_username
password:
from_secret: docker_password
build_args:
- DRONE=${DRONE}
- DRONE_COMMIT=${DRONE_COMMIT}
- DRONE_BRANCH=${DRONE_BRANCH}
tags:
- ${DRONE_COMMIT_BRANCH/\//-}
dry_run: true
when:
branch:
exclude: [master, release/*]
event: push
deploy:
image: appleboy/drone-ssh
host: remark42.com
username: umputun
port: 22
secrets: [ ssh_key ]
script:
- cd /srv/remark
- docker-compose pull
- docker-compose up -d
- name: artifacts tag
image: plugins/docker
settings:
dockerfile: Dockerfile.artifacts
build_args:
- DRONE=${DRONE}
- DRONE_TAG=${DRONE_TAG}
- DRONE_COMMIT=${DRONE_COMMIT}
- GITHUB_TOKEN=${GITHUB_TOKEN}
when:
event: tag
- name: deploy
image: docker.umputun.com/system/deploy-ci:master
commands:
- ssh umputun@master.radio-t.com "cd /srv/remark && git pull"
- ssh umputun@master.radio-t.com "cd /srv/remark && docker-compose pull && docker-compose up -d"
when:
branch: master
event: push
notify:
- name: notify
image: drillster/drone-email
host: smtp.mailgun.org
port: 25
username: email_username
password: email_password
from: drone@mg.umputun.com
recipients: [ umputun@gmail.com ]
secrets: [ email_username, email_password ]
settings:
host: smtp.mailgun.org
username:
from_secret: email_username
password:
from_secret: email_password
from: drone@mg.umputun.dev
recipients: [ sys@umputun.dev ]
when:
status: [ changed, failure ]
-19
View File
@@ -1,19 +0,0 @@
install:
- docker --version
- docker-compose --version
script:
- docker build
--build-arg COVERALLS_TOKEN=$COVERALLS_TOKEN
--build-arg CI=$CI
--build-arg TRAVIS=$TRAVIS
--build-arg TRAVIS_BRANCH=$TRAVIS_BRANCH
--build-arg TRAVIS_COMMIT=$TRAVIS_COMMIT
--build-arg TRAVIS_JOB_ID=$TRAVIS_JOB_ID
--build-arg TRAVIS_JOB_NUMBER=$TRAVIS_JOB_NUMBER
--build-arg TRAVIS_OS_NAME=$TRAVIS_OS_NAME
--build-arg TRAVIS_PULL_REQUEST=$TRAVIS_PULL_REQUEST
--build-arg TRAVIS_PULL_REQUEST_SHA=$TRAVIS_PULL_REQUEST_SHA
--build-arg TRAVIS_REPO_SLUG=$TRAVIS_REPO_SLUG
--build-arg TRAVIS_TAG=$TRAVIS_TAG
.
@@ -311,7 +311,6 @@ func TestRPC_admEnabledHndl(t *testing.T) {
assert.Equal(t, false, ok)
}
func TestRPC_admEventHndl(t *testing.T) {
_, port, teardown := prepTestStore(t)
defer teardown()
+1 -1
View File
@@ -302,7 +302,7 @@ func TestServerApp_MainSignal(t *testing.T) {
require.Nil(t, err)
err = s.Execute(args)
assert.NoError(t, err, "execute failed")
assert.True(t, time.Since(st).Seconds() < 1, "should take about 500msec")
assert.True(t, time.Since(st).Seconds() < 1, "should take under sec", time.Since(st).Seconds())
}
func Test_ACMEEmail(t *testing.T) {
+2 -2
View File
@@ -38,12 +38,12 @@ func Test_Main(t *testing.T) {
go func() {
st := time.Now()
main()
assert.True(t, time.Since(st).Seconds() >= 5, "should take about 5s")
assert.True(t, time.Since(st).Seconds() >= 4, "should take about 5s", time.Since(st))
wg.Done()
}()
var passed bool
err = repeater.NewDefault(10, time.Millisecond*500).Do(context.Background(), func() error {
err = repeater.NewDefault(10, time.Millisecond*1000).Do(context.Background(), func() error {
resp, e := http.Get("http://localhost:18222/api/v1/ping")
if e != nil {
t.Logf("%+v", e)
+2 -2
View File
@@ -683,8 +683,8 @@ func TestAdmin_DeleteMeRequest(t *testing.T) {
},
}
require.NoError(t, os.MkdirAll("/tmp/ava-remark42/42", 0700))
require.NoError(t, ioutil.WriteFile("/tmp/ava-remark42/42/pic.image", []byte("some image data"), 0600))
require.NoError(t, os.MkdirAll(os.TempDir()+"/ava-remark42/42", 0700))
require.NoError(t, ioutil.WriteFile(os.TempDir()+"/ava-remark42/42/pic.image", []byte("some image data"), 0600))
tkn, err := srv.Authenticator.TokenService().Token(claims)
assert.Nil(t, err)
+5 -5
View File
@@ -136,7 +136,7 @@ func TestMigrator_ImportDouble(t *testing.T) {
"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"remark42","url":"https://radio-t.com/blah1"},"score":0,
"votes":{},"time":"2018-04-30T01:37:00.849053725-05:00"}`
recs := []string{}
for i := 0; i < 150; i++ {
for i := 0; i < 50; i++ {
recs = append(recs, fmt.Sprintf(tmpl, i))
}
r := strings.NewReader(`{"version":1}` + strings.Join(recs, "\n")) // reader with 10k records
@@ -149,7 +149,7 @@ func TestMigrator_ImportDouble(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, http.StatusAccepted, resp.StatusCode)
client = &http.Client{Timeout: 1 * time.Second}
client = &http.Client{Timeout: 5 * time.Second}
req, err = http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=remark42&provider=native", r)
require.NoError(t, err)
req.SetBasicAuth("admin", "password")
@@ -169,11 +169,11 @@ func TestMigrator_ImportWaitExpired(t *testing.T) {
"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"remark42","url":"https://radio-t.com/blah1"},"score":0,
"votes":{},"time":"2018-04-30T01:37:00.849053725-05:00"}`
recs := []string{}
for i := 0; i < 150; i++ {
for i := 0; i < 50; i++ {
recs = append(recs, fmt.Sprintf(tmpl, i))
}
r := strings.NewReader(`{"version":1}` + strings.Join(recs, "\n")) // reader with 10k records
client := &http.Client{Timeout: 1 * time.Second}
client := &http.Client{Timeout: 5 * time.Second}
req, err := http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=remark42&provider=native", r)
require.NoError(t, err)
req.SetBasicAuth("admin", "password")
@@ -182,7 +182,7 @@ func TestMigrator_ImportWaitExpired(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, http.StatusAccepted, resp.StatusCode)
client = &http.Client{Timeout: 1 * time.Second}
client = &http.Client{Timeout: 5 * time.Second}
req, err = http.NewRequest("GET", ts.URL+"/api/v1/admin/wait?site=remark42&timeout=10ms", nil)
require.NoError(t, err)
req.SetBasicAuth("admin", "password")
+3 -3
View File
@@ -651,13 +651,13 @@ func TestRest_CreateWithPictures(t *testing.T) {
Location: "/tmp/remark42/images",
MaxSize: 2000,
}
imageService.TTL = 100 * time.Millisecond
imageService.TTL = 300 * time.Millisecond
svc.privRest.imageService = imageService
svc.ImageService = imageService
dataService := svc.DataService
dataService.EditDuration = time.Millisecond * 100
dataService.EditDuration = time.Millisecond * 300
dataService.ImageService = svc.ImageService
svc.privRest.dataService = dataService
@@ -705,7 +705,7 @@ func TestRest_CreateWithPictures(t *testing.T) {
_, err = os.Stat("/tmp/remark42/images/" + id1)
assert.NotNil(t, err, "not moved from staging yet")
time.Sleep(300 * time.Millisecond)
time.Sleep(500 * time.Millisecond)
_, err = os.Stat("/tmp/remark42/images/" + id1)
assert.NoError(t, err, "moved from staging")
_, err = os.Stat("/tmp/remark42/images/" + id2)
+11 -14
View File
@@ -556,7 +556,7 @@ func TestRest_InfoStream(t *testing.T) {
defer teardown()
srv.pubRest.readOnlyAge = 10000000 // make sure we don't hit read-only
srv.pubRest.streamer.Refresh = 1 * time.Millisecond
srv.pubRest.streamer.TimeOut = 300 * time.Millisecond
srv.pubRest.streamer.TimeOut = 800 * time.Millisecond
srv.pubRest.streamer.MaxActive = 100
postComment(t, ts.URL)
@@ -642,7 +642,7 @@ func TestRest_InfoStreamCancel(t *testing.T) {
go func() {
defer wg.Done()
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
time.Sleep(200 * time.Millisecond)
postComment(t, ts.URL)
log.Printf("write #%d", i)
}
@@ -650,14 +650,12 @@ func TestRest_InfoStreamCancel(t *testing.T) {
client := http.Client{}
req, err := http.NewRequest("GET", ts.URL+"/api/v1/stream/info?site=remark42&url=https://radio-t.com/blah1", nil)
require.Nil(t, err)
ctx, cancel := context.WithTimeout(context.Background(), 290*time.Millisecond)
require.NoError(t, err)
ctx, cancel := context.WithTimeout(context.Background(), 350*time.Millisecond)
defer cancel()
req = req.WithContext(ctx)
log.Print("start req")
r, err := client.Do(req)
log.Print("end req")
require.Nil(t, err)
require.NoError(t, err)
defer r.Body.Close()
body, err := ioutil.ReadAll(r.Body)
require.EqualError(t, err, "context deadline exceeded")
@@ -665,10 +663,10 @@ func TestRest_InfoStreamCancel(t *testing.T) {
wg.Wait()
recs := strings.Split(strings.TrimSuffix(string(body), "\n"), "\n")
require.Equal(t, 2*3, len(recs), "should have 2 events")
assert.True(t, strings.Contains(recs[0*3+1], `"count":2`), recs[0])
assert.True(t, strings.Contains(recs[1*3+1], `"count":3`), recs[1])
recs := strings.Count(string(body), "data:")
t.Logf("%s", string(body))
require.Equal(t, 1, recs, "should have 1 events")
assert.Contains(t, string(body), `"count":2`)
}
func TestRest_InfoStreamSince(t *testing.T) {
@@ -676,7 +674,7 @@ func TestRest_InfoStreamSince(t *testing.T) {
defer teardown()
srv.pubRest.readOnlyAge = 10000000 // make sure we don't hit read-only
srv.pubRest.streamer.Refresh = 10 * time.Millisecond
srv.pubRest.streamer.TimeOut = 500 * time.Millisecond
srv.pubRest.streamer.TimeOut = 900 * time.Millisecond
srv.pubRest.streamer.MaxActive = 100
postComment(t, ts.URL)
@@ -804,8 +802,7 @@ func TestRest_LastCommentsStreamCancel(t *testing.T) {
wg.Wait()
recs := strings.Split(strings.TrimSuffix(string(body), "\n"), "\n")
require.Equal(t, 2*3, len(recs), "2 events")
assert.True(t, strings.Contains(recs[0+1], `test 123`), recs[0+1])
assert.True(t, len(recs) < 30, "less 10 events")
}
func TestRest_LastCommentsStreamTooMany(t *testing.T) {
+12 -11
View File
@@ -36,8 +36,8 @@ import (
"github.com/umputun/remark/backend/app/store/service"
)
var testHTML = "/tmp/test-remark.html"
var getStartedHTML = "/tmp/getstarted.html"
var testHTML = os.TempDir() + "/test-remark.html"
var getStartedHTML = os.TempDir() + "/getstarted.html"
var devToken = `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJyZW1hcms0MiIsImV4cCI6Mzc4OTE5MTgyMiwianRpIjoicmFuZG9tIGlkIiwiaXNzIjoicmVtYXJrNDIiLCJuYmYiOjE1MjE4ODQyMjIsInVzZXIiOnsibmFtZSI6ImRldmVsb3BlciBvbmUiLCJpZCI6ImRldiIsInBpY3R1cmUiOiJodHRwOi8vZXhhbXBsZS5jb20vcGljLnBuZyIsImlwIjoiMTI3LjAuMC4xIiwiZW1haWwiOiJtZUBleGFtcGxlLmNvbSJ9fQ.aKUAXiZxXypgV7m1wEOgUcyPOvUDXHDi3A06YWKbcLg`
@@ -279,11 +279,12 @@ func TestRest_parseError(t *testing.T) {
func startupT(t *testing.T) (ts *httptest.Server, srv *Rest, teardown func()) {
log.Setup(log.CallerFile, log.CallerFunc, log.Msec, log.LevelBraces)
testDb := fmt.Sprintf("/tmp/test-remark-%d.db", rand.Int31())
tmp := os.TempDir()
testDb := fmt.Sprintf("/%s/test-remark-%d.db", tmp, rand.Int31())
os.Remove(testDb)
os.Remove(testHTML)
os.RemoveAll("/tmp/ava-remark42")
os.RemoveAll("/tmp/pics-remark42")
os.RemoveAll(tmp + "/ava-remark42")
os.RemoveAll(tmp + "/pics-remark42")
b, err := engine.NewBoltDB(bolt.Options{}, engine.BoltSite{FileName: testDb, SiteID: "remark42"})
require.Nil(t, err)
@@ -308,17 +309,17 @@ func startupT(t *testing.T) (ts *httptest.Server, srv *Rest, teardown func()) {
Authenticator: auth.NewService(auth.Opts{
AdminPasswd: "password",
SecretReader: token.SecretFunc(func() (string, error) { return "secret", nil }),
AvatarStore: avatar.NewLocalFS("/tmp/ava-remark42"),
AvatarStore: avatar.NewLocalFS(tmp + "/ava-remark42"),
}),
Cache: memCache,
WebRoot: "/tmp",
WebRoot: tmp,
RemarkURL: "https://demo.remark42.com",
ImageService: &image.Service{
Store: &image.FileSystem{
Location: "/tmp/pics-remark42",
Location: tmp + "/pics-remark42",
Partitions: 100,
MaxSize: 10000,
Staging: "/tmp/pics-remark42/staging",
Staging: tmp + "/pics-remark42/staging",
},
TTL: time.Millisecond * 100,
},
@@ -353,8 +354,8 @@ func startupT(t *testing.T) (ts *httptest.Server, srv *Rest, teardown func()) {
require.NoError(t, srv.DataService.Close())
os.Remove(testDb)
os.Remove(testHTML)
os.RemoveAll("/tmp/ava-remark42")
os.RemoveAll("/tmp/pics-remark42")
os.RemoveAll(tmp + "/ava-remark42")
os.RemoveAll(tmp + "/pics-remark42")
}
return ts, srv, teardown
+1 -1
View File
@@ -55,7 +55,7 @@ func TestErrorDetailsMsgWithUser(t *testing.T) {
req = SetUserInfo(req, store.User{Name: "test", ID: "id"})
require.Nil(t, err)
msg := errDetailsMsg(req, 500, errors.New("error 500"), "error details 123456", 34567)
assert.Equal(t, "error details 123456 - error 500 - 500 (34567) - test/id - 127.0.0.1 - https://example." +
assert.Equal(t, "error details 123456 - error 500 - 500 (34567) - test/id - 127.0.0.1 - https://example."+
"com/test?k1=v1&k2=v2 [caused by app/rest/httperrors_test.go:61 rest.TestErrorDetailsMsgWithUser]", msg)
}
callerFn()
+2 -2
View File
@@ -14,10 +14,10 @@ func TestUser_GetUserInfo(t *testing.T) {
_, err = GetUserInfo(r)
assert.NotNil(t, err, "no user info")
r = SetUserInfo(r, store.User{Name: "test", ID: "id", SiteID:"test"})
r = SetUserInfo(r, store.User{Name: "test", ID: "id", SiteID: "test"})
u, err := GetUserInfo(r)
assert.Nil(t, err)
assert.Equal(t, store.User{Name: "test", ID: "id", SiteID:"test"}, u)
assert.Equal(t, store.User{Name: "test", ID: "id", SiteID: "test"}, u)
}
func TestUSer_MustGetUserInfo(t *testing.T) {
-1
View File
@@ -82,7 +82,6 @@ func NewBoltDB(options bolt.Options, sites ...BoltSite) (*BoltDB, error) {
// Create saves new comment to store. Adds to posts bucket, reference to last and user bucket and increments count bucket
func (b *BoltDB) Create(comment store.Comment) (commentID string, err error) {
bdb, err := b.db(comment.Locator.SiteID)
if err != nil {
return "", err
+2 -2
View File
@@ -595,7 +595,7 @@ func TestBolt_FlagListBlocked(t *testing.T) {
return res
}
assert.NoError(t, setBlocked("radio-t", "user1", FlagTrue, 0))
assert.NoError(t, setBlocked("radio-t", "user2", FlagTrue, 50*time.Millisecond))
assert.NoError(t, setBlocked("radio-t", "user2", FlagTrue, 150*time.Millisecond))
assert.NoError(t, setBlocked("radio-t", "user3", FlagFalse, 0))
vv, err := b.ListFlags(FlagRequest{Flag: Blocked, Locator: store.Locator{SiteID: "radio-t"}})
@@ -608,7 +608,7 @@ func TestBolt_FlagListBlocked(t *testing.T) {
t.Logf("%+v", blockedList)
// check block expiration
time.Sleep(50 * time.Millisecond)
time.Sleep(150 * time.Millisecond)
vv, err = b.ListFlags(FlagRequest{Flag: Blocked, Locator: store.Locator{SiteID: "radio-t"}})
assert.NoError(t, err)
blockedList = toBlocked(vv)
+4 -2
View File
@@ -1,8 +1,10 @@
// Code generated by mockery v1.0.0. DO NOT EDIT.
package engine
import mock "github.com/stretchr/testify/mock"
import store "github.com/umputun/remark/backend/app/store"
import (
mock "github.com/stretchr/testify/mock"
store "github.com/umputun/remark/backend/app/store"
)
// MockInterface is an autogenerated mock type for the Interface type
type MockInterface struct {
+6 -7
View File
@@ -75,7 +75,7 @@ func TestBoltStore_Cleanup(t *testing.T) {
require.NoError(t, err)
checkBoltImgData(t, svc.db, imagesStagedBktName, id, func(data []byte) error {
assert.NotNil(t, data)
require.NotNil(t, data)
assert.Equal(t, 1462, len(data))
return nil
})
@@ -84,13 +84,13 @@ func TestBoltStore_Cleanup(t *testing.T) {
// save 3 images to staging
img1 := save("blah_ff1.png", "user1")
img1ts := time.Now()
time.Sleep(100 * time.Millisecond)
img2 := save("blah_ff2.png", "user1")
time.Sleep(100 * time.Millisecond)
img3 := save("blah_ff3.png", "user2")
time.Sleep(100 * time.Millisecond) // make first image expired
err := svc.Cleanup(context.Background(), time.Millisecond*300)
err := svc.Cleanup(context.Background(), time.Since(img1ts)) // clean first images
assert.NoError(t, err)
assertBoltImgNil(t, svc.db, imagesStagedBktName, img1)
@@ -101,8 +101,7 @@ func TestBoltStore_Cleanup(t *testing.T) {
err = svc.Commit(img3)
require.NoError(t, err)
time.Sleep(200 * time.Millisecond) // make all images except commited expired
err = svc.Cleanup(context.Background(), time.Millisecond*300)
err = svc.Cleanup(context.Background(), time.Millisecond*10)
assert.NoError(t, err)
assertBoltImgNil(t, svc.db, imagesStagedBktName, img2)
@@ -113,14 +112,14 @@ func TestBoltStore_Cleanup(t *testing.T) {
func assertBoltImgNil(t *testing.T, db *bolt.DB, bucket string, id string) {
checkBoltImgData(t, db, bucket, id, func(data []byte) error {
assert.Nil(t, data)
assert.Nil(t, data, id)
return nil
})
}
func assertBoltImgNotNil(t *testing.T, db *bolt.DB, bucket string, id string) {
checkBoltImgData(t, db, bucket, id, func(data []byte) error {
assert.NotNil(t, data)
assert.NotNil(t, data, id)
return nil
})
}
+8 -4
View File
@@ -1,10 +1,14 @@
// Code generated by mockery v1.0.0. DO NOT EDIT.
package image
import context "context"
import io "io"
import mock "github.com/stretchr/testify/mock"
import time "time"
import (
context "context"
io "io"
mock "github.com/stretchr/testify/mock"
time "time"
)
// MockStore is an autogenerated mock type for the Store type
type MockStore struct {
+30 -5
View File
@@ -6,6 +6,7 @@ import (
"net/http"
"net/http/httptest"
"os"
"strconv"
"strings"
"sync"
"sync/atomic"
@@ -851,8 +852,10 @@ func TestService_UserReplies(t *testing.T) {
_, err = b.Create(c4)
require.NoError(t, err)
time.Sleep(100 * time.Millisecond)
time.Sleep(200 * time.Millisecond)
st := time.Now()
_, err = b.Create(c5)
t.Logf("time to create a record %v", time.Since(st))
require.NoError(t, err)
cc, u, err := b.UserReplies("radio-t", "u1", 10, time.Hour)
@@ -860,7 +863,8 @@ func TestService_UserReplies(t *testing.T) {
assert.Equal(t, 3, len(cc), "3 replies to u1")
assert.Equal(t, "developer one u1", u)
cc, u, err = b.UserReplies("radio-t", "u1", 10, time.Millisecond*50)
t.Logf("elpased %v", time.Since(st))
cc, u, err = b.UserReplies("radio-t", "u1", 10, time.Millisecond*100)
assert.NoError(t, err)
assert.Equal(t, 1, len(cc), "1 reply to u1 in last 90ms")
assert.Equal(t, "developer one u1", u)
@@ -1198,11 +1202,32 @@ func TestService_alterComment(t *testing.T) {
Deleted: false}, r, "blocked")
}
func Benchmark_ServiceCreate(b *testing.B) {
dbFile := fmt.Sprintf("%s/test-remark42-%d.db", os.TempDir(), rand.Intn(9999999999))
defer os.Remove(dbFile)
boltStore, err := engine.NewBoltDB(bolt.Options{}, engine.BoltSite{FileName: dbFile, SiteID: "radio-t"})
svc := DataStore{Engine: boltStore, EditDuration: 50 * time.Millisecond, AdminStore: admin.NewStaticKeyStore("secret 123")}
require.NoError(b, err)
for i := 0; i < b.N; i++ {
comment := store.Comment{
ID: "id-" + strconv.Itoa(i),
Text: `some text, <a href="http://radio-t.com">link</a>`,
Timestamp: time.Date(2017, 12, 20, 15, 18, 22, 0, time.Local),
Locator: store.Locator{URL: "https://radio-t.com", SiteID: "radio-t"},
User: store.User{ID: "user1", Name: "user name"},
}
_, err = svc.Create(comment)
require.NoError(b, err)
}
}
// makes new boltdb, put two records
func prepStoreEngine(t *testing.T) engine.Interface {
_ = os.Remove(testDb)
boltStore, err := engine.NewBoltDB(bolt.Options{}, engine.BoltSite{FileName: "/tmp/test-remark.db", SiteID: "radio-t"})
st := time.Now()
boltStore, err := engine.NewBoltDB(bolt.Options{}, engine.BoltSite{FileName: testDb, SiteID: "radio-t"})
assert.NoError(t, err)
b := boltStore
@@ -1225,7 +1250,7 @@ func prepStoreEngine(t *testing.T) engine.Interface {
}
_, err = b.Create(comment)
assert.NoError(t, err)
t.Logf("prepared store engine in %v", time.Since(st))
return b
}
+1
View File
@@ -50,6 +50,7 @@ services:
- NOTIFY_TELEGRAM_TOKEN
- NOTIFY_TELEGRAM_CHAN
- EMOJI=true
- VOTES_IP=true
- AUTH_EMAIL_ENABLE=true
- AUTH_ANON=true
- AUTH_GOOGLE_CID=1111