From 8bdb756123a1f86e1cabd3bca6e44b0b491b25d7 Mon Sep 17 00:00:00 2001 From: "p.privalov" Date: Mon, 18 Jul 2016 15:40:29 +0300 Subject: [PATCH] SRADA-920 Features provided by cli enabled in da. Changes: * Required Pages and Charts added to trace with CliInternals.selectFeatures(). * InTracingArguments featuresList replaced with featuresSet, method getFeaturesList(...) replaced with getFeatures(...) * Implemented tests for TracingFeatureArguments, containing few possible combinations of selected features. * Implemented tests for TracingArguments.isValid for different combinations of specified features. Change-Id: Ie4e3c847f5275c05b849def44a298790c5bc4032 --- .../tizen/dynamicanalyzer/cli/CliInternals.java | 48 +++---- .../cli/tracing/TracingArguments.java | 19 ++- .../cli/tracing/TracingFeatureArgument.java | 23 ++-- .../cli/tracing/TracingArgumentsParserTest.java | 150 +++++++++++++++++++-- .../cli/tracing/TracingArgumentsTest.java | 23 ++++ 5 files changed, 199 insertions(+), 64 deletions(-) diff --git a/org.tizen.dynamicanalyzer.cli/src/org/tizen/dynamicanalyzer/cli/CliInternals.java b/org.tizen.dynamicanalyzer.cli/src/org/tizen/dynamicanalyzer/cli/CliInternals.java index 68ff35d..57c79b3 100644 --- a/org.tizen.dynamicanalyzer.cli/src/org/tizen/dynamicanalyzer/cli/CliInternals.java +++ b/org.tizen.dynamicanalyzer.cli/src/org/tizen/dynamicanalyzer/cli/CliInternals.java @@ -2,9 +2,12 @@ package org.tizen.dynamicanalyzer.cli; import java.io.File; import java.rmi.ConnectException; +import java.util.Arrays; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -26,7 +29,9 @@ import org.tizen.dynamicanalyzer.handlers.UIActionHolder; import org.tizen.dynamicanalyzer.project.PackageInfo; import org.tizen.dynamicanalyzer.setting.PrimitiveFeature; import org.tizen.dynamicanalyzer.setting.SettingDataManager; +import org.tizen.dynamicanalyzer.setting.TargetData; import org.tizen.dynamicanalyzer.setting.Template; +import org.tizen.dynamicanalyzer.setting.UILayoutDataManager; import org.tizen.dynamicanalyzer.util.InternalLogger; import org.tizen.dynamicanalyzer.util.Logger; import org.tizen.dynamicanalyzer.utils.AnalyzerUtil; @@ -266,34 +271,22 @@ public final class CliInternals { } /** - * Selects features to be used for tracing by given list of - * {@link PrimitiveFeature} + * Enables all selected features. * - * @param template - * Template instance - * @return true on success + * @param features set of features to be enabled. + * @return was operation successful or not. */ - private static boolean selectFeatureList(List features) { - if (features.isEmpty()) - return false; + private static boolean selectFeatures(Set features) { + TargetData target = SettingDataManager.INSTANCE.getTarget(null); + Set selectedChartSet = new HashSet(); + + for (PrimitiveFeature feature : features) { + target.addSelectedFlatFeature(feature.getName()); + selectedChartSet.add(feature.getChart()); + } - /* - * TODO Implement selected features usage in DACLI - * - * TargetData target = SettingDataManager.INSTANCE.getTarget(null); - * target.setSelectedTemplate(template); - * target.changeSelectedFeatureList(template); - * - * Set selectedChartSet = new HashSet(); - * - * for (FeatureValueData feature : template.getData().getFeatureList()) - * { if (feature.getKey().getData().getChartList().size() > 0) { - * selectedChartSet.addAll(feature.getKey().getData() .getChartList()); - * } } Logger.debug(selectedChartSet); - * - * UILayoutDataManager.INSTANCE.setSelectedChartSet(selectedChartSet); - */ - return false; // true; + UILayoutDataManager.INSTANCE.setSelectedChartSet(selectedChartSet); + return true; } /** @@ -354,7 +347,6 @@ public final class CliInternals { */ public static TracingProcessContext getContext(String device) throws ConnectException { ProcessManagerMBean pmProxy = getPMProxyInstance(); - return pmProxy.getContext(device); } @@ -414,10 +406,12 @@ public final class CliInternals { } Logger.debug("Set current app: " + args.getApplication()); - if (!selectFeatureList(args.getFeaturesList())) { + if (!selectFeatures(args.getFeatures())) { Logger.debug("Failed to select features"); return ErrorCode.ERR_EXCEPTION_OCCURRED; } + Logger.debug("Set features: " + + Arrays.asList(args.getFeatures().toArray())); // Create all needed data managers before UIActionHolder.getUIAction().setUIElementsBySetting(); diff --git a/org.tizen.dynamicanalyzer.cli/src/org/tizen/dynamicanalyzer/cli/tracing/TracingArguments.java b/org.tizen.dynamicanalyzer.cli/src/org/tizen/dynamicanalyzer/cli/tracing/TracingArguments.java index 72aff7f..ec1e74b 100644 --- a/org.tizen.dynamicanalyzer.cli/src/org/tizen/dynamicanalyzer/cli/tracing/TracingArguments.java +++ b/org.tizen.dynamicanalyzer.cli/src/org/tizen/dynamicanalyzer/cli/tracing/TracingArguments.java @@ -2,11 +2,10 @@ package org.tizen.dynamicanalyzer.cli.tracing; import java.io.File; import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import org.tizen.dynamicanalyzer.setting.PrimitiveFeature; -import org.tizen.dynamicanalyzer.setting.Template; /** * Context class storing all necessary information for tracing start. @@ -20,7 +19,7 @@ public class TracingArguments implements Cloneable, Serializable { private String device; // device serial number or IP address private String application; // application name - private List featuresList; // list of features for analysis + private Set featuresSet; // list of features for analysis private File output; // file with tracing output // TODO duration actually is not supported yet by CLI, always set to 0 private long durationSec; // tracing duration in seconds (0 is for unlimited duration) @@ -28,7 +27,7 @@ public class TracingArguments implements Cloneable, Serializable { private String errMessage; // contains message about all found errors during validation ( isValid() ) public TracingArguments() { - featuresList = new ArrayList(); + featuresSet = new HashSet(); durationSec = 0; errMessage = ""; } @@ -73,7 +72,7 @@ public class TracingArguments implements Cloneable, Serializable { } // Features check - if (featuresList.isEmpty()) { + if (featuresSet.isEmpty()) { result = false; msg += " * At least one feature for tracing must be selected%n"; } @@ -154,16 +153,16 @@ public class TracingArguments implements Cloneable, Serializable { /** * @return the featuresList list of features selected for tracing */ - public List getFeaturesList() { - return featuresList; + public Set getFeatures() { + return featuresSet; } /** - * @param featuresList the feature to be added to list of selected + * @param featuresSet the feature to be added to list of selected * @return this object to allow chained methods execution */ public TracingArguments addFeature(PrimitiveFeature feature) { - featuresList.add(feature); + featuresSet.add(feature); return this; } } diff --git a/org.tizen.dynamicanalyzer.cli/src/org/tizen/dynamicanalyzer/cli/tracing/TracingFeatureArgument.java b/org.tizen.dynamicanalyzer.cli/src/org/tizen/dynamicanalyzer/cli/tracing/TracingFeatureArgument.java index 3434c54..8336947 100644 --- a/org.tizen.dynamicanalyzer.cli/src/org/tizen/dynamicanalyzer/cli/tracing/TracingFeatureArgument.java +++ b/org.tizen.dynamicanalyzer.cli/src/org/tizen/dynamicanalyzer/cli/tracing/TracingFeatureArgument.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; @@ -26,30 +27,26 @@ public enum TracingFeatureArgument { SYNC("Y", "synchronization"), // Options for single features selection - UIEVENT("U", PrimitiveFeature.UI_EVENT), PERIPHERAL("P", - PrimitiveFeature.PERIPHERAL_STATUS), POWER("E", - PrimitiveFeature.POWER_ESTIMATION); + UIEVENT("U", PrimitiveFeature.UI_EVENT), + PERIPHERAL("P", PrimitiveFeature.PERIPHERAL_STATUS), + POWER("E", PrimitiveFeature.POWER_ESTIMATION); static { CPU.addDefaultFeatureValue("usage", PrimitiveFeature.CPU_USAGE); CPU.addDefaultFeatureValue("core", PrimitiveFeature.CPU_USAGE_PER_CORE); - CPU.addDefaultFeatureValue("frequency", - PrimitiveFeature.CPU_FREQ_PER_CORE); + CPU.addDefaultFeatureValue("frequency", PrimitiveFeature.CPU_FREQ_PER_CORE); MEMORY.addDefaultFeatureValue("system", PrimitiveFeature.SYSTEM_MEMORY); - MEMORY.addDefaultFeatureValue("process", - PrimitiveFeature.PROCESS_MEMORY); + MEMORY.addDefaultFeatureValue("process", PrimitiveFeature.PROCESS_MEMORY); MEMORY.addFeatureValue("heap", PrimitiveFeature.MEMORY_ALLOC); FILE.addDefaultFeatureValue("io", PrimitiveFeature.DISK_IO); FILE.addDefaultFeatureValue("analysis", PrimitiveFeature.FILE_ANALYSIS); - GRAPHICS.addDefaultFeatureValue("opengl", - PrimitiveFeature.OPENGLES_ANALYSIS); + GRAPHICS.addDefaultFeatureValue("opengl", PrimitiveFeature.OPENGLES_ANALYSIS); NETWORK.addDefaultFeatureValue("io", PrimitiveFeature.NETWORK_IO); - NETWORK.addDefaultFeatureValue("analysis", - PrimitiveFeature.NETWORK_ANALYSIS); + NETWORK.addDefaultFeatureValue("analysis", PrimitiveFeature.NETWORK_ANALYSIS); SYNC.addDefaultFeatureValue("thread", PrimitiveFeature.THREAD_ANALYSIS); SYNC.addDefaultFeatureValue("sync", PrimitiveFeature.SYNC_ANALYSIS); @@ -156,7 +153,7 @@ public enum TracingFeatureArgument { opt.parseFeatureOption(result, cmdline); } - if (result.getFeaturesList().isEmpty()) + if (result.getFeatures().isEmpty()) throw new ParseException("No tracing features seleted: at least one feature is required."); } @@ -169,7 +166,7 @@ public enum TracingFeatureArgument { */ public static ArrayList toStringArrayList(TracingArguments args) { ArrayList result = new ArrayList(); - List features = args.getFeaturesList(); + Set features = args.getFeatures(); if (features.isEmpty()) return result; diff --git a/org.tizen.dynamicanalyzer.cli/test/src/org/tizen/dynamicanalyzer/cli/tracing/TracingArgumentsParserTest.java b/org.tizen.dynamicanalyzer.cli/test/src/org/tizen/dynamicanalyzer/cli/tracing/TracingArgumentsParserTest.java index 3820085..7f3bd8e 100644 --- a/org.tizen.dynamicanalyzer.cli/test/src/org/tizen/dynamicanalyzer/cli/tracing/TracingArgumentsParserTest.java +++ b/org.tizen.dynamicanalyzer.cli/test/src/org/tizen/dynamicanalyzer/cli/tracing/TracingArgumentsParserTest.java @@ -26,8 +26,16 @@ public class TracingArgumentsParserTest { private final static String device = "device"; private final static String application = "application"; private final static String applicationOpt = "-a"; - private final static PrimitiveFeature feature = PrimitiveFeature.CPU_USAGE; - private final static String featureOpt = "-C=usage"; + private final static PrimitiveFeature cpu = PrimitiveFeature.CPU_USAGE; + private final static String featureOptCPU = "-C=usage"; + private final static PrimitiveFeature memory1 = PrimitiveFeature.SYSTEM_MEMORY; + private final static PrimitiveFeature memory2 = PrimitiveFeature.PROCESS_MEMORY; + private final static String featureOptMEMORY = "-M"; + private final static PrimitiveFeature file1 = PrimitiveFeature.DISK_IO; + private final static PrimitiveFeature file2 = PrimitiveFeature.FILE_ANALYSIS; + private final static String featureOptFILE = "-F=all"; + private final static PrimitiveFeature power = PrimitiveFeature.POWER_ESTIMATION; + private final static String featureOptPOWER = "-E"; private final static File output = new File("output.out"); private final static String outputOpt = "-o"; private final static long duration = 12345; @@ -47,7 +55,7 @@ public class TracingArgumentsParserTest { device, applicationOpt, application, outputOpt, output.getPath(), - featureOpt + featureOptCPU // TODO duration option is not supported yet // durationOpt, Long.toString(duration) }); @@ -57,8 +65,8 @@ public class TracingArgumentsParserTest { assertEquals(device, result.getDevice()); assertEquals(application, result.getApplication()); assertEquals(output, result.getOutput()); - assertEquals(1, result.getFeaturesList().size()); - assertEquals(feature, result.getFeaturesList().get(0)); + assertEquals(1, result.getFeatures().size()); + assertTrue(result.getFeatures().contains(cpu)); // TODO duration option is not supported yet // assertEquals(duration, result.getDuration()); } @@ -91,7 +99,7 @@ public class TracingArgumentsParserTest { TracingArguments result = TracingArgumentsParser.parse(new String[] { device, applicationOpt, application, - featureOpt }); + featureOptCPU }); assertNotNull(result); assertTrue(result.isValid()); assertNull(result.getOutput()); @@ -103,7 +111,7 @@ public class TracingArgumentsParserTest { TracingArguments result = TracingArgumentsParser.parse(new String[] { applicationOpt, application, device, - featureOpt }); + featureOptCPU }); assertNull(result); } @@ -112,7 +120,7 @@ public class TracingArgumentsParserTest { TracingArguments result = TracingArgumentsParser.parse(new String[] { device, application, applicationOpt, - featureOpt }); + featureOptCPU }); assertNull(result); } @@ -121,7 +129,7 @@ public class TracingArgumentsParserTest { TracingArguments result = TracingArgumentsParser.parse(new String[] { device, applicationOpt, - featureOpt }); + featureOptCPU }); assertNull(result); } @@ -130,7 +138,7 @@ public class TracingArgumentsParserTest { TracingArguments result = TracingArgumentsParser.parse(new String[] { device, applicationOpt, application, - featureOpt, + featureOptCPU, "--option", "value" }); assertNull(result); } @@ -152,7 +160,7 @@ public class TracingArgumentsParserTest { TracingArguments result = TracingArgumentsParser.parse(new String[] { device, applicationOpt, application, - featureOpt, + featureOptCPU, outputOpt, output.getPath(), durationOpt, Long.toString(duration), "--", "value"}); @@ -192,7 +200,7 @@ public class TracingArgumentsParserTest { TracingArguments args = new TracingArguments() .setDevice(device) .setApplication(application) - .addFeature(feature); + .addFeature(cpu); String[] result = TracingArgumentsParser.toStringArray(args); assertNotNull(result); assertEquals(5, result.length); @@ -206,7 +214,7 @@ public class TracingArgumentsParserTest { TracingArguments args = new TracingArguments() .setDevice(device) .setApplication(application) - .addFeature(feature) + .addFeature(cpu) .setDuration(-10); String[] result = TracingArgumentsParser.toStringArray(args); assertNull(result); @@ -217,7 +225,7 @@ public class TracingArgumentsParserTest { TracingArguments args = new TracingArguments() .setDevice(device) .setApplication(application) - .addFeature(feature) + .addFeature(cpu) .setOutput(output); String[] result = TracingArgumentsParser.toStringArray(args); assertNotNull(result); @@ -236,4 +244,118 @@ public class TracingArgumentsParserTest { String[] result = TracingArgumentsParser.toStringArray(null); assertNull(result); } + + @Test + public void parse_AllFeaturesfromGroup() throws Exception { + TracingArguments result = TracingArgumentsParser.parse(new String[] { + device, + applicationOpt, application, + outputOpt, output.getPath(), + featureOptFILE + // TODO duration option is not supported yet + // durationOpt, Long.toString(duration) + }); + + assertNotNull(result); + assertTrue(result.isValid()); + assertEquals(device, result.getDevice()); + assertEquals(application, result.getApplication()); + assertEquals(output, result.getOutput()); + assertEquals(2, result.getFeatures().size()); + assertTrue(result.getFeatures().contains(file1)); + assertTrue(result.getFeatures().contains(file2)); + } + + @Test + public void parse_DefaultFeaturesfromGroup() throws Exception { + TracingArguments result = TracingArgumentsParser.parse(new String[] { + device, + applicationOpt, application, + outputOpt, output.getPath(), + featureOptMEMORY + // TODO duration option is not supported yet + // durationOpt, Long.toString(duration) + }); + + assertNotNull(result); + assertTrue(result.isValid()); + assertEquals(device, result.getDevice()); + assertEquals(application, result.getApplication()); + assertEquals(output, result.getOutput()); + assertEquals(2, result.getFeatures().size()); + assertTrue(result.getFeatures().contains(memory1)); + assertTrue(result.getFeatures().contains(memory2)); + } + + @Test + public void parse_OneFeaturenotFromGroup() throws Exception { + TracingArguments result = TracingArgumentsParser.parse(new String[] { + device, + applicationOpt, application, + outputOpt, output.getPath(), + featureOptPOWER + // TODO duration option is not supported yet + // durationOpt, Long.toString(duration) + }); + + assertNotNull(result); + assertTrue(result.isValid()); + assertEquals(device, result.getDevice()); + assertEquals(application, result.getApplication()); + assertEquals(output, result.getOutput()); + assertEquals(1, result.getFeatures().size()); + assertTrue(result.getFeatures().contains(power)); + } + + @Test + public void parse_LotsOfFeatures() throws Exception { + TracingArguments result = TracingArgumentsParser.parse(new String[] { + device, + applicationOpt, application, + outputOpt, output.getPath(), + featureOptPOWER, + featureOptCPU, + featureOptFILE, + featureOptMEMORY + // TODO duration option is not supported yet + // durationOpt, Long.toString(duration) + }); + + assertNotNull(result); + assertTrue(result.isValid()); + assertEquals(device, result.getDevice()); + assertEquals(application, result.getApplication()); + assertEquals(output, result.getOutput()); + assertEquals(6, result.getFeatures().size()); + } + + @Test + public void toStringArray_TwoFeatures() { + TracingArguments args = new TracingArguments() + .setDevice(device) + .setApplication(application) + .addFeature(cpu) + .addFeature(file2); + String[] result = TracingArgumentsParser.toStringArray(args); + assertNotNull(result); + assertEquals(7, result.length); + } + + @Test + public void toStringArray_ThreeFeatures() { + TracingArguments args = new TracingArguments() + .setDevice(device) + .setApplication(application) + .addFeature(cpu) + .addFeature(file1) + .addFeature(file2); + String[] result = TracingArgumentsParser.toStringArray(args); + assertNotNull(result); + assertEquals(8, result.length); + assertEquals("-C", result[3]); + assertEquals("usage", result[4]); + assertEquals("-F", result[5]); + assertEquals("analysis", result[6]); + assertEquals("io", result[7]); + } } diff --git a/org.tizen.dynamicanalyzer.cli/test/src/org/tizen/dynamicanalyzer/cli/tracing/TracingArgumentsTest.java b/org.tizen.dynamicanalyzer.cli/test/src/org/tizen/dynamicanalyzer/cli/tracing/TracingArgumentsTest.java index adc05b4..dc05c8c 100644 --- a/org.tizen.dynamicanalyzer.cli/test/src/org/tizen/dynamicanalyzer/cli/tracing/TracingArgumentsTest.java +++ b/org.tizen.dynamicanalyzer.cli/test/src/org/tizen/dynamicanalyzer/cli/tracing/TracingArgumentsTest.java @@ -21,6 +21,7 @@ public class TracingArgumentsTest { private final static String application = "application"; private final static File output = new File("output.out"); private final static PrimitiveFeature feature = PrimitiveFeature.CPU_USAGE; + private final static PrimitiveFeature feature2 = PrimitiveFeature.POWER_ESTIMATION; @Before public void setUp() { @@ -84,6 +85,28 @@ public class TracingArgumentsTest { } @Test + public void isValid_TwoFeatures() { + TracingArguments args = new TracingArguments() + .setDevice(device) + .setApplication(application) + .addFeature(feature) + .addFeature(feature2); + assertTrue(args.isValid()); + assertTrue(args.getFeatures().size()==2); + } + + @Test + public void isValid_TwoSameFeatures() { + TracingArguments args = new TracingArguments() + .setDevice(device) + .setApplication(application) + .addFeature(feature) + .addFeature(feature); + assertTrue(args.isValid()); + assertFalse(args.getFeatures().size() == 2); + } + + @Test public void isValid_NoOpts() { TracingArguments args = new TracingArguments(); assertFalse(args.isValid()); -- 2.7.4