201 lines
6.4 KiB
Go
201 lines
6.4 KiB
Go
// Copyright (C) 2020 The Android Open Source Project
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package sdk
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"android/soong/android"
|
|
|
|
"github.com/google/blueprint/proptools"
|
|
)
|
|
|
|
func propertySetFixture() interface{} {
|
|
set := newPropertySet()
|
|
set.AddProperty("x", "taxi")
|
|
set.AddPropertyWithTag("y", 1729, "tag_y")
|
|
subset := set.AddPropertySet("sub")
|
|
subset.AddPropertyWithTag("x", "taxi", "tag_x")
|
|
subset.AddProperty("y", 1729)
|
|
return set
|
|
}
|
|
|
|
func intPtr(i int) *int { return &i }
|
|
|
|
type propertyStruct struct {
|
|
X *string
|
|
Y *int
|
|
Unset *bool
|
|
Sub struct {
|
|
X *string
|
|
Y *int
|
|
Unset *bool
|
|
}
|
|
}
|
|
|
|
func propertyStructFixture() interface{} {
|
|
str := &propertyStruct{}
|
|
str.X = proptools.StringPtr("taxi")
|
|
str.Y = intPtr(1729)
|
|
str.Sub.X = proptools.StringPtr("taxi")
|
|
str.Sub.Y = intPtr(1729)
|
|
return str
|
|
}
|
|
|
|
func checkPropertySetFixture(t *testing.T, val interface{}, hasTags bool) {
|
|
set := val.(*bpPropertySet)
|
|
android.AssertDeepEquals(t, "wrong x value", "taxi", set.getValue("x"))
|
|
android.AssertDeepEquals(t, "wrong y value", 1729, set.getValue("y"))
|
|
|
|
subset := set.getValue("sub").(*bpPropertySet)
|
|
android.AssertDeepEquals(t, "wrong sub.x value", "taxi", subset.getValue("x"))
|
|
android.AssertDeepEquals(t, "wrong sub.y value", 1729, subset.getValue("y"))
|
|
|
|
if hasTags {
|
|
android.AssertDeepEquals(t, "wrong y tag", "tag_y", set.getTag("y"))
|
|
android.AssertDeepEquals(t, "wrong sub.x tag", "tag_x", subset.getTag("x"))
|
|
} else {
|
|
android.AssertDeepEquals(t, "wrong y tag", nil, set.getTag("y"))
|
|
android.AssertDeepEquals(t, "wrong sub.x tag", nil, subset.getTag("x"))
|
|
}
|
|
}
|
|
|
|
func TestAddPropertySimple(t *testing.T) {
|
|
set := newPropertySet()
|
|
for name, val := range map[string]interface{}{
|
|
"x": "taxi",
|
|
"y": 1729,
|
|
"t": true,
|
|
"f": false,
|
|
"arr": []string{"a", "b", "c"},
|
|
} {
|
|
set.AddProperty(name, val)
|
|
android.AssertDeepEquals(t, "wrong value", val, set.getValue(name))
|
|
}
|
|
android.AssertPanicMessageContains(t, "adding x again should panic", `Property "x" already exists in property set`,
|
|
func() { set.AddProperty("x", "taxi") })
|
|
android.AssertPanicMessageContains(t, "adding arr again should panic", `Property "arr" already exists in property set`,
|
|
func() { set.AddProperty("arr", []string{"d"}) })
|
|
}
|
|
|
|
func TestAddPropertySubset(t *testing.T) {
|
|
getFixtureMap := map[string]func() interface{}{
|
|
"property set": propertySetFixture,
|
|
"property struct": propertyStructFixture,
|
|
}
|
|
|
|
t.Run("add new subset", func(t *testing.T) {
|
|
for name, getFixture := range getFixtureMap {
|
|
t.Run(name, func(t *testing.T) {
|
|
set := propertySetFixture().(*bpPropertySet)
|
|
set.AddProperty("new", getFixture())
|
|
checkPropertySetFixture(t, set, true)
|
|
checkPropertySetFixture(t, set.getValue("new"), name == "property set")
|
|
})
|
|
}
|
|
})
|
|
|
|
t.Run("merge existing subset", func(t *testing.T) {
|
|
for name, getFixture := range getFixtureMap {
|
|
t.Run(name, func(t *testing.T) {
|
|
set := newPropertySet()
|
|
subset := set.AddPropertySet("sub")
|
|
subset.AddProperty("flag", false)
|
|
subset.AddPropertySet("sub")
|
|
set.AddProperty("sub", getFixture())
|
|
merged := set.getValue("sub").(*bpPropertySet)
|
|
android.AssertDeepEquals(t, "wrong flag value", false, merged.getValue("flag"))
|
|
checkPropertySetFixture(t, merged, name == "property set")
|
|
})
|
|
}
|
|
})
|
|
|
|
t.Run("add conflicting subset", func(t *testing.T) {
|
|
set := propertySetFixture().(*bpPropertySet)
|
|
android.AssertPanicMessageContains(t, "adding x again should panic", `Property "x" already exists in property set`,
|
|
func() { set.AddProperty("x", propertySetFixture()) })
|
|
})
|
|
|
|
t.Run("add non-pointer struct", func(t *testing.T) {
|
|
set := propertySetFixture().(*bpPropertySet)
|
|
str := propertyStructFixture().(*propertyStruct)
|
|
android.AssertPanicMessageContains(t, "adding a non-pointer struct should panic", "Value is a struct, not a pointer to one:",
|
|
func() { set.AddProperty("new", *str) })
|
|
})
|
|
}
|
|
|
|
func TestAddPropertySetNew(t *testing.T) {
|
|
set := newPropertySet()
|
|
subset := set.AddPropertySet("sub")
|
|
subset.AddProperty("new", "d^^b")
|
|
android.AssertDeepEquals(t, "wrong sub.new value", "d^^b", set.getValue("sub").(*bpPropertySet).getValue("new"))
|
|
}
|
|
|
|
func TestAddPropertySetExisting(t *testing.T) {
|
|
set := propertySetFixture().(*bpPropertySet)
|
|
subset := set.AddPropertySet("sub")
|
|
subset.AddProperty("new", "d^^b")
|
|
android.AssertDeepEquals(t, "wrong sub.new value", "d^^b", set.getValue("sub").(*bpPropertySet).getValue("new"))
|
|
}
|
|
|
|
type removeFredTransformation struct {
|
|
identityTransformation
|
|
}
|
|
|
|
func (t removeFredTransformation) transformProperty(name string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) {
|
|
if name == "fred" {
|
|
return nil, nil
|
|
}
|
|
return value, tag
|
|
}
|
|
|
|
func (t removeFredTransformation) transformPropertySetBeforeContents(name string, propertySet *bpPropertySet, tag android.BpPropertyTag) (*bpPropertySet, android.BpPropertyTag) {
|
|
if name == "fred" {
|
|
return nil, nil
|
|
}
|
|
return propertySet, tag
|
|
}
|
|
|
|
func (t removeFredTransformation) transformPropertySetAfterContents(name string, propertySet *bpPropertySet, tag android.BpPropertyTag) (*bpPropertySet, android.BpPropertyTag) {
|
|
if len(propertySet.properties) == 0 {
|
|
return nil, nil
|
|
}
|
|
return propertySet, tag
|
|
}
|
|
|
|
func TestTransformRemoveProperty(t *testing.T) {
|
|
set := newPropertySet()
|
|
set.AddProperty("name", "name")
|
|
set.AddProperty("fred", "12")
|
|
|
|
set.transformContents(removeFredTransformation{})
|
|
|
|
contents := &generatedContents{}
|
|
outputPropertySet(contents, set)
|
|
android.AssertTrimmedStringEquals(t, "removing property failed", "name: \"name\",\n", contents.content.String())
|
|
}
|
|
|
|
func TestTransformRemovePropertySet(t *testing.T) {
|
|
set := newPropertySet()
|
|
set.AddProperty("name", "name")
|
|
set.AddPropertySet("fred")
|
|
|
|
set.transformContents(removeFredTransformation{})
|
|
|
|
contents := &generatedContents{}
|
|
outputPropertySet(contents, set)
|
|
android.AssertTrimmedStringEquals(t, "removing property set failed", "name: \"name\",\n", contents.content.String())
|
|
}
|