app/server_test: make sure sentry is ready to be setup (#16260)
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
c9a4a475d3
Коммит
46a409aef6
@@ -6,7 +6,9 @@ package app
|
|||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -365,93 +367,108 @@ func TestSentry(t *testing.T) {
|
|||||||
client := &http.Client{Timeout: 5 * time.Second, Transport: &http.Transport{
|
client := &http.Client{Timeout: 5 * time.Second, Transport: &http.Transport{
|
||||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
||||||
}}
|
}}
|
||||||
data1 := make(chan bool, 1)
|
|
||||||
|
|
||||||
server1 := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
t.Log("Received sentry request for some reason")
|
|
||||||
data1 <- true
|
|
||||||
}))
|
|
||||||
defer server1.Close()
|
|
||||||
|
|
||||||
// make sure we don't report anything when sentry is disabled
|
|
||||||
_, port, _ := net.SplitHostPort(server1.Listener.Addr().String())
|
|
||||||
SENTRY_DSN = fmt.Sprintf("http://test:test@localhost:%s/123", port)
|
|
||||||
|
|
||||||
testDir, _ := fileutils.FindDir("tests")
|
testDir, _ := fileutils.FindDir("tests")
|
||||||
s, err := NewServer(func(server *Server) error {
|
|
||||||
configStore, _ := config.NewFileStore("config.json", true)
|
t.Run("sentry is disabled, should not receive a report", func(t *testing.T) {
|
||||||
store, _ := config.NewStoreFromBacking(configStore)
|
data := make(chan bool, 1)
|
||||||
server.configStore = store
|
|
||||||
server.UpdateConfig(func(cfg *model.Config) {
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
*cfg.ServiceSettings.ListenAddress = ":0"
|
t.Log("Received sentry request for some reason")
|
||||||
*cfg.LogSettings.EnableSentry = false
|
data <- true
|
||||||
*cfg.ServiceSettings.ConnectionSecurity = "TLS"
|
}))
|
||||||
*cfg.ServiceSettings.TLSKeyFile = path.Join(testDir, "tls_test_key.pem")
|
defer server.Close()
|
||||||
*cfg.ServiceSettings.TLSCertFile = path.Join(testDir, "tls_test_cert.pem")
|
|
||||||
|
// make sure we don't report anything when sentry is disabled
|
||||||
|
_, port, _ := net.SplitHostPort(server.Listener.Addr().String())
|
||||||
|
dsn, err := sentry.NewDsn(fmt.Sprintf("http://test:test@localhost:%s/123", port))
|
||||||
|
require.NoError(t, err)
|
||||||
|
SENTRY_DSN = dsn.String()
|
||||||
|
|
||||||
|
s, err := NewServer(func(server *Server) error {
|
||||||
|
configStore, _ := config.NewFileStore("config.json", true)
|
||||||
|
store, _ := config.NewStoreFromBacking(configStore)
|
||||||
|
server.configStore = store
|
||||||
|
server.UpdateConfig(func(cfg *model.Config) {
|
||||||
|
*cfg.ServiceSettings.ListenAddress = ":0"
|
||||||
|
*cfg.LogSettings.EnableSentry = false
|
||||||
|
*cfg.ServiceSettings.ConnectionSecurity = "TLS"
|
||||||
|
*cfg.ServiceSettings.TLSKeyFile = path.Join(testDir, "tls_test_key.pem")
|
||||||
|
*cfg.ServiceSettings.TLSCertFile = path.Join(testDir, "tls_test_cert.pem")
|
||||||
|
*cfg.LogSettings.EnableDiagnostics = true
|
||||||
|
})
|
||||||
|
return nil
|
||||||
})
|
})
|
||||||
return nil
|
require.NoError(t, err)
|
||||||
})
|
|
||||||
|
|
||||||
require.NoError(t, err)
|
|
||||||
// Route for just panicing
|
|
||||||
s.Router.HandleFunc("/panic", func(writer http.ResponseWriter, request *http.Request) {
|
|
||||||
panic("log this panic")
|
|
||||||
})
|
|
||||||
|
|
||||||
serverErr := s.Start()
|
|
||||||
require.NoError(t, serverErr)
|
|
||||||
defer s.Shutdown()
|
|
||||||
resp, err := client.Get("https://localhost:" + strconv.Itoa(s.ListenAddr.Port) + "/panic")
|
|
||||||
require.Nil(t, resp)
|
|
||||||
require.Error(t, err)
|
|
||||||
|
|
||||||
sentry.Flush(time.Second * 1)
|
|
||||||
select {
|
|
||||||
case <-data1:
|
|
||||||
require.Fail(t, "Sentry received a message, even though it's disabled!")
|
|
||||||
case <-time.After(time.Second * 1):
|
|
||||||
t.Log("Sentry request didn't arrive. Good!")
|
|
||||||
}
|
|
||||||
|
|
||||||
// check successful report
|
|
||||||
data2 := make(chan bool, 1)
|
|
||||||
server2 := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
t.Log("Received sentry request!")
|
|
||||||
data2 <- true
|
|
||||||
}))
|
|
||||||
defer server2.Close()
|
|
||||||
_, port, _ = net.SplitHostPort(server2.Listener.Addr().String())
|
|
||||||
SENTRY_DSN = fmt.Sprintf("http://test:test@localhost:%s/123", port)
|
|
||||||
s2, err := NewServer(func(server *Server) error {
|
|
||||||
configStore, _ := config.NewFileStore("config.json", true)
|
|
||||||
store, _ := config.NewStoreFromBacking(configStore)
|
|
||||||
server.configStore = store
|
|
||||||
server.UpdateConfig(func(cfg *model.Config) {
|
|
||||||
*cfg.ServiceSettings.ListenAddress = ":0"
|
|
||||||
*cfg.ServiceSettings.ConnectionSecurity = "TLS"
|
|
||||||
*cfg.ServiceSettings.TLSKeyFile = path.Join(testDir, "tls_test_key.pem")
|
|
||||||
*cfg.ServiceSettings.TLSCertFile = path.Join(testDir, "tls_test_cert.pem")
|
|
||||||
*cfg.LogSettings.EnableSentry = true
|
|
||||||
|
|
||||||
|
// Route for just panicing
|
||||||
|
s.Router.HandleFunc("/panic", func(writer http.ResponseWriter, request *http.Request) {
|
||||||
|
panic("log this panic")
|
||||||
})
|
})
|
||||||
return nil
|
|
||||||
})
|
require.NoError(t, s.Start())
|
||||||
require.NoError(t, err)
|
defer s.Shutdown()
|
||||||
// Route for just panicing
|
|
||||||
s2.Router.HandleFunc("/panic", func(writer http.ResponseWriter, request *http.Request) {
|
resp, err := client.Get("https://localhost:" + strconv.Itoa(s.ListenAddr.Port) + "/panic")
|
||||||
panic("log this panic")
|
require.Nil(t, resp)
|
||||||
|
require.True(t, errors.Is(err, io.EOF), fmt.Sprintf("unexpected error: %s", err))
|
||||||
|
|
||||||
|
sentry.Flush(time.Second)
|
||||||
|
select {
|
||||||
|
case <-data:
|
||||||
|
require.Fail(t, "Sentry received a message, even though it's disabled!")
|
||||||
|
case <-time.After(time.Second):
|
||||||
|
t.Log("Sentry request didn't arrive. Good!")
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
require.NoError(t, s2.Start())
|
t.Run("sentry is enabled, report should be received", func(t *testing.T) {
|
||||||
defer s2.Shutdown()
|
data := make(chan bool, 1)
|
||||||
resp, err = client.Get("https://localhost:" + strconv.Itoa(s2.ListenAddr.Port) + "/panic")
|
|
||||||
require.Nil(t, resp)
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
require.Error(t, err)
|
t.Log("Received sentry request!")
|
||||||
sentry.Flush(time.Second * 1)
|
data <- true
|
||||||
select {
|
}))
|
||||||
case <-data2:
|
defer server.Close()
|
||||||
t.Log("Sentry request arrived. Good!")
|
|
||||||
case <-time.After(time.Second * 2):
|
_, port, _ := net.SplitHostPort(server.Listener.Addr().String())
|
||||||
require.Fail(t, "Sentry report didn't arrive")
|
dsn, err := sentry.NewDsn(fmt.Sprintf("http://test:test@localhost:%s/123", port))
|
||||||
}
|
require.NoError(t, err)
|
||||||
|
SENTRY_DSN = dsn.String()
|
||||||
|
|
||||||
|
s, err := NewServer(func(server *Server) error {
|
||||||
|
configStore, _ := config.NewFileStore("config.json", true)
|
||||||
|
store, _ := config.NewStoreFromBacking(configStore)
|
||||||
|
server.configStore = store
|
||||||
|
server.UpdateConfig(func(cfg *model.Config) {
|
||||||
|
*cfg.ServiceSettings.ListenAddress = ":0"
|
||||||
|
*cfg.ServiceSettings.ConnectionSecurity = "TLS"
|
||||||
|
*cfg.ServiceSettings.TLSKeyFile = path.Join(testDir, "tls_test_key.pem")
|
||||||
|
*cfg.ServiceSettings.TLSCertFile = path.Join(testDir, "tls_test_cert.pem")
|
||||||
|
*cfg.LogSettings.EnableSentry = true
|
||||||
|
*cfg.LogSettings.EnableDiagnostics = true
|
||||||
|
})
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// Route for just panicing
|
||||||
|
s.Router.HandleFunc("/panic", func(writer http.ResponseWriter, request *http.Request) {
|
||||||
|
panic("log this panic")
|
||||||
|
})
|
||||||
|
|
||||||
|
require.NoError(t, s.Start())
|
||||||
|
defer s.Shutdown()
|
||||||
|
|
||||||
|
resp, err := client.Get("https://localhost:" + strconv.Itoa(s.ListenAddr.Port) + "/panic")
|
||||||
|
require.Nil(t, resp)
|
||||||
|
require.True(t, errors.Is(err, io.EOF), fmt.Sprintf("unexpected error: %s", err))
|
||||||
|
|
||||||
|
sentry.Flush(time.Second)
|
||||||
|
select {
|
||||||
|
case <-data:
|
||||||
|
t.Log("Sentry request arrived. Good!")
|
||||||
|
case <-time.After(time.Second * 10):
|
||||||
|
require.Fail(t, "Sentry report didn't arrive")
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user