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

Commit 3998234d authored by Jaewoong Jung's avatar Jaewoong Jung
Browse files

Overwrite test-file-name in test config.

If the install apk name is different than the module name, use
test_config_fixer to update the test-file-name value in the config.

Test: app_test.go
Fixes: 147375216
Change-Id: I2141eeebbb3552995400b45634712306673fd812
parent 1be2d480
Loading
Loading
Loading
Loading
+28 −10
Original line number Diff line number Diff line
@@ -644,20 +644,38 @@ func (a *AndroidTest) GenerateAndroidBuildActions(ctx android.ModuleContext) {
	}
	a.generateAndroidBuildActions(ctx)

	a.testConfig = tradefed.AutoGenInstrumentationTestConfig(ctx, a.testProperties.Test_config,
	testConfig := tradefed.AutoGenInstrumentationTestConfig(ctx, a.testProperties.Test_config,
		a.testProperties.Test_config_template, a.manifestPath, a.testProperties.Test_suites, a.testProperties.Auto_gen_config)
	if a.overridableAppProperties.Package_name != nil {
	a.testConfig = a.FixTestConfig(ctx, testConfig)
	a.data = android.PathsForModuleSrc(ctx, a.testProperties.Data)
}

func (a *AndroidTest) FixTestConfig(ctx android.ModuleContext, testConfig android.Path) android.Path {
	if testConfig == nil {
		return nil
	}

	fixedConfig := android.PathForModuleOut(ctx, "test_config_fixer", "AndroidTest.xml")
	rule := android.NewRuleBuilder()
		rule.Command().BuiltTool(ctx, "test_config_fixer").
			FlagWithInput("--manifest ", a.manifestPath).
			FlagWithArg("--package-name ", *a.overridableAppProperties.Package_name).
			Input(a.testConfig).
			Output(fixedConfig)
	command := rule.Command().BuiltTool(ctx, "test_config_fixer").Input(testConfig).Output(fixedConfig)
	fixNeeded := false

	if ctx.ModuleName() != a.installApkName {
		fixNeeded = true
		command.FlagWithArg("--test-file-name ", a.installApkName+".apk")
	}

	if a.overridableAppProperties.Package_name != nil {
		fixNeeded = true
		command.FlagWithInput("--manifest ", a.manifestPath).
			FlagWithArg("--package-name ", *a.overridableAppProperties.Package_name)
	}

	if fixNeeded {
		rule.Build(pctx, ctx, "fix_test_config", "fix test config")
		a.testConfig = fixedConfig
		return fixedConfig
	}
	a.data = android.PathsForModuleSrc(ctx, a.testProperties.Data)
	return testConfig
}

func (a *AndroidTest) DepsMutator(ctx android.BottomUpMutatorContext) {
+81 −0
Original line number Diff line number Diff line
@@ -1305,6 +1305,87 @@ func TestOverrideAndroidTest(t *testing.T) {
	}
}

func TestAndroidTest_FixTestConfig(t *testing.T) {
	ctx, _ := testJava(t, `
		android_app {
			name: "foo",
			srcs: ["a.java"],
			package_name: "com.android.foo",
			sdk_version: "current",
		}

		android_test {
			name: "foo_test",
			srcs: ["b.java"],
			instrumentation_for: "foo",
		}

		android_test {
			name: "bar_test",
			srcs: ["b.java"],
			package_name: "com.android.bar.test",
			instrumentation_for: "foo",
		}

		override_android_test {
			name: "baz_test",
			base: "foo_test",
			package_name: "com.android.baz.test",
		}
		`)

	testCases := []struct {
		moduleName    string
		variantName   string
		expectedFlags []string
	}{
		{
			moduleName:  "foo_test",
			variantName: "android_common",
		},
		{
			moduleName:  "bar_test",
			variantName: "android_common",
			expectedFlags: []string{
				"--manifest " + buildDir + "/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
				"--package-name com.android.bar.test",
			},
		},
		{
			moduleName:  "foo_test",
			variantName: "android_common_baz_test",
			expectedFlags: []string{
				"--manifest " + buildDir +
					"/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
				"--package-name com.android.baz.test",
				"--test-file-name baz_test.apk",
			},
		},
	}

	for _, test := range testCases {
		variant := ctx.ModuleForTests(test.moduleName, test.variantName)
		params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")

		if len(test.expectedFlags) > 0 {
			if params.Rule == nil {
				t.Errorf("test_config_fixer was expected to run, but didn't")
			} else {
				for _, flag := range test.expectedFlags {
					if !strings.Contains(params.RuleParams.Command, flag) {
						t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
					}
				}
			}
		} else {
			if params.Rule != nil {
				t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
			}
		}

	}
}

func TestAndroidAppImport(t *testing.T) {
	ctx, _ := testJava(t, `
		android_app_import {
+17 −1
Original line number Diff line number Diff line
@@ -37,6 +37,8 @@ def parse_args():
                      help=('AndroidManifest.xml that contains the original package name'))
  parser.add_argument('--package-name', default='', dest='package_name',
                      help=('overwrite package fields in the test config'))
  parser.add_argument('--test-file-name', default='', dest='test_file_name',
                      help=('overwrite test file name in the test config'))
  parser.add_argument('input', help='input test config file')
  parser.add_argument('output', help='output test config file')
  return parser.parse_args()
@@ -46,7 +48,6 @@ def overwrite_package_name(test_config_doc, manifest_doc, package_name):

  manifest = parse_manifest(manifest_doc)
  original_package = manifest.getAttribute('package')
  print('package: ' + original_package)

  test_config = parse_test_config(test_config_doc)
  tests = get_children_with_tag(test_config, 'test')
@@ -57,6 +58,18 @@ def overwrite_package_name(test_config_doc, manifest_doc, package_name):
      if option.getAttribute('name') == "package" and option.getAttribute('value') == original_package:
        option.setAttribute('value', package_name)

def overwrite_test_file_name(test_config_doc, test_file_name):

  test_config = parse_test_config(test_config_doc)
  tests = get_children_with_tag(test_config, 'target_preparer')

  for test in tests:
    if test.getAttribute('class') == "com.android.tradefed.targetprep.TestAppInstallSetup":
      options = get_children_with_tag(test, 'option')
      for option in options:
        if option.getAttribute('name') == "test-file-name":
          option.setAttribute('value', test_file_name)

def main():
  """Program entry point."""
  try:
@@ -70,6 +83,9 @@ def main():
      manifest_doc = minidom.parse(args.manifest)
      overwrite_package_name(doc, manifest_doc, args.package_name)

    if args.test_file_name:
      overwrite_test_file_name(doc, args.test_file_name)

    with open(args.output, 'wb') as f:
      write_xml(f, doc)

+27 −0
Original line number Diff line number Diff line
@@ -67,5 +67,32 @@ class OverwritePackageNameTest(unittest.TestCase):
    self.assertEqual(expected, output.getvalue())


class OverwriteTestFileNameTest(unittest.TestCase):
  """ Unit tests for overwrite_test_file_name function """

  test_config = (
      '<?xml version="1.0" encoding="utf-8"?>\n'
      '<configuration description="Runs some tests.">\n'
      '    <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">\n'
      '        <option name="test-file-name" value="%s"/>\n'
      '    </target_preparer>\n'
      '    <test class="com.android.tradefed.testtype.AndroidJUnitTest">\n'
      '        <option name="package" value="com.android.foo"/>\n'
      '        <option name="runtime-hint" value="20s"/>\n'
      '    </test>\n'
      '</configuration>\n')

  def test_all(self):
    doc = minidom.parseString(self.test_config % ("foo.apk"))

    test_config_fixer.overwrite_test_file_name(doc, "bar.apk")
    output = StringIO.StringIO()
    test_config_fixer.write_xml(output, doc)

    # Only the matching package name in a test node should be updated.
    expected = self.test_config % ("bar.apk")
    self.assertEqual(expected, output.getvalue())


if __name__ == '__main__':
  unittest.main(verbosity=2)