123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- // 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())
- }
|