# Run the Jacks test suite.
# See http://www-124.ibm.com/developerworks/oss/cvs/jikes/~checkout~/jacks/jacks.html

load_gcc_lib target-libpath.exp

proc gcj_jacks_setup_xfail {ary} {
  upvar $ary array
  global srcdir

  set fd [open $srcdir/libjava.jacks/jacks.xfail]
  while {! [eof $fd]} {
    set array([gets $fd]) {}
  }
  close $fd
}

proc gcj_jacks_write {filename} {
  global GCJ_UNDER_TEST
  global libgcj_jar
  global libjava_libgcc_s_path
  global ld_library_path

  set gcjl [split $GCJ_UNDER_TEST]
  set gcj_cmd [lindex $gcjl 0]
  set rest [join [lreplace $gcjl 0 0]]
  append rest " -C"

  set fd [open $filename w]
  puts $fd "set JAVAC $gcj_cmd"
  puts $fd "set JAVA_CLASSPATH \"$libgcj_jar\""
  puts $fd "set JAVAC_FLAGS [list $rest]"
  puts $fd "set JAVA [list [libjava_find_gij]]"

  # Without an explicit limit on the heap size, tests depending on
  # an OutOfMemoryError (e.g. "15.9.4-runtime-creation-2") can result
  # in a lot of unnecessary thrashing.
  puts $fd "set JAVA_FLAGS \"-mx=64m\""

  puts $fd "set JAVAC_ENCODING_FLAG --encoding="
  puts $fd "set JAVAC_DEPRECATION_FLAG -Wdeprecated"
  puts $fd "set tcltest::testConstraints(encoding) 1"
  puts $fd "set tcltest::testConstraints(gcj) 1"
  puts $fd "set tcltest::testConstraints(assert) 1"
  # "Time-consuming JVM limitation tests".
  # puts $fd "set tcltest::testConstraints(jvm) 1"
  close $fd

  set ld_library_path $libjava_libgcc_s_path
  set_ld_library_path_env_vars
}

proc gcj_jacks_parse {file} {
  if {[catch {open $file} fd]} {
    verbose "couldn't parse Jacks output: $fd"
    return
  }

  verbose "Reading jacks.xfail"
  gcj_jacks_setup_xfail xfails

  while {! [eof $fd]} {
    set line [gets $fd]
    if {[string match RESULT* $line]} {
      set linelist [split $line]
      set test [lindex $linelist 1]
      if {[info exists xfails($test)]} {
	setup_xfail "*-*-*"
      }
      if {[lindex $linelist 2] == "PASSED"} {
	pass $test
      } else {
	fail $test
      }
    }
  }

  close $fd
}

proc gcj_jacks_run {} {
  global srcdir

  if {! [file isdirectory $srcdir/libjava.jacks/jacks]} {
    # No tests.
    verbose "Jacks tests not found"
    return
  }

  # Jacks forces us to do this.  You can't run it from a separate
  # tree.
  verbose "Copying Jacks..."
  catch {system "rm -rf jacks"}
  catch {system "cp -r $srcdir/libjava.jacks/jacks jacks"}

  set here [pwd]
  cd jacks

  verbose "Writing Jacks setup file"
  gcj_jacks_write gcj_setup

  verbose "Running Jacks..."
  # Just ignore error exits from the jacks program.
  # It will always error exit for us, since don't completely pass.
  # At the moment jacks has a hardcoded call to tclsh8.3. To override this,
  # we check here on the version and launch the script directly with the
  # tclsh$tcl_ver.
  set tcl_ver [info tclversion]
  if {[package vcompare  $tcl_ver 8.3] >= 0 } {
    if {[catch {exec tclsh$tcl_ver jacks gcj} msg]} {
	send_log "Couldn't run jacks: $msg\n"
	return
    }
    gcj_jacks_parse logging/gcj.log
  } else {
      send_log "No suitable tclsh found, you need at least version 8.3 or up.\n"
      return
  }

  cd $here
}

gcj_jacks_run
