You've already forked factorio-server-manager
mirror of
https://github.com/OpenFactorioServerManager/factorio-server-manager.git
synced 2025-07-13 01:10:25 +02:00
Updated tests, to also test compatibility
This commit is contained in:
@ -44,6 +44,9 @@ func SetupModPacks(t *testing.T, empty bool, emptyMods bool) {
|
||||
|
||||
err = modList.DownloadMod("/download/train-station-overview/5fc1b28cd3d1bb6fd86d9432", "train-station-overview_3.0.0.zip", "train-station-overview")
|
||||
assert.NoError(t, err, `Error downloading Mod "train-station-overview"`)
|
||||
|
||||
err = modList.DownloadMod("/download/sonaxaton-infinite-resources/5dca095d440570000be0de82", "sonaxaton-infinite-resources_0.4.1.zip", "sonaxaton-infinite-resources")
|
||||
assert.NoError(t, err, `Error downloading Mod "sonaxaton-infinite-resources""`)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -111,7 +114,48 @@ func TestModPackListHandler(t *testing.T) {
|
||||
SetupModPacks(t, false, false)
|
||||
defer CleanupModPacks(t)
|
||||
|
||||
expected := `[{"name":"test","mods":{"mods":[{"name":"belt-balancer","version":"3.0.0","title":"Belt Balancer","author":"knoxfighter","file_name":"belt-balancer_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true},{"name":"train-station-overview","version":"3.0.0","title":"Train Station Overview","author":"knoxfighter","file_name":"train-station-overview_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true}]}}]`
|
||||
expected := `[
|
||||
{
|
||||
"name": "test",
|
||||
"mods": {
|
||||
"mods": [
|
||||
{
|
||||
"name": "belt-balancer",
|
||||
"version": "3.0.0",
|
||||
"title": "Belt Balancer",
|
||||
"author": "knoxfighter",
|
||||
"file_name": "belt-balancer_3.0.0.zip",
|
||||
"factorio_version": "1.1.0.0",
|
||||
"dependencies": null,
|
||||
"compatibility": true,
|
||||
"enabled": true
|
||||
},
|
||||
{
|
||||
"name": "sonaxaton-infinite-resources",
|
||||
"version": "0.4.1",
|
||||
"title": "Infinite Resources",
|
||||
"author": "sonaxaton",
|
||||
"file_name": "sonaxaton-infinite-resources_0.4.1.zip",
|
||||
"factorio_version": "0.17.0.0",
|
||||
"dependencies": null,
|
||||
"compatibility": false,
|
||||
"enabled": true
|
||||
},
|
||||
{
|
||||
"name": "train-station-overview",
|
||||
"version": "3.0.0",
|
||||
"title": "Train Station Overview",
|
||||
"author": "knoxfighter",
|
||||
"file_name": "train-station-overview_3.0.0.zip",
|
||||
"factorio_version": "1.1.0.0",
|
||||
"dependencies": null,
|
||||
"compatibility": true,
|
||||
"enabled": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]`
|
||||
|
||||
CallRoute(t, method, route, route, nil, handlerFunc, http.StatusOK, expected)
|
||||
})
|
||||
@ -140,7 +184,48 @@ func TestModPackCreateHandler(t *testing.T) {
|
||||
defer CleanupMods(t)
|
||||
|
||||
requestBody := strings.NewReader(`{"name": "test"}`)
|
||||
expected := `[{"name":"test","mods":{"mods":[{"name":"belt-balancer","version":"3.0.0","title":"Belt Balancer","author":"knoxfighter","file_name":"belt-balancer_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true},{"name":"train-station-overview","version":"3.0.0","title":"Train Station Overview","author":"knoxfighter","file_name":"train-station-overview_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true}]}}]`
|
||||
expected := `[
|
||||
{
|
||||
"name": "test",
|
||||
"mods": {
|
||||
"mods": [
|
||||
{
|
||||
"name": "belt-balancer",
|
||||
"version": "3.0.0",
|
||||
"title": "Belt Balancer",
|
||||
"author": "knoxfighter",
|
||||
"file_name": "belt-balancer_3.0.0.zip",
|
||||
"factorio_version": "1.1.0.0",
|
||||
"dependencies": null,
|
||||
"compatibility": true,
|
||||
"enabled": true
|
||||
},
|
||||
{
|
||||
"name": "sonaxaton-infinite-resources",
|
||||
"version": "0.4.1",
|
||||
"title": "Infinite Resources",
|
||||
"author": "sonaxaton",
|
||||
"file_name": "sonaxaton-infinite-resources_0.4.1.zip",
|
||||
"factorio_version": "0.17.0.0",
|
||||
"dependencies": null,
|
||||
"compatibility": false,
|
||||
"enabled": true
|
||||
},
|
||||
{
|
||||
"name": "train-station-overview",
|
||||
"version": "3.0.0",
|
||||
"title": "Train Station Overview",
|
||||
"author": "knoxfighter",
|
||||
"file_name": "train-station-overview_3.0.0.zip",
|
||||
"factorio_version": "1.1.0.0",
|
||||
"dependencies": null,
|
||||
"compatibility": true,
|
||||
"enabled": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]`
|
||||
|
||||
CallRoute(t, method, route, route, requestBody, handlerFunc, http.StatusOK, expected)
|
||||
})
|
||||
@ -183,7 +268,43 @@ func TestModPackLoadHandler(t *testing.T) {
|
||||
SetupMods(t, true)
|
||||
defer CleanupMods(t)
|
||||
|
||||
expected := `{"mods":[{"name":"belt-balancer","version":"3.0.0","title":"Belt Balancer","author":"knoxfighter","file_name":"belt-balancer_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true},{"name":"train-station-overview","version":"3.0.0","title":"Train Station Overview","author":"knoxfighter","file_name":"train-station-overview_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true}]}`
|
||||
expected := `{
|
||||
"mods": [
|
||||
{
|
||||
"name": "belt-balancer",
|
||||
"version": "3.0.0",
|
||||
"title": "Belt Balancer",
|
||||
"author": "knoxfighter",
|
||||
"file_name": "belt-balancer_3.0.0.zip",
|
||||
"factorio_version": "1.1.0.0",
|
||||
"dependencies": null,
|
||||
"compatibility": true,
|
||||
"enabled": true
|
||||
},
|
||||
{
|
||||
"name": "sonaxaton-infinite-resources",
|
||||
"version": "0.4.1",
|
||||
"title": "Infinite Resources",
|
||||
"author": "sonaxaton",
|
||||
"file_name": "sonaxaton-infinite-resources_0.4.1.zip",
|
||||
"factorio_version": "0.17.0.0",
|
||||
"dependencies": null,
|
||||
"compatibility": false,
|
||||
"enabled": true
|
||||
},
|
||||
{
|
||||
"name": "train-station-overview",
|
||||
"version": "3.0.0",
|
||||
"title": "Train Station Overview",
|
||||
"author": "knoxfighter",
|
||||
"file_name": "train-station-overview_3.0.0.zip",
|
||||
"factorio_version": "1.1.0.0",
|
||||
"dependencies": null,
|
||||
"compatibility": true,
|
||||
"enabled": true
|
||||
}
|
||||
]
|
||||
}`
|
||||
|
||||
CallRoute(t, method, baseRoute, route, nil, handlerFunc, http.StatusOK, expected)
|
||||
|
||||
@ -246,7 +367,43 @@ func TestModPackModListHandler(t *testing.T) {
|
||||
SetupModPacks(t, false, false)
|
||||
defer CleanupModPacks(t)
|
||||
|
||||
expected := `{"mods":[{"name":"belt-balancer","version":"3.0.0","title":"Belt Balancer","author":"knoxfighter","file_name":"belt-balancer_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true},{"name":"train-station-overview","version":"3.0.0","title":"Train Station Overview","author":"knoxfighter","file_name":"train-station-overview_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true}]}`
|
||||
expected := `{
|
||||
"mods": [
|
||||
{
|
||||
"name": "belt-balancer",
|
||||
"version": "3.0.0",
|
||||
"title": "Belt Balancer",
|
||||
"author": "knoxfighter",
|
||||
"file_name": "belt-balancer_3.0.0.zip",
|
||||
"factorio_version": "1.1.0.0",
|
||||
"dependencies": null,
|
||||
"compatibility": true,
|
||||
"enabled": true
|
||||
},
|
||||
{
|
||||
"name": "sonaxaton-infinite-resources",
|
||||
"version": "0.4.1",
|
||||
"title": "Infinite Resources",
|
||||
"author": "sonaxaton",
|
||||
"file_name": "sonaxaton-infinite-resources_0.4.1.zip",
|
||||
"factorio_version": "0.17.0.0",
|
||||
"dependencies": null,
|
||||
"compatibility": false,
|
||||
"enabled": true
|
||||
},
|
||||
{
|
||||
"name": "train-station-overview",
|
||||
"version": "3.0.0",
|
||||
"title": "Train Station Overview",
|
||||
"author": "knoxfighter",
|
||||
"file_name": "train-station-overview_3.0.0.zip",
|
||||
"factorio_version": "1.1.0.0",
|
||||
"dependencies": null,
|
||||
"compatibility": true,
|
||||
"enabled": true
|
||||
}
|
||||
]
|
||||
}`
|
||||
|
||||
CallRoute(t, method, baseRoute, route, nil, handlerFunc, http.StatusOK, expected)
|
||||
})
|
||||
|
@ -90,6 +90,11 @@ func SetupMods(t *testing.T, empty bool) {
|
||||
if err != nil {
|
||||
t.Fatalf(`Error downloading Mod "train-station-overview": %s`, err)
|
||||
}
|
||||
|
||||
err = mod.DownloadMod("/download/sonaxaton-infinite-resources/5dca095d440570000be0de82", "sonaxaton-infinite-resources_0.4.1.zip", "sonaxaton-infinite-resources")
|
||||
if err != nil {
|
||||
t.Fatalf(`Error downloading Mod "sonaxaton-infinite-resources": %s`, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -167,7 +172,41 @@ func TestListInstalledModsHandler(t *testing.T) {
|
||||
|
||||
route := "/api/mods/list"
|
||||
|
||||
expected := `[{"name":"belt-balancer","version":"3.0.0","title":"Belt Balancer","author":"knoxfighter","file_name":"belt-balancer_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true},{"name":"train-station-overview","version":"3.0.0","title":"Train Station Overview","author":"knoxfighter","file_name":"train-station-overview_3.0.0.zip","factorio_version":"1.1.0.0","dependencies":null,"compatibility":true,"enabled":true}]`
|
||||
expected := `[
|
||||
{
|
||||
"name": "belt-balancer",
|
||||
"version": "3.0.0",
|
||||
"title": "Belt Balancer",
|
||||
"author": "knoxfighter",
|
||||
"file_name": "belt-balancer_3.0.0.zip",
|
||||
"factorio_version": "1.1.0.0",
|
||||
"dependencies": null,
|
||||
"compatibility": true,
|
||||
"enabled": true
|
||||
},
|
||||
{
|
||||
"name": "sonaxaton-infinite-resources",
|
||||
"version": "0.4.1",
|
||||
"title": "Infinite Resources",
|
||||
"author": "sonaxaton",
|
||||
"file_name": "sonaxaton-infinite-resources_0.4.1.zip",
|
||||
"factorio_version": "0.17.0.0",
|
||||
"dependencies": null,
|
||||
"compatibility": false,
|
||||
"enabled": true
|
||||
},
|
||||
{
|
||||
"name": "train-station-overview",
|
||||
"version": "3.0.0",
|
||||
"title": "Train Station Overview",
|
||||
"author": "knoxfighter",
|
||||
"file_name": "train-station-overview_3.0.0.zip",
|
||||
"factorio_version": "1.1.0.0",
|
||||
"dependencies": null,
|
||||
"compatibility": true,
|
||||
"enabled": true
|
||||
}
|
||||
]`
|
||||
|
||||
CallRoute(t, "GET", route, route, nil, ListInstalledModsHandler, http.StatusOK, expected)
|
||||
}
|
||||
|
@ -111,7 +111,7 @@ func (modInfoList *ModInfoList) listInstalledMods() error {
|
||||
server := GetFactorioServer()
|
||||
|
||||
if !base.Equals(NilVersion) {
|
||||
modInfo.Compatibility = server.Version.Compare(base, op)
|
||||
modInfo.Compatibility = server.Version.Compatible(base, op)
|
||||
} else {
|
||||
log.Println("error finding basemodDependency. Using FactorioVersion...")
|
||||
modInfo.Compatibility = !server.Version.Less(modInfo.FactorioVersion)
|
||||
|
@ -76,6 +76,7 @@ type Mod struct {
|
||||
CRC uint32 `json:"crc"`
|
||||
}
|
||||
|
||||
// Mostly based on https://forums.factorio.com/viewtopic.php?f=5&t=8568&p=277892&hilit=level.dat+python#p277892
|
||||
func (h *SaveHeader) ReadFrom(r io.Reader) (err error) {
|
||||
var scratch [8]byte
|
||||
|
||||
@ -91,7 +92,7 @@ func (h *SaveHeader) ReadFrom(r io.Reader) (err error) {
|
||||
|
||||
atLeast016 := !h.FactorioVersion.Less(Version{0, 16, 0, 0})
|
||||
|
||||
if h.FactorioVersion.Greater(Version{0, 17, 0, 0}) {
|
||||
if !h.FactorioVersion.Less(Version{0, 17, 0, 0}) {
|
||||
//FIXME correct naming
|
||||
_, err = r.Read(scratch[:1])
|
||||
if err != nil {
|
||||
@ -99,39 +100,46 @@ func (h *SaveHeader) ReadFrom(r io.Reader) (err error) {
|
||||
}
|
||||
}
|
||||
|
||||
// campaign, example: "transport-belt-madness
|
||||
h.Campaign, err = readString(r, Version(h.FactorioVersion), false)
|
||||
if err != nil {
|
||||
return fmt.Errorf("read Campaign: %v", err)
|
||||
}
|
||||
|
||||
// level name, example: "level-01"
|
||||
h.Name, err = readString(r, Version(h.FactorioVersion), false)
|
||||
if err != nil {
|
||||
return fmt.Errorf("read Name: %v", err)
|
||||
}
|
||||
|
||||
// name of the base mod, example: "base"
|
||||
h.BaseMod, err = readString(r, Version(h.FactorioVersion), false)
|
||||
if err != nil {
|
||||
return fmt.Errorf("read BaseMod: %v", err)
|
||||
}
|
||||
|
||||
// Read Difficulty
|
||||
_, err = r.Read(scratch[:1])
|
||||
if err != nil {
|
||||
return fmt.Errorf("read Difficulty: %v", err)
|
||||
}
|
||||
h.Difficulty = scratch[0]
|
||||
|
||||
// Read finished as bool
|
||||
_, err = r.Read(scratch[:1])
|
||||
if err != nil {
|
||||
return fmt.Errorf("read Finished: %v", err)
|
||||
}
|
||||
h.Finished = scratch[0] != 0
|
||||
|
||||
// Read playerWon as bool
|
||||
_, err = r.Read(scratch[:1])
|
||||
if err != nil {
|
||||
return fmt.Errorf("read PlayerWon: %v", err)
|
||||
}
|
||||
h.PlayerWon = scratch[0] != 0
|
||||
|
||||
// Read NextLevel string (normally empty)
|
||||
h.NextLevel, err = readString(r, Version(h.FactorioVersion), false)
|
||||
if err != nil {
|
||||
return fmt.Errorf("read NextLevel: %v", err)
|
||||
@ -257,6 +265,7 @@ func readOptimUint(r io.Reader, v Version, bitSize int) (uint32, error) {
|
||||
func readString(r io.Reader, game Version, forceOptimized bool) (s string, err error) {
|
||||
var n uint32
|
||||
|
||||
// since 0.16 read optimized uint
|
||||
if !game.Less(Version{0, 16, 0, 0}) || forceOptimized {
|
||||
n, err = readOptimUint(r, game, 32)
|
||||
if err != nil {
|
||||
|
@ -42,7 +42,13 @@ func (v Version) Equals(b Version) bool {
|
||||
return v[0] == b[0] && v[1] == b[1] && v[2] == b[2] && v[3] == b[3]
|
||||
}
|
||||
|
||||
/**
|
||||
* Greater cannot be !Less, cause incompatibility is given, when changing super-major or major version.
|
||||
* So this will give incompatibilities between two different versions.
|
||||
*/
|
||||
|
||||
// Less returns true if the receiver version is less than the argument version
|
||||
// This has to be kept like it is, it used to determine the versions for the binary level.dat
|
||||
func (v Version) Less(b Version) bool {
|
||||
switch {
|
||||
case v[0] < b[0]:
|
||||
@ -61,23 +67,30 @@ func (v Version) Less(b Version) bool {
|
||||
// Greater returns true if the receiver version is greater than the argument version
|
||||
func (v Version) Greater(b Version) bool { return !v.Equals(b) && !v.Less(b) }
|
||||
|
||||
func (v Version) ge(b Version) bool { return v.Equals(b) || v.Greater(b) }
|
||||
func (v Version) le(b Version) bool { return v.Equals(b) || v.Less(b) }
|
||||
// GreaterC called to determine the compatibility with a greater version
|
||||
// Versions, that have different super/major version are not compatible!
|
||||
func (v *Version) GreaterC(b Version) bool {
|
||||
return v[0] == b[0] && v[1] == b[1] && (v[2] > b[2] || (v[2] == b[2] && v[3] > b[3]))
|
||||
}
|
||||
|
||||
// Compare returns true if the comparison between the two version operands is valid.
|
||||
func (v Version) ge(b Version) bool { return v.Equals(b) || v.Greater(b) }
|
||||
func (v Version) geC(b Version) bool { return v.Equals(b) || v.GreaterC(b) }
|
||||
func (v Version) le(b Version) bool { return v.Equals(b) || v.Less(b) }
|
||||
|
||||
// Compatible returns true if the comparison between the two version operands is valid.
|
||||
// Supported ops are: ==, !=, >, <, >=, <=
|
||||
func (v Version) Compare(b Version, op string) bool {
|
||||
func (v Version) Compatible(b Version, op string) bool {
|
||||
switch op {
|
||||
case "==":
|
||||
return v.Equals(b)
|
||||
case "!=":
|
||||
return !v.Equals(b)
|
||||
case ">":
|
||||
return v.Greater(b)
|
||||
return v.GreaterC(b)
|
||||
case "<":
|
||||
return v.Less(b)
|
||||
case ">=":
|
||||
return v.ge(b)
|
||||
return v.geC(b)
|
||||
case "<=":
|
||||
return v.le(b)
|
||||
default:
|
||||
|
Reference in New Issue
Block a user