Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7ab59566 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Prevent unspecified values in soong_config_string_variable" am: 1da55692

Original change: https://android-review.googlesource.com/c/platform/build/soong/+/2030432

Change-Id: I06c567c8c442d27111e55f5b6ed1587bce245865
parents c20adfad 1da55692
Loading
Loading
Loading
Loading
+15 −1
Original line number Original line Diff line number Diff line
@@ -639,9 +639,13 @@ func (s *stringVariable) initializeProperties(v reflect.Value, typ reflect.Type)
// Extracts an interface from values containing the properties to apply based on config.
// Extracts an interface from values containing the properties to apply based on config.
// If config does not match a value with a non-nil property set, the default value will be returned.
// If config does not match a value with a non-nil property set, the default value will be returned.
func (s *stringVariable) PropertiesToApply(config SoongConfig, values reflect.Value) (interface{}, error) {
func (s *stringVariable) PropertiesToApply(config SoongConfig, values reflect.Value) (interface{}, error) {
	configValue := config.String(s.variable)
	if configValue != "" && !InList(configValue, s.values) {
		return nil, fmt.Errorf("Soong config property %q must be one of %v, found %q", s.variable, s.values, configValue)
	}
	for j, v := range s.values {
	for j, v := range s.values {
		f := values.Field(j)
		f := values.Field(j)
		if config.String(s.variable) == v && !f.Elem().IsNil() {
		if configValue == v && !f.Elem().IsNil() {
			return f.Interface(), nil
			return f.Interface(), nil
		}
		}
	}
	}
@@ -858,3 +862,13 @@ type emptyInterfaceStruct struct {
}
}


var emptyInterfaceType = reflect.TypeOf(emptyInterfaceStruct{}).Field(0).Type
var emptyInterfaceType = reflect.TypeOf(emptyInterfaceStruct{}).Field(0).Type

// InList checks if the string belongs to the list
func InList(s string, list []string) bool {
	for _, s2 := range list {
		if s2 == s {
			return true
		}
	}
	return false
}
+49 −0
Original line number Original line Diff line number Diff line
@@ -303,6 +303,10 @@ type soongConfigVars struct {
	Bool_var interface{}
	Bool_var interface{}
}
}


type stringSoongConfigVars struct {
	String_var interface{}
}

func Test_PropertiesToApply(t *testing.T) {
func Test_PropertiesToApply(t *testing.T) {
	mt, _ := newModuleType(&ModuleTypeProperties{
	mt, _ := newModuleType(&ModuleTypeProperties{
		Module_type:      "foo",
		Module_type:      "foo",
@@ -365,6 +369,51 @@ func Test_PropertiesToApply(t *testing.T) {
	}
	}
}
}


func Test_PropertiesToApply_String_Error(t *testing.T) {
	mt, _ := newModuleType(&ModuleTypeProperties{
		Module_type:      "foo",
		Config_namespace: "bar",
		Variables:        []string{"string_var"},
		Properties:       []string{"a", "b"},
	})
	mt.Variables = append(mt.Variables, &stringVariable{
		baseVariable: baseVariable{
			variable: "string_var",
		},
		values: []string{"a", "b", "c"},
	})
	stringVarPositive := &properties{
		A: proptools.StringPtr("A"),
		B: true,
	}
	conditionsDefault := &properties{
		A: proptools.StringPtr("default"),
		B: false,
	}
	actualProps := &struct {
		Soong_config_variables stringSoongConfigVars
	}{
		Soong_config_variables: stringSoongConfigVars{
			String_var: &boolVarProps{
				A:                  stringVarPositive.A,
				B:                  stringVarPositive.B,
				Conditions_default: conditionsDefault,
			},
		},
	}
	props := reflect.ValueOf(actualProps)

	_, err := PropertiesToApply(mt, props, Config(map[string]string{
		"string_var": "x",
	}))
	expected := `Soong config property "string_var" must be one of [a b c], found "x"`
	if err == nil {
		t.Fatalf("Expected an error, got nil")
	} else if err.Error() != expected {
		t.Fatalf("Error message was not correct, expected %q, got %q", expected, err.Error())
	}
}

func Test_Bp2BuildSoongConfigDefinitions(t *testing.T) {
func Test_Bp2BuildSoongConfigDefinitions(t *testing.T) {
	testCases := []struct {
	testCases := []struct {
		desc     string
		desc     string