1package android
2
3import (
4	"testing"
5)
6
7var packageTests = []struct {
8	name           string
9	fs             map[string][]byte
10	expectedErrors []string
11}{
12	// Package default_visibility handling is tested in visibility_test.go
13	{
14		name: "package must not accept visibility and name properties",
15		fs: map[string][]byte{
16			"top/Blueprints": []byte(`
17				package {
18					name: "package",
19					visibility: ["//visibility:private"],
20				}`),
21		},
22		expectedErrors: []string{
23			`top/Blueprints:3:10: unrecognized property "name"`,
24			`top/Blueprints:4:16: unrecognized property "visibility"`,
25		},
26	},
27	{
28		name: "multiple packages in separate directories",
29		fs: map[string][]byte{
30			"top/Blueprints": []byte(`
31				package {
32				}`),
33			"other/Blueprints": []byte(`
34				package {
35				}`),
36			"other/nested/Blueprints": []byte(`
37				package {
38				}`),
39		},
40	},
41	{
42		name: "package must not be specified more than once per package",
43		fs: map[string][]byte{
44			"top/Blueprints": []byte(`
45				package {
46					default_visibility: ["//visibility:private"],
47				}
48
49        package {
50				}`),
51		},
52		expectedErrors: []string{
53			`module "//top" already defined`,
54		},
55	},
56}
57
58func TestPackage(t *testing.T) {
59	for _, test := range packageTests {
60		t.Run(test.name, func(t *testing.T) {
61			_, errs := testPackage(test.fs)
62
63			expectedErrors := test.expectedErrors
64			if expectedErrors == nil {
65				FailIfErrored(t, errs)
66			} else {
67				for _, expectedError := range expectedErrors {
68					FailIfNoMatchingErrors(t, expectedError, errs)
69				}
70				if len(errs) > len(expectedErrors) {
71					t.Errorf("additional errors found, expected %d, found %d", len(expectedErrors), len(errs))
72					for i, expectedError := range expectedErrors {
73						t.Errorf("expectedErrors[%d] = %s", i, expectedError)
74					}
75					for i, err := range errs {
76						t.Errorf("errs[%d] = %s", i, err)
77					}
78				}
79			}
80		})
81	}
82}
83
84func testPackage(fs map[string][]byte) (*TestContext, []error) {
85
86	// Create a new config per test as visibility information is stored in the config.
87	config := TestArchConfig(buildDir, nil, "", fs)
88
89	ctx := NewTestArchContext()
90	RegisterPackageBuildComponents(ctx)
91	ctx.Register(config)
92
93	_, errs := ctx.ParseBlueprintsFiles(".")
94	if len(errs) > 0 {
95		return ctx, errs
96	}
97
98	_, errs = ctx.PrepareBuildActions(config)
99	return ctx, errs
100}
101