package osbuild1 import ( "bytes" "encoding/json" "reflect" "testing" "github.com/google/uuid" ) func TestStage_UnmarshalJSON(t *testing.T) { nullUUID := uuid.MustParse("00000000-0000-0000-0000-000000000000") type fields struct { Name string Options StageOptions } type args struct { data []byte } tests := []struct { name string fields fields args args wantErr bool }{ { name: "invalid json", args: args{ data: []byte(`{"name":"org.osbuild.foo","options":{"bar":null}`), }, wantErr: true, }, { name: "unknown stage", args: args{ data: []byte(`{"name":"org.osbuild.foo","options":{"bar":null}}`), }, wantErr: true, }, { name: "missing options", args: args{ data: []byte(`{"name":"org.osbuild.locale"}`), }, wantErr: true, }, { name: "missing name", args: args{ data: []byte(`{"foo":null,"options":{"bar":null}}`), }, wantErr: true, }, { name: "chrony", fields: fields{ Name: "org.osbuild.chrony", Options: &ChronyStageOptions{}, }, args: args{ data: []byte(`{"name":"org.osbuild.chrony","options":{"timeservers":null}}`), }, }, { name: "firewall", fields: fields{ Name: "org.osbuild.firewall", Options: &FirewallStageOptions{}, }, args: args{ data: []byte(`{"name":"org.osbuild.firewall","options":{}}`), }, }, { name: "fix-bls", fields: fields{ Name: "org.osbuild.fix-bls", Options: &FixBLSStageOptions{}, }, args: args{ data: []byte(`{"name":"org.osbuild.fix-bls","options":{}}`), }, }, { name: "fstab", fields: fields{ Name: "org.osbuild.fstab", Options: &FSTabStageOptions{}, }, args: args{ data: []byte(`{"name":"org.osbuild.fstab","options":{"filesystems":null}}`), }, }, { name: "groups", fields: fields{ Name: "org.osbuild.groups", Options: &GroupsStageOptions{}, }, args: args{ data: []byte(`{"name":"org.osbuild.groups","options":{"groups":null}}`), }, }, { name: "grub2", fields: fields{ Name: "org.osbuild.grub2", Options: &GRUB2StageOptions{ RootFilesystemUUID: nullUUID, }, }, args: args{ data: []byte(`{"name":"org.osbuild.grub2","options":{"root_fs_uuid":"00000000-0000-0000-0000-000000000000"}}`), }, }, { name: "grub2-uefi", fields: fields{ Name: "org.osbuild.grub2", Options: &GRUB2StageOptions{ RootFilesystemUUID: nullUUID, UEFI: &GRUB2UEFI{ Vendor: "vendor", }, }, }, args: args{ data: []byte(`{"name":"org.osbuild.grub2","options":{"root_fs_uuid":"00000000-0000-0000-0000-000000000000","uefi":{"vendor":"vendor"}}}`), }, }, { name: "grub2-separate-boot", fields: fields{ Name: "org.osbuild.grub2", Options: &GRUB2StageOptions{ RootFilesystemUUID: nullUUID, BootFilesystemUUID: &nullUUID, }, }, args: args{ data: []byte(`{"name":"org.osbuild.grub2","options":{"root_fs_uuid":"00000000-0000-0000-0000-000000000000","boot_fs_uuid":"00000000-0000-0000-0000-000000000000"}}`), }, }, { name: "hostname", fields: fields{ Name: "org.osbuild.hostname", Options: &HostnameStageOptions{}, }, args: args{ data: []byte(`{"name":"org.osbuild.hostname","options":{"hostname":""}}`), }, }, { name: "keymap", fields: fields{ Name: "org.osbuild.keymap", Options: &KeymapStageOptions{}, }, args: args{ data: []byte(`{"name":"org.osbuild.keymap","options":{"keymap":""}}`), }, }, { name: "locale", fields: fields{ Name: "org.osbuild.locale", Options: &LocaleStageOptions{}, }, args: args{ data: []byte(`{"name":"org.osbuild.locale","options":{"language":""}}`), }, }, { name: "rhsm-empty", fields: fields{ Name: "org.osbuild.rhsm", Options: &RHSMStageOptions{}, }, args: args{ data: []byte(`{"name":"org.osbuild.rhsm","options":{}}`), }, }, { name: "rhsm", fields: fields{ Name: "org.osbuild.rhsm", Options: &RHSMStageOptions{ DnfPlugins: &RHSMStageOptionsDnfPlugins{ ProductID: &RHSMStageOptionsDnfPlugin{ Enabled: false, }, SubscriptionManager: &RHSMStageOptionsDnfPlugin{ Enabled: false, }, }, }, }, args: args{ data: []byte(`{"name":"org.osbuild.rhsm","options":{"dnf-plugins":{"product-id":{"enabled":false},"subscription-manager":{"enabled":false}}}}`), }, }, { name: "rpm-empty", fields: fields{ Name: "org.osbuild.rpm", Options: &RPMStageOptions{}, }, args: args{ data: []byte(`{"name":"org.osbuild.rpm","options":{"packages":null}}`), }, }, { name: "rpm", fields: fields{ Name: "org.osbuild.rpm", Options: &RPMStageOptions{ GPGKeys: []string{"key1", "key2"}, Packages: []RPMPackage{ { Checksum: "checksum1", }, { Checksum: "checksum2", CheckGPG: true, }, }, }, }, args: args{ data: []byte(`{"name":"org.osbuild.rpm","options":{"gpgkeys":["key1","key2"],"packages":[{"checksum":"checksum1"},{"checksum":"checksum2","check_gpg":true}]}}`), }, }, { name: "rpm-ostree", fields: fields{ Name: "org.osbuild.rpm-ostree", Options: &RPMOSTreeStageOptions{ EtcGroupMembers: []string{ "wheel", }, }, }, args: args{ data: []byte(`{"name":"org.osbuild.rpm-ostree","options":{"etc_group_members":["wheel"]}}`), }, }, { name: "script", fields: fields{ Name: "org.osbuild.script", Options: &ScriptStageOptions{}, }, args: args{ data: []byte(`{"name":"org.osbuild.script","options":{"script":""}}`), }, }, { name: "selinux", fields: fields{ Name: "org.osbuild.selinux", Options: &SELinuxStageOptions{}, }, args: args{ data: []byte(`{"name":"org.osbuild.selinux","options":{"file_contexts":""}}`), }, }, { name: "systemd", fields: fields{ Name: "org.osbuild.systemd", Options: &SystemdStageOptions{}, }, args: args{ data: []byte(`{"name":"org.osbuild.systemd","options":{}}`), }, }, { name: "systemd-enabled", fields: fields{ Name: "org.osbuild.systemd", Options: &SystemdStageOptions{ EnabledServices: []string{"foo.service"}, }, }, args: args{ data: []byte(`{"name":"org.osbuild.systemd","options":{"enabled_services":["foo.service"]}}`), }, }, { name: "timezone", fields: fields{ Name: "org.osbuild.timezone", Options: &TimezoneStageOptions{}, }, args: args{ data: []byte(`{"name":"org.osbuild.timezone","options":{"zone":""}}`), }, }, { name: "users", fields: fields{ Name: "org.osbuild.users", Options: &UsersStageOptions{}, }, args: args{ data: []byte(`{"name":"org.osbuild.users","options":{"users":null}}`), }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { stage := &Stage{ Name: tt.fields.Name, Options: tt.fields.Options, } var gotStage Stage if err := gotStage.UnmarshalJSON(tt.args.data); (err != nil) != tt.wantErr { t.Errorf("Stage.UnmarshalJSON() error = %v, wantErr %v", err, tt.wantErr) } if tt.wantErr { return } gotBytes, err := json.Marshal(stage) if err != nil { t.Errorf("Could not marshal stage: %v", err) } if !bytes.Equal(gotBytes, tt.args.data) { t.Errorf("Expected `%v`, got `%v`", string(tt.args.data), string(gotBytes)) } if !reflect.DeepEqual(&gotStage, stage) { t.Errorf("got {%v, %v}, expected {%v, %v}", gotStage.Name, gotStage.Options, stage.Name, stage.Options) } }) } }