mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-21 10:27:46 +08:00
* chore: apply go fix modernizers from Go 1.26
automated refactoring: interface{} to any, slices.Contains,
and other idiomatic updates.
* feat(ci): add `go fix` check to Go analysis workflow
ensures Go 1.26 modernizers are applied, fails CI if `go fix ./...`
produces any changes (similar to existing `go fmt` enforcement)
172 lines
4.3 KiB
Go
172 lines
4.3 KiB
Go
package config
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestClone(t *testing.T) {
|
|
c := new(Config)
|
|
c.Identity.PeerID = "faketest"
|
|
c.API.HTTPHeaders = map[string][]string{"foo": {"bar"}}
|
|
|
|
newCfg, err := c.Clone()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if newCfg.Identity.PeerID != c.Identity.PeerID {
|
|
t.Fatal("peer ID not preserved")
|
|
}
|
|
|
|
c.API.HTTPHeaders["foo"] = []string{"baz"}
|
|
if newCfg.API.HTTPHeaders["foo"][0] != "bar" {
|
|
t.Fatal("HTTP headers not preserved")
|
|
}
|
|
|
|
delete(c.API.HTTPHeaders, "foo")
|
|
if newCfg.API.HTTPHeaders["foo"][0] != "bar" {
|
|
t.Fatal("HTTP headers not preserved")
|
|
}
|
|
}
|
|
|
|
func TestReflectToMap(t *testing.T) {
|
|
// Helper function to create a test config with various field types
|
|
reflectedConfig := ReflectToMap(new(Config))
|
|
|
|
mapConfig, ok := reflectedConfig.(map[string]any)
|
|
if !ok {
|
|
t.Fatal("Config didn't convert to map")
|
|
}
|
|
|
|
reflectedIdentity, ok := mapConfig["Identity"]
|
|
if !ok {
|
|
t.Fatal("Identity field not found")
|
|
}
|
|
|
|
mapIdentity, ok := reflectedIdentity.(map[string]any)
|
|
if !ok {
|
|
t.Fatal("Identity field didn't convert to map")
|
|
}
|
|
|
|
// Test string field reflection
|
|
reflectedPeerID, ok := mapIdentity["PeerID"]
|
|
if !ok {
|
|
t.Fatal("PeerID field not found in Identity")
|
|
}
|
|
if _, ok := reflectedPeerID.(string); !ok {
|
|
t.Fatal("PeerID field didn't convert to string")
|
|
}
|
|
|
|
// Test omitempty json string field
|
|
reflectedPrivKey, ok := mapIdentity["PrivKey"]
|
|
if !ok {
|
|
t.Fatal("PrivKey omitempty field not found in Identity")
|
|
}
|
|
if _, ok := reflectedPrivKey.(string); !ok {
|
|
t.Fatal("PrivKey omitempty field didn't convert to string")
|
|
}
|
|
|
|
// Test slices field
|
|
reflectedBootstrap, ok := mapConfig["Bootstrap"]
|
|
if !ok {
|
|
t.Fatal("Bootstrap field not found in config")
|
|
}
|
|
bootstrap, ok := reflectedBootstrap.([]any)
|
|
if !ok {
|
|
t.Fatal("Bootstrap field didn't convert to []string")
|
|
}
|
|
if len(bootstrap) != 0 {
|
|
t.Fatal("Bootstrap len is incorrect")
|
|
}
|
|
|
|
reflectedDatastore, ok := mapConfig["Datastore"]
|
|
if !ok {
|
|
t.Fatal("Datastore field not found in config")
|
|
}
|
|
datastore, ok := reflectedDatastore.(map[string]any)
|
|
if !ok {
|
|
t.Fatal("Datastore field didn't convert to map")
|
|
}
|
|
storageGCWatermark, ok := datastore["StorageGCWatermark"]
|
|
if !ok {
|
|
t.Fatal("StorageGCWatermark field not found in Datastore")
|
|
}
|
|
// Test int field
|
|
if _, ok := storageGCWatermark.(int64); !ok {
|
|
t.Fatal("StorageGCWatermark field didn't convert to int64")
|
|
}
|
|
noSync, ok := datastore["NoSync"]
|
|
if !ok {
|
|
t.Fatal("NoSync field not found in Datastore")
|
|
}
|
|
// Test bool field
|
|
if _, ok := noSync.(bool); !ok {
|
|
t.Fatal("NoSync field didn't convert to bool")
|
|
}
|
|
|
|
reflectedDNS, ok := mapConfig["DNS"]
|
|
if !ok {
|
|
t.Fatal("DNS field not found in config")
|
|
}
|
|
DNS, ok := reflectedDNS.(map[string]any)
|
|
if !ok {
|
|
t.Fatal("DNS field didn't convert to map")
|
|
}
|
|
reflectedResolvers, ok := DNS["Resolvers"]
|
|
if !ok {
|
|
t.Fatal("Resolvers field not found in DNS")
|
|
}
|
|
// Test map field
|
|
if _, ok := reflectedResolvers.(map[string]any); !ok {
|
|
t.Fatal("Resolvers field didn't convert to map")
|
|
}
|
|
|
|
// Test pointer field
|
|
if _, ok := DNS["MaxCacheTTL"].(map[string]any); !ok {
|
|
// Since OptionalDuration only field is private, we cannot test it
|
|
t.Fatal("MaxCacheTTL field didn't convert to map")
|
|
}
|
|
}
|
|
|
|
// Test validation of options set through "ipfs config"
|
|
func TestCheckKey(t *testing.T) {
|
|
err := CheckKey("Foo.Bar")
|
|
if err == nil {
|
|
t.Fatal("Foo.Bar isn't a valid key in the config")
|
|
}
|
|
|
|
err = CheckKey("Provide.Strategy")
|
|
if err != nil {
|
|
t.Fatalf("%s: %s", err, "Provide.Strategy is a valid key in the config")
|
|
}
|
|
|
|
err = CheckKey("Provide.DHT.MaxWorkers")
|
|
if err != nil {
|
|
t.Fatalf("%s: %s", err, "Provide.DHT.MaxWorkers is a valid key in the config")
|
|
}
|
|
|
|
err = CheckKey("Provide.DHT.Interval")
|
|
if err != nil {
|
|
t.Fatalf("%s: %s", err, "Provide.DHT.Interval is a valid key in the config")
|
|
}
|
|
|
|
err = CheckKey("Provide.Foo")
|
|
if err == nil {
|
|
t.Fatal("Provide.Foo isn't a valid key in the config")
|
|
}
|
|
|
|
err = CheckKey("Gateway.PublicGateways.Foo.Paths")
|
|
if err != nil {
|
|
t.Fatalf("%s: %s", err, "Gateway.PublicGateways.Foo.Paths is a valid key in the config")
|
|
}
|
|
|
|
err = CheckKey("Gateway.PublicGateways.Foo.Bar")
|
|
if err == nil {
|
|
t.Fatal("Gateway.PublicGateways.Foo.Bar isn't a valid key in the config")
|
|
}
|
|
|
|
err = CheckKey("Plugins.Plugins.peerlog.Config.Enabled")
|
|
if err != nil {
|
|
t.Fatalf("%s: %s", err, "Plugins.Plugins.peerlog.Config.Enabled is a valid key in the config")
|
|
}
|
|
}
|