22
33import com .google .devtools .build .runfiles .Runfiles ;
44import java .io .IOException ;
5+ import java .io .File ;
56import java .util .List ;
67import java .util .Map ;
78import java .nio .charset .Charset ;
89import java .nio .file .Files ;
910import java .nio .file .Paths ;
1011
11- /** This exists only as a proxy for scala tests's runner to provide access to env variables */
12+ /** This exists only as a proxy for scala tests's runner to:
13+ * - provide access to env variables
14+ * - unwrap runner's arguments from a file (passed via file to overcome command-line string limitation on Windows)
15+ **/
1216public class Runner {
1317 /**
1418 * This is the name of the env var set by bazel when a user provides a `--test_filter` test option
1519 */
1620 private static final String TESTBRIDGE_TEST_ONLY = "TESTBRIDGE_TEST_ONLY" ;
1721
1822 /**
19- * This is the name of the system property used to pass Bazel's workspace name
23+ * This is the name of the system property used to pass the main workspace name
2024 */
21- private static final String RULES_SCALA_WS = "RULES_SCALA_WS " ;
25+ private static final String RULES_SCALA_MAIN_WS_NAME = "RULES_SCALA_MAIN_WS_NAME " ;
2226
2327 /**
2428 * This is the name of the system property used to pass a short path of the file, which includes
@@ -31,32 +35,26 @@ public static void main(String[] args) throws IOException {
3135 }
3236
3337 private static String [] extendArgs (String [] args , Map <String , String > env ) throws IOException {
34- args = extendFromSystemPropArgs (args );
38+ args = extendFromFileArgs (args );
3539 args = extendFromEnvVar (args , env , TESTBRIDGE_TEST_ONLY , "-s" );
3640 return args ;
3741 }
3842
39- private static String [] extendFromSystemPropArgs (String [] args ) throws IOException {
40- String rulesWorkspace = System .getProperty (RULES_SCALA_WS );
41- if (rulesWorkspace == null || rulesWorkspace .trim ().isEmpty ())
42- throw new IllegalArgumentException (RULES_SCALA_WS + " is null or empty." );
43-
44- String rulesArgsKey = System .getProperty (RULES_SCALA_ARGS_FILE );
45- if (rulesArgsKey == null || rulesArgsKey .trim ().isEmpty ())
43+ private static String [] extendFromFileArgs (String [] args ) throws IOException {
44+ String runnerArgsFileKey = System .getProperty (RULES_SCALA_ARGS_FILE );
45+ if (runnerArgsFileKey == null || runnerArgsFileKey .trim ().isEmpty ())
4646 throw new IllegalArgumentException (RULES_SCALA_ARGS_FILE + " is null or empty." );
4747
48- String rulesArgsPath = Runfiles . create (). rlocation ( rulesWorkspace + "/" + rulesArgsKey );
49- if (rulesArgsPath == null )
50- throw new IllegalArgumentException ("rlocation value is null for key: " + rulesArgsKey );
48+ String workspace = System . getProperty ( RULES_SCALA_MAIN_WS_NAME );
49+ if (workspace == null || workspace . trim (). isEmpty () )
50+ throw new IllegalArgumentException (RULES_SCALA_MAIN_WS_NAME + " is null or empty." );
5151
52- List <String > runnerArgs = Files .readAllLines (Paths .get (rulesArgsPath ), Charset .forName ("UTF-8" ));
52+ String runnerArgsFilePath = Runfiles .create ().rlocation (workspace + "/" + runnerArgsFileKey );
53+ if (runnerArgsFilePath == null )
54+ throw new IllegalArgumentException ("rlocation value is null for key: " + runnerArgsFileKey );
5355
54- int runpathFlag = runnerArgs .indexOf ("-R" );
55- if (runpathFlag >= 0 ) {
56- String runpathKey = runnerArgs .get (runpathFlag + 1 );
57- String runpath = Runfiles .create ().rlocation (rulesWorkspace + "/" + runpathKey );
58- runnerArgs .set (runpathFlag + 1 , runpath );
59- }
56+ List <String > runnerArgs = Files .readAllLines (Paths .get (runnerArgsFilePath ), Charset .forName ("UTF-8" ));
57+ rlocateRunpathValue (workspace , runnerArgs );
6058
6159 String [] runnerArgsArray = runnerArgs .toArray (new String [runnerArgs .size ()]);
6260
@@ -73,12 +71,28 @@ private static String[] extendFromEnvVar(
7371 if (value == null ) {
7472 return args ;
7573 }
76- ;
7774 String [] flag = new String [] {flagName , value };
7875 String [] result = new String [args .length + flag .length ];
7976 System .arraycopy (args , 0 , result , 0 , args .length );
8077 System .arraycopy (flag , 0 , result , args .length , flag .length );
8178
8279 return result ;
8380 }
81+
82+ /**
83+ * Replaces ScalaTest Runner's runpath elements paths (see http://www.scalatest.org/user_guide/using_the_runner)
84+ * with values from Bazel's runfiles
85+ */
86+ private static void rlocateRunpathValue (String rulesWorkspace , List <String > runnerArgs ) throws IOException {
87+ int runpathFlag = runnerArgs .indexOf ("-R" );
88+ if (runpathFlag >= 0 ) {
89+ String [] runpathElements = runnerArgs .get (runpathFlag + 1 ).split (File .pathSeparator );
90+ Runfiles runfiles = Runfiles .create ();
91+ for (int i = 0 ; i < runpathElements .length ; i ++) {
92+ runpathElements [i ] = runfiles .rlocation (rulesWorkspace + "/" + runpathElements [i ]);
93+ }
94+ String runpath = String .join (File .separator , runpathElements );
95+ runnerArgs .set (runpathFlag + 1 , runpath );
96+ }
97+ }
8498}
0 commit comments