Skip to content

Commit 74ac36f

Browse files
committed
[SYSTEMDS-3842] Improve test coverage of API components: DMLScript & DMLOptions
1 parent cfbe190 commit 74ac36f

File tree

9 files changed

+716
-41
lines changed

9 files changed

+716
-41
lines changed

src/main/java/org/apache/sysds/api/DMLOptions.java

+42-40
Original file line numberDiff line numberDiff line change
@@ -141,34 +141,32 @@ public static DMLOptions parseCLArguments(String[] args)
141141
String lineageTypes[] = line.getOptionValues("lineage");
142142
if (lineageTypes != null) {
143143
for (String lineageType : lineageTypes) {
144-
if (lineageType != null){
145-
if (lineageType.equalsIgnoreCase("dedup"))
146-
dmlOptions.lineage_dedup = lineageType.equalsIgnoreCase("dedup");
147-
else if (lineageType.equalsIgnoreCase("reuse_full")
148-
|| lineageType.equalsIgnoreCase("reuse"))
149-
dmlOptions.linReuseType = ReuseCacheType.REUSE_FULL;
150-
else if (lineageType.equalsIgnoreCase("reuse_partial"))
151-
dmlOptions.linReuseType = ReuseCacheType.REUSE_PARTIAL;
152-
else if (lineageType.equalsIgnoreCase("reuse_multilevel"))
153-
dmlOptions.linReuseType = ReuseCacheType.REUSE_MULTILEVEL;
154-
else if (lineageType.equalsIgnoreCase("reuse_hybrid"))
155-
dmlOptions.linReuseType = ReuseCacheType.REUSE_HYBRID;
156-
else if (lineageType.equalsIgnoreCase("none"))
157-
dmlOptions.linReuseType = ReuseCacheType.NONE;
158-
else if (lineageType.equalsIgnoreCase("policy_lru"))
159-
dmlOptions.linCachePolicy = LineageCachePolicy.LRU;
160-
else if (lineageType.equalsIgnoreCase("policy_costnsize"))
161-
dmlOptions.linCachePolicy = LineageCachePolicy.COSTNSIZE;
162-
else if (lineageType.equalsIgnoreCase("policy_dagheight"))
163-
dmlOptions.linCachePolicy = LineageCachePolicy.DAGHEIGHT;
164-
else if (lineageType.equalsIgnoreCase("estimate"))
165-
dmlOptions.lineage_estimate = lineageType.equalsIgnoreCase("estimate");
166-
else if (lineageType.equalsIgnoreCase("debugger"))
167-
dmlOptions.lineage_debugger = lineageType.equalsIgnoreCase("debugger");
168-
else
169-
throw new org.apache.commons.cli.ParseException(
170-
"Invalid argument specified for -lineage option: " + lineageType);
171-
}
144+
if (lineageType.equalsIgnoreCase("dedup"))
145+
dmlOptions.lineage_dedup = lineageType.equalsIgnoreCase("dedup");
146+
else if (lineageType.equalsIgnoreCase("reuse_full")
147+
|| lineageType.equalsIgnoreCase("reuse"))
148+
dmlOptions.linReuseType = ReuseCacheType.REUSE_FULL;
149+
else if (lineageType.equalsIgnoreCase("reuse_partial"))
150+
dmlOptions.linReuseType = ReuseCacheType.REUSE_PARTIAL;
151+
else if (lineageType.equalsIgnoreCase("reuse_multilevel"))
152+
dmlOptions.linReuseType = ReuseCacheType.REUSE_MULTILEVEL;
153+
else if (lineageType.equalsIgnoreCase("reuse_hybrid"))
154+
dmlOptions.linReuseType = ReuseCacheType.REUSE_HYBRID;
155+
else if (lineageType.equalsIgnoreCase("none"))
156+
dmlOptions.linReuseType = ReuseCacheType.NONE;
157+
else if (lineageType.equalsIgnoreCase("policy_lru"))
158+
dmlOptions.linCachePolicy = LineageCachePolicy.LRU;
159+
else if (lineageType.equalsIgnoreCase("policy_costnsize"))
160+
dmlOptions.linCachePolicy = LineageCachePolicy.COSTNSIZE;
161+
else if (lineageType.equalsIgnoreCase("policy_dagheight"))
162+
dmlOptions.linCachePolicy = LineageCachePolicy.DAGHEIGHT;
163+
else if (lineageType.equalsIgnoreCase("estimate"))
164+
dmlOptions.lineage_estimate = true;
165+
else if (lineageType.equalsIgnoreCase("debugger"))
166+
dmlOptions.lineage_debugger = true;
167+
else
168+
throw new org.apache.commons.cli.ParseException(
169+
"Invalid argument specified for -lineage option: " + lineageType);
172170
}
173171
}
174172
}
@@ -186,13 +184,11 @@ else if (lineageType.equalsIgnoreCase("debugger"))
186184
}
187185
if (line.hasOption("exec")){
188186
String execMode = line.getOptionValue("exec");
189-
if (execMode != null){
190-
if (execMode.equalsIgnoreCase("singlenode")) dmlOptions.execMode = ExecMode.SINGLE_NODE;
191-
else if (execMode.equalsIgnoreCase("hybrid")) dmlOptions.execMode = ExecMode.HYBRID;
192-
else if (execMode.equalsIgnoreCase("spark")) dmlOptions.execMode = ExecMode.SPARK;
193-
else throw new org.apache.commons.cli.ParseException("Invalid argument specified for -exec option, must be one of [hadoop, singlenode, hybrid, HYBRID, spark]");
194-
}
195-
}
187+
if (execMode.equalsIgnoreCase("singlenode")) dmlOptions.execMode = ExecMode.SINGLE_NODE;
188+
else if (execMode.equalsIgnoreCase("hybrid")) dmlOptions.execMode = ExecMode.HYBRID;
189+
else if (execMode.equalsIgnoreCase("spark")) dmlOptions.execMode = ExecMode.SPARK;
190+
else throw new org.apache.commons.cli.ParseException("Invalid argument specified for -exec option, must be one of [hadoop, singlenode, hybrid, HYBRID, spark]");
191+
}
196192
if (line.hasOption("explain")) {
197193
dmlOptions.explainType = ExplainType.RUNTIME;
198194
String explainType = line.getOptionValue("explain");
@@ -222,7 +218,7 @@ else if (lineageType.equalsIgnoreCase("debugger"))
222218
dmlOptions.statsNGrams = line.hasOption("ngrams");
223219
if (dmlOptions.statsNGrams){
224220
String[] nGramArgs = line.getOptionValues("ngrams");
225-
if (nGramArgs.length >= 2) {
221+
if (nGramArgs != null && nGramArgs.length >= 2) {
226222
try {
227223
String[] nGramSizeSplit = nGramArgs[0].split(",");
228224
dmlOptions.statsNGramSizes = new int[nGramSizeSplit.length];
@@ -273,11 +269,17 @@ else if (lineageType.equalsIgnoreCase("debugger"))
273269

274270
if (line.hasOption("fedMonitoring")) {
275271
dmlOptions.fedMonitoring= true;
276-
dmlOptions.fedMonitoringPort = Integer.parseInt(line.getOptionValue("fedMonitoring"));
272+
String port = line.getOptionValue("fedMonitoring");
273+
if(port != null)
274+
dmlOptions.fedMonitoringPort = Integer.parseInt(port);
275+
else
276+
throw new org.apache.commons.cli.ParseException("No port [integer] specified for -fedMonitoring option");
277277
}
278278

279279
if (line.hasOption("fedMonitoringAddress")) {
280280
dmlOptions.fedMonitoringAddress = line.getOptionValue("fedMonitoringAddress");
281+
if(dmlOptions.fedMonitoringAddress == null)
282+
throw new org.apache.commons.cli.ParseException("No address [String] specified for -fedMonitoringAddress option");
281283
}
282284

283285
if (line.hasOption("f")){
@@ -326,7 +328,7 @@ else if (lineageType.equalsIgnoreCase("debugger"))
326328
OptimizerUtils.FEDERATED_COMPILATION = true;
327329
dmlOptions.federatedCompilation = true;
328330
String[] fedCompSpecs = line.getOptionValues("federatedCompilation");
329-
if ( fedCompSpecs != null && fedCompSpecs.length > 0 ){
331+
if (fedCompSpecs != null){
330332
for ( String spec : fedCompSpecs ){
331333
String[] specPair = spec.split("=");
332334
if (specPair.length != 2){
@@ -370,8 +372,8 @@ private static Options createCLIOptions() {
370372
.withDescription("monitors and reports summary execution statistics; heavy hitter <count> is 10 unless overridden; default off")
371373
.hasOptionalArg().create("stats");
372374
Option ngramsOpt = OptionBuilder//.withArgName("ngrams")
373-
.withDescription("monitors and reports the most occurring n-grams; -ngrams <comma separated n's> <topK>")
374-
.hasOptionalArgs(2).create("ngrams");
375+
.withDescription("monitors and reports the most occurring n-grams; -ngrams <comma separated n's> <topK> <boolean lineage>")
376+
.hasOptionalArgs(3).create("ngrams");
375377
Option fedStatsOpt = OptionBuilder.withArgName("count")
376378
.withDescription("monitors and reports summary execution statistics of federated workers; heavy hitter <count> is 10 unless overridden; default off")
377379
.hasOptionalArg().create("fedStats");

src/main/java/org/apache/sysds/hops/codegen/SpoofCompiler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ public static void loadNativeCodeGenerator(GeneratorAPI generator) {
223223
else {
224224
local_tmp = System.getProperty("user.dir") + "/src/main".replace("/", File.separator);
225225
}
226-
226+
// TODO: Code is unreachable here
227227
if(generator == GeneratorAPI.CUDA) {
228228
// init GPUs with jCuda to avoid double initialization problems
229229
GPUContextPool.initializeGPU();

src/test/java/org/apache/sysds/test/component/misc/CLIOptionsParserTest.java

+194
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,18 @@
2424
import org.apache.commons.cli.AlreadySelectedException;
2525
import org.apache.commons.cli.MissingOptionException;
2626
import org.apache.commons.cli.ParseException;
27+
import org.apache.sysds.hops.OptimizerUtils;
28+
import org.apache.sysds.runtime.instructions.fed.FEDInstruction;
29+
import org.apache.sysds.runtime.lineage.LineageCacheConfig;
2730
import org.junit.Assert;
2831
import org.junit.Test;
2932
import org.apache.sysds.api.DMLOptions;
3033
import org.apache.sysds.common.Types.ExecMode;
3134
import org.apache.sysds.runtime.lineage.LineageCacheConfig.ReuseCacheType;
3235
import org.apache.sysds.utils.Explain;
3336

37+
import static org.apache.sysds.api.DMLOptions.parseCLArguments;
38+
3439
@net.jcip.annotations.NotThreadSafe
3540
public class CLIOptionsParserTest {
3641

@@ -450,4 +455,193 @@ public void testNVArgs4() throws Exception {
450455
Map<String, String> m = o.argVals;
451456
Assert.assertEquals("'def'", m.get("$abc"));
452457
}
458+
459+
@Test
460+
public void parseCLArgumentsLineageDAGHEIGHTTest() throws ParseException {
461+
String[] args = new String[]{"-f", "test", "-lineage", "policy_dagheight"};
462+
DMLOptions opts = parseCLArguments(args);
463+
Assert.assertTrue(opts.lineage && opts.linCachePolicy == LineageCacheConfig.LineageCachePolicy.DAGHEIGHT);
464+
}
465+
466+
@Test
467+
public void parseCLIArgumentsLineageEstimateTest() throws ParseException {
468+
String[] args = new String[]{"-f", "test", "-lineage", "estimate"};
469+
DMLOptions opts = parseCLArguments(args);
470+
Assert.assertTrue(opts.lineage && opts.lineage_estimate);
471+
}
472+
473+
@Test
474+
public void parseCLArgumentsGPUTest() throws ParseException {
475+
String[] args = new String[]{"-f", "test", "-gpu",};
476+
DMLOptions opts = parseCLArguments(args);
477+
Assert.assertTrue(opts.gpu);
478+
}
479+
480+
@Test
481+
public void parseCLArgumentsInvalidExplainTest() throws ParseException {
482+
String[] args = new String[]{"-f", "test","-explain","XYZ"};
483+
try {
484+
parseCLArguments(args);
485+
} catch (ParseException e) {
486+
assert e.getMessage().equals("Invalid argument specified for -hops option, must be one of [hops, runtime, recompile_hops, recompile_runtime, codegen, codegen_recompile]");
487+
}
488+
}
489+
@Test
490+
public void parseCLArgumentsExplainCodegenRecompileTest() throws ParseException {
491+
String[] args = new String[]{"-f", "test","-explain","codegen_recompile"};
492+
DMLOptions opts = parseCLArguments(args);
493+
Assert.assertEquals(opts.explainType, Explain.ExplainType.CODEGEN_RECOMPILE);
494+
}
495+
496+
497+
@Test
498+
public void parseCLArgumentsNGramsTest1() throws ParseException {
499+
String[] args = new String[]{"-f", "test", "-ngrams",};
500+
DMLOptions opts = parseCLArguments(args);
501+
Assert.assertTrue(opts.statsNGrams);
502+
}
503+
504+
@Test
505+
public void parseCLArgumentsNGramsTest2() throws ParseException {
506+
String[] args = new String[]{"-f", "test", "-ngrams","1"};
507+
DMLOptions opts = parseCLArguments(args);
508+
Assert.assertTrue(opts.statsNGrams);
509+
}
510+
511+
@Test
512+
public void parseCLArgumentsNGramsTest3() throws ParseException {
513+
String[] args = new String[]{"-f", "test", "-ngrams","1","1","FALSE"};
514+
DMLOptions opts = parseCLArguments(args);
515+
Assert.assertTrue(opts.statsNGrams);
516+
Assert.assertEquals(opts.statsNGramSizes[0], 1);
517+
Assert.assertEquals(opts.statsTopKNGrams, 1);
518+
Assert.assertFalse(opts.statsNGramsUseLineage);
519+
}
520+
521+
@Test
522+
public void parseCLArgumentsNGramsTest4() throws ParseException {
523+
String[] args = new String[]{"-f", "test", "-ngrams","1,3","1"};
524+
DMLOptions opts = parseCLArguments(args);
525+
Assert.assertTrue(opts.statsNGrams);
526+
Assert.assertEquals(opts.statsNGramSizes[0], 1);
527+
Assert.assertEquals(opts.statsNGramSizes[1], 3);
528+
Assert.assertEquals(opts.statsTopKNGrams, 1);
529+
Assert.assertTrue(opts.statsNGramsUseLineage);
530+
}
531+
532+
@Test
533+
public void parseCLArgumentsNGramsTest5() throws ParseException {
534+
String[] args = new String[]{"-f", "test","-ngrams","1,2","b"};
535+
try {
536+
parseCLArguments(args);
537+
} catch (ParseException e) {
538+
assert e.getMessage().equals("Invalid argument specified for -ngrams option, must be a valid integer");
539+
}
540+
}
541+
542+
@Test
543+
public void parseCLArgumentsFEDStatsTest1() throws ParseException {
544+
String[] args = new String[]{"-f", "test", "-fedStats",};
545+
DMLOptions opts = parseCLArguments(args);
546+
Assert.assertTrue(opts.fedStats);
547+
}
548+
549+
@Test
550+
public void parseCLArgumentsFEDStatsTest2() throws ParseException {
551+
String[] args = new String[]{"-f", "test", "-fedStats", "21"};
552+
DMLOptions opts = parseCLArguments(args);
553+
Assert.assertTrue(opts.fedStats);
554+
Assert.assertEquals(21, opts.fedStatsCount);
555+
}
556+
557+
@Test
558+
public void parseCLArgumentsFEDStatsTest3() {
559+
String[] args = new String[]{"-f", "test", "-fedStats", "xyz"};
560+
try {
561+
parseCLArguments(args);
562+
} catch (ParseException e) {
563+
assert e.getMessage().equals("Invalid argument specified for -fedStats option, must be a valid integer");
564+
}
565+
}
566+
567+
@Test
568+
public void parseCLArgumentsFEDMonitoringTest1() {
569+
String[] args = new String[]{"-fedMonitoring"};
570+
try {
571+
parseCLArguments(args);
572+
} catch (ParseException e) {
573+
assert e.getMessage().equals("No port [integer] specified for -fedMonitoring option");
574+
}
575+
}
576+
577+
@Test
578+
public void parseCLArgumentsFEDMonitoringTest2() {
579+
String[] args = new String[]{"-fedMonitoring","21", "-fedMonitoringAddress"};
580+
try {
581+
parseCLArguments(args);
582+
} catch (ParseException e) {
583+
assert e.getMessage().equals("No address [String] specified for -fedMonitoringAddress option");
584+
}
585+
}
586+
587+
@Test
588+
public void parseCLArgumentsFEDMonitoringTest3() throws ParseException {
589+
String[] args = new String[]{"-fedMonitoring", "21"};
590+
DMLOptions opts = parseCLArguments(args);
591+
Assert.assertTrue(opts.fedMonitoring);
592+
Assert.assertEquals(21, opts.fedMonitoringPort);
593+
}
594+
595+
@Test
596+
public void parseCLArgumentsFEDMonitoringTest4() throws ParseException {
597+
String[] args = new String[]{"-fedMonitoring", "21", "-fedMonitoringAddress", "xyz"};
598+
DMLOptions opts = parseCLArguments(args);
599+
Assert.assertTrue(opts.fedMonitoring);
600+
Assert.assertEquals(21, opts.fedMonitoringPort);
601+
Assert.assertEquals("xyz", opts.fedMonitoringAddress);
602+
}
603+
604+
@Test
605+
public void parseCLArgumentsFEDCompilationTest1() throws ParseException {
606+
String[] args = new String[]{"-f", "test", "-federatedCompilation"};
607+
DMLOptions opts = parseCLArguments(args);
608+
Assert.assertTrue(opts.federatedCompilation);
609+
}
610+
611+
@Test
612+
public void parseCLArgumentsFEDCompilationTest2() throws ParseException {
613+
String[] args = new String[]{"-f", "test", "-federatedCompilation", "1=NONE"};
614+
DMLOptions opts = parseCLArguments(args);
615+
Assert.assertTrue(opts.federatedCompilation);
616+
Assert.assertEquals(OptimizerUtils.FEDERATED_SPECS.get(1), FEDInstruction.FederatedOutput.NONE);
617+
}
618+
619+
@Test
620+
public void parseCLArgumentsFEDCompilationTest3() {
621+
String[] args = new String[]{"-f","test", "-federatedCompilation","1=n=n"};
622+
try {
623+
parseCLArguments(args);
624+
throw new AssertionError("Test should have resulted in Exception");
625+
} catch (ParseException e){
626+
Assert.assertEquals("Invalid argument specified for -federatedCompilation option, must be a list of space separated K=V pairs, where K is a line number of the DML script and V is a federated output value",e.getMessage());
627+
}
628+
}
629+
630+
@Test
631+
public void parseCLArgumentsFEDNoRuntimeConversionTest() throws ParseException {
632+
String[] args = new String[]{"-f", "test", "-noFedRuntimeConversion"};
633+
DMLOptions opts = parseCLArguments(args);
634+
Assert.assertTrue(opts.noFedRuntimeConversion);
635+
}
636+
637+
@Test
638+
public void testDMLOptionToString() throws ParseException {
639+
String cl = "systemds -f test.dml -exec spark";
640+
String[] args = cl.split(" ");
641+
DMLOptions o = DMLOptions.parseCLArguments(args);
642+
String oString = o.toString();
643+
Assert.assertTrue(oString.contains("script='null'"));
644+
Assert.assertTrue(oString.contains("filePath='test.dml'"));
645+
Assert.assertTrue(oString.contains("execMode=SPARK"));
646+
}
453647
}

0 commit comments

Comments
 (0)