mirror of
https://github.com/Eggbertx/gochan.git
synced 2025-08-19 08:26:23 -07:00
Replace parsed gochan version type with constant string and DB version passed by parameter with constant int
This commit is contained in:
parent
414a66ecc9
commit
c143596f80
31 changed files with 77 additions and 347 deletions
|
@ -18,9 +18,6 @@ import (
|
|||
type GCDatabaseUpdater struct {
|
||||
options *common.MigrationOptions
|
||||
db *gcsql.GCDB
|
||||
// if the database version is less than TargetDBVer, it is assumed to be out of date, and the schema needs to be adjusted.
|
||||
// It is expected to be set by the build script
|
||||
TargetDBVer int
|
||||
}
|
||||
|
||||
// IsMigratingInPlace implements common.DBMigrator.
|
||||
|
@ -43,12 +40,12 @@ func (dbu *GCDatabaseUpdater) IsMigrated() (bool, error) {
|
|||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
if currentDatabaseVersion == dbu.TargetDBVer {
|
||||
if currentDatabaseVersion == gcsql.DatabaseVersion {
|
||||
return true, nil
|
||||
}
|
||||
if currentDatabaseVersion > dbu.TargetDBVer {
|
||||
if currentDatabaseVersion > gcsql.DatabaseVersion {
|
||||
return false, fmt.Errorf("database layout is ahead of current version (%d), target version: %d",
|
||||
currentDatabaseVersion, dbu.TargetDBVer)
|
||||
currentDatabaseVersion, gcsql.DatabaseVersion)
|
||||
}
|
||||
return false, nil
|
||||
}
|
||||
|
@ -124,7 +121,7 @@ func (dbu *GCDatabaseUpdater) MigrateDB() (migrated bool, err error) {
|
|||
}
|
||||
|
||||
query := `UPDATE DBPREFIXdatabase_version SET version = ? WHERE component = 'gochan'`
|
||||
_, err = dbu.db.ExecContextSQL(ctx, nil, query, dbu.TargetDBVer)
|
||||
_, err = dbu.db.ExecContextSQL(ctx, nil, query, gcsql.DatabaseVersion)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
|
|
@ -85,7 +85,7 @@ func (m *Pre2021Migrator) renameTablesForInPlace() error {
|
|||
}
|
||||
}
|
||||
|
||||
if err = gcsql.CheckAndInitializeDatabase(m.config.DBtype, "4"); err != nil {
|
||||
if err = gcsql.CheckAndInitializeDatabase(m.config.DBtype); err != nil {
|
||||
errEv.Caller().Err(err).Msg("Error checking and initializing database")
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -82,7 +82,7 @@ func setupMigrationTest(t *testing.T, outDir string, migrateInPlace bool) *Pre20
|
|||
t.FailNow()
|
||||
}
|
||||
if !migrateInPlace {
|
||||
if !assert.NoError(t, gcsql.CheckAndInitializeDatabase("sqlite3", "4")) {
|
||||
if !assert.NoError(t, gcsql.CheckAndInitializeDatabase("sqlite3")) {
|
||||
t.FailNow()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@ import (
|
|||
"flag"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"github.com/gochan-org/gochan/cmd/gochan-migration/internal/common"
|
||||
"github.com/gochan-org/gochan/cmd/gochan-migration/internal/gcupdate"
|
||||
|
@ -16,9 +15,7 @@ import (
|
|||
)
|
||||
|
||||
var (
|
||||
versionStr string
|
||||
migrator common.DBMigrator
|
||||
dbVersionStr string
|
||||
migrator common.DBMigrator
|
||||
)
|
||||
|
||||
func cleanup() {
|
||||
|
@ -46,7 +43,7 @@ func main() {
|
|||
flag.StringVar(&options.OldChanConfig, "oldconfig", "", "The path to the old chan's configuration file")
|
||||
flag.Parse()
|
||||
|
||||
err := config.InitConfig(versionStr)
|
||||
err := config.InitConfig()
|
||||
if err != nil {
|
||||
log.Fatalln("Unable to initialize configuration:", err.Error())
|
||||
}
|
||||
|
@ -74,13 +71,7 @@ func main() {
|
|||
|
||||
switch options.ChanType {
|
||||
case "gcupdate":
|
||||
targetDBVer, err := strconv.Atoi(dbVersionStr)
|
||||
if err != nil {
|
||||
fatalEv.Err(err).Caller().Msg("Invalid database version string, unable to parse as integer")
|
||||
}
|
||||
migrator = &gcupdate.GCDatabaseUpdater{
|
||||
TargetDBVer: targetDBVer,
|
||||
}
|
||||
migrator = &gcupdate.GCDatabaseUpdater{}
|
||||
case "pre2021":
|
||||
migrator = &pre2021.Pre2021Migrator{}
|
||||
case "kusabax":
|
||||
|
@ -97,7 +88,7 @@ func main() {
|
|||
Bool("migratingInPlace", migratingInPlace).
|
||||
Msg("Starting database migration")
|
||||
|
||||
if err = config.InitConfig(versionStr); err != nil {
|
||||
if err = config.InitConfig(); err != nil {
|
||||
fatalEv.Err(err).Caller().Msg("Unable to reload configuration")
|
||||
}
|
||||
sqlCfg := config.GetSQLConfig()
|
||||
|
@ -112,7 +103,7 @@ func main() {
|
|||
if err != nil {
|
||||
fatalEv.Err(err).Caller().Msg("Failed to connect to the database")
|
||||
}
|
||||
if err = gcsql.CheckAndInitializeDatabase(sqlCfg.DBtype, dbVersionStr); err != nil {
|
||||
if err = gcsql.CheckAndInitializeDatabase(sqlCfg.DBtype); err != nil {
|
||||
fatalEv.Err(err).Caller().Msg("Unable to initialize the database")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,11 +25,6 @@ import (
|
|||
"github.com/gochan-org/gochan/pkg/server/serverutil"
|
||||
)
|
||||
|
||||
var (
|
||||
versionStr string
|
||||
dbVersionStr string
|
||||
)
|
||||
|
||||
func cleanup() {
|
||||
gcsql.Close()
|
||||
geoip.Close()
|
||||
|
@ -37,13 +32,13 @@ func cleanup() {
|
|||
}
|
||||
|
||||
func main() {
|
||||
gcutil.LogInfo().Str("version", versionStr).Msg("Starting gochan")
|
||||
gcutil.LogInfo().Str("version", config.GochanVersion).Msg("Starting gochan")
|
||||
fatalEv := gcutil.LogFatal()
|
||||
defer func() {
|
||||
fatalEv.Discard()
|
||||
cleanup()
|
||||
}()
|
||||
err := config.InitConfig(versionStr)
|
||||
err := config.InitConfig()
|
||||
if err != nil {
|
||||
fatalEv.Err(err).Caller().
|
||||
Str("jsonLocation", config.JSONLocation()).
|
||||
|
@ -83,7 +78,7 @@ func main() {
|
|||
Str("DBhost", systemCritical.DBhost).
|
||||
Msg("Connected to database")
|
||||
|
||||
if err = gcsql.CheckAndInitializeDatabase(systemCritical.DBtype, dbVersionStr); err != nil {
|
||||
if err = gcsql.CheckAndInitializeDatabase(systemCritical.DBtype); err != nil {
|
||||
cleanup()
|
||||
gcutil.LogFatal().Err(err).Msg("Failed to initialize the database")
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ func InitPlugin() error {
|
|||
manage.RegisterManagePage("gochaninfo", "Gochan info", manage.AdminPerms, manage.NoJSON,
|
||||
func(writer http.ResponseWriter, request *http.Request, staff *gcsql.Staff, wantsJSON bool, infoEv, errEv *zerolog.Event) (output interface{}, err error) {
|
||||
return fmt.Sprintf(infoPage,
|
||||
config.GetVersion().String(),
|
||||
config.GochanVersion,
|
||||
runtime.Version(),
|
||||
runtime.GOOS,
|
||||
config.GetSystemCriticalConfig().DBtype,
|
||||
|
|
|
@ -82,7 +82,7 @@ func TestBuildJS(t *testing.T) {
|
|||
}
|
||||
|
||||
outDir := t.TempDir()
|
||||
config.SetVersion("4.0.2")
|
||||
config.InitTestConfig()
|
||||
systemCriticalCfg := config.GetSystemCriticalConfig()
|
||||
systemCriticalCfg.DocumentRoot = path.Join(outDir, "html")
|
||||
systemCriticalCfg.TemplateDir = path.Join(testRoot, "templates")
|
||||
|
@ -251,7 +251,7 @@ func TestBuildFrontPage(t *testing.T) {
|
|||
}
|
||||
t.Run(driver, func(t *testing.T) {
|
||||
outDir := t.TempDir()
|
||||
config.SetVersion("4.0.2")
|
||||
config.InitTestConfig()
|
||||
systemCriticalCfg := config.GetSystemCriticalConfig()
|
||||
systemCriticalCfg.DocumentRoot = path.Join(outDir, "html")
|
||||
systemCriticalCfg.TemplateDir = path.Join(testRoot, "templates")
|
||||
|
@ -369,7 +369,7 @@ func (p *pageHeaderTestCase) runTest(t *testing.T, driver string) {
|
|||
}
|
||||
|
||||
func TestBuildPageHeader(t *testing.T) {
|
||||
config.SetVersion("4.0.2")
|
||||
config.InitTestConfig()
|
||||
_, err := testutil.GoToGochanRoot(t)
|
||||
if !assert.NoError(t, err) {
|
||||
return
|
||||
|
@ -392,7 +392,7 @@ func TestBuildPageHeader(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestBuildPageFooter(t *testing.T) {
|
||||
config.SetVersion("4.0.2")
|
||||
config.InitTestConfig()
|
||||
_, err := testutil.GoToGochanRoot(t)
|
||||
if !assert.NoError(t, err) {
|
||||
t.FailNow()
|
||||
|
|
|
@ -29,6 +29,8 @@ const (
|
|||
DefaultSQLTimeout = 15
|
||||
DefaultSQLMaxConns = 10
|
||||
DefaultSQLConnMaxLifetimeMin = 3
|
||||
|
||||
GochanVersion = "4.1.0"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -281,8 +283,7 @@ type SystemCriticalConfig struct {
|
|||
// RandomSeed is a random string used for generating secure tokens. It will be generated if not set and must not be changed
|
||||
RandomSeed string
|
||||
|
||||
Version *GochanVersion `json:"-"`
|
||||
TimeZone int `json:"-"`
|
||||
TimeZone int `json:"-"`
|
||||
|
||||
logLevel zerolog.Level
|
||||
logLevelParsed bool
|
||||
|
@ -920,7 +921,3 @@ func UpdateBoardConfig(dir string) error {
|
|||
func DeleteBoardConfig(dir string) {
|
||||
delete(boardConfigs, dir)
|
||||
}
|
||||
|
||||
func GetVersion() *GochanVersion {
|
||||
return cfg.Version
|
||||
}
|
||||
|
|
|
@ -26,9 +26,7 @@ func TestValidJSON(t *testing.T) {
|
|||
|
||||
func TestValidateValues(t *testing.T) {
|
||||
testutil.GoToGochanRoot(t)
|
||||
if !assert.NoError(t, InitConfig("4.1.0")) {
|
||||
t.FailNow()
|
||||
}
|
||||
InitConfig()
|
||||
SetRandomSeed("test")
|
||||
assert.NoError(t, cfg.ValidateValues())
|
||||
|
||||
|
@ -51,9 +49,7 @@ type webRootTest struct {
|
|||
|
||||
func TestWebPath(t *testing.T) {
|
||||
testutil.GoToGochanRoot(t)
|
||||
if !assert.NoError(t, InitConfig("4.1.0")) {
|
||||
t.FailNow()
|
||||
}
|
||||
InitConfig()
|
||||
testCases := []webRootTest{
|
||||
{
|
||||
webRoot: "/",
|
||||
|
|
|
@ -31,9 +31,7 @@ func (tC *preloadTest) run(t *testing.T) {
|
|||
|
||||
func TestPreload(t *testing.T) {
|
||||
testutil.GoToGochanRoot(t)
|
||||
if !assert.NoError(t, InitConfig("4.1.0")) {
|
||||
t.FailNow()
|
||||
}
|
||||
InitTestConfig()
|
||||
testCases := []preloadTest{
|
||||
{
|
||||
desc: "access system critical config from lua",
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
package config
|
||||
|
||||
import "github.com/gochan-org/gochan/pkg/gcutil/testutil"
|
||||
import (
|
||||
"github.com/gochan-org/gochan/pkg/gcutil/testutil"
|
||||
)
|
||||
|
||||
func setDefaultCfgIfNotSet() {
|
||||
if cfg == nil {
|
||||
|
@ -8,12 +10,10 @@ func setDefaultCfgIfNotSet() {
|
|||
}
|
||||
}
|
||||
|
||||
// SetVersion should only be used for tests, where a config file wouldn't be loaded
|
||||
func SetVersion(version string) {
|
||||
// InitTestConfig should only be used for tests, where a config file wouldn't be loaded
|
||||
func InitTestConfig() {
|
||||
testutil.PanicIfNotTest()
|
||||
setDefaultCfgIfNotSet()
|
||||
|
||||
cfg.Version = ParseVersion(version)
|
||||
}
|
||||
|
||||
// SetTestTemplateDir sets the directory for templates, used only in testing. If it is not run via `go test`, it will panic.
|
||||
|
|
|
@ -72,7 +72,7 @@ func TakeOwnershipOfFile(f *os.File) error {
|
|||
return f.Chown(uid, gid)
|
||||
}
|
||||
|
||||
func loadConfig(versionStr string, searchPaths ...string) (err error) {
|
||||
func loadConfig(searchPaths ...string) (err error) {
|
||||
cfg = defaultGochanConfig
|
||||
if testing.Testing() {
|
||||
// create a dummy config for testing if we're using go test
|
||||
|
@ -89,7 +89,6 @@ func loadConfig(versionStr string, searchPaths ...string) (err error) {
|
|||
cfg.DBusername = "gochan"
|
||||
cfg.SiteHost = "127.0.0.1"
|
||||
cfg.RandomSeed = "test"
|
||||
cfg.Version = ParseVersion(versionStr)
|
||||
cfg.SiteSlogan = "Gochan testing"
|
||||
cfg.Cooldowns = BoardCooldowns{0, 0, 0}
|
||||
cfg.BanColors = map[string]string{
|
||||
|
@ -121,12 +120,12 @@ func loadConfig(versionStr string, searchPaths ...string) (err error) {
|
|||
}
|
||||
|
||||
// InitConfig loads and parses gochan.json on startup and verifies its contents
|
||||
func InitConfig(versionStr string) (err error) {
|
||||
func InitConfig() (err error) {
|
||||
var searchPaths []string
|
||||
if !testing.Testing() {
|
||||
searchPaths = []string{"gochan.json", "/usr/local/etc/gochan/gochan.json", "/etc/gochan/gochan.json"}
|
||||
}
|
||||
if err = loadConfig(versionStr, searchPaths...); err != nil {
|
||||
if err = loadConfig(searchPaths...); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -190,8 +189,6 @@ func InitConfig(versionStr string) (err error) {
|
|||
_, zoneOffset := time.Now().Zone()
|
||||
cfg.TimeZone = zoneOffset / 60 / 60
|
||||
|
||||
cfg.Version = ParseVersion(versionStr)
|
||||
cfg.Version.Normalize()
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -1,93 +0,0 @@
|
|||
// used for version parsing, printing, and comparison
|
||||
|
||||
package config
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
const (
|
||||
VersionEqual = 0
|
||||
VersionNewer = 1
|
||||
VersionOlder = -1
|
||||
)
|
||||
|
||||
type GochanVersion struct {
|
||||
Major int
|
||||
Minor int
|
||||
Revision int
|
||||
Extra string
|
||||
}
|
||||
|
||||
func ParseVersion(vStr string) *GochanVersion {
|
||||
var v GochanVersion
|
||||
fmt.Sscanf(vStr, "%d.%d.%d-%s", &v.Major, &v.Minor, &v.Revision, &v.Extra)
|
||||
v.Normalize()
|
||||
return &v
|
||||
}
|
||||
|
||||
// Normalize checks to make sure that the version is legitimate, i.e. fields > 0
|
||||
func (v *GochanVersion) Normalize() bool {
|
||||
valid := true
|
||||
if v.Major < 0 {
|
||||
v.Major = 0
|
||||
valid = false
|
||||
}
|
||||
if v.Minor < 0 {
|
||||
v.Minor = 0
|
||||
valid = false
|
||||
}
|
||||
if v.Revision < 0 {
|
||||
v.Revision = 0
|
||||
valid = false
|
||||
}
|
||||
if v.Revision+v.Minor+v.Major == 0 {
|
||||
valid = false
|
||||
}
|
||||
return valid
|
||||
}
|
||||
|
||||
// Compare compares v to v2 and returns 1 if it is newer, -1 if it older, and 0
|
||||
// if they are equal
|
||||
func (v *GochanVersion) Compare(v2 *GochanVersion) int {
|
||||
v.Normalize()
|
||||
v2.Normalize()
|
||||
if v.Major > v2.Major {
|
||||
return VersionNewer
|
||||
}
|
||||
if v.Major < v2.Major {
|
||||
return VersionOlder
|
||||
}
|
||||
if v.Minor > v2.Minor {
|
||||
return VersionNewer
|
||||
}
|
||||
if v.Minor < v2.Minor {
|
||||
return VersionOlder
|
||||
}
|
||||
if v.Revision > v2.Revision {
|
||||
return VersionNewer
|
||||
}
|
||||
if v.Revision < v2.Revision {
|
||||
return VersionOlder
|
||||
}
|
||||
return VersionEqual
|
||||
}
|
||||
|
||||
func (v *GochanVersion) CompareString(v2str string) int {
|
||||
v.Normalize()
|
||||
v2 := ParseVersion(v2str)
|
||||
v2.Normalize()
|
||||
return v.Compare(v2)
|
||||
}
|
||||
|
||||
func (v *GochanVersion) String() string {
|
||||
v.Normalize()
|
||||
str := fmt.Sprintf("%d.%d", v.Major, v.Minor)
|
||||
if v.Revision > 0 {
|
||||
str += fmt.Sprintf(".%d", v.Revision)
|
||||
}
|
||||
if v.Extra != "" {
|
||||
str += "-" + v.Extra
|
||||
}
|
||||
return str
|
||||
}
|
|
@ -1,134 +0,0 @@
|
|||
// used for version parsing, printing, and comparison
|
||||
|
||||
package config
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
type versionTestCase struct {
|
||||
versionStr string
|
||||
expectMajor int
|
||||
expectMinor int
|
||||
expectRevision int
|
||||
expectExtra string
|
||||
expectString string
|
||||
expectInvalid bool
|
||||
}
|
||||
|
||||
func (tC *versionTestCase) run(t *testing.T) {
|
||||
version := ParseVersion(tC.versionStr)
|
||||
valid := version.Normalize()
|
||||
assert.NotEqual(t, tC.expectInvalid, valid)
|
||||
if tC.expectInvalid {
|
||||
return
|
||||
}
|
||||
assert.Equal(t, tC.expectMajor, version.Major)
|
||||
assert.Equal(t, tC.expectMinor, version.Minor)
|
||||
assert.Equal(t, tC.expectRevision, version.Revision)
|
||||
assert.Equal(t, tC.expectExtra, version.Extra)
|
||||
assert.Equal(t, tC.expectString, version.String())
|
||||
}
|
||||
|
||||
func TestParseVersion(t *testing.T) {
|
||||
tests := []versionTestCase{
|
||||
{
|
||||
versionStr: "1.2.3-extra",
|
||||
expectMajor: 1,
|
||||
expectMinor: 2,
|
||||
expectRevision: 3,
|
||||
expectExtra: "extra",
|
||||
expectString: "1.2.3-extra",
|
||||
},
|
||||
{
|
||||
versionStr: "1.2.3",
|
||||
expectMajor: 1,
|
||||
expectMinor: 2,
|
||||
expectRevision: 3,
|
||||
expectString: "1.2.3",
|
||||
},
|
||||
{
|
||||
versionStr: "1.2",
|
||||
expectMajor: 1,
|
||||
expectMinor: 2,
|
||||
expectString: "1.2",
|
||||
},
|
||||
{
|
||||
versionStr: "1",
|
||||
expectMajor: 1,
|
||||
expectString: "1.0",
|
||||
},
|
||||
{
|
||||
versionStr: "-1.-1.-1",
|
||||
expectInvalid: true,
|
||||
},
|
||||
}
|
||||
for _, tC := range tests {
|
||||
t.Run(tC.versionStr, tC.run)
|
||||
}
|
||||
}
|
||||
|
||||
type versionCompareTestCase struct {
|
||||
desc string
|
||||
v1Str string
|
||||
v2Str string
|
||||
expectCmp int
|
||||
}
|
||||
|
||||
func (tC *versionCompareTestCase) run(t *testing.T) {
|
||||
v1 := ParseVersion(tC.v1Str)
|
||||
cmp := v1.CompareString(tC.v2Str)
|
||||
assert.Equal(t, tC.expectCmp, cmp)
|
||||
}
|
||||
|
||||
func TestVersionCompare(t *testing.T) {
|
||||
tests := []versionCompareTestCase{
|
||||
{
|
||||
desc: "v1 > v2 major",
|
||||
v1Str: "3.0",
|
||||
v2Str: "2.0",
|
||||
expectCmp: 1,
|
||||
},
|
||||
{
|
||||
desc: "v1 > v2 minor",
|
||||
v1Str: "3.1",
|
||||
v2Str: "3.0",
|
||||
expectCmp: 1,
|
||||
},
|
||||
{
|
||||
desc: "v1 > v2 revision",
|
||||
v1Str: "3.1.1",
|
||||
v2Str: "3.1",
|
||||
expectCmp: 1,
|
||||
},
|
||||
{
|
||||
desc: "v1 < v2 major",
|
||||
v1Str: "2.0",
|
||||
v2Str: "3.0",
|
||||
expectCmp: -1,
|
||||
},
|
||||
{
|
||||
desc: "v1 < v2 minor",
|
||||
v1Str: "3.0",
|
||||
v2Str: "3.1",
|
||||
expectCmp: -1,
|
||||
},
|
||||
{
|
||||
desc: "v1 < v2 revision",
|
||||
v1Str: "3.1",
|
||||
v2Str: "3.1.1",
|
||||
expectCmp: -1,
|
||||
},
|
||||
{
|
||||
desc: "v1 = v2",
|
||||
v1Str: "3.1.1",
|
||||
v2Str: "3.1.1",
|
||||
expectCmp: 0,
|
||||
},
|
||||
}
|
||||
for _, tC := range tests {
|
||||
t.Run(tC.desc, tC.run)
|
||||
}
|
||||
}
|
|
@ -109,7 +109,8 @@ func preloadLua() {
|
|||
lState.PreloadModule("serverutil", serverutil.PreloadModule)
|
||||
lState.PreloadModule("bbcode", posting.PreloadBBCodeModule)
|
||||
|
||||
lState.SetGlobal("_GOCHAN_VERSION", lua.LString(config.GetVersion().String()))
|
||||
lState.SetGlobal("_GOCHAN_VERSION", lua.LString(config.GochanVersion))
|
||||
lState.SetGlobal("_DATABASE_VERSION", lua.LNumber(gcsql.DatabaseVersion))
|
||||
}
|
||||
|
||||
func LoadPlugins(paths []string) error {
|
||||
|
|
|
@ -39,7 +39,7 @@ return { ListenAddress = system_critical_cfg.ListenAddress, SiteSlogan = site_cf
|
|||
)
|
||||
|
||||
func initPluginTests() {
|
||||
config.SetVersion("4.0.2")
|
||||
config.InitTestConfig()
|
||||
initLua()
|
||||
}
|
||||
|
||||
|
@ -48,7 +48,7 @@ func TestVersionFunction(t *testing.T) {
|
|||
err := lState.DoString(versionStr)
|
||||
assert.NoError(t, err)
|
||||
testingVersionStr := lState.Get(-1).(lua.LString)
|
||||
assert.EqualValues(t, config.GetVersion().String(), testingVersionStr)
|
||||
assert.EqualValues(t, config.GochanVersion, testingVersionStr)
|
||||
}
|
||||
|
||||
func TestStructPassing(t *testing.T) {
|
||||
|
@ -75,9 +75,7 @@ func TestEventModule(t *testing.T) {
|
|||
|
||||
func TestConfigModule(t *testing.T) {
|
||||
testutil.GoToGochanRoot(t)
|
||||
if !assert.NoError(t, config.InitConfig("4.1.0")) {
|
||||
t.FailNow()
|
||||
}
|
||||
config.InitConfig()
|
||||
initPluginTests()
|
||||
err := lState.DoString(configTestingStr)
|
||||
assert.NoError(t, err)
|
||||
|
|
|
@ -21,6 +21,7 @@ import (
|
|||
const (
|
||||
// GochanVersionKeyConstant is the key value used in the version table of the database to store and receive the (database) version of base gochan
|
||||
gochanVersionKeyConstant = "gochan"
|
||||
DatabaseVersion = 5
|
||||
UnsupportedSQLVersionMsg = `syntax error in SQL query, confirm you are using a supported driver and SQL server (error text: %s)`
|
||||
mysqlConnStr = "%s:%s@tcp(%s)/%s?parseTime=true&collation=utf8mb4_unicode_ci"
|
||||
postgresConnStr = "postgres://%s:%s@%s/%s?sslmode=disable"
|
||||
|
|
|
@ -27,7 +27,7 @@ func setupPostTest(t *testing.T, driver string) sqlmock.Sqlmock {
|
|||
if !assert.NoError(t, err) {
|
||||
t.FailNow()
|
||||
}
|
||||
config.SetVersion("4.0.0")
|
||||
config.InitTestConfig()
|
||||
config.SetTestDBConfig(driver, "localhost", "gochan", "gochan", "gochan", "")
|
||||
|
||||
gcdb, err := setupDBConn(setupSqlTestConfig(driver, "gochan", ""))
|
||||
|
|
|
@ -5,7 +5,6 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"path"
|
||||
"strconv"
|
||||
|
||||
"github.com/gochan-org/gochan/pkg/config"
|
||||
"github.com/gochan-org/gochan/pkg/gcutil"
|
||||
|
@ -23,11 +22,10 @@ const (
|
|||
var (
|
||||
// ErrInvalidVersion is used when the db contains a database_version table
|
||||
// but zero or more than one versions were found
|
||||
ErrInvalidVersion = errors.New("database contains database_version table but zero or more than one versions were found")
|
||||
ErrCorruptedDB = errors.New("database contains gochan prefixed tables but is missing versioning tables (possibly corrupted)")
|
||||
ErrDeprecatedDB = errors.New("database layout is deprecated, please run gochan-migration -updatedb")
|
||||
ErrInvalidDBVersion = errors.New("invalid version flag returned by GetCompleteDatabaseVersion()")
|
||||
targetDatabaseVersion = -1
|
||||
ErrInvalidVersion = errors.New("database contains database_version table but zero or more than one versions were found")
|
||||
ErrCorruptedDB = errors.New("database contains gochan prefixed tables but is missing versioning tables (possibly corrupted)")
|
||||
ErrDeprecatedDB = errors.New("database layout is deprecated, please run gochan-migration -updatedb")
|
||||
ErrInvalidDBVersion = errors.New("invalid version flag returned by GetCompleteDatabaseVersion()")
|
||||
)
|
||||
|
||||
func findSQLFile(filename string) string {
|
||||
|
@ -63,10 +61,10 @@ func GetCompleteDatabaseVersion() (dbVersion, dbFlag int, err error) {
|
|||
if versionError != nil {
|
||||
return 0, 0, versionError
|
||||
}
|
||||
if databaseVersion < targetDatabaseVersion {
|
||||
if databaseVersion < DatabaseVersion {
|
||||
return databaseVersion, DBModernButBehind, nil
|
||||
}
|
||||
if databaseVersion > targetDatabaseVersion {
|
||||
if databaseVersion > DatabaseVersion {
|
||||
return databaseVersion, DBModernButAhead, nil
|
||||
}
|
||||
return databaseVersion, DBUpToDate, nil
|
||||
|
@ -93,14 +91,7 @@ func GetCompleteDatabaseVersion() (dbVersion, dbFlag int, err error) {
|
|||
}
|
||||
|
||||
// CheckAndInitializeDatabase checks the validity of the database and initialises it if it is empty
|
||||
func CheckAndInitializeDatabase(dbType string, targetDbVersionStr string) (err error) {
|
||||
if targetDatabaseVersion == -1 {
|
||||
targetDatabaseVersion, err = strconv.Atoi(targetDbVersionStr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
func CheckAndInitializeDatabase(dbType string) (err error) {
|
||||
dbVersion, versionFlag, err := GetCompleteDatabaseVersion()
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -118,7 +109,7 @@ func CheckAndInitializeDatabase(dbType string, targetDbVersionStr string) (err e
|
|||
err = ErrCorruptedDB
|
||||
case DBModernButAhead:
|
||||
// Uer might be running an old gochan version
|
||||
err = fmt.Errorf("database layout is ahead of current version (%d), target version: %d", dbVersion, targetDatabaseVersion)
|
||||
err = fmt.Errorf("database layout is ahead of current version (%d), target version: %d", dbVersion, DatabaseVersion)
|
||||
default:
|
||||
err = ErrInvalidDBVersion
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ func TestProvision(t *testing.T) {
|
|||
if !assert.NoError(t, err) {
|
||||
return
|
||||
}
|
||||
config.SetVersion("4.0.0")
|
||||
config.InitTestConfig()
|
||||
config.SetRandomSeed("test")
|
||||
|
||||
for _, driver := range testingDBDrivers {
|
||||
|
|
|
@ -201,7 +201,7 @@ var funcMap = template.FuncMap{
|
|||
return style == config.GetBoardConfig("").DefaultStyle
|
||||
},
|
||||
"version": func() string {
|
||||
return config.GetVersion().String()
|
||||
return config.GochanVersion
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
@ -181,7 +181,7 @@ func TestFormatFilesizeTmplFunc(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestFormatTimestampTmplFunc(t *testing.T) {
|
||||
config.SetVersion("4.0.0")
|
||||
config.InitTestConfig()
|
||||
|
||||
tmpl := template.Must(template.New("name").Funcs(funcMap).Parse("{{formatTimestamp .Time}}"))
|
||||
buf := bytes.NewBuffer(nil)
|
||||
|
@ -474,7 +474,7 @@ func TestMapTmplFunc(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestWebPathDirTmplFunc(t *testing.T) {
|
||||
config.SetVersion("4.0.0")
|
||||
config.InitTestConfig()
|
||||
testCases := []struct {
|
||||
desc string
|
||||
tmplStr string
|
||||
|
@ -524,7 +524,7 @@ func TestWebPathDirTmplFunc(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestMakeLoopTmplFunc(t *testing.T) {
|
||||
config.SetVersion("4.0.0")
|
||||
config.InitTestConfig()
|
||||
testCases := []struct {
|
||||
desc string
|
||||
tmplStr string
|
||||
|
|
|
@ -378,7 +378,7 @@ var (
|
|||
validationFunc: func(t *testing.T, reader io.Reader) {
|
||||
ba, err := io.ReadAll(reader)
|
||||
if assert.NoError(t, err) {
|
||||
assert.Equal(t, `<footer>Powered by<a href="http://github.com/gochan-org/gochan/">Gochan 4.0</a><br /></footer></div></body></html>`, string(ba))
|
||||
assert.Equal(t, `<footer>Powered by<a href="http://github.com/gochan-org/gochan/">Gochan `+config.GochanVersion+`</a><br /></footer></div></body></html>`, string(ba))
|
||||
}
|
||||
},
|
||||
},
|
||||
|
|
|
@ -69,7 +69,7 @@ func runTemplateTestCases(t *testing.T, templateName string, testCases []templat
|
|||
if !assert.NoError(t, err) {
|
||||
return
|
||||
}
|
||||
config.SetVersion("4.0.0")
|
||||
config.InitTestConfig()
|
||||
config.SetTestDBConfig("mysql", "localhost", "gochan", "gochan", "gochan", "")
|
||||
if !assert.NoError(t, gcsql.SetTestingDB("mysql", "gochan", "", db)) {
|
||||
return
|
||||
|
|
|
@ -179,7 +179,7 @@ func embedTestRunner(t *testing.T, tc *embedTestCase, boardCfg *config.BoardConf
|
|||
}
|
||||
|
||||
func TestAttachEmbed(t *testing.T) {
|
||||
config.InitConfig("4.1.0")
|
||||
config.InitTestConfig()
|
||||
config.SetTestDBConfig("mysql", "localhost", "gochan", "gochan", "", "")
|
||||
|
||||
// Set up a board config with some embed matchers
|
||||
|
@ -202,7 +202,7 @@ func TestAttachEmbed(t *testing.T) {
|
|||
func TestOnlyAllowOneEmbed(t *testing.T) {
|
||||
// verify that only one embed or file upload is allowed. Multiple files/uploading is on my to-do list,
|
||||
// but for now, single upload/embedding is enforced.
|
||||
config.InitConfig("4.1.0")
|
||||
config.InitTestConfig()
|
||||
config.SetTestDBConfig("mysql", "localhost", "gochan", "gochan", "", "")
|
||||
boardCfg := &config.BoardConfig{
|
||||
PostConfig: config.PostConfig{
|
||||
|
|
|
@ -13,7 +13,6 @@ import (
|
|||
)
|
||||
|
||||
const (
|
||||
versionStr = "4.0.0"
|
||||
bbcodeMsgPreRender = `[b]Bold[/b] [i]Italics[/i] [u]Underline[/u] [url=https://gochan.org]URL[/url] [?]Spoiler[/?]
|
||||
[code]Code[/code]
|
||||
[hide]Hidden[/hide]`
|
||||
|
@ -146,7 +145,7 @@ type diceRollerTestCase struct {
|
|||
}
|
||||
|
||||
func TestBBCode(t *testing.T) {
|
||||
config.SetVersion(versionStr)
|
||||
config.InitTestConfig()
|
||||
var testFmtr MessageFormatter
|
||||
testFmtr.Init()
|
||||
rendered := testFmtr.Compile(bbcodeMsgPreRender, "")
|
||||
|
@ -154,7 +153,7 @@ func TestBBCode(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestLinks(t *testing.T) {
|
||||
config.SetVersion(versionStr)
|
||||
config.InitTestConfig()
|
||||
var testFmtr MessageFormatter
|
||||
testFmtr.Init()
|
||||
rendered := urlRE.ReplaceAllStringFunc(linkTestPreRender, wrapLinksInURL)
|
||||
|
@ -163,7 +162,7 @@ func TestLinks(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestNoDoubleTags(t *testing.T) {
|
||||
config.SetVersion(versionStr)
|
||||
config.InitTestConfig()
|
||||
msgfmtr.Init()
|
||||
_, warnEv, errEv := testutil.GetTestLogs(t)
|
||||
rendered, err := FormatMessage(doubleTagPreRender, "", warnEv, errEv)
|
||||
|
@ -172,7 +171,7 @@ func TestNoDoubleTags(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestLuaBBCode(t *testing.T) {
|
||||
config.SetVersion(versionStr)
|
||||
config.InitTestConfig()
|
||||
msgfmtr.Init()
|
||||
l := lua.NewState()
|
||||
defer l.Close()
|
||||
|
@ -203,7 +202,7 @@ func diceRollRunner(t *testing.T, tC *diceRollerTestCase) {
|
|||
}
|
||||
|
||||
func TestDiceRoll(t *testing.T) {
|
||||
config.SetVersion(versionStr)
|
||||
config.InitTestConfig()
|
||||
msgfmtr.Init()
|
||||
for _, tC := range diceTestCases {
|
||||
t.Run(tC.desc, func(t *testing.T) {
|
||||
|
@ -216,7 +215,7 @@ func TestDiceRoll(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestHashTags(t *testing.T) {
|
||||
config.SetVersion(versionStr)
|
||||
config.InitTestConfig()
|
||||
msgfmtr.Init()
|
||||
_, warnEv, errEv := testutil.GetTestLogs(t)
|
||||
msg := `[#tag]
|
||||
|
@ -248,7 +247,7 @@ test]
|
|||
}
|
||||
|
||||
func TestWorksafe(t *testing.T) {
|
||||
config.SetVersion(versionStr)
|
||||
config.InitTestConfig()
|
||||
msgfmtr.Init()
|
||||
_, warnEv, errEv := testutil.GetTestLogs(t)
|
||||
boardConfig := config.GetBoardConfig("test")
|
||||
|
|
|
@ -14,7 +14,7 @@ type parseNameTestCase struct {
|
|||
}
|
||||
|
||||
func TestParseName(t *testing.T) {
|
||||
config.SetVersion("4.1")
|
||||
config.InitTestConfig()
|
||||
boardConfig := config.GetBoardConfig("test")
|
||||
boardConfig.ReservedTrips = map[string]string{
|
||||
"reserved": "TripOut",
|
||||
|
|
|
@ -17,14 +17,13 @@ import (
|
|||
)
|
||||
|
||||
func TestServeJSON(t *testing.T) {
|
||||
|
||||
_, err := testutil.GoToGochanRoot(t)
|
||||
if !assert.NoError(t, err) {
|
||||
t.Fatalf("Failed to get current working directory: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
config.SetVersion("4.0.1")
|
||||
config.InitTestConfig()
|
||||
config.SetRandomSeed("test")
|
||||
|
||||
writer := httptest.NewRecorder()
|
||||
|
@ -73,7 +72,7 @@ func TestServeErrorPage(t *testing.T) {
|
|||
if !assert.NoError(t, err, "Unable to switch to gochan root directory") {
|
||||
return
|
||||
}
|
||||
config.SetVersion("4.0.1")
|
||||
config.InitTestConfig()
|
||||
config.SetTestTemplateDir("templates")
|
||||
if !assert.NoError(t, gctemplates.InitTemplates()) {
|
||||
return
|
||||
|
@ -100,8 +99,7 @@ func TestServeErrorPage(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestServeError(t *testing.T) {
|
||||
|
||||
config.SetVersion("4.0.1")
|
||||
config.InitTestConfig()
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
|
@ -129,7 +127,7 @@ func TestServeError(t *testing.T) {
|
|||
err: "page not found",
|
||||
wantsJSON: false,
|
||||
data: nil,
|
||||
expected: "<!doctype html><meta charset=utf-8><title>Error :c</title><h1>Error</h1><p>page not found<hr><address>Site powered by Gochan 4.0.1</address>",
|
||||
expected: "<!doctype html><meta charset=utf-8><title>Error :c</title><h1>Error</h1><p>page not found<hr><address>Site powered by Gochan " + config.GochanVersion + "</address>",
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
@ -13,8 +13,7 @@ import (
|
|||
)
|
||||
|
||||
func TestServeFile(t *testing.T) {
|
||||
|
||||
config.SetVersion("4.0.1")
|
||||
config.InitTestConfig()
|
||||
|
||||
tempDir, err := os.MkdirTemp("", "testservefile")
|
||||
if err != nil {
|
||||
|
@ -51,8 +50,7 @@ func TestServeFile(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestServeFile_NotFound(t *testing.T) {
|
||||
|
||||
config.SetVersion("4.0.1")
|
||||
config.InitTestConfig()
|
||||
|
||||
// Create a temporary directory for testing
|
||||
tempDir, err := os.MkdirTemp("", "testservefile")
|
||||
|
|
|
@ -50,7 +50,7 @@ type checkRefererTestCase struct {
|
|||
}
|
||||
|
||||
func TestCheckReferer(t *testing.T) {
|
||||
config.SetVersion("4.0.0")
|
||||
config.InitTestConfig()
|
||||
systemCriticalConfig := config.GetSystemCriticalConfig()
|
||||
req, err := http.NewRequest("GET", "https://gochan.org", nil)
|
||||
if !assert.NoError(t, err) {
|
||||
|
|
|
@ -82,7 +82,7 @@ func TestCanMinify(t *testing.T) {
|
|||
desc: "don't minify HTML or JS",
|
||||
},
|
||||
}
|
||||
config.SetVersion("4.0.0")
|
||||
config.InitTestConfig()
|
||||
siteCfg := config.GetSiteConfig()
|
||||
for _, tC := range testCases {
|
||||
t.Run(tC.desc, func(t *testing.T) {
|
||||
|
@ -153,7 +153,7 @@ func TestMinifyWriter(t *testing.T) {
|
|||
expectOutput: unminifiedJSON,
|
||||
},
|
||||
}
|
||||
config.SetVersion("4.0.0")
|
||||
config.InitTestConfig()
|
||||
siteCfg := config.GetSiteConfig()
|
||||
buf := new(bytes.Buffer)
|
||||
var err error
|
||||
|
@ -212,7 +212,7 @@ func TestMinifyTemplate(t *testing.T) {
|
|||
return
|
||||
}
|
||||
config.SetTestTemplateDir("templates")
|
||||
config.SetVersion("4.0.0")
|
||||
config.InitTestConfig()
|
||||
|
||||
tmplRefStringTests := []testCaseMinifyTemplate{
|
||||
{
|
||||
|
@ -254,7 +254,7 @@ func TestMinifyTemplate(t *testing.T) {
|
|||
mediaType: "text/html",
|
||||
isTmplRef: true,
|
||||
},
|
||||
expectWriterString: `<!doctype html><meta charset=utf-8><title>Error</title><h1>Error</h1><p>Error<hr><address>Site powered by Gochan 4.0</address>`,
|
||||
expectWriterString: `<!doctype html><meta charset=utf-8><title>Error</title><h1>Error</h1><p>Error<hr><address>Site powered by Gochan ` + config.GochanVersion + `</address>`,
|
||||
},
|
||||
{
|
||||
testCaseCanMinify: testCaseCanMinify{
|
||||
|
@ -279,7 +279,7 @@ func TestMinifyTemplate(t *testing.T) {
|
|||
<body>
|
||||
<h1>Error</h1>
|
||||
<p>Error</p>
|
||||
<hr><address>Site powered by Gochan 4.0</address>
|
||||
<hr><address>Site powered by Gochan ` + config.GochanVersion + `</address>
|
||||
</body>
|
||||
</html>`,
|
||||
},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue