/*
 * blanco Framework
 * Copyright (C) 2004-2007 IGA Tosiki
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 */
package blanco.mail.core.connect;

import java.io.IOException;
import java.net.ConnectException;

import junit.framework.TestCase;
import blanco.mail.core.BlancoMailReceiver;
import blanco.mail.core.BlancoMailReceiverFactory;
import blanco.mail.core.BlancoMailSettingFactory;
import blanco.mail.core.valueobject.BlancoMailSetting;

/**
 * 注意！
 * 
 * このJUnitコードを実行すると、メールサーバへの接続を実際に行います。
 * 
 * このJUnitコードを実行することは 推奨しません。内容を良く理解した上で、試験用のメールサーバなどを準備してから実行するようにしてください。
 * 
 * @author IGA Tosiki
 */
public class BlancoMailReceiverConnectTest extends TestCase {
    /**
     * 典型的な設定値を取得します。
     * 
     * @return
     */
    private BlancoMailSetting getSetting() {
        final BlancoMailSetting setting = BlancoMailSettingFactory
                .getInstance();
        if (true) {
            // 設定値は BlancoMailSetting.properties から取得します。
        } else {
            setting.setReceiveHost("localhost");
            setting.setReceiveUserName("userName");
            setting.setReceivePassword("password");
        }

        return setting;
    }

    /**
     * MBMCR201は試験していません。
     * 
     * TODO MBMCR301から MBMCS308およびMBMCR901は 現時点ではJUnit化非実施。
     * 
     * @throws Exception
     */
    public void testReceiveInput() throws Exception {
        try {
            final BlancoMailSetting setting = getSetting();
            final BlancoMailReceiver receiver = BlancoMailReceiverFactory
                    .getInstance();
            setting.setReceiveUserName("notexist");
            setting.setReceivePassword("failpassword");
            receiver.receive(setting);
            fail("発生すべき例外が発生していません。");
        } catch (ConnectException e) {
            assertTrue(e.getMessage().indexOf("MBMCR202") >= 0);
        }

        try {
            final BlancoMailSetting setting = getSetting();
            final BlancoMailReceiver receiver = BlancoMailReceiverFactory
                    .getInstance();
            setting.setReceiveHost("localhost.notexist");
            receiver.receive(setting);
            fail("発生すべき例外が発生していません。");
        } catch (ConnectException e) {
            assertTrue(e.getMessage().indexOf("MBMCR203") >= 0);
        }
    }

    /**
     * タイムアウト系の試験。
     * 
     * このJUnitはサーバにある種の特殊な負荷をかける可能性があります。
     * 
     * @throws Exception
     */
    public void testReceiveTimeout() throws Exception {
        if (false)
            try {
                final BlancoMailSetting setting = getSetting();
                // 接続タイムアウトは環境しだいで発生したりしなかったりします。
                // setting.setMailConnectionTimeout(1);
                setting.setMailTimeout(3);
                BlancoMailReceiverFactory.getInstance().receive(setting);
                fail("発生すべき例外が発生していません。");
            } catch (IOException e) {
                // 1MBのファイルの受信時に この例外を発生させることができました。
                assertTrue("メッセージIDチェック",
                        e.getMessage().indexOf("MBMCR301") >= 0);
            }
    }
}
