package org.jfox.ejb.examples.stateless;

import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.FileInputStream;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.ejb.EJBMetaData;
import javax.ejb.HomeHandle;
import javax.ejb.Handle;

import junit.framework.TestCase;

/**
 * 
 * @author <a href="mailto:young_yy@hotmail.com">Young Yang</a>
 */

public class HelloTest extends TestCase {
  private static HelloHome home = null;
  private static Hello hello = null;
  static {
    try {
      Context ctx = new InitialContext();
      Object obj = ctx.lookup("/" + HelloHome.class.getName().replace('.','/'));
      home = (HelloHome)javax.rmi.PortableRemoteObject.narrow(obj,HelloHome.class);
      hello = home.create();
    }
    catch(Exception e){
      e.printStackTrace();
    }
  }

  // setup 方法每调用一个 test 方法都会事先调用
  protected void setUp() throws Exception {
//    System.out.println("Setup");
//    Context ctx = new InitialContext();
//    Object obj = ctx.lookup("/" + HelloHome.class.getName().replace('.','/'));
//    home = (HelloHome)javax.rmi.PortableRemoteObject.narrow(obj,HelloHome.class);
//    hello = home.create();
  }

  public void testToString() {
    System.out.println(home.toString());
    System.out.println(hello);
  }


  public void testGetEJBMetaData() {
    try {
      System.out.print("test getEJBMetaData()...");
      EJBMetaData meta = home.getEJBMetaData();
      System.out.println("EJBMetaData: " + meta);
    }
    catch(Exception e){
      e.printStackTrace();
      fail(e.toString());
    }

  }

  public void testGetVoice() {
    try {
      System.out.print("test method getVoice()...");
      assertTrue(hello.getVoice().equals("Hello,World"));
      System.out.println("OK!");
    }
    catch(Exception e){
      e.printStackTrace();
      fail(e.toString());
    }
  }

  public void testHomeHandle() {
    try {
      System.out.print("test HomeHandle serialize & deserialize...");
      HomeHandle homeHandle = home.getHomeHandle();
      writeHandle(homeHandle);
      homeHandle = (HomeHandle)readHandle();
      home = (HelloHome)homeHandle.getEJBHome();
      hello = home.create();
      assertTrue(hello.getVoice().equals("Hello,World"));
      System.out.println("OK!");
    }
    catch(Exception e){
      e.printStackTrace();
      fail(e.toString());
    }
  }

  public void testHandle() {
    try {
      System.out.print("test Handle serialize & deserialize...");
      Handle handle = hello.getHandle();
      writeHandle(handle);
      handle = (Handle)readHandle();
      hello = (Hello)handle.getEJBObject();
      assertTrue(hello.getVoice().equals("Hello,World"));
      System.out.println("OK!");
    }
    catch(Exception e){
      e.printStackTrace();
      fail(e.toString());
    }
  }

  public void testGetWorld() {
    try {
      System.out.print("test getCount()...");
      int count = hello.getCount();
      System.out.println(count + " OK!");
    }
    catch(Exception e){
      e.printStackTrace();
      fail(e.toString());
    }
  }

  private void writeHandle(Object obj) throws Exception {
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(this.getClass() + ".ser"));
    out.writeObject(obj);
    out.close();
  }

  private Object readHandle() throws Exception {
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(this.getClass() + ".ser"));
    Object handle = in.readObject();
    in.close();
    return handle;
  }

  public static void main(String[] args) {
    junit.textui.TestRunner.run(HelloTest.class);
  }

}