Browse Source

Merge branch 'master' into travis-hotfix

Conflicts:
	toolset/benchmark/benchmarker.py
	toolset/benchmark/framework_test.py
Hamilton Turner 11 years ago
parent
commit
f8b0a2d315

+ 1 - 1
php-fatfree/index.php

@@ -6,7 +6,7 @@ $f3->set('DEBUG',2);
 $f3->set('CACHE','folder=tmp/cache/');
 $f3->set('UI','ui/');
 
-$f3->set('DBS',array('mysql:host=127.0.0.1;port=3306;dbname=hello_world','benchmarkdbuser','benchmarkdbpass'));
+$f3->set('DBS',array('mysql:host=localhost;port=3306;dbname=hello_world','benchmarkdbuser','benchmarkdbpass'));
 
 // http: //www.techempower.com/benchmarks/#section=code
 

+ 2 - 4
toolset/benchmark/benchmarker.py

@@ -545,12 +545,10 @@ class Benchmarker:
             test_process.terminate()
           if test_process.exitcode != 0:
             error_happened = True
-
-    try:
+    if os.path.isfile('current_benchmark.txt'):
       os.remove('current_benchmark.txt')
-    except OSError:
-      pass
     logging.debug("End __run_tests.")
+
     if error_happened:
       return 1
     return 0

+ 8 - 2
toolset/benchmark/fortune_html_parser.py

@@ -1,5 +1,6 @@
 # -*- coding: utf-8
 from HTMLParser import HTMLParser
+from difflib import unified_diff
 
 class FortuneHTMLParser(HTMLParser):
   body = []
@@ -107,5 +108,10 @@ class FortuneHTMLParser(HTMLParser):
   # is valid against our known "fortune" spec.
   # The parsed data in 'body' is joined on empty strings
   # and checked for equality against our spec.
-  def isValidFortune(self):
-    return self.valid == ''.join(self.body)
+  def isValidFortune(self, out):
+    body = ''.join(self.body)
+    diff = self.valid == body
+    if not diff:
+      out.write("Fortune invalid. Diff following:\n")
+      out.write(''.join(unified_diff(self.valid, body, fromfile="Valid", tofile="Output")) + '\n')
+    return diff

+ 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)
@@ -363,7 +467,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])
         result = False
       out.flush
 
@@ -394,7 +498,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])
         result = False
       out.flush
 
@@ -409,21 +513,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")
@@ -431,9 +537,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")
@@ -441,9 +548,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")
@@ -456,7 +564,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])
         result = False
       out.flush
 
@@ -477,7 +585,7 @@ class FrameworkTest:
         out.write("PASS\n\n")
       else:
         self.fortune_url_passed = False
-        out.write("FAIL\n\n")
+        out.write("\nFAIL\n\n")
         result = False
       out.flush
 
@@ -498,7 +606,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])
         result = False
       out.flush
 
@@ -514,12 +622,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")
         result = False
       out.flush
 

+ 4 - 4
toolset/setup/windows/installer.ps1

@@ -10,9 +10,9 @@ $python_version           = "27"
 $wincache_installer_file  = "wincache-1.3.4-5.4-nts-vc9-x86.exe"
 $wincache_installer_path  = "wincache-1.3.4/$wincache_installer_file"
 $go_installer_file        = "go1.2.windows-amd64.msi"
-$jre_installer_file       = "jre-7u51-windows-x64.exe"
-$jdk_installer_file       = "jdk-7u51-windows-x64.exe"
-$jdk_master_hash          = "d1367410be659f1b47e554e7bd011ea0" 
+$jre_installer_file       = "jdk-7u65-windows-x64.exe"
+$jdk_installer_file       = "jdk-7u65-windows-x64.exe"
+$jdk_master_hash          = "f0270817998c7408b24a2dd9ac420346" 
 # http://www.oracle.com/technetwork/java/javase/downloads/java-se-binaries-checksum-1956892.html
 $resin_version            = "resin-4.0.36"
 $resin_installer_file     = "$resin_version.zip"
@@ -337,4 +337,4 @@ $cygwin_install_dir = "C:\Cygwin"
 Start-Process $cygwin_installer_local "-q -n -l $cygwin_installer_dir -s http://mirrors.kernel.org/sourceware/cygwin/ -R $cygwin_install_dir -P openssh" -WorkingDirectory "$cygwin_installer_dir" -Wait -RedirectStandardOutput $cygwin_installer_dir\install.log
 $env:Path += ";$cygwin_install_dir;$cygwin_install_dir\bin"; [Environment]::SetEnvironmentVariable("Path", $env:Path, [System.EnvironmentVariableTarget]::Machine)
 
-cd $basedir
+cd $basedir