From 8ba3346bfdf0b37f826a270aabb604922513774b Mon Sep 17 00:00:00 2001 From: jdesprez Date: Wed, 5 Apr 2017 16:51:13 -0700 Subject: Ensure that Status checker are not shared by shard When using legacy sharding, ensure that system checker (that are stateful) are not shared between shards. Test: local unit tests Bug: 36776549 Change-Id: I59a3091734efd581b99ead5c42145383ce684f66 --- src/com/android/tradefed/invoker/ShardHelper.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src/com') diff --git a/src/com/android/tradefed/invoker/ShardHelper.java b/src/com/android/tradefed/invoker/ShardHelper.java index dd70dbce7..760ceb697 100644 --- a/src/com/android/tradefed/invoker/ShardHelper.java +++ b/src/com/android/tradefed/invoker/ShardHelper.java @@ -18,12 +18,15 @@ package com.android.tradefed.invoker; import com.android.tradefed.build.ExistingBuildProvider; import com.android.tradefed.build.IBuildInfo; import com.android.tradefed.config.ConfigurationException; +import com.android.tradefed.config.ConfigurationFactory; import com.android.tradefed.config.IConfiguration; import com.android.tradefed.log.LogUtil.CLog; import com.android.tradefed.result.IShardableListener; import com.android.tradefed.result.ITestInvocationListener; +import com.android.tradefed.suite.checker.ISystemStatusChecker; import com.android.tradefed.testtype.IRemoteTest; import com.android.tradefed.testtype.IShardableTest; +import com.android.tradefed.util.QuotationAwareTokenizer; import java.util.ArrayList; import java.util.Collection; @@ -71,6 +74,7 @@ public class ShardHelper { CLog.i("Rescheduling sharded config..."); IConfiguration shardConfig = config.clone(); shardConfig.setTest(testShard); + cloneStatusChecker(config, shardConfig); cloneBuildInfos(config, shardConfig, context); @@ -91,6 +95,23 @@ public class ShardHelper { return true; } + /** + * Helper to clone {@link ISystemStatusChecker}s from the original config to the clonedConfig. + */ + private static void cloneStatusChecker(IConfiguration oriConfig, IConfiguration clonedConfig) { + try { + IConfiguration deepCopy = + ConfigurationFactory.getInstance() + .createConfigurationFromArgs( + QuotationAwareTokenizer.tokenizeLine( + oriConfig.getCommandLine())); + clonedConfig.setSystemStatusCheckers(deepCopy.getSystemStatusCheckers()); + } catch (ConfigurationException e) { + // should not happen + throw new RuntimeException("failed to deep copy a configuration", e); + } + } + /** * Attempt to shard given {@link IRemoteTest}. * -- cgit v1.2.3