huge refactoring

This commit is contained in:
Julien Neuhart
2019-07-23 13:57:18 +02:00
parent f6b357691c
commit 7bfbda4490
105 changed files with 4051 additions and 2667 deletions

206
internal/pkg/conf/conf.go Normal file
View File

@@ -0,0 +1,206 @@
package conf
import (
"github.com/thecodingmachine/gotenberg/internal/pkg/xassert"
"github.com/thecodingmachine/gotenberg/internal/pkg/xerror"
"github.com/thecodingmachine/gotenberg/internal/pkg/xlog"
)
const (
maximumWaitTimeoutEnvVar string = "MAXIMUM_WAIT_TIMEOUT"
maximumWaitDelayEnvVar string = "MAXIMUM_WAIT_DELAY"
maximumWebhookURLTimeoutEnvVar string = "MAXIMUM_WEBHOOK_URL_TIMEOUT"
defaultWaitTimeoutEnvVar string = "DEFAULT_WAIT_TIMEOUT"
defaultWebhookURLTimeoutEnvVar string = "DEFAULT_WEBHOOK_URL_TIMEOUT"
defaultListenPortEnvVar string = "DEFAULT_LISTEN_PORT"
disableGoogleChromeEnvVar string = "DISABLE_GOOGLE_CHROME"
disableUnoconvEnvVar string = "DISABLE_UNOCONV"
logLevelEnvVar string = "LOG_LEVEL"
)
// Config contains the application
// configuration.
type Config struct {
maximumWaitTimeout float64
maximumWaitDelay float64
maximumWebhookURLTimeout float64
defaultWaitTimeout float64
defaultWebhookURLTimeout float64
defaultListenPort int64
disableGoogleChrome bool
disableUnoconv bool
logLevel xlog.Level
}
func defaultConfig() Config {
return Config{
maximumWaitTimeout: 30.0,
maximumWaitDelay: 10.0,
maximumWebhookURLTimeout: 30.0,
defaultWaitTimeout: 10.0,
defaultWebhookURLTimeout: 10.0,
defaultListenPort: 3000,
disableGoogleChrome: false,
disableUnoconv: false,
logLevel: xlog.InfoLevel,
}
}
/*
FromEnv returns a Conf according
to environment variables.
*/
func FromEnv() (Config, error) {
const op string = "conf.FromEnv"
resolver := func() (Config, error) {
c := defaultConfig()
maximumWaitTimeout, err := xassert.Float64FromEnv(
maximumWaitTimeoutEnvVar,
c.maximumWaitTimeout,
xassert.Float64NotInferiorTo(0.0),
)
c.maximumWaitTimeout = maximumWaitTimeout
if err != nil {
return c, err
}
maximumWaitDelay, err := xassert.Float64FromEnv(
maximumWaitDelayEnvVar,
c.maximumWaitDelay,
xassert.Float64NotInferiorTo(0.0),
)
c.maximumWaitDelay = maximumWaitDelay
if err != nil {
return c, err
}
maximumWebhookURLTimeout, err := xassert.Float64FromEnv(
maximumWebhookURLTimeoutEnvVar,
c.maximumWebhookURLTimeout,
xassert.Float64NotInferiorTo(0.0),
)
c.maximumWebhookURLTimeout = maximumWebhookURLTimeout
if err != nil {
return c, err
}
defaultWaitTimeout, err := xassert.Float64FromEnv(
defaultWaitTimeoutEnvVar,
c.defaultWaitTimeout,
xassert.Float64NotInferiorTo(0.0),
xassert.Float64NotSuperiorTo(c.maximumWaitTimeout),
)
c.defaultWaitTimeout = defaultWaitTimeout
if err != nil {
return c, err
}
defaultWebhookURLTimeout, err := xassert.Float64FromEnv(
defaultWebhookURLTimeoutEnvVar,
c.defaultWebhookURLTimeout,
xassert.Float64NotInferiorTo(0.0),
xassert.Float64NotSuperiorTo(c.defaultWebhookURLTimeout),
)
c.defaultWebhookURLTimeout = defaultWebhookURLTimeout
if err != nil {
return c, err
}
defaultListenPort, err := xassert.Int64FromEnv(
defaultListenPortEnvVar,
c.defaultListenPort,
xassert.Int64NotInferiorTo(0),
xassert.Int64NotSuperiorTo(65535),
)
c.defaultListenPort = defaultListenPort
if err != nil {
return c, err
}
disableGoogleChrome, err := xassert.BoolFromEnv(
disableGoogleChromeEnvVar,
c.disableGoogleChrome,
)
c.disableGoogleChrome = disableGoogleChrome
if err != nil {
return c, err
}
disableUnoconv, err := xassert.BoolFromEnv(
disableUnoconvEnvVar,
c.disableUnoconv,
)
c.disableUnoconv = disableUnoconv
if err != nil {
return c, err
}
logLevel, err := xassert.StringFromEnv(
logLevelEnvVar,
string(c.logLevel),
xassert.StringOneOf(xlog.Levels()),
)
c.logLevel = xlog.MustParseLevel(logLevel)
if err != nil {
return c, err
}
return c, nil
}
result, err := resolver()
if err != nil {
return result, xerror.New(op, err)
}
return result, nil
}
// MaximumWaitTimeout returns the maximum
// wait timeout from the configuration.
func (c Config) MaximumWaitTimeout() float64 {
return c.maximumWaitTimeout
}
// MaximumWaitDelay returns the maximum
// wait timeout from the configuration.
func (c Config) MaximumWaitDelay() float64 {
return c.maximumWaitDelay
}
// MaximumWebhookURLTimeout returns the maximum
// webhook URL wait timeout from the configuration.
func (c Config) MaximumWebhookURLTimeout() float64 {
return c.maximumWebhookURLTimeout
}
// DefaultWaitTimeout returns the default
// wait timeout from the configuration.
func (c Config) DefaultWaitTimeout() float64 {
return c.defaultWaitTimeout
}
// DefaultWebhookURLTimeout returns the default
// webhook URL wait timeout from the configuration.
func (c Config) DefaultWebhookURLTimeout() float64 {
return c.defaultWebhookURLTimeout
}
// DefaultListenPort returns the default
// listen port from the configuration.
func (c Config) DefaultListenPort() int64 {
return c.defaultListenPort
}
/*
DisableGoogleChrome returns true if
Google Chrome is disabled in the
configuration.
*/
func (c Config) DisableGoogleChrome() bool {
return c.disableGoogleChrome
}
/*
DisableUnoconv returns true if
Unoconv is disabled in the
configuration.
*/
func (c Config) DisableUnoconv() bool {
return c.disableUnoconv
}
// LogLevel returns the xlog.Level from
// the configuration.
func (c Config) LogLevel() xlog.Level {
return c.logLevel
}

View File

@@ -0,0 +1,334 @@
package conf
import (
"os"
"testing"
"github.com/stretchr/testify/assert"
"github.com/thecodingmachine/gotenberg/internal/pkg/xlog"
"github.com/thecodingmachine/gotenberg/test/internalpkg/xerrortest"
)
func TestEmptyFromEnv(t *testing.T) {
var (
expected Config
result Config
err error
)
// no environment variables set,
// values should be equal to default config.
expected = defaultConfig()
result, err = FromEnv()
assert.Nil(t, err)
assert.Equal(t, expected, result)
}
func TestMaximumWaitTimeoutFromEnv(t *testing.T) {
var (
expected Config
result Config
err error
)
// MAXIMUM_WAIT_TIMEOUT correctly set.
os.Setenv(maximumWaitTimeoutEnvVar, "10.0")
expected = defaultConfig()
expected.maximumWaitTimeout = 10.0
result, err = FromEnv()
assert.Nil(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(maximumWaitTimeoutEnvVar)
// MAXIMUM_WAIT_TIMEOUT wrongly set.
os.Setenv(maximumWaitTimeoutEnvVar, "foo")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(maximumWaitTimeoutEnvVar)
// MAXIMUM_WAIT_TIMEOUT < 0.
os.Setenv(maximumWaitTimeoutEnvVar, "-1.0")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(maximumWaitTimeoutEnvVar)
}
func TestMaximumWaitDelayFromEnv(t *testing.T) {
var (
expected Config
result Config
err error
)
// MAXIMUM_WAIT_DELAY correctly set.
os.Setenv(maximumWaitDelayEnvVar, "10.0")
expected = defaultConfig()
expected.maximumWaitDelay = 10.0
result, err = FromEnv()
assert.Nil(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(maximumWaitDelayEnvVar)
// MAXIMUM_WAIT_DELAY wrongly set.
os.Setenv(maximumWaitDelayEnvVar, "foo")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(maximumWaitDelayEnvVar)
// MAXIMUM_WAIT_DELAY < 0.
os.Setenv(maximumWaitDelayEnvVar, "-1.0")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(maximumWaitDelayEnvVar)
}
func TestMaximumWebhookURLTimeoutFromEnv(t *testing.T) {
var (
expected Config
result Config
err error
)
// MAXIMUM_WEBHOOK_URL_TIMEOUT correctly set.
os.Setenv(maximumWebhookURLTimeoutEnvVar, "10.0")
expected = defaultConfig()
expected.maximumWebhookURLTimeout = 10.0
result, err = FromEnv()
assert.Nil(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(maximumWebhookURLTimeoutEnvVar)
// MAXIMUM_WEBHOOK_URL_TIMEOUT wrongly set.
os.Setenv(maximumWebhookURLTimeoutEnvVar, "foo")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(maximumWebhookURLTimeoutEnvVar)
// MAXIMUM_WEBHOOK_URL_TIMEOUT < 0.
os.Setenv(maximumWebhookURLTimeoutEnvVar, "-1.0")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(maximumWebhookURLTimeoutEnvVar)
}
func TestDefaultWaitTimeoutFromEnv(t *testing.T) {
var (
expected Config
result Config
err error
)
// DEFAULT_WAIT_TIMEOUT correctly set.
os.Setenv(defaultWaitTimeoutEnvVar, "10.0")
expected = defaultConfig()
expected.defaultWaitTimeout = 10.0
result, err = FromEnv()
assert.Nil(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(defaultWaitTimeoutEnvVar)
// DEFAULT_WAIT_TIMEOUT wrongly set.
os.Setenv(defaultWaitTimeoutEnvVar, "foo")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(defaultWaitTimeoutEnvVar)
// DEFAULT_WAIT_TIMEOUT < 0.
os.Setenv(defaultWaitTimeoutEnvVar, "-1.0")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(defaultWaitTimeoutEnvVar)
// DEFAULT_WAIT_TIMEOUT > MAXIMUM_WAIT_TIMEOUT.
os.Setenv(defaultWaitTimeoutEnvVar, "40.0")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(defaultWaitTimeoutEnvVar)
}
func TestDefaultWebhookURLTimeoutFromEnv(t *testing.T) {
var (
expected Config
result Config
err error
)
// DEFAULT_WEBHOOK_URL_TIMEOUT correctly set.
os.Setenv(defaultWebhookURLTimeoutEnvVar, "10.0")
expected = defaultConfig()
expected.defaultWebhookURLTimeout = 10.0
result, err = FromEnv()
assert.Nil(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(defaultWebhookURLTimeoutEnvVar)
// DEFAULT_WEBHOOK_URL_TIMEOUT wrongly set.
os.Setenv(defaultWebhookURLTimeoutEnvVar, "foo")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(defaultWebhookURLTimeoutEnvVar)
// DEFAULT_WEBHOOK_URL_TIMEOUT < 0.
os.Setenv(defaultWebhookURLTimeoutEnvVar, "-1.0")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(defaultWebhookURLTimeoutEnvVar)
// DEFAULT_WEBHOOK_URL_TIMEOUT > MAXIMUM_WEBHOOK_URL_TIMEOUT.
os.Setenv(defaultWebhookURLTimeoutEnvVar, "40.0")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(defaultWebhookURLTimeoutEnvVar)
}
func TestDefaultListenPortFromEnv(t *testing.T) {
var (
expected Config
result Config
err error
)
// DEFAULT_LISTEN_PORT correctly set.
os.Setenv(defaultListenPortEnvVar, "80")
expected = defaultConfig()
expected.defaultListenPort = 80
result, err = FromEnv()
assert.Nil(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(defaultListenPortEnvVar)
// DEFAULT_LISTEN_PORT wrongly set.
os.Setenv(defaultListenPortEnvVar, "foo")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(defaultListenPortEnvVar)
// DEFAULT_LISTEN_PORT < 0.
os.Setenv(defaultListenPortEnvVar, "-1.0")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(defaultListenPortEnvVar)
// DEFAULT_LISTEN_PORT > 65535.
os.Setenv(defaultListenPortEnvVar, "65536")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(defaultListenPortEnvVar)
}
func TestDisableGoogleChromeFromEnv(t *testing.T) {
var (
expected Config
result Config
err error
)
// DISABLE_GOOGLE_CHROME correctly set.
os.Setenv(disableGoogleChromeEnvVar, "1")
expected = defaultConfig()
expected.disableGoogleChrome = true
result, err = FromEnv()
assert.Nil(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(disableGoogleChromeEnvVar)
os.Setenv(disableGoogleChromeEnvVar, "0")
expected = defaultConfig()
expected.disableGoogleChrome = false
result, err = FromEnv()
assert.Nil(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(disableGoogleChromeEnvVar)
// DISABLE_GOOGLE_CHROME wrongly set.
os.Setenv(disableGoogleChromeEnvVar, "foo")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(disableGoogleChromeEnvVar)
}
func TestDisableUnoconvFromEnv(t *testing.T) {
var (
expected Config
result Config
err error
)
// DISABLE_UNOCONV correctly set.
os.Setenv(disableUnoconvEnvVar, "1")
expected = defaultConfig()
expected.disableUnoconv = true
result, err = FromEnv()
assert.Nil(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(disableUnoconvEnvVar)
os.Setenv(disableUnoconvEnvVar, "0")
expected = defaultConfig()
expected.disableUnoconv = false
result, err = FromEnv()
assert.Nil(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(disableUnoconvEnvVar)
// DISABLE_UNOCONV wrongly set.
os.Setenv(disableUnoconvEnvVar, "foo")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(disableUnoconvEnvVar)
}
func TestLogLevelFromEnv(t *testing.T) {
var (
expected Config
result Config
err error
)
// LOG_LEVEL correctly set.
os.Setenv(logLevelEnvVar, "DEBUG")
expected = defaultConfig()
expected.logLevel = xlog.DebugLevel
result, err = FromEnv()
assert.Nil(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(logLevelEnvVar)
os.Setenv(logLevelEnvVar, "INFO")
expected = defaultConfig()
result, err = FromEnv()
assert.Nil(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(logLevelEnvVar)
os.Setenv(logLevelEnvVar, "ERROR")
expected = defaultConfig()
expected.logLevel = xlog.ErrorLevel
result, err = FromEnv()
assert.Nil(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(logLevelEnvVar)
// LOG_LEVEL wrongly set.
os.Setenv(logLevelEnvVar, "foo")
expected = defaultConfig()
result, err = FromEnv()
xerrortest.AssertError(t, err)
assert.Equal(t, expected, result)
os.Unsetenv(logLevelEnvVar)
}
func TestGetters(t *testing.T) {
result := defaultConfig()
assert.Equal(t, result.maximumWaitTimeout, result.MaximumWaitTimeout())
assert.Equal(t, result.maximumWaitDelay, result.MaximumWaitDelay())
assert.Equal(t, result.maximumWebhookURLTimeout, result.MaximumWebhookURLTimeout())
assert.Equal(t, result.defaultWaitTimeout, result.DefaultWaitTimeout())
assert.Equal(t, result.defaultWebhookURLTimeout, result.DefaultWebhookURLTimeout())
assert.Equal(t, result.defaultListenPort, result.DefaultListenPort())
assert.Equal(t, result.disableGoogleChrome, result.DisableGoogleChrome())
assert.Equal(t, result.disableUnoconv, result.DisableUnoconv())
assert.Equal(t, result.logLevel, result.LogLevel())
}

3
internal/pkg/conf/doc.go Normal file
View File

@@ -0,0 +1,3 @@
// Package conf gathers all
// configuration data.
package conf