// Copyright (c) 2026 Storm Dragon // Authors: Storm Dragon, Angus Kola // SPDX-License-Identifier: GPL-3.0-or-later package config import ( "bytes" "os" "path/filepath" "reflect" "strings" "testing" ) func TestGreeterCopyUsesOnlyEffectiveActiveProfile(t *testing.T) { directory := t.TempDir() sourcePath := filepath.Join(directory, "source.toml") contents := []byte("schema-version = 2\nactive-profile = 'custom'\n" + "[profiles.custom.speech.default-voice]\nrate = 73.0\n" + "[profiles.custom.keyboard]\nlayout = 2\nscreen-reader-keys = ['Caps_Lock']\n" + "[profiles.custom.braille]\nenabled = true\n" + "[profiles.application.speech]\nenabled = false\n" + "[applications]\n'example-editor' = 'application'\n") if err := os.WriteFile(sourcePath, contents, 0o600); err != nil { t.Fatal(err) } settings, err := Load(sourcePath) if err != nil { t.Fatal(err) } targetPath := filepath.Join(directory, "greeter.toml") // Repeated exports must replace stale profiles and mappings too. if err := os.WriteFile(targetPath, contents, 0o644); err != nil { t.Fatal(err) } if err := WriteGreeterSettings(targetPath, settings); err != nil { t.Fatal(err) } exported, err := Load(targetPath) if err != nil { t.Fatal(err) } settings.Path, settings.ActiveProfile = targetPath, "greeter" if !reflect.DeepEqual(exported, settings) { t.Fatalf("export changed effective settings: got %#v, want %#v", exported, settings) } data, _ := os.ReadFile(targetPath) document, _, err := decodeDocument(data) if err != nil || len(document.Profiles) != 1 || len(document.Applications) != 0 { t.Fatalf("export retained other profiles: %+v, %v", document, err) } info, _ := os.Stat(targetPath) if info.Mode().Perm() != 0o600 { t.Fatalf("export permissions = %o", info.Mode().Perm()) } unchanged, _ := os.ReadFile(sourcePath) if string(unchanged) != string(contents) { t.Fatal("export changed source settings") } } func TestGreeterPipeRejectsInvalidOrOversizedSettings(t *testing.T) { for _, contents := range []string{"", "schema-version = 999", strings.Repeat(" ", maxConfigSize+1)} { if _, err := ReadGreeterSettings(strings.NewReader(contents)); err == nil { t.Fatal("accepted invalid or oversized settings pipe") } } settings := DefaultSettings() settings.EnableEchoByWord = true contents, err := GreeterSettings(settings) if err != nil { t.Fatal(err) } copied, err := ReadGreeterSettings(bytes.NewReader(contents)) if err != nil || copied.ActiveProfile != "greeter" || !copied.EnableEchoByWord { t.Fatalf("pipe round trip = %#v, error %v", copied, err) } } func TestGreeterCopyPreservesSourceAndExistingOutputOnFailure(t *testing.T) { directory := t.TempDir() source := filepath.Join(directory, "source.toml") if err := os.WriteFile(source, []byte("original"), 0o600); err != nil { t.Fatal(err) } settings := DefaultSettings() settings.Path = source alias := filepath.Join(directory, "alias.toml") if err := os.Symlink(source, alias); err != nil { t.Fatal(err) } for _, path := range []string{source, alias} { if err := WriteGreeterSettings(path, settings); err == nil { t.Fatal("export replaced its own source") } } target := filepath.Join(directory, "target.toml") if err := os.WriteFile(target, []byte("previous export"), 0o600); err != nil { t.Fatal(err) } settings.SoundVolume = 2.0 if err := WriteGreeterSettings(target, settings); err == nil { t.Fatal("invalid settings were exported") } data, _ := os.ReadFile(target) if string(data) != "previous export" { t.Fatal("failed export changed existing output") } }