/*
 * ServiceProviderImplTest.java
 * Copyright (C) 2008 Cyber Beans Corporation. All rights reserved.
 */
package jp.co.cybec.cb3.container.provider;

import java.util.HashMap;

import jp.co.cybec.cb3.accessor.Accessor;
import jp.co.cybec.cb3.container.provider.ServiceProviderImpl;
import jp.co.cybec.cb3.mock.accessor.MockDataAccessContext;
import jp.co.cybec.cb3.mock.container.service.MockService;
import jp.co.cybec.cb3.mock.util.MockApplicationExiter;
import jp.co.cybec.cb3.session.RuntimeParameters;
import jp.co.cybec.cb3.session.ServiceParameters;
import jp.co.cybec.cb3.util.ApplicationExiterDelegater;
import jp.co.cybec.cb3.util.CB3BeanFactory;
import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;


/**
 * ServiceProviderImplのテストケース。
 * @author Naoko Sugimoto
 */
public class ServiceProviderImplTest {

	@Before
	public void setUp() {
		// 設定ファイル参照先をテスト用に切り替える
		CB3BeanFactory.getInstance().setApplicationContextFilePath("jp/co/cybec/cb3/container/provider/ServiceProviderImpl/applicationContext.xml");
		// SystemReturnerをモックに切り替える。main()メソッドのテストで、System.exit()が呼ばれるとテストができないため。
		ApplicationExiterDelegater.getInstance().setApplicationExiter(new MockApplicationExiter());
	}

	/**
	 * {@link jp.co.cybec.cb3.container.provider.ServiceProviderImpl#main(java.lang.String[])} のためのテスト・メソッド。
	 * サービス実行成功時のテスト。
	 */
	@Test
	public void testMain() {
		// 起動時の引数を設定。
		String[] args = new String[]{
				"-ServiceName", "test"
		};
		// main起動。
		ServiceProviderImpl.main(args);
		// 実行結果を確認（正常終了）。
		Assert.assertEquals(0, ApplicationExiterDelegater.getInstance().getReturnCode());
	}

	/**
	 * {@link jp.co.cybec.cb3.container.provider.ServiceProviderImpl#main(java.lang.String[])} のためのテスト・メソッド。
	 * 起動パラメータにサービスが指定されていない場合のテスト。
	 */
	@Test
	public void testMainNoServiceParameter() {
		// 起動時の引数を設定。
		String[] args = new String[]{};
		// main起動。
		ServiceProviderImpl.main(args);
		// 実行結果を確認（異常終了）。
		Assert.assertEquals(9, ApplicationExiterDelegater.getInstance().getReturnCode());
	}

	/**
	 * {@link jp.co.cybec.cb3.container.provider.ServiceProviderImpl#callService(jp.co.cybec.cb3.session.ServiceParameters, jp.co.cybec.cb3.session.RuntimeParameters)} のためのテスト・メソッド。
	 * setService()でセットしたサービスを実行できることを確認。
	 */
	@Test
	public void testCallService() {
		// サービスプロバイダに渡すサービスを組み立てる。
		MockDataAccessContext dataAccessContext = new MockDataAccessContext(new HashMap<String, Accessor>());
		MockService service = new MockService();
		service.setDataAccessContext(dataAccessContext);

		// サービスプロバイダを生成。
		ServiceProviderImpl provider = new ServiceProviderImpl();
		provider.setService(service);

		// サービスを実行。
		provider.callService(new ServiceParameters(), new RuntimeParameters(null));

		// サービスが実行されていることを確認。
		Assert.assertTrue(service.isExecuted());

	}
}
