Browse Source

Add more detailed logging to framework-test.py

Alex Schneider 11 years ago
parent
commit
eea798b1f0
1 changed files with 181 additions and 71 deletions
  1. 181 71
      toolset/benchmark/framework_test.py

+ 181 - 71
toolset/benchmark/framework_test.py

@@ -146,14 +146,16 @@ class FrameworkTest:
   # key with the value "hello, world!" (case-insensitive).
   ############################################################
   def validateJson(self, jsonString, out, err):
+    err_str = ""
     try:
       obj = {k.lower(): v for k,v in json.loads(jsonString).items()}
-
+      if "message" not in obj:
+        err_str += "Expected key 'message' to be in JSON string "
       if  obj["message"].lower() == "hello, world!":
-        return True
+        err_str += "Message was '{message}', should have been 'Hello, World!' ".format(message=obj["message"])
     except:
-      pass
-    return False
+      err_str += "Got exception when trying to validate the JSON test: {exception}".format(exception=sys.exc_info()[0:2])
+    return (True, ) if len(err_str) == 0 else (False, err_str)
 
   ############################################################
   # Validates the jsonString is a JSON object that has an "id"
@@ -161,6 +163,7 @@ class FrameworkTest:
   # integers.
   ############################################################
   def validateDb(self, jsonString, out, err):
+    err_str = ""
     try:
       obj = {k.lower(): v for k,v in json.loads(jsonString).items()}
 
@@ -169,29 +172,62 @@ class FrameworkTest:
       if type(obj) == list:
         obj = obj[0]
 
+     if "id" not in obj or "randomnumber" not in obj:
+        err_str += "Expected keys id and randomNumber to be in JSON string. "
+        return (False, err_str)
+
       # This will error out of the value could not parsed to a
       # float (this will work with ints, but it will turn them
       # into their float equivalent; i.e. "123" => 123.0)
-      if (type(float(obj["id"])) == float and 
-          type(float(obj["randomnumber"])) == float):
-        return True
+      id_ret_val = True
+      try:
+        if not isinstance(float(obj["id"]), float):
+          id_ret_val=False
+      except:
+        id_ret_val=False
+      if not id_ret_val:
+        err_str += "Expected id to be type int or float, got '{rand}' ".format(rand=obj["randomnumber"])
+      random_num_ret_val = True
+      try:
+        if not isinstance(float(obj["randomnumber"]), float):
+          random_num_ret_val=False
+      except:
+        random_num_ret_val=False
+      if not random_num_ret_val:
+        err_str += "Expected id to be type int or float, got '{rand}' ".format(rand=obj["randomnumber"])
+      return id_ret_val and random_num_ret_val
     except:
-      pass
-    return False
+      err_str += "Got exception when trying to validate the db test: {exception}".format(exception=sys.exc_info()[0:2])
+    return (True, ) if len(err_str) == 0 else (False, err_str)
 
   def validateDbStrict(self, jsonString, out, err):
+    err_str = ""
     try:
       obj = {k.lower(): v for k,v in json.loads(jsonString).items()}
 
       # This will error out of the value could not parsed to a
       # float (this will work with ints, but it will turn them
       # into their float equivalent; i.e. "123" => 123.0)
-      if (type(float(obj["id"])) == float and 
-          type(float(obj["randomnumber"])) == float):
-        return True
+     id_ret_val = True
+      try:
+        if not isinstance(float(obj["id"]), float):
+          id_ret_val=False
+      except:
+        id_ret_val=False
+      if not id_ret_val:
+        err_str += "Expected id to be type int or float, got '{rand}' ".format(rand=obj["randomnumber"])
+      random_num_ret_val = True
+      try:
+        if not isinstance(float(obj["randomnumber"]), float):
+          random_num_ret_val=False
+      except:
+        random_num_ret_val=False
+      if not random_num_ret_val:
+        err_str += "Expected id to be type int or float, got '{rand}' ".format(rand=obj["randomnumber"])
+      return id_ret_val and random_num_ret_val
     except:
-      pass
-    return False
+      err_str += "Got exception when trying to validate the db test: {exception}".format(exception=sys.exc_info()[0:2])
+    return (True, ) if len(err_str) == 0 else (False, err_str)
 
 
   ############################################################
@@ -201,17 +237,34 @@ class FrameworkTest:
   # both keys map to integers.
   ############################################################
   def validateQuery(self, jsonString, out, err):
+    err_str = ""
     try:
       arr = [{k.lower(): v for k,v in d.items()} for d in json.loads(jsonString)]
-
-      if (type(float(arr[0]["id"])) == float and 
-          type(float(arr[0]["randomnumber"])) == float and 
-          type(float(arr[1]["id"])) == float and 
-          type(float(arr[1]["randomnumber"])) == float):
-        return True
+     if len(arr) != 2:
+        err_str += "Expected array of length 2. Got length {length}. ".format(length=len(arr))
+      for obj in arr:
+        id_ret_val = True
+        random_num_ret_val = True
+        if "id" not in obj or "randomnumber" not in obj:
+          err_str += "Expected keys id and randomNumber to be in JSON string. "
+          break
+        try:
+          if not isinstance(float(obj["id"]), float):
+            id_ret_val=False
+        except:
+          id_ret_val=False
+        if not id_ret_val:
+          err_str += "Expected id to be type int or float, got '{rand}' ".format(rand=obj["randomnumber"])
+        try:
+          if not isinstance(float(obj["randomnumber"]), float):
+            random_num_ret_val=False
+        except:
+          random_num_ret_val=False
+        if not random_num_ret_val:
+          err_str += "Expected randomNumber to be type int or float, got '{rand}' ".format(rand=obj["randomnumber"])
     except:
-      pass
-    return False
+      err_str += "Got exception when trying to validate the query test: {exception}".format(exception=sys.exc_info()[0:2])
+    return (True, ) if len(err_str) == 0 else (False, err_str)
 
   ############################################################
   # Validates the jsonString is an array with a length of
@@ -220,23 +273,39 @@ class FrameworkTest:
   # both keys map to integers.
   ############################################################
   def validateQueryOneOrLess(self, jsonString, out, err):
+    err_str = ""
     try:
-      arr = {k.lower(): v for k,v in json.loads(jsonString).items()}
-
-      if len(arr) != 1:
-        return False
+      json_load = json.loads(jsonString)
+      if isinstance(json_load, list):
+        err_str += "Expected JSON object, got JSON array. " 
+        return (False, err_str)
+      arr = {k.lower(): v for k,v in json_string.items()}
 
       for obj in arr:
-        if (type(float(obj["id"])) != float or
-            type(float(obj["randomnumber"])) != float or
-            type(float(obj["id"])) != float or
-            type(float(obj["randomnumber"])) != float):
-          return False
-      # By here, it's passed validation
-      return True
+        id_ret_val = True
+        random_num_ret_val = True
+        if "id" not in obj or "randomnumber" not in obj:
+          err_str += "Expected keys id and randomNumber to be in JSON string. "
+          continue
+        try:
+          if not isinstance(float(obj["id"]), float):
+            id_ret_val=False
+        except:
+          id_ret_val=False
+        if not id_ret_val:
+          err_str += "Expected id to be type int or float, got '{rand}'. ".format(rand=obj["randomnumber"])
+        try:
+          if not isinstance(float(obj["randomnumber"]), float):
+            random_num_ret_val=False
+        except:
+          random_num_ret_val=False
+        if not random_num_ret_val:
+          err_str += "Expected randomNumber to be type int or float, got '{rand}'. ".format(rand=obj["randomnumber"])
+          ret_val = False
+      return ret_val
     except:
-      pass
-    return False
+      err_str += "Got exception when trying to validate the query test: {exception} ".format(exception=sys.exc_info()[0:2])
+    return (True, ) if len(err_str) == 0 else (False, err_str)
 
   ############################################################
   # Validates the jsonString is an array with a length of
@@ -245,36 +314,51 @@ class FrameworkTest:
   # both keys map to integers.
   ############################################################
   def validateQueryFiveHundredOrMore(self, jsonString, out, err):
+    err_str = ""
     try:
       arr = {k.lower(): v for k,v in json.loads(jsonString).items()}
 
       if len(arr) != 500:
+       err_str += "Expected array of length 500. Got length {length}. ".format(length=len(arr))
         return False
 
       for obj in arr:
-        if (type(float(obj["id"])) != float or
-            type(float(obj["randomnumber"])) != float or
-            type(float(obj["id"])) != float or
-            type(float(obj["randomnumber"])) != float):
-          return False
-      # By here, it's passed validation
-      return True
+        id_ret_val = True
+        random_num_ret_val = True
+        if "id" not in obj or "randomnumber" not in obj:
+          err_str += "Expected keys id and randomNumber to be in JSON string. "
+          break
+        try:
+          if not isinstance(float(obj["id"]), float):
+            id_ret_val=False
+        except:
+          id_ret_val=False
+        if not id_ret_val:
+          err_str += "Expected id to be type int or float, got '{rand}'. ".format(rand=obj["randomnumber"])
+        try:
+          if not isinstance(float(obj["randomnumber"]), float):
+            random_num_ret_val=False
+        except:
+          random_num_ret_val=False
+        if not random_num_ret_val:
+          err_str += "Expected randomNumber to be type int or float, got '{rand}'. ".format(rand=obj["randomnumber"])
     except:
-      pass
-    return False
+      err_str += "Got exception when trying to validate the query test: {exception} ".format(exception=sys.exc_info()[0:2])
+    return (True, ) if len(err_str) == 0 else (False, err_str)
 
   ############################################################
   # Parses the given HTML string and asks a FortuneHTMLParser
   # whether the parsed string is a valid fortune return.
   ############################################################
   def validateFortune(self, htmlString, out, err):
+    err_str = ""
     try:
       parser = FortuneHTMLParser()
       parser.feed(htmlString)
 
       return parser.isValidFortune()
     except:
-      pass
+      print "Got exception when trying to validate the fortune test: {exception} ".format(exception=sys.exc_info()[0:2])
     return False
 
   ############################################################
@@ -284,27 +368,47 @@ class FrameworkTest:
   # both keys map to integers.
   ############################################################
   def validateUpdate(self, jsonString, out, err):
+    err_str = ""
     try:
       arr = [{k.lower(): v for k,v in d.items()} for d in json.loads(jsonString)]
-
-      if (type(float(arr[0]["id"])) == float and 
-          type(float(arr[0]["randomnumber"])) == float and 
-          type(float(arr[1]["id"])) == float and 
-          type(float(arr[1]["randomnumber"])) == float):
-        return True
+      ret_val = True
+      if len(arr) != 2:
+        err_str += "Expected array of length 2. Got length {length}.\n".format(length=len(arr))
+      for obj in arr:
+        id_ret_val = True
+        random_num_ret_val = True
+        if "id" not in obj or "randomnumber" not in obj:
+          err_str += "Expected keys id and randomNumber to be in JSON string.\n"
+          return False
+        try:
+          if not isinstance(float(obj["id"]), float):
+            id_ret_val=False
+        except:
+          id_ret_val=False
+        if not id_ret_val:
+          err_str += "Expected id to be type int or float, got '{rand}'.\n".format(rand=obj["randomnumber"])
+        try:
+          if not isinstance(float(obj["randomnumber"]), float):
+            random_num_ret_val=False
+        except:
+          random_num_ret_val=False
+        if not random_num_ret_val:
+          err_str += "Expected randomNumber to be type int or float, got '{rand}'.\n".format(rand=obj["randomnumber"])
     except:
-      pass
-    return False
+      err_str += "Got exception when trying to validate the update test: {exception}\n".format(exception=sys.exc_info()[0:2])
+    return (True, ) if len(err_str) == 0 else (False, err_str)
 
   ############################################################
   #
   ############################################################
   def validatePlaintext(self, jsonString, out, err):
+    err_str = ""
     try:
-      return jsonString.lower().strip() == "hello, world!"
+      if not jsonString.lower().strip() == "hello, world!":
+        err_str += "Expected 'Hello, World!', got '{message}'.\n".format(message=jsonString.strip())
     except:
-      pass
-    return False
+      err_str += "Got exception when trying to validate the plaintext test: {exception}\n".format(exception=sys.exc_info()[0:2])
+    return (True, ) if len(err_str) == 0 else (False, err_str)
 
   ############################################################
   # start(benchmarker)
@@ -360,7 +464,7 @@ class FrameworkTest:
         out.write("PASS\n\n")
       else:
         self.json_url_passed = False
-        out.write("FAIL\n\n")
+        out.write("\nFAIL\n\n" + ret_tuple[1])
       out.flush
 
     # DB
@@ -390,7 +494,7 @@ class FrameworkTest:
           out.write(" (with warnings)")
         out.write("\n\n")
       else:
-        out.write("FAIL\n\n")
+        out.write("\nFAIL\n\n" + ret_tuple[1])
       out.flush
 
     # Query
@@ -404,21 +508,23 @@ class FrameworkTest:
 
       url = self.benchmarker.generate_url(self.query_url + "2", self.port)
       output = self.__curl_url(url, self.QUERY, out, err)
-      if self.validateQuery(output, out, err):
+      ret_tuple = self.validateQuery(output, out, err)
+      if ret_tuple[0]:
         self.query_url_passed = True
         out.write(self.query_url + "2 - PASS\n\n")
       else:
         self.query_url_passed = False
-        out.write(self.query_url + "2 - FAIL\n\n")
+        out.write(self.query_url + "2 - FAIL\n\n" + ret_tuple[1])
       out.write("-----------------------------------------------------\n\n")
       out.flush()
 
       self.query_url_warn = False
       url2 = self.benchmarker.generate_url(self.query_url + "0", self.port)
       output2 = self.__curl_url(url2, self.QUERY, out, err)
-      if not self.validateQueryOneOrLess(output2, out, err):
+      ret_tuple = self.validateQueryOneOrLess(output2, out, err)
+      if not ret_tuple[0]:
         self.query_url_warn = True
-        out.write(self.query_url + "0 - WARNING\n\n")
+        out.write(self.query_url + "0 - WARNING\n\n" + ret_tuple[1])
       else:
         out.write(self.query_url + "0 - PASS\n\n")
       out.write("-----------------------------------------------------\n\n")
@@ -426,9 +532,10 @@ class FrameworkTest:
 
       url3 = self.benchmarker.generate_url(self.query_url + "foo", self.port)
       output3 = self.__curl_url(url3, self.QUERY, out, err)
-      if not self.validateQueryOneOrLess(output3, out, err):
+      ret_tuple = self.validateQueryOneOrLess(output3, out, err)
+      if not ret_tuple[0]:
         self.query_url_warn = True
-        out.write(self.query_url + "foo - WARNING\n\n")
+        out.write(self.query_url + "foo - WARNING\n\n" + ret_tuple[1])
       else:
         out.write(self.query_url + "foo - PASS\n\n")
       out.write("-----------------------------------------------------\n\n")
@@ -436,9 +543,10 @@ class FrameworkTest:
 
       url4 = self.benchmarker.generate_url(self.query_url + "501", self.port)
       output4 = self.__curl_url(url4, self.QUERY, out, err)
-      if not self.validateQueryFiveHundredOrMore(output4, out, err):
+      ret_tuple = self.validateQueryFiveHundredOrMore(output4, out, err)
+      if not ret_tuple[0]:
         self.query_url_warn = True
-        out.write(self.query_url + "501 - WARNING\n\n")
+        out.write(self.query_url + "501 - WARNING\n\n" + ret_tuple[1])
       else:
         out.write(self.query_url + "501 - PASS\n\n")
       out.write("-----------------------------------------------------\n\n\n")
@@ -451,7 +559,7 @@ class FrameworkTest:
           out.write(" (with warnings)")
         out.write("\n\n")
       else:
-        out.write("FAIL\n\n")
+        out.write("\nFAIL\n\n" + ret_tuple[1])
       out.flush
 
     # Fortune
@@ -471,7 +579,7 @@ class FrameworkTest:
         out.write("PASS\n\n")
       else:
         self.fortune_url_passed = False
-        out.write("FAIL\n\n")
+        out.write("\nFAIL\n\n")
       out.flush
 
     # Update
@@ -491,7 +599,7 @@ class FrameworkTest:
         out.write("PASS\n\n")
       else:
         self.update_url_passed = False
-        out.write("FAIL\n\n")
+        out.write("\nFAIL\n\n" + ret_tuple[1])
       out.flush
 
     # plaintext
@@ -506,12 +614,14 @@ class FrameworkTest:
       url = self.benchmarker.generate_url(self.plaintext_url, self.port)
       output = self.__curl_url(url, self.PLAINTEXT, out, err)
       out.write("VALIDATING PLAINTEXT ... ")
-      if self.validatePlaintext(output, out, err):
+      ret_tuple = self.validatePlaintext(output, out, err)
+      print ret_tuple
+      if ret_tuple[0]:
         self.plaintext_url_passed = True
         out.write("PASS\n\n")
       else:
         self.plaintext_url_passed = False
-        out.write("FAIL\n\n")
+        out.write(ret_tuple[1] + "\nFAIL\n\n")
       out.flush
 
   ############################################################