Merge changes I5f2fd123,Ie8d8e229,Id2194f6b into main

* changes:
  Move RelativeToTop out of basePath
  Make PathForArbitraryOutput return an OutputPath
  Run TestClasspath subtests in parallel
This commit is contained in:
Colin Cross
2024-07-30 16:30:54 +00:00
committed by Gerrit Code Review
5 changed files with 47 additions and 31 deletions

View File

@@ -245,13 +245,13 @@ type Path interface {
// A standard build has the following structure:
// ../top/
// out/ - make install files go here.
// out/soong - this is the soongOutDir passed to NewTestConfig()
// out/soong - this is the outDir passed to NewTestConfig()
// ... - the source files
//
// This function converts a path so that it appears relative to the ../top/ directory, i.e.
// * Make install paths, which have the pattern "soongOutDir/../<path>" are converted into the top
// * Make install paths, which have the pattern "outDir/../<path>" are converted into the top
// relative path "out/<path>"
// * Soong install paths and other writable paths, which have the pattern "soongOutDir/<path>" are
// * Soong install paths and other writable paths, which have the pattern "outDir/soong/<path>" are
// converted into the top relative path "out/soong/<path>".
// * Source paths are already relative to the top.
// * Phony paths are not relative to anything.
@@ -261,8 +261,9 @@ type Path interface {
}
const (
OutDir = "out"
OutSoongDir = OutDir + "/soong"
testOutDir = "out"
testOutSoongSubDir = "/soong"
TestOutSoongDir = testOutDir + testOutSoongSubDir
)
// WritablePath is a type of path that can be used as an output for build rules.
@@ -1118,11 +1119,6 @@ func (p basePath) withRel(rel string) basePath {
return p
}
func (p basePath) RelativeToTop() Path {
ensureTestOnly()
return p
}
// SourcePath is a Path representing a file path rooted from SrcDir
type SourcePath struct {
basePath
@@ -1135,6 +1131,11 @@ func (p SourcePath) withRel(rel string) SourcePath {
return p
}
func (p SourcePath) RelativeToTop() Path {
ensureTestOnly()
return p
}
// safePathForSource is for paths that we expect are safe -- only for use by go
// code that is embedding ninja variables in paths
func safePathForSource(ctx PathContext, pathComponents ...string) (SourcePath, error) {
@@ -1218,11 +1219,13 @@ func PathForSource(ctx PathContext, pathComponents ...string) SourcePath {
// PathForArbitraryOutput creates a path for the given components. Unlike PathForOutput,
// the path is relative to the root of the output folder, not the out/soong folder.
func PathForArbitraryOutput(ctx PathContext, pathComponents ...string) Path {
p, err := validatePath(pathComponents...)
path, err := validatePath(pathComponents...)
if err != nil {
reportPathError(ctx, err)
}
return basePath{path: filepath.Join(ctx.Config().OutDir(), p)}
fullPath := filepath.Join(ctx.Config().OutDir(), path)
path = fullPath[len(fullPath)-len(path):]
return OutputPath{basePath{path, ""}, ctx.Config().OutDir(), fullPath}
}
// MaybeExistentPathForSource joins the provided path components and validates that the result
@@ -1325,8 +1328,8 @@ func (p SourcePath) OverlayPath(ctx ModuleMissingDepsPathContext, path Path) Opt
type OutputPath struct {
basePath
// The soong build directory, i.e. Config.SoongOutDir()
soongOutDir string
// The base out directory for this path, either Config.SoongOutDir() or Config.OutDir()
outDir string
fullPath string
}
@@ -1334,7 +1337,7 @@ type OutputPath struct {
func (p OutputPath) GobEncode() ([]byte, error) {
w := new(bytes.Buffer)
encoder := gob.NewEncoder(w)
err := errors.Join(encoder.Encode(p.basePath), encoder.Encode(p.soongOutDir), encoder.Encode(p.fullPath))
err := errors.Join(encoder.Encode(p.basePath), encoder.Encode(p.outDir), encoder.Encode(p.fullPath))
if err != nil {
return nil, err
}
@@ -1345,7 +1348,7 @@ func (p OutputPath) GobEncode() ([]byte, error) {
func (p *OutputPath) GobDecode(data []byte) error {
r := bytes.NewBuffer(data)
decoder := gob.NewDecoder(r)
err := errors.Join(decoder.Decode(&p.basePath), decoder.Decode(&p.soongOutDir), decoder.Decode(&p.fullPath))
err := errors.Join(decoder.Decode(&p.basePath), decoder.Decode(&p.outDir), decoder.Decode(&p.fullPath))
if err != nil {
return err
}
@@ -1365,7 +1368,7 @@ func (p OutputPath) WithoutRel() OutputPath {
}
func (p OutputPath) getSoongOutDir() string {
return p.soongOutDir
return p.outDir
}
func (p OutputPath) RelativeToTop() Path {
@@ -1373,8 +1376,13 @@ func (p OutputPath) RelativeToTop() Path {
}
func (p OutputPath) outputPathRelativeToTop() OutputPath {
p.fullPath = StringPathRelativeToTop(p.soongOutDir, p.fullPath)
p.soongOutDir = OutSoongDir
p.fullPath = StringPathRelativeToTop(p.outDir, p.fullPath)
if strings.HasSuffix(p.outDir, testOutSoongSubDir) {
p.outDir = TestOutSoongDir
} else {
// Handle the PathForArbitraryOutput case
p.outDir = testOutDir
}
return p
}
@@ -1420,7 +1428,7 @@ func PathForOutput(ctx PathContext, pathComponents ...string) OutputPath {
return OutputPath{basePath{path, ""}, ctx.Config().soongOutDir, fullPath}
}
// PathsForOutput returns Paths rooted from soongOutDir
// PathsForOutput returns Paths rooted from outDir
func PathsForOutput(ctx PathContext, paths []string) WritablePaths {
ret := make(WritablePaths, len(paths))
for i, path := range paths {
@@ -1751,9 +1759,9 @@ func ensureTestOnly() {
func (p InstallPath) RelativeToTop() Path {
ensureTestOnly()
if p.makePath {
p.soongOutDir = OutDir
p.soongOutDir = testOutDir
} else {
p.soongOutDir = OutSoongDir
p.soongOutDir = TestOutSoongDir
}
p.fullPath = filepath.Join(p.soongOutDir, p.path)
return p

View File

@@ -822,15 +822,15 @@ func newBaseTestingComponent(config Config, provider testBuildProvider) baseTest
// containing at most one instance of the temporary build directory at the start of the path while
// this assumes that there can be any number at any position.
func normalizeStringRelativeToTop(config Config, s string) string {
// The soongOutDir usually looks something like: /tmp/testFoo2345/001
// The outDir usually looks something like: /tmp/testFoo2345/001
//
// Replace any usage of the soongOutDir with out/soong, e.g. replace "/tmp/testFoo2345/001" with
// Replace any usage of the outDir with out/soong, e.g. replace "/tmp/testFoo2345/001" with
// "out/soong".
outSoongDir := filepath.Clean(config.soongOutDir)
re := regexp.MustCompile(`\Q` + outSoongDir + `\E\b`)
s = re.ReplaceAllString(s, "out/soong")
// Replace any usage of the soongOutDir/.. with out, e.g. replace "/tmp/testFoo2345" with
// Replace any usage of the outDir/.. with out, e.g. replace "/tmp/testFoo2345" with
// "out". This must come after the previous replacement otherwise this would replace
// "/tmp/testFoo2345/001" with "out/001" instead of "out/soong".
outDir := filepath.Dir(outSoongDir)
@@ -1234,8 +1234,14 @@ func StringPathRelativeToTop(soongOutDir string, path string) string {
}
if isRel {
if strings.HasSuffix(soongOutDir, testOutSoongSubDir) {
// The path is in the soong out dir so indicate that in the relative path.
return filepath.Join("out/soong", rel)
return filepath.Join(TestOutSoongDir, rel)
} else {
// Handle the PathForArbitraryOutput case
return filepath.Join(testOutDir, rel)
}
}
// Check to see if the path is relative to the top level out dir.

View File

@@ -16,7 +16,6 @@ package filesystem
import (
"os"
"path/filepath"
"testing"
"android/soong/android"
@@ -147,8 +146,8 @@ func TestIncludeMakeBuiltFiles(t *testing.T) {
output := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img")
stampFile := filepath.Join(result.Config.OutDir(), "target/product/test_device/obj/PACKAGING/system_intermediates/staging_dir.stamp")
fileListFile := filepath.Join(result.Config.OutDir(), "target/product/test_device/obj/PACKAGING/system_intermediates/file_list.txt")
stampFile := "out/target/product/test_device/obj/PACKAGING/system_intermediates/staging_dir.stamp"
fileListFile := "out/target/product/test_device/obj/PACKAGING/system_intermediates/file_list.txt"
android.AssertStringListContains(t, "deps of filesystem must include the staging dir stamp file", output.Implicits.Strings(), stampFile)
android.AssertStringListContains(t, "deps of filesystem must include the staging dir file list", output.Implicits.Strings(), fileListFile)
}

View File

@@ -56,7 +56,7 @@ func TestAndroidAppSet(t *testing.T) {
mkEntries := android.AndroidMkEntriesForTest(t, result.TestContext, module.Module())[0]
actualInstallFile := mkEntries.EntryMap["LOCAL_APK_SET_INSTALL_FILE"]
expectedInstallFile := []string{
strings.Replace(params.ImplicitOutputs[0].String(), android.OutSoongDir, result.Config.SoongOutDir(), 1),
strings.Replace(params.ImplicitOutputs[0].String(), android.TestOutSoongDir, result.Config.SoongOutDir(), 1),
}
if !reflect.DeepEqual(actualInstallFile, expectedInstallFile) {
t.Errorf("Unexpected LOCAL_APK_SET_INSTALL_FILE value: '%s', expected: '%s',",

View File

@@ -388,7 +388,9 @@ func TestClasspath(t *testing.T) {
},
}
t.Parallel()
t.Run("basic", func(t *testing.T) {
t.Parallel()
testClasspathTestCases(t, classpathTestcases, false)
})
@@ -404,6 +406,7 @@ func testClasspathTestCases(t *testing.T, classpathTestcases []classpathTestCase
}
t.Run(testcase.name, func(t *testing.T) {
t.Parallel()
moduleType := "java_library"
if testcase.moduleType != "" {
moduleType = testcase.moduleType