content: /*
   * CDDL HEADER START
   *
   * The contents of this file are subject to the terms of the Common Development
   * and Distribution License (the "License").
   * You may not use this file except in compliance with the License.
   *
   * You can obtain a copy of the license at
   * src/com/vodafone360/people/VODAFONE.LICENSE.txt or
   * http://github.com/360/360-Engine-for-Android
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   * When distributing Covered Code, include this CDDL HEADER in each file and
   * include the License file at src/com/vodafone360/people/VODAFONE.LICENSE.txt.
   * If applicable, add the following below this CDDL HEADER, with the fields
   * enclosed by brackets "[]" replaced with your own identifying information:
   * Portions Copyright [yyyy] [name of copyright owner]
   *
   * CDDL HEADER END
   *
   * Copyright 2010 Vodafone Sales & Services Ltd.  All rights reserved.
   * Use is subject to license terms.
   */
  
  package com.vodafone360.people.tests.engine;
  
  import java.net.URL;
  import java.util.ArrayList;
  import java.util.List;
  
  import android.app.Instrumentation;
  import android.os.Bundle;
  import android.test.InstrumentationTestCase;
  import android.test.suitebuilder.annotation.MediumTest;
  import android.test.suitebuilder.annotation.Suppress;
  import android.util.Log;
  
  import com.vodafone360.people.MainApplication;
  import com.vodafone360.people.database.DatabaseHelper;
  import com.vodafone360.people.datatypes.BaseDataType;
  import com.vodafone360.people.datatypes.Identity;
  import com.vodafone360.people.datatypes.IdentityCapability;
  import com.vodafone360.people.datatypes.ServerError;
  import com.vodafone360.people.datatypes.StatusMsg;
  import com.vodafone360.people.engine.EngineManager.EngineId;
  import com.vodafone360.people.engine.identities.IdentityEngine;
  import com.vodafone360.people.service.ServiceStatus;
  import com.vodafone360.people.service.agent.NetworkAgent;
  import com.vodafone360.people.service.io.ResponseQueue;
  import com.vodafone360.people.service.io.ResponseQueue.DecodedResponse;
  
  public class IdentityEngineTest extends InstrumentationTestCase implements
          IEngineTestFrameworkObserver {
  
      /**
       * States for test harness
       */
      enum IdentityTestState {
          IDLE, FETCH_IDENTITIES, GET_MY_IDENTITIES, FETCH_IDENTITIES_FAIL, FETCH_IDENTITIES_POPULATED, GET_CHATABLE_IDENTITIES, SET_IDENTITY_CAPABILTY, VALIDATE_ID_CREDENTIALS_SUCCESS, VALIDATE_ID_CREDENTIALS_FAIL, GET_NEXT_RUNTIME
      }
  
      EngineTestFramework mEngineTester = null;
  
      IdentityEngine mEng = null;
  
      IdentityTestState mState = IdentityTestState.IDLE;
      
      MainApplication mApplication = null;
  
      @Override
      protected void setUp() throws Exception {
          super.setUp();
          mApplication = (MainApplication)Instrumentation.newApplication(MainApplication.class,
                  getInstrumentation().getTargetContext());
          mApplication.onCreate();
          mEngineTester = new EngineTestFramework(this);
  
          mEng = new IdentityEngine(mEngineTester, mApplication.getDatabase());
          
          mEngineTester.setEngine(mEng);
          mState = IdentityTestState.IDLE;
      }
  
      @Override
      protected void tearDown() throws Exception {
  
          // stop our dummy thread?
          mEngineTester.stopEventThread();
          mEngineTester = null;
          mEng = null;
          // call at the end!!!
          super.tearDown();
      }
  
      @Suppress // Takes too long
      @MediumTest
      public void testFetchIdentities() {
  
          mState = IdentityTestState.FETCH_IDENTITIES;
  
          NetworkAgent.setAgentState(NetworkAgent.AgentState.CONNECTED);
          mEng.getAvailableThirdPartyIdentities();
          // mEng.run();
          ServiceStatus status = mEngineTester.waitForEvent();
          assertEquals(ServiceStatus.SUCCESS, status);
  
          Object data = mEngineTester.data();
          assertTrue(data != null);
          try {
              ArrayList<Identity> identityList = ((Bundle)data).getParcelableArrayList("data");
              assertTrue(identityList.size() == 1);
          } catch (Exception e) {
              throw (new RuntimeException("Expected identity list with 1 item"));
          }
  
      }
  
      @MediumTest
      @Suppress // Takes too long.
      public void testAddUiGetMyIdentities() {
          mState = IdentityTestState.GET_MY_IDENTITIES;
  
          NetworkAgent.setAgentState(NetworkAgent.AgentState.CONNECTED);
          mEng.getMyThirdPartyIdentities();
          // mEng.run();
          ServiceStatus status = mEngineTester.waitForEvent();
          assertEquals(ServiceStatus.SUCCESS, status);
  
          Object data = mEngineTester.data();
          assertNull(null);
          try {
              ArrayList<Identity> identityList = ((Bundle)data).getParcelableArrayList("data");
              assertEquals(identityList.size(), 1);
          } catch (Exception e) {
              throw (new RuntimeException("Expected identity list with 1 item"));
          }
      }
  
      @MediumTest
      @Suppress // Takes to long
      public void testFetchIdentitiesFail() {
          mState = IdentityTestState.FETCH_IDENTITIES_FAIL;
  
          NetworkAgent.setAgentState(NetworkAgent.AgentState.CONNECTED);
          mEng.getAvailableThirdPartyIdentities();
          // mEng.run();
          ServiceStatus status = mEngineTester.waitForEvent();
          assertFalse(ServiceStatus.SUCCESS == status);
  
          Object data = mEngineTester.data();
          assertNull(data);
      }
  
      @MediumTest
      @Suppress // Breaks tests.
      public void testFetchIdentitiesPopulated() {
          mState = IdentityTestState.FETCH_IDENTITIES_POPULATED;
  
          NetworkAgent.setAgentState(NetworkAgent.AgentState.CONNECTED);
          mEng.getAvailableThirdPartyIdentities();
          // mEng.run();
          ServiceStatus status = mEngineTester.waitForEvent();
          assertEquals(ServiceStatus.SUCCESS, status);
          Object data = mEngineTester.data();
          assertTrue(data != null);
      }
  
      @MediumTest
      @Suppress // Breaks tests.
      public void testSetIdentityCapability() {
          mState = IdentityTestState.SET_IDENTITY_CAPABILTY;
  
          String network = "facebook";
          // Bundle fbund = new Bundle();
          // fbund.putBoolean("sync_contacts", true);
          String identityId = "mikeyb";
  
          NetworkAgent.setAgentState(NetworkAgent.AgentState.CONNECTED);
          // AA mEng.addUiSetIdentityCapabilityStatus(network, identityId, fbund);
          mEng.addUiSetIdentityStatus(network, identityId, true);
          ServiceStatus status = mEngineTester.waitForEvent();
          assertEquals(ServiceStatus.SUCCESS, status);
  
          Object data = mEngineTester.data();
          assertTrue(data != null);
          try {
              ArrayList<StatusMsg> identityList = ((Bundle)data).getParcelableArrayList("data");
              assertTrue(identityList.size() == 1);
          } catch (Exception e) {
              throw (new RuntimeException("Expected identity list with 1 item"));
          }
      }
  
      @MediumTest
      @Suppress // Breaks tests.
      public void testValidateIDCredentialsSuccess() {
          mState = IdentityTestState.VALIDATE_ID_CREDENTIALS_SUCCESS;
  
          NetworkAgent.setAgentState(NetworkAgent.AgentState.CONNECTED);
          mEng.addUiValidateIdentityCredentials(false, "bob", "password", "", new Bundle());
          ServiceStatus status = mEngineTester.waitForEvent();
          assertEquals(ServiceStatus.SUCCESS, status);
          Object data = mEngineTester.data();
          assertTrue(data != null);
      }
  
      @MediumTest
      @Suppress // Breaks tests.
      public void testGetMyChatableIdentities() {
          mState = IdentityTestState.GET_CHATABLE_IDENTITIES;
  
          NetworkAgent.setAgentState(NetworkAgent.AgentState.CONNECTED);
          mEng.getMyChattableIdentities();
          ServiceStatus status = mEngineTester.waitForEvent();
          assertEquals(ServiceStatus.SUCCESS, status);
  
          Object data = mEngineTester.data();
          assertTrue(data != null);
      }
  
      @MediumTest
      @Suppress // Breaks tests.
      public void testValidateIDCredentialsFail() {
          mState = IdentityTestState.VALIDATE_ID_CREDENTIALS_FAIL;
  
          NetworkAgent.setAgentState(NetworkAgent.AgentState.CONNECTED);
          mEng.addUiValidateIdentityCredentials(false, "bob", "password", "", new Bundle());
  
          ServiceStatus status = mEngineTester.waitForEvent();
  
          assertFalse(ServiceStatus.SUCCESS == status);
          Object data = mEngineTester.data();
          assertTrue(data == null);
      }
  
      @MediumTest
      public void testGetNextRuntime() {
          mState = IdentityTestState.GET_NEXT_RUNTIME;
          // long runtime = mEng.getNextRunTime();
      }
  
      @Override
      public void reportBackToEngine(int reqId, EngineId engine) {
          Log.d("TAG", "IdentityEngineTest.reportBackToEngine");
          ResponseQueue respQueue = ResponseQueue.getInstance();
          List<BaseDataType> data = new ArrayList<BaseDataType>();
  
          switch (mState) {
              case IDLE:
                  break;
              case FETCH_IDENTITIES:
                  Log.d("TAG", "IdentityEngineTest.reportBackToEngine FETCH ids");
                  Identity id = new Identity();
                  data.add(id);
                  respQueue.addToResponseQueue(new DecodedResponse(reqId, data, engine, DecodedResponse.ResponseType.GET_AVAILABLE_IDENTITIES_RESPONSE.ordinal()));
                  Log.d("TAG", "IdentityEngineTest.reportBackToEngine add to Q");
                  mEng.onCommsInMessage();
                  break;
              case GET_MY_IDENTITIES:
                  Log.d("TAG", "IdentityEngineTest.reportBackToEngine Get ids");
                  Identity myId = new Identity();
                  data.add(myId);
                  respQueue.addToResponseQueue(new DecodedResponse(reqId, data, engine, DecodedResponse.ResponseType.GET_AVAILABLE_IDENTITIES_RESPONSE.ordinal()));
                  Log.d("TAG", "IdentityEngineTest.reportBackToEngine add to Q");
                  mEng.onCommsInMessage();
                  break;
              case FETCH_IDENTITIES_FAIL:
                  ServerError err = new ServerError("Catastrophe");
                  err.errorDescription = "Fail";
                  data.add(err);
                  respQueue.addToResponseQueue(new DecodedResponse(reqId, data, engine, DecodedResponse.ResponseType.SERVER_ERROR.ordinal()));
                  mEng.onCommsInMessage();
                  break;
              case SET_IDENTITY_CAPABILTY:
                  StatusMsg msg = new StatusMsg();
                  msg.mCode = "ok";
                  msg.mDryRun = false;
                  msg.mStatus = true;
                  data.add(msg);
                  respQueue.addToResponseQueue(new DecodedResponse(reqId, data, engine, DecodedResponse.ResponseType.SET_IDENTITY_CAPABILITY_RESPONSE.ordinal()));
                  mEng.onCommsInMessage();
                  break;
              case VALIDATE_ID_CREDENTIALS_SUCCESS:
                  StatusMsg msg2 = new StatusMsg();
                  msg2.mCode = "ok";
                  msg2.mDryRun = false;
                  msg2.mStatus = true;
                  data.add(msg2);
                  respQueue.addToResponseQueue(new DecodedResponse(reqId, data, engine, DecodedResponse.ResponseType.VALIDATE_IDENTITY_CREDENTIALS_RESPONSE.ordinal()));
                  mEng.onCommsInMessage();
                  break;
              case VALIDATE_ID_CREDENTIALS_FAIL:
                  ServerError err2 = new ServerError("Catastrophe");
                  err2.errorDescription = "Fail";
                  data.add(err2);
                  respQueue.addToResponseQueue(new DecodedResponse(reqId, data, engine, DecodedResponse.ResponseType.SERVER_ERROR.ordinal()));
                  mEng.onCommsInMessage();
                  break;
              case GET_NEXT_RUNTIME:
                  break;
              case GET_CHATABLE_IDENTITIES:
              case FETCH_IDENTITIES_POPULATED:
                  Identity id2 = new Identity();
                  id2.mActive = true;
                  id2.mAuthType = "auth";
                  List<String> clist = new ArrayList<String>();
                  clist.add("uk");
                  clist.add("fr");
                  id2.mCountryList = clist;
                  id2.mCreated = new Long(0);
                  id2.mDisplayName = "Facebook";
                  // id2.mIcon2Mime = "jpeg";
                  id2.mIconMime = "jpeg";
                  try {
                      id2.mIcon2Url = new URL("url2");
                      id2.mIconUrl = new URL("url");
                      id2.mNetworkUrl = new URL("network");
                  } catch (Exception e) {
  
                  }
                  id2.mIdentityId = "fb";
                  id2.mIdentityType = "type";
                  id2.mName = "Facebook";
                  id2.mNetwork = "Facebook";
                  id2.mOrder = 0;
                  id2.mPluginId = "";
                  id2.mUpdated = new Long(0);
                  id2.mUserId = 23;
                  id2.mUserName = "user";
  
                  data.add(id2);
  
                  List<IdentityCapability> capList = new ArrayList<IdentityCapability>();
                  IdentityCapability idcap = new IdentityCapability();
                  idcap.mCapability = IdentityCapability.CapabilityID.sync_contacts;
                  idcap.mDescription = "sync cont";
                  idcap.mName = "sync cont";
                  idcap.mValue = true;
                  capList.add(idcap);
  
                  id2.mCapabilities = capList;
                  data.add(id2);
  
                  respQueue.addToResponseQueue(new DecodedResponse(reqId, data, engine, DecodedResponse.ResponseType.GET_AVAILABLE_IDENTITIES_RESPONSE.ordinal()));
                  Log.d("TAG", "IdentityEngineTest.reportBackToEngine add to Q");
                  mEng.onCommsInMessage();
                  break;
              default:
          }
  
      }
  
      @Override
      public void onEngineException(Exception exp) {
          // TODO Auto-generated method stub
  
      }
  
  }
  