1006 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			1006 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								import haxe.zip.Compress;
							 | 
						||
| 
								 | 
							
								import haxe.zip.Uncompress;
							 | 
						||
| 
								 | 
							
								import haxe.zip.FlushMode;
							 | 
						||
| 
								 | 
							
								import sys.FileSystem;
							 | 
						||
| 
								 | 
							
								import sys.db.Connection;
							 | 
						||
| 
								 | 
							
								import sys.db.Sqlite;
							 | 
						||
| 
								 | 
							
								import sys.db.Mysql;
							 | 
						||
| 
								 | 
							
								import sys.FileSystem;
							 | 
						||
| 
								 | 
							
								import haxe.io.Bytes;
							 | 
						||
| 
								 | 
							
								import haxe.io.BytesData;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import cpp.Random;
							 | 
						||
| 
								 | 
							
								import cpp.net.Poll;
							 | 
						||
| 
								 | 
							
								import sys.io.File;
							 | 
						||
| 
								 | 
							
								import sys.io.FileSeek;
							 | 
						||
| 
								 | 
							
								import sys.net.Host;
							 | 
						||
| 
								 | 
							
								import sys.net.Socket;
							 | 
						||
| 
								 | 
							
								import sys.net.UdpSocket;
							 | 
						||
| 
								 | 
							
								import sys.net.UdpSocket;
							 | 
						||
| 
								 | 
							
								import sys.io.Process;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if haxe4
							 | 
						||
| 
								 | 
							
								import sys.thread.Deque;
							 | 
						||
| 
								 | 
							
								import sys.thread.Thread;
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								import cpp.vm.Deque;
							 | 
						||
| 
								 | 
							
								import cpp.vm.Thread;
							 | 
						||
| 
								 | 
							
								#end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								using cpp.NativeArray;
							 | 
						||
| 
								 | 
							
								using cpp.AtomicInt;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// These should be ignored in haxe 3.3...
							 | 
						||
| 
								 | 
							
								import cpp.link.StaticStd;
							 | 
						||
| 
								 | 
							
								import cpp.link.StaticRegexp;
							 | 
						||
| 
								 | 
							
								import cpp.link.StaticZlib;
							 | 
						||
| 
								 | 
							
								import cpp.link.StaticMysql;
							 | 
						||
| 
								 | 
							
								import cpp.link.StaticSqlite;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@:buildXml('<include name="${HXCPP}/src/hx/libs/ssl/Build.xml"/>')
							 | 
						||
| 
								 | 
							
								extern class SslTest
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   @:extern @:native("_hx_ssl_init")
							 | 
						||
| 
								 | 
							
								   extern public static function socket_init():Void;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Test
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   static var errors = new Array<String>();
							 | 
						||
| 
								 | 
							
								   static var lastErrorCount = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   var x:Int;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public function new()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      x = 1;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function log(t:String)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      Sys.println(t);
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function v(t:String)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      Sys.println("  " + t);
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function ok()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      if (lastErrorCount==errors.length)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         v("ok");
							 | 
						||
| 
								 | 
							
								         return 0;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         lastErrorCount=errors.length;
							 | 
						||
| 
								 | 
							
								         v("bad");
							 | 
						||
| 
								 | 
							
								         return 1;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function error(e:String)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      Sys.println("Test Failed:" + e);
							 | 
						||
| 
								 | 
							
								      errors.push(e);
							 | 
						||
| 
								 | 
							
								      return -1;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function thisFile()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      #if nme_install_tool
							 | 
						||
| 
								 | 
							
								      var bytes:haxe.io.Bytes = ApplicationMain.getAsset("Test.hx");
							 | 
						||
| 
								 | 
							
								      #else
							 | 
						||
| 
								 | 
							
								      var bytes = sys.io.File.getBytes("Test.hx");
							 | 
						||
| 
								 | 
							
								      #end
							 | 
						||
| 
								 | 
							
								      return bytes;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testDb(cnx:Connection) : Int
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      v("connected :" + cnx);
							 | 
						||
| 
								 | 
							
								      if (cnx.dbName() == "SQLite") {
							 | 
						||
| 
								 | 
							
								        cnx.request("
							 | 
						||
| 
								 | 
							
								          CREATE TABLE IF NOT EXISTS UserPwd (
							 | 
						||
| 
								 | 
							
								              id INTEGER PRIMARY KEY AUTOINCREMENT,
							 | 
						||
| 
								 | 
							
								              name TEXT,
							 | 
						||
| 
								 | 
							
								              age INTEGER,
							 | 
						||
| 
								 | 
							
								              money DOUBLE,
							 | 
						||
| 
								 | 
							
								              password BLOB
							 | 
						||
| 
								 | 
							
								          )");
							 | 
						||
| 
								 | 
							
								         cnx.request("SELECT '豪鬼' test");
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        cnx.request("
							 | 
						||
| 
								 | 
							
								          CREATE TABLE IF NOT EXISTS UserPwd (
							 | 
						||
| 
								 | 
							
								              id INTEGER NOT NULL AUTO_INCREMENT,
							 | 
						||
| 
								 | 
							
								              name TEXT,
							 | 
						||
| 
								 | 
							
								              age INTEGER,
							 | 
						||
| 
								 | 
							
								              money DOUBLE,
							 | 
						||
| 
								 | 
							
								              password BLOB,
							 | 
						||
| 
								 | 
							
								              PRIMARY KEY(id)
							 | 
						||
| 
								 | 
							
								          )");
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      var dels = cnx.request("DELETE FROM UserPwd");
							 | 
						||
| 
								 | 
							
								      if (dels.nfields != 0)
							 | 
						||
| 
								 | 
							
								         return error("Bad DELETE'd result");
							 | 
						||
| 
								 | 
							
								      v("deleted " + dels.length + " existing rows");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      cnx.request("INSERT INTO UserPwd (name,age,money,password) VALUES ('John',32,100.45,X'c0ffee')");
							 | 
						||
| 
								 | 
							
								      cnx.request("INSERT INTO UserPwd (name,age,money,password) VALUES ('Bob',14,4.50,X'deadbeef01020304')");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var rset = cnx.request("SELECT * FROM UserPwd");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var length = rset.length;
							 | 
						||
| 
								 | 
							
								      v("found "+length+" users");
							 | 
						||
| 
								 | 
							
								      if (length!=2)
							 | 
						||
| 
								 | 
							
								         return error("Bad user count");
							 | 
						||
| 
								 | 
							
								      for( row in rset )
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         var pass:Dynamic = row.password;
							 | 
						||
| 
								 | 
							
								         var password = Std.is(pass, haxe.io.BytesData) ? haxe.io.Bytes.ofData(pass) : pass;
							 | 
						||
| 
								 | 
							
								         var md5 = haxe.crypto.Md5.make(password).toHex().substr(0,8);
							 | 
						||
| 
								 | 
							
								         v("  user "+row.name+" is "+row.age+" years old,  password:" + md5);
							 | 
						||
| 
								 | 
							
								         if (md5!="5f80e231" && md5!="8ed0b363")
							 | 
						||
| 
								 | 
							
								             return error("Bad binary blob store");
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return 0;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   static function testDate()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test date");
							 | 
						||
| 
								 | 
							
								      var now = Date.now();
							 | 
						||
| 
								 | 
							
								      v(Std.string(now));
							 | 
						||
| 
								 | 
							
								      var then = Date.fromString("1977-06-11");
							 | 
						||
| 
								 | 
							
								      v(Std.string(then));
							 | 
						||
| 
								 | 
							
								      if (now.getTime()<=then.getTime())
							 | 
						||
| 
								 | 
							
								         return error("Date fromString - time travel");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var later = DateTools.makeUtc(1996,5,4,17,55,11);
							 | 
						||
| 
								 | 
							
								      v(Std.string(later));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var diff:Float = untyped __global__.__hxcpp_timezone_offset(now.mSeconds);
							 | 
						||
| 
								 | 
							
								      v("timezone offet:" + diff);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testCompress()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test compress");
							 | 
						||
| 
								 | 
							
								      var bytes = thisFile();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var compress = new Compress(9);
							 | 
						||
| 
								 | 
							
								      compress.setFlushMode(FlushMode.FINISH);
							 | 
						||
| 
								 | 
							
								      var buffer = haxe.io.Bytes.alloc(bytes.length * 2 + 100);
							 | 
						||
| 
								 | 
							
								      var r = compress.execute(bytes,0,buffer,0);
							 | 
						||
| 
								 | 
							
								      compress.close();
							 | 
						||
| 
								 | 
							
								      var compressed = buffer.sub(0,r.write);
							 | 
						||
| 
								 | 
							
								      v("compressed size " + compressed.length );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      v("try closing too many times...");
							 | 
						||
| 
								 | 
							
								      var caughtError = false;
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         compress.close();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         v("correctly caught " + e );
							 | 
						||
| 
								 | 
							
								         caughtError = true;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (!caughtError)
							 | 
						||
| 
								 | 
							
								         error("Zlib closed without throwing error");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var decompressed = Uncompress.run(compressed);
							 | 
						||
| 
								 | 
							
								      v("decompressed size:" + decompressed.length + "/" + bytes.length);
							 | 
						||
| 
								 | 
							
								      if (decompressed.compare(bytes)!=0)
							 | 
						||
| 
								 | 
							
								         return error("Compress/Uncompress mismatch");
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testRegexp()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test Regexp/BytesInput");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      // This utf8 comment is parsed by the code ...
							 | 
						||
| 
								 | 
							
								      //  su©©ess
							 | 
						||
| 
								 | 
							
								      var success = false;
							 | 
						||
| 
								 | 
							
								      var utf8Match = ~/su©+ess/u;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      // This comment is parsed by the code ...
							 | 
						||
| 
								 | 
							
								      //XML<xml value="Hello World!"/>
							 | 
						||
| 
								 | 
							
								      var match = ~/^..XML/;
							 | 
						||
| 
								 | 
							
								      var input = new haxe.io.BytesInput(thisFile());
							 | 
						||
| 
								 | 
							
								      try {
							 | 
						||
| 
								 | 
							
								        while(true)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								           var line = input.readLine();
							 | 
						||
| 
								 | 
							
								           if (match.match(line))
							 | 
						||
| 
								 | 
							
								           {
							 | 
						||
| 
								 | 
							
								              var xml = Xml.parse(line.substr(5));
							 | 
						||
| 
								 | 
							
								              v("found xml:" + xml.firstElement().get("value"));
							 | 
						||
| 
								 | 
							
								              if (xml.firstElement().get("value")!="Hello World!")
							 | 
						||
| 
								 | 
							
								                 return error("Bad universal greeting");
							 | 
						||
| 
								 | 
							
								           }
							 | 
						||
| 
								 | 
							
								           if (utf8Match.match(line))
							 | 
						||
| 
								 | 
							
								           {
							 | 
						||
| 
								 | 
							
								              v("found utf8:" + utf8Match.matched(0));
							 | 
						||
| 
								 | 
							
								              success = true;
							 | 
						||
| 
								 | 
							
								           }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      } catch (e:Dynamic) { }
							 | 
						||
| 
								 | 
							
								      if (!success)
							 | 
						||
| 
								 | 
							
								         return error("Could not find success in utf8 code");
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testRegexpMixedUnicode() {
							 | 
						||
| 
								 | 
							
								      var success = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      // when matching a utf8 subject string against a utf16 pattern and vice versa
							 | 
						||
| 
								 | 
							
								      for (pattern => subject in ["[A-Za-zÀ-ÖØ-öø-ÿ0-9]+" => "a", "[A-Z]+" => "ÀÖA"]) {
							 | 
						||
| 
								 | 
							
								         if (new EReg(pattern, "").match(subject)) {
							 | 
						||
| 
								 | 
							
								            v('"$subject" matches against ~/$pattern/');
							 | 
						||
| 
								 | 
							
								         } else {
							 | 
						||
| 
								 | 
							
								            return error('"$subject" does not match against ~/$pattern/');
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testSqlite()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test sqlite");
							 | 
						||
| 
								 | 
							
								      var dbFile = "hxcpp.db";
							 | 
						||
| 
								 | 
							
								      var cnx = Sqlite.open(dbFile);
							 | 
						||
| 
								 | 
							
								      if (testDb(cnx)!=0)
							 | 
						||
| 
								 | 
							
								         return error("db error");
							 | 
						||
| 
								 | 
							
								      cnx.close();
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testMysql()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test mysql");
							 | 
						||
| 
								 | 
							
								      var cnx:sys.db.Connection = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         cnx = Mysql.connect({
							 | 
						||
| 
								 | 
							
								            host : "localhost",
							 | 
						||
| 
								 | 
							
								            port : 3306,
							 | 
						||
| 
								 | 
							
								            user : "hxcpp",
							 | 
						||
| 
								 | 
							
								            pass : "hxcpp",
							 | 
						||
| 
								 | 
							
								            socket : null,
							 | 
						||
| 
								 | 
							
								            database : "hxcpp"
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         v("mysql got error - ok because no server" );
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (cnx!=null)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        if (testDb(cnx)!=0)
							 | 
						||
| 
								 | 
							
								           error("TestDB failed");
							 | 
						||
| 
								 | 
							
								        cnx.close();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testRandom()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test Random");
							 | 
						||
| 
								 | 
							
								      var rand = new Random();
							 | 
						||
| 
								 | 
							
								      var f0 = rand.float();
							 | 
						||
| 
								 | 
							
								      var f1 = rand.float();
							 | 
						||
| 
								 | 
							
								      v('samples $f0,$f1');
							 | 
						||
| 
								 | 
							
								      if (f0==f1)
							 | 
						||
| 
								 | 
							
								         return error("Not random enough");
							 | 
						||
| 
								 | 
							
								      rand.setSeed(1);
							 | 
						||
| 
								 | 
							
								      var i0 = rand.int(256);
							 | 
						||
| 
								 | 
							
								      rand.setSeed(2);
							 | 
						||
| 
								 | 
							
								      var i1 = rand.int(256);
							 | 
						||
| 
								 | 
							
								      v('int samples $i0,$i1');
							 | 
						||
| 
								 | 
							
								      if (i0!=91 || i1!=217)
							 | 
						||
| 
								 | 
							
								         return error("Non-repeatable random seed, should be 91,217");
							 | 
						||
| 
								 | 
							
								      var tries = 0;
							 | 
						||
| 
								 | 
							
								      while(rand.int(1000)!=999)
							 | 
						||
| 
								 | 
							
								         tries++;
							 | 
						||
| 
								 | 
							
								      v('tries to 1000 = $tries');
							 | 
						||
| 
								 | 
							
								      if (tries!=749)
							 | 
						||
| 
								 | 
							
								         return error("Non-repeatable random iterations");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function tryFunc( func ) : Bool
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         func();
							 | 
						||
| 
								 | 
							
								         return true;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      catch(e:Dynamic) { }
							 | 
						||
| 
								 | 
							
								      return false;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testFile()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test File");
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								      var filename = "testfile.txt";
							 | 
						||
| 
								 | 
							
								      tryFunc( function() FileSystem.deleteFile(filename) );
							 | 
						||
| 
								 | 
							
								      tryFunc( function() FileSystem.deleteFile(filename+"-copy") );
							 | 
						||
| 
								 | 
							
								      tryFunc( function() FileSystem.deleteFile(filename+".bin") );
							 | 
						||
| 
								 | 
							
								      tryFunc( function() FileSystem.deleteFile(filename+".out") );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var contents = "line1\nline2\n";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      v("compare...");
							 | 
						||
| 
								 | 
							
								      File.saveContent(filename,contents);
							 | 
						||
| 
								 | 
							
								      if ( File.getContent(filename)!=contents )
							 | 
						||
| 
								 | 
							
								         return error("getContent mismatch");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      v("copy...");
							 | 
						||
| 
								 | 
							
								      File.copy(filename,filename+"-copy");
							 | 
						||
| 
								 | 
							
								      var bytes = File.getBytes(filename+"-copy");
							 | 
						||
| 
								 | 
							
								      if ( bytes.compare( Bytes.ofString(contents) ) !=0 )
							 | 
						||
| 
								 | 
							
								         return error("copy getBytes mismatch");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      File.saveBytes(filename+".bin",bytes);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      v("file in...");
							 | 
						||
| 
								 | 
							
								      var fileIn = File.read(filename+".bin");
							 | 
						||
| 
								 | 
							
								      if (fileIn.readByte()!=contents.charCodeAt(0))
							 | 
						||
| 
								 | 
							
								         return error("File readByte mismatch");
							 | 
						||
| 
								 | 
							
								      var buffer = Bytes.alloc(5);
							 | 
						||
| 
								 | 
							
								      buffer.set(0,'-'.code);
							 | 
						||
| 
								 | 
							
								      buffer.set(4,'+'.code);
							 | 
						||
| 
								 | 
							
								      if (fileIn.readBytes(buffer,1,3)!=3)
							 | 
						||
| 
								 | 
							
								         return error("Could not read 3 bytes");
							 | 
						||
| 
								 | 
							
								      v( "read 3: " + buffer.toString() );
							 | 
						||
| 
								 | 
							
								      if ( buffer.toString() != "-ine+" )
							 | 
						||
| 
								 | 
							
								         return error("Bad sub-buffer readBytes");
							 | 
						||
| 
								 | 
							
								      v("seek...");
							 | 
						||
| 
								 | 
							
								      if (fileIn.tell()!=4)
							 | 
						||
| 
								 | 
							
								         return error("tell!=4");
							 | 
						||
| 
								 | 
							
								      fileIn.seek(4, SeekCur );
							 | 
						||
| 
								 | 
							
								      if (fileIn.tell()!=8)
							 | 
						||
| 
								 | 
							
								         return error("SeekCur tell!=8");
							 | 
						||
| 
								 | 
							
								      fileIn.seek(7, SeekBegin );
							 | 
						||
| 
								 | 
							
								      if (fileIn.tell()!=7)
							 | 
						||
| 
								 | 
							
								         return error("SeekSet tell!=7");
							 | 
						||
| 
								 | 
							
								      var rest = Bytes.alloc( contents.length - fileIn.tell() );
							 | 
						||
| 
								 | 
							
								      fileIn.readBytes(rest,0,rest.length);
							 | 
						||
| 
								 | 
							
								      if (fileIn.eof())
							 | 
						||
| 
								 | 
							
								         return error("File at end, but not eof");
							 | 
						||
| 
								 | 
							
								      fileIn.seek( -contents.length, SeekEnd );
							 | 
						||
| 
								 | 
							
								      if (fileIn.tell()!=0)
							 | 
						||
| 
								 | 
							
								         return error("File seek from end to beginning failed");
							 | 
						||
| 
								 | 
							
								      fileIn.close();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      v("write...");
							 | 
						||
| 
								 | 
							
								      var fileOut = File.write(filename+".out");
							 | 
						||
| 
								 | 
							
								      fileOut.writeByte('W'.code);
							 | 
						||
| 
								 | 
							
								      if (fileOut.writeBytes(buffer,1,3)!=3)
							 | 
						||
| 
								 | 
							
								         return error("Could not write 3 bytes");
							 | 
						||
| 
								 | 
							
								      if (fileOut.tell()!=4)
							 | 
						||
| 
								 | 
							
								         return error("Bad tell on file write");
							 | 
						||
| 
								 | 
							
								      fileOut.flush();
							 | 
						||
| 
								 | 
							
								      if (File.getContent(filename+".out")!="Wine")
							 | 
						||
| 
								 | 
							
								         return error("Bad reading after flush");
							 | 
						||
| 
								 | 
							
								      fileOut.seek(1,SeekBegin);
							 | 
						||
| 
								 | 
							
								      fileOut.writeByte('a'.code);
							 | 
						||
| 
								 | 
							
								      fileOut.close();
							 | 
						||
| 
								 | 
							
								      var contents =  File.getContent(filename+".out");
							 | 
						||
| 
								 | 
							
								      v("have :" + contents);
							 | 
						||
| 
								 | 
							
								      if (contents!="Wane")
							 | 
						||
| 
								 | 
							
								         return error("Bad readback after seek");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      v("cleanup...");
							 | 
						||
| 
								 | 
							
								      FileSystem.deleteFile(filename);
							 | 
						||
| 
								 | 
							
								      FileSystem.deleteFile(filename + "-copy");
							 | 
						||
| 
								 | 
							
								      FileSystem.deleteFile(filename + ".bin");
							 | 
						||
| 
								 | 
							
								      FileSystem.deleteFile(filename + ".out");
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         return error("Unexpected error in testFile: " + e);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testHost()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test Host");
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								      var localhost = Host.localhost();
							 | 
						||
| 
								 | 
							
								      v('localhost :$localhost');
							 | 
						||
| 
								 | 
							
								      var host = new Host(localhost);
							 | 
						||
| 
								 | 
							
								      v('host :$host');
							 | 
						||
| 
								 | 
							
								      // var reverse = host.reverse();
							 | 
						||
| 
								 | 
							
								      // v('reverse :$reverse');
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         return error("Unexpected error in testHost: " + e);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testFileSystem()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      log("Test FileSystem");
							 | 
						||
| 
								 | 
							
								      tryFunc( function() FileSystem.deleteFile("dir/file.txt") );
							 | 
						||
| 
								 | 
							
								      tryFunc( function() FileSystem.deleteFile("dir/txt.file") );
							 | 
						||
| 
								 | 
							
								      tryFunc( function() FileSystem.deleteFile("dir/child") );
							 | 
						||
| 
								 | 
							
								      tryFunc( function() FileSystem.deleteDirectory("dir") );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      v("create dir");
							 | 
						||
| 
								 | 
							
								      if (!tryFunc( function() FileSystem.createDirectory("dir") ) )
							 | 
						||
| 
								 | 
							
								         return error("Could not create 'dir'");
							 | 
						||
| 
								 | 
							
								      if (!tryFunc( function() FileSystem.createDirectory("dir/child") ) )
							 | 
						||
| 
								 | 
							
								         return error("Could not create 'dir/child'");
							 | 
						||
| 
								 | 
							
								      File.saveContent("dir/file.txt","hello");
							 | 
						||
| 
								 | 
							
								      var stat = FileSystem.stat("dir/file.txt");
							 | 
						||
| 
								 | 
							
								      v(Std.string(stat));
							 | 
						||
| 
								 | 
							
								      if (stat.size!=5)
							 | 
						||
| 
								 | 
							
								         return error("File does not contain 5 bytes");
							 | 
						||
| 
								 | 
							
								      if ( Std.string(stat.ctime).length != 19)
							 | 
						||
| 
								 | 
							
								         return error("File ctime does not appear to be a date");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      v("exists");
							 | 
						||
| 
								 | 
							
								      if (!FileSystem.exists("dir"))
							 | 
						||
| 
								 | 
							
								         return error("'dir' should exist");
							 | 
						||
| 
								 | 
							
								      if (!FileSystem.exists("dir/file.txt"))
							 | 
						||
| 
								 | 
							
								         return error("'/file.txt' should exist");
							 | 
						||
| 
								 | 
							
								      var files = FileSystem.readDirectory("dir");
							 | 
						||
| 
								 | 
							
								      v("dir contents:" + files);
							 | 
						||
| 
								 | 
							
								      if (files.length!=2 || files.indexOf("file.txt")<0 || files.indexOf("child")<0)
							 | 
						||
| 
								 | 
							
								         return error("Unexpected dir contents " + (files.indexOf("file.txt") + "," + files.indexOf("child")) );
							 | 
						||
| 
								 | 
							
								      if (tryFunc( function() FileSystem.deleteDirectory("dir/junk") ) )
							 | 
						||
| 
								 | 
							
								         return error("No error deleting junk directory");
							 | 
						||
| 
								 | 
							
								      if (tryFunc( function() FileSystem.deleteFile("dir/junk") ) )
							 | 
						||
| 
								 | 
							
								         return error("No error deleting junk file");
							 | 
						||
| 
								 | 
							
								      if (tryFunc( function() FileSystem.deleteFile("dir/child") ) )
							 | 
						||
| 
								 | 
							
								         return error("No error deleting directory as file");
							 | 
						||
| 
								 | 
							
								      if (tryFunc( function() FileSystem.deleteDirectory("dir/file.txt") ) )
							 | 
						||
| 
								 | 
							
								         return error("No error deleting file as directory");
							 | 
						||
| 
								 | 
							
								      var fullPath = FileSystem.fullPath("dir/child");
							 | 
						||
| 
								 | 
							
								      v('fullPath: $fullPath');
							 | 
						||
| 
								 | 
							
								      var fullPath = FileSystem.fullPath("dir/file.txt");
							 | 
						||
| 
								 | 
							
								      v('fullPath: $fullPath');
							 | 
						||
| 
								 | 
							
								      v("isDirectory...");
							 | 
						||
| 
								 | 
							
								      if (FileSystem.isDirectory("dir/file.txt"))
							 | 
						||
| 
								 | 
							
								         return error("file appears to be a directory");
							 | 
						||
| 
								 | 
							
								      if (!FileSystem.isDirectory("dir/child"))
							 | 
						||
| 
								 | 
							
								         return error("directory appears to not be a directory");
							 | 
						||
| 
								 | 
							
								      if (FileSystem.isDirectory("dir/junk"))
							 | 
						||
| 
								 | 
							
								         return error("junk appears to be a directory");
							 | 
						||
| 
								 | 
							
								      if (FileSystem.isDirectory("dir/file.txt"))
							 | 
						||
| 
								 | 
							
								         return error("file appears to be a directory");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      v("rename...");
							 | 
						||
| 
								 | 
							
								      if (tryFunc( function() FileSystem.rename("dir/a", "dir/b")) )
							 | 
						||
| 
								 | 
							
								         return error("No error renaming missing file");
							 | 
						||
| 
								 | 
							
								      FileSystem.rename("dir/file.txt","dir/txt.file");
							 | 
						||
| 
								 | 
							
								      if (!FileSystem.exists("dir/txt.file") || FileSystem.exists("dir/file.txt"))
							 | 
						||
| 
								 | 
							
								         return error("Rename seemed to go wrong " + FileSystem.readDirectory("dir"));
							 | 
						||
| 
								 | 
							
								      v("cleanup..");
							 | 
						||
| 
								 | 
							
								      FileSystem.deleteFile("dir/txt.file");
							 | 
						||
| 
								 | 
							
								      FileSystem.deleteDirectory("dir/child");
							 | 
						||
| 
								 | 
							
								      FileSystem.deleteDirectory("dir");
							 | 
						||
| 
								 | 
							
								      if (FileSystem.readDirectory(".").indexOf("dir")>=0)
							 | 
						||
| 
								 | 
							
								         return error("Directory removed, but sill there?:" + FileSystem.readDirectory("."));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         return error("Unexpected error in testFileSystem: " + e);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testSys()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test Sys");
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         Sys.putEnv("mykey","123");
							 | 
						||
| 
								 | 
							
								         var env = Sys.getEnv("mykey");
							 | 
						||
| 
								 | 
							
								         v("got env:" + env);
							 | 
						||
| 
								 | 
							
								         if (env!="123")
							 | 
						||
| 
								 | 
							
								            return error("Bad environment get");
							 | 
						||
| 
								 | 
							
								         v("little sleep...");
							 | 
						||
| 
								 | 
							
								         var t0 = Sys.time();
							 | 
						||
| 
								 | 
							
								         Sys.sleep(0.1);
							 | 
						||
| 
								 | 
							
								         var t1 = Sys.time();
							 | 
						||
| 
								 | 
							
								         v("Slept for: " + (t1-t0));
							 | 
						||
| 
								 | 
							
								         if (t1<=t0 || (t1-t0)>10)
							 | 
						||
| 
								 | 
							
								            return error("Too sleepy");
							 | 
						||
| 
								 | 
							
								         v("CpuTime: " + Sys.cpuTime());
							 | 
						||
| 
								 | 
							
								         v("Cwd: " + Sys.getCwd());
							 | 
						||
| 
								 | 
							
								         v("Program Path: " + Sys.programPath());
							 | 
						||
| 
								 | 
							
								         var env = Sys.environment();
							 | 
						||
| 
								 | 
							
								         v("Environment mykey: " + env.get("mykey") );
							 | 
						||
| 
								 | 
							
								         if (env.get("mykey")!="123")
							 | 
						||
| 
								 | 
							
								            return error("Could not find mykey in environment");
							 | 
						||
| 
								 | 
							
								         v("Ignore getChar auto test");
							 | 
						||
| 
								 | 
							
								         v("Args: " + Sys.args());
							 | 
						||
| 
								 | 
							
								         v("SystemName: " + Sys.systemName());
							 | 
						||
| 
								 | 
							
								         v("Skipping  Sys.setTimeLocale" + Sys.setTimeLocale);
							 | 
						||
| 
								 | 
							
								         // Sys.command
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								         return ok();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         return error("Unexpected error in testSys: " + e);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testCommand()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test Command");
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								      var code = Sys.command( Sys.programPath(), ["exit", "13"]);
							 | 
						||
| 
								 | 
							
								      if (code!=13)
							 | 
						||
| 
								 | 
							
								         return error('Process exited with code $code, not 13');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         return error("Unexpected error in testCommand: " + e);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function runAsProcess()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      var args = Sys.args();
							 | 
						||
| 
								 | 
							
								      var job = args.shift();
							 | 
						||
| 
								 | 
							
								      if (job=="exit")
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         Sys.exit( Std.parseInt(args[0]) );
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else if (job=="socket")
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         socketClient();
							 | 
						||
| 
								 | 
							
								         Sys.exit(0);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								         Sys.println('Unknown job : "$job"');
							 | 
						||
| 
								 | 
							
								      Sys.exit(-99);
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testPoll()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test poll");
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var poll = new Poll(4);
							 | 
						||
| 
								 | 
							
								      poll.prepare([],[]);
							 | 
						||
| 
								 | 
							
								      var t0 = Sys.time();
							 | 
						||
| 
								 | 
							
								      v("poll...");
							 | 
						||
| 
								 | 
							
								      poll.poll([],0.1);
							 | 
						||
| 
								 | 
							
								      var t = Sys.time()-t0;
							 | 
						||
| 
								 | 
							
								      v('took ${t}s');
							 | 
						||
| 
								 | 
							
								      /*
							 | 
						||
| 
								 | 
							
								      if (t<0.1)
							 | 
						||
| 
								 | 
							
								         return error("Timeout too soon");
							 | 
						||
| 
								 | 
							
								      if (t>10)
							 | 
						||
| 
								 | 
							
								         return error("Timeout too slow");
							 | 
						||
| 
								 | 
							
								      */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         return error("Unexpected error in testPoll: " + e);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testUdpSocket()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test UdpSocket");
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var udp = new UdpSocket();
							 | 
						||
| 
								 | 
							
								      udp.close();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         return error("Unexpected error in testUdpSocket: " + e);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   static var socketClientRunning = true;
							 | 
						||
| 
								 | 
							
								   public static function readOutput(proc:Process)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      Thread.create( function() {
							 | 
						||
| 
								 | 
							
								         while(true)
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            try
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               var line = proc.stdout.readLine();
							 | 
						||
| 
								 | 
							
								               v("---> " + line);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               break;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         var code = proc.exitCode();
							 | 
						||
| 
								 | 
							
								         v("process exit code :" + code);
							 | 
						||
| 
								 | 
							
								         socketClientRunning = false;
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testSocket()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test Socket");
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								      v("Spawn client..");
							 | 
						||
| 
								 | 
							
								      var proc = new Process( Sys.programPath(), ["socket"] );
							 | 
						||
| 
								 | 
							
								      readOutput(proc);
							 | 
						||
| 
								 | 
							
								      v("connect localhost..");
							 | 
						||
| 
								 | 
							
								      var host = new Host("localhost");
							 | 
						||
| 
								 | 
							
								      var socket = new Socket();
							 | 
						||
| 
								 | 
							
								      socket.bind(host,0xcccc);
							 | 
						||
| 
								 | 
							
								      v("listen...");
							 | 
						||
| 
								 | 
							
								      socket.listen(1);
							 | 
						||
| 
								 | 
							
								      v("accept...");
							 | 
						||
| 
								 | 
							
								      var connected = socket.accept();
							 | 
						||
| 
								 | 
							
								      v("connected!");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var input = connected.input;
							 | 
						||
| 
								 | 
							
								      var output = connected.output;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      v("send...");
							 | 
						||
| 
								 | 
							
								      connected.setFastSend(true);
							 | 
						||
| 
								 | 
							
								      connected.write("ping");
							 | 
						||
| 
								 | 
							
								      var buffer = Bytes.alloc(8);
							 | 
						||
| 
								 | 
							
								      if (input.readBytes(buffer,0,8)!=8)
							 | 
						||
| 
								 | 
							
								         return error("Could not read from socket");
							 | 
						||
| 
								 | 
							
								      var got = buffer.toString();
							 | 
						||
| 
								 | 
							
								      v('got $got');
							 | 
						||
| 
								 | 
							
								      if (got!="pingpong")
							 | 
						||
| 
								 | 
							
								         return error("Bad socket read");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      v("close connection..");
							 | 
						||
| 
								 | 
							
								      connected.close();
							 | 
						||
| 
								 | 
							
								      v("close original..");
							 | 
						||
| 
								 | 
							
								      socket.close();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      for(wait in 0...10)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         if (!socketClientRunning)
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								         v("wait for client...");
							 | 
						||
| 
								 | 
							
								         Sys.sleep(0.1);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (socketClientRunning)
							 | 
						||
| 
								 | 
							
								         return error("Socket client did not finish");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         return error("Unexpected error in Socket: " + e);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function socketClient()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Client proc...");
							 | 
						||
| 
								 | 
							
								      var host = new Host("localhost");
							 | 
						||
| 
								 | 
							
								      var socket:Socket = null;
							 | 
						||
| 
								 | 
							
								      for(attempt in 0...10)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         try
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            log("Client connect...");
							 | 
						||
| 
								 | 
							
								            socket = new Socket();
							 | 
						||
| 
								 | 
							
								            socket.connect(host,0xcccc);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            socket.close();
							 | 
						||
| 
								 | 
							
								            socket = null;
							 | 
						||
| 
								 | 
							
								            log("Client failed :" + e);
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         log("sleep...");
							 | 
						||
| 
								 | 
							
								         Sys.sleep(0.25);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (socket==null)
							 | 
						||
| 
								 | 
							
								         Sys.exit(-1);
							 | 
						||
| 
								 | 
							
								      v("connected client");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var input = socket.input;
							 | 
						||
| 
								 | 
							
								      var output = socket.output;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var buffer = Bytes.alloc(4);
							 | 
						||
| 
								 | 
							
								      input.readBytes(buffer,0,4);
							 | 
						||
| 
								 | 
							
								      v("client got " + buffer);
							 | 
						||
| 
								 | 
							
								      output.writeBytes( Bytes.ofString( buffer.toString() + "pong" ), 0, 8);
							 | 
						||
| 
								 | 
							
								      output.flush();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      v("bye");
							 | 
						||
| 
								 | 
							
								      socket.shutdown(true,true);
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testSsl() : Int
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test ssl");
							 | 
						||
| 
								 | 
							
								      SslTest.socket_init();
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testSerialization() : Int
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test serialization");
							 | 
						||
| 
								 | 
							
								      var orig:haxe.Int64 = haxe.Int64.make(0xdeadbeef,0xbeefdead);
							 | 
						||
| 
								 | 
							
								      var recon:haxe.Int64 = haxe.Unserializer.run(haxe.Serializer.run(orig));
							 | 
						||
| 
								 | 
							
								      if (orig!=recon)
							 | 
						||
| 
								 | 
							
								         error('Bad Int64 serialization $orig != $recon');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   // Hide from optimizer
							 | 
						||
| 
								 | 
							
								   static function getOne() return 1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testThread()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test thread");
							 | 
						||
| 
								 | 
							
								      v("atomics..");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var a:AtomicInt = getOne();
							 | 
						||
| 
								 | 
							
								      var aPtr = cpp.Pointer.addressOf(a);
							 | 
						||
| 
								 | 
							
								      if (aPtr.exchangeIf(2,3))
							 | 
						||
| 
								 | 
							
								         error("Bad exchageIf " + a);
							 | 
						||
| 
								 | 
							
								      if (!aPtr.exchangeIf(1,3))
							 | 
						||
| 
								 | 
							
								         error("No exchageIf " + a);
							 | 
						||
| 
								 | 
							
								      if (a!=3)
							 | 
						||
| 
								 | 
							
								         error("Bad exchageIf value ");
							 | 
						||
| 
								 | 
							
								      if (aPtr.atomicInc()!=3)
							 | 
						||
| 
								 | 
							
								         error("Bad atomicInc return");
							 | 
						||
| 
								 | 
							
								      if (a!=4)
							 | 
						||
| 
								 | 
							
								         error("Bad atomicInc value " + a);
							 | 
						||
| 
								 | 
							
								      if (aPtr.atomicDec()!=4)
							 | 
						||
| 
								 | 
							
								         error("Bad atomicDec return");
							 | 
						||
| 
								 | 
							
								      if (a!=3)
							 | 
						||
| 
								 | 
							
								         error("Bad atomicDec value " + a);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      a = getOne();
							 | 
						||
| 
								 | 
							
								      v('deque a=$a');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var q = new Deque<Int>();
							 | 
						||
| 
								 | 
							
								      q.add(1);
							 | 
						||
| 
								 | 
							
								      q.add(2);
							 | 
						||
| 
								 | 
							
								      q.add(3);
							 | 
						||
| 
								 | 
							
								      var mainThread = Thread.current();
							 | 
						||
| 
								 | 
							
								      // +100000
							 | 
						||
| 
								 | 
							
								      Thread.create(function() {
							 | 
						||
| 
								 | 
							
								         q.pop(true);
							 | 
						||
| 
								 | 
							
								         for(i in 0...100000)
							 | 
						||
| 
								 | 
							
								            aPtr.atomicInc();
							 | 
						||
| 
								 | 
							
								         mainThread.sendMessage(null);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      // +100000
							 | 
						||
| 
								 | 
							
								      Thread.create(function() {
							 | 
						||
| 
								 | 
							
								         q.pop(true);
							 | 
						||
| 
								 | 
							
								         for(i in 0...100000)
							 | 
						||
| 
								 | 
							
								            aPtr.atomicInc();
							 | 
						||
| 
								 | 
							
								         mainThread.sendMessage(null);
							 | 
						||
| 
								 | 
							
								      } );
							 | 
						||
| 
								 | 
							
								      // -200000
							 | 
						||
| 
								 | 
							
								      Thread.create(function() {
							 | 
						||
| 
								 | 
							
								         q.pop(true);
							 | 
						||
| 
								 | 
							
								         for(i in 0...200000)
							 | 
						||
| 
								 | 
							
								            aPtr.atomicDec();
							 | 
						||
| 
								 | 
							
								         mainThread.sendMessage(null);
							 | 
						||
| 
								 | 
							
								      } );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      v("wait for reply..");
							 | 
						||
| 
								 | 
							
								      for(i in 0...3)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         Thread.readMessage(true);
							 | 
						||
| 
								 | 
							
								         v('got $i');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (a!=1)
							 | 
						||
| 
								 | 
							
								         error('Bad deque count : $a');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testFloatReads()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test float bytes");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var bytes =haxe.io.Bytes.alloc(1+4+8);
							 | 
						||
| 
								 | 
							
								      bytes.fill(0,1,46);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      // Test unaligned read/write
							 | 
						||
| 
								 | 
							
								      bytes.setFloat(1,1.25);
							 | 
						||
| 
								 | 
							
								      bytes.setDouble(5,1.25);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (bytes.get(0)!=46)
							 | 
						||
| 
								 | 
							
								         error("Bad byte 0");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (bytes.getDouble(5)!=bytes.getFloat(1))
							 | 
						||
| 
								 | 
							
								         error("Bad byte read/write");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public dynamic function getX() return x;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testDynamicMember()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test dynamic member");
							 | 
						||
| 
								 | 
							
								      var t = new Test();
							 | 
						||
| 
								 | 
							
								      if (t.getX()!=1)
							 | 
						||
| 
								 | 
							
								         error("Bad dynamic member function");
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   @:noDebug
							 | 
						||
| 
								 | 
							
								   public static function testNoDebug()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test noDebug");
							 | 
						||
| 
								 | 
							
								      // Just testing to see it it compiles...
							 | 
						||
| 
								 | 
							
								      if (  null == new haxe.io.BytesBuffer() )
							 | 
						||
| 
								 | 
							
								         error("Bad alloc");
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   @:noDebug
							 | 
						||
| 
								 | 
							
								   public static function testNoDebugNoAlloc()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test noDebug, no alloc");
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function testIntParsing()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      log("Test int parsing");
							 | 
						||
| 
								 | 
							
								      var val = Std.parseInt('0x1');
							 | 
						||
| 
								 | 
							
								      if (val != 1)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         error('parsed hex value was not 1, $val');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      var val = Std.parseInt(' 0x1');
							 | 
						||
| 
								 | 
							
								      if (val != 1)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         error('parsed hex value was not 1, $val');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      var val = Std.parseInt('\t0x1');
							 | 
						||
| 
								 | 
							
								      if (val != 1)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         error('parsed hex value was not 1, $val');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      var val = Std.parseInt('   0x');
							 | 
						||
| 
								 | 
							
								      if (val != 0)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         error('parsed hex value was not 0, $val');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      var val = Std.parseInt('   0xyz');
							 | 
						||
| 
								 | 
							
								      if (val != 0)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         error('parsed hex value was not 0, $val');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      var val = Std.parseInt('-0x1');
							 | 
						||
| 
								 | 
							
								      if (val != -1)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         error('parsed hex value was not 1, $val');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      var val = Std.parseInt(' -0x1');
							 | 
						||
| 
								 | 
							
								      if (val != -1)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         error('parsed hex value was not 1, $val');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      var val = Std.parseInt('\t-0x1');
							 | 
						||
| 
								 | 
							
								      if (val != -1)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         error('parsed hex value was not 1, $val');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      var val = Std.parseInt('   -0x');
							 | 
						||
| 
								 | 
							
								      if (val != 0)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         error('parsed hex value was not 0, $val');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      var val = Std.parseInt('   -0xyz');
							 | 
						||
| 
								 | 
							
								      if (val != 0)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         error('parsed hex value was not 0, $val');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      var val = Std.parseInt('  5');
							 | 
						||
| 
								 | 
							
								      if (val != 5)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         error('parsed int value was not 5, $val');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      var val = Std.parseInt(' \t\n5');
							 | 
						||
| 
								 | 
							
								      if (val != 5)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         error('parsed int value was not 5, $val');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return ok();
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function main()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      var exitCode = 0;
							 | 
						||
| 
								 | 
							
								      if (Sys.args().length>0)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         runAsProcess();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         exitCode |= testDate();
							 | 
						||
| 
								 | 
							
								         exitCode |= testCompress();
							 | 
						||
| 
								 | 
							
								         exitCode |= testRegexp();
							 | 
						||
| 
								 | 
							
								         exitCode |= testRegexpMixedUnicode();
							 | 
						||
| 
								 | 
							
								         exitCode |= testSqlite();
							 | 
						||
| 
								 | 
							
								         exitCode |= testMysql();
							 | 
						||
| 
								 | 
							
								         exitCode |= testRandom();
							 | 
						||
| 
								 | 
							
								         exitCode |= testFile();
							 | 
						||
| 
								 | 
							
								         exitCode |= testFileSystem();
							 | 
						||
| 
								 | 
							
								         exitCode |= testHost();
							 | 
						||
| 
								 | 
							
								         exitCode |= testSys();
							 | 
						||
| 
								 | 
							
								         exitCode |= testCommand();
							 | 
						||
| 
								 | 
							
								         exitCode |= testPoll();
							 | 
						||
| 
								 | 
							
								         exitCode |= testUdpSocket();
							 | 
						||
| 
								 | 
							
								         exitCode |= testSocket();
							 | 
						||
| 
								 | 
							
								         exitCode |= testThread();
							 | 
						||
| 
								 | 
							
								         exitCode |= testSsl();
							 | 
						||
| 
								 | 
							
								         exitCode |= testSerialization();
							 | 
						||
| 
								 | 
							
								         exitCode |= testFloatReads();
							 | 
						||
| 
								 | 
							
								         exitCode |= testDynamicMember();
							 | 
						||
| 
								 | 
							
								         exitCode |= testNoDebug();
							 | 
						||
| 
								 | 
							
								         exitCode |= testNoDebugNoAlloc();
							 | 
						||
| 
								 | 
							
								         exitCode |= testIntParsing();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								         if (exitCode!=0)
							 | 
						||
| 
								 | 
							
								            Sys.println("############# Errors running tests:\n   " + errors.join("\n   ") );
							 | 
						||
| 
								 | 
							
								         else
							 | 
						||
| 
								 | 
							
								            Sys.println("All tests passed.");
							 | 
						||
| 
								 | 
							
								         Sys.exit(exitCode);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								}
							 |