From edf868e1bd2237fd54a50a8d3c48e1f9271c89c2 Mon Sep 17 00:00:00 2001
From: Pedro Donini Linan <pedro.doninilinan@gmail.com>
Date: Mon, 25 Mar 2019 15:20:03 +0100
Subject: [PATCH] Test for the value validation of Basic DAs.

---
 .../iec61850/scl/validator/DOIValidator.java  | 158 ++++++++++++++++--
 1 file changed, 145 insertions(+), 13 deletions(-)

diff --git a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/DOIValidator.java b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/DOIValidator.java
index 883eeb5..c6039a9 100644
--- a/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/DOIValidator.java
+++ b/fr.centralesupelec.edf.riseclipse.iec61850.scl.tools/src/fr/centralesupelec/edf/riseclipse/iec61850/scl/validator/DOIValidator.java
@@ -39,6 +39,7 @@ public class DOIValidator {
 
 	private String cdc;
 	private HashMap<String, DataAttribute> daMap;
+	//private static Boolean test = false;
 	
 	public DOIValidator(CDC cdc) {
 		this.cdc = cdc.getName();
@@ -46,6 +47,10 @@ public class DOIValidator {
     	for(DataAttribute da : cdc.getDataAttribute()){
     		this.daMap.put(da.getName(), da);
     	}
+    	/*if(!test) {
+    		testValidateVal();
+    	}
+    	test = true;*/
 	}
 
 	
@@ -108,7 +113,7 @@ public class DOIValidator {
 		}
 		return true;
 	}
-	
+
 	
 	public boolean validateDAI(DAI dai) {
 
@@ -139,44 +144,171 @@ public class DOIValidator {
     	case "BOOLEAN":
     		return (val.equals("0") || val.equals("1") || val.equals("false") || val.equals("true"));
     	case "INT8":
-    		v = Integer.parseInt(val);
+    		try {
+    			v = Integer.parseInt(val);
+    		} catch(Exception e) {
+    			return false;
+    		}
     		return v >= -128 && v <= 127;
     	case "INT16":
-    		v = Integer.parseInt(val);
+    		try {
+    			v = Integer.parseInt(val);
+    		} catch(Exception e) {
+    			return false;
+    		}
     		return v >= -32768 && v <= 32767;
     	case "INT32":
-    		v = Integer.parseInt(val);
+    		try {
+    			v = Integer.parseInt(val);
+    		} catch(Exception e) {
+    			return false;
+    		}
     		return v >= Integer.MIN_VALUE && v <= Integer.MAX_VALUE;
     	case "INT64":
-    		l = Long.parseLong(val);
+    		try {
+        		l = Long.parseLong(val);
+    		} catch(Exception e) {
+    			return false;
+    		}
     		return l >= Long.MIN_VALUE && l <= Long.MAX_VALUE;
     	case "INT8U":
-    		v = Integer.parseInt(val);
+    		try {
+    			v = Integer.parseInt(val);
+    		} catch(Exception e) {
+    			return false;
+    		}
     		return v >= 0 && v <= 255;
     	case "INT16U":
-    		v = Integer.parseInt(val);
+    		try {
+    			v = Integer.parseInt(val);
+    		} catch(Exception e) {
+    			return false;
+    		}
     		return v >= 0 && v <= 65535;
     	case "INT32U":
-    		l = Long.parseLong(val);
+    		try {
+        		l = Long.parseLong(val);
+    		} catch(Exception e) {
+    			return false;
+    		}
             String max = "4294967295";
     		return l >= 0 && l <= Long.parseLong(max);
     	case "FLOAT32":
-    		f = Float.parseFloat(val);
-    		return f >= Float.MIN_VALUE && f <= Float.MAX_VALUE;
+    		try {
+        		f = Float.parseFloat(val);
+    		} catch(Exception e) {
+    			return false;
+    		}
+    		return f >= -Float.MAX_VALUE && f <= Float.MAX_VALUE;
     	case "Octet64":
     		byte[] bytes = val.getBytes();
     		return bytes.length <= 64;
     	case "VisString64":
-    		return val.length() <= 255;
+    		return val.length() <= 64;
     	case "VisString129":
     		return val.length() <= 129;
     	case "Unicode255":
     	case "VisString255":
     		return val.length() <= 255;
     	default:
-    		return false;
+    		return true;
     	}
     }
     
-	
+    
+    public void testValidateVal() {
+    	log("\n--\tSTART TEST\t--\n");
+    	assertTrue(validateVal("0", "BOOLEAN"));
+    	assertTrue(validateVal("1", "BOOLEAN"));
+    	assertTrue(validateVal("true", "BOOLEAN"));
+    	assertTrue(validateVal("false", "BOOLEAN"));
+    	assertTrue(!validateVal("2", "BOOLEAN"));
+    	assertTrue(!validateVal("-1", "BOOLEAN"));
+    	assertTrue(!validateVal("string", "BOOLEAN"));
+    	log("");
+    	assertTrue(validateVal("1", "INT8"));
+    	assertTrue(validateVal("0", "INT8"));
+    	assertTrue(validateVal("-1", "INT8"));
+    	assertTrue(validateVal("127", "INT8"));
+    	assertTrue(validateVal("-128", "INT8"));
+    	assertTrue(!validateVal("128", "INT8"));
+    	assertTrue(!validateVal("-129", "INT8"));
+    	assertTrue(!validateVal("string", "INT8"));
+    	assertTrue(!validateVal("22.2", "INT8"));
+    	log("");
+    	assertTrue(validateVal("32767", "INT16"));
+    	assertTrue(validateVal("-32768", "INT16"));
+    	assertTrue(!validateVal("32768", "INT16"));
+    	assertTrue(!validateVal("-32769", "INT16"));
+    	log("");
+    	assertTrue(validateVal(Integer.toString(Integer.MAX_VALUE), "INT32"));
+    	assertTrue(validateVal(Integer.toString(Integer.MIN_VALUE), "INT32"));
+    	assertTrue(!validateVal("2147483648", "INT32"));
+    	assertTrue(!validateVal("-2147483649", "INT32"));
+    	log("");
+    	assertTrue(validateVal(Long.toString(Long.MAX_VALUE), "INT64"));
+    	assertTrue(validateVal(Long.toString(Long.MIN_VALUE), "INT64"));
+    	assertTrue(!validateVal("9223372036854775808", "INT64"));
+    	assertTrue(!validateVal("-9223372036854775809", "INT64"));
+    	log("");
+    	assertTrue(validateVal("0", "INT8U"));
+    	assertTrue(validateVal("255", "INT8U"));
+    	assertTrue(!validateVal("256", "INT8U"));
+    	assertTrue(!validateVal("-1", "INT8U"));
+    	assertTrue(!validateVal("-2", "INT8U"));
+    	log("");
+    	assertTrue(validateVal("0", "INT16U"));
+    	assertTrue(validateVal("65535", "INT16U"));
+    	assertTrue(!validateVal("65536", "INT16U"));
+    	assertTrue(!validateVal("-1", "INT16U"));
+    	assertTrue(!validateVal("-2", "INT16U"));
+    	log("");
+    	assertTrue(validateVal("0", "INT32U"));
+    	assertTrue(validateVal("4294967295", "INT32U"));
+    	assertTrue(!validateVal("4294967296", "INT32U"));
+    	assertTrue(!validateVal("-1", "INT32U"));
+    	assertTrue(!validateVal("-2", "INT32U"));
+    	log("");
+    	assertTrue(validateVal("0.0", "FLOAT32"));
+    	assertTrue(validateVal("1.2345", "FLOAT32"));
+    	assertTrue(validateVal("-1.2345", "FLOAT32"));
+    	assertTrue(validateVal("100", "FLOAT32"));
+    	assertTrue(validateVal(Float.toString(Float.MAX_VALUE), "FLOAT32"));
+    	assertTrue(validateVal(Float.toString(-Float.MAX_VALUE), "FLOAT32"));
+    	assertTrue(!validateVal("3.4028236E38", "FLOAT32"));
+    	assertTrue(!validateVal("-3.4028236E38", "FLOAT32"));
+    	assertTrue(!validateVal("string", "FLOAT32"));
+    	log("");
+    	assertTrue(validateVal("1234567890123456789012345678901234567890123456789012345678901234", "Octet64"));
+    	assertTrue(!validateVal("12345678901234567890123456789012345678901234567890123456789012345", "Octet64"));
+    	log("");
+    	assertTrue(validateVal("1234567890123456789012345678901234567890123456789012345678901234", "VisString64"));
+    	assertTrue(!validateVal("12345678901234567890123456789012345678901234567890123456789012345", "VisString64"));
+    	log("");
+    	assertTrue(validateVal("1234567890123456789012345678901234567890123456789012345678901234"
+    			+ "12345678901234567890123456789012345678901234567890123456789012345", "VisString129"));
+    	assertTrue(!validateVal("1234567890123456789012345678901234567890123456789012345678901234"
+    			+ "123456789012345678901234567890123456789012345678901234567890123456", "VisString129"));    	
+    	log("");
+    	assertTrue(validateVal("1234567890123456789012345678901234567890123456789012345678901234"
+    			+ "1234567890123456789012345678901234567890123456789012345678901234"
+    			+ "1234567890123456789012345678901234567890123456789012345678901234"
+    			+ "123456789012345678901234567890123456789012345678901234567890123", "VisString255"));
+    	assertTrue(!validateVal("1234567890123456789012345678901234567890123456789012345678901234"
+    			+ "1234567890123456789012345678901234567890123456789012345678901234"
+    			+ "1234567890123456789012345678901234567890123456789012345678901234"
+    			+ "1234567890123456789012345678901234567890123456789012345678901234", "VisString255"));
+    }
+
+    public void assertTrue(Boolean b) {
+    	if(b) {
+    		log("Check");
+    	} else {
+    		log("Error");
+    	}
+    }
+    
+    public void log(String message) {
+        AbstractRiseClipseConsole.getConsole().info(message);
+    }
 }
-- 
GitLab