/***********************************************************************
 * 
 *  Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
 *
 *  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; version 2.1
 *  of the License.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Library Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, Novell, Inc.
 * 
 *  To contact Novell about this file by physical or electronic mail, 
 *  you may find current contact information at www.novell.com.
 * 
 ***********************************************************************/

/* This file contains all the keychain related test cases. */
#include "testcases.h"

void EnumerateIDs(SSCS_SECRETSTORE_HANDLE_T *ssHandle,int type,
                  SSCS_KEYCHAIN_ID_T *keychainID)
{
    SSCS_KEYCHAIN_ID_LIST_T kcIDList;
    SSCS_SECRET_ID_LIST_T secretIDList;

    uint32_t ssFlags = 0;
    unsigned int bytesRequired = 0;
    int i = 0;

    int retVal = 0;
    if(type == 0) //keychains
    {
        kcIDList.keyChainIDList = (SSCS_KEYCHAIN_ID_T *)malloc(
                       sizeof(SSCS_KEYCHAIN_ID_T) * MAX_RETURNED_IDS );
        assert(kcIDList.keyChainIDList);

        //kcIDList.bufferSizeRequired = sizeof(SSCS_KEYCHAIN_ID_T) * MAX_RETURNED_IDS;
        kcIDList.returnedIDs = MAX_RETURNED_IDS;
        retVal = sscs_CacheEnumerateKeychainIDs(ssHandle, ssFlags,NULL, &kcIDList,NULL);
        if(retVal != 0)
        {
            printf("sscs_CacheEnumerateKeychainIDs failed: %d\n",retVal);
        }

        printf("KEYCHAINLIST : \n");
        for( i = 0 ; i < kcIDList.returnedIDs; i++ )
        {
            printf("%s\n",kcIDList.keyChainIDList[i].keychainID);
        }

        free(kcIDList.keyChainIDList);
    }
    else //secrets
    {
        secretIDList.secIDList = (SSCS_SECRET_ID_T*)malloc(
                        sizeof(SSCS_SECRET_ID_T)* MAX_RETURNED_IDS);
        assert(secretIDList.secIDList);

//        secretIDList.bufferSizeRequired = sizeof(SSCS_SECRET_ID_T)* MAX_RETURNED_IDS;
        secretIDList.returnedIDs = MAX_RETURNED_IDS;
        retVal = sscs_CacheEnumerateSecretIDs(ssHandle, ssFlags, keychainID, NULL, &secretIDList, NULL);
        if(retVal != 0)
        {
            printf("sscs_CacheEnumerateSecretIDs failed: %d\n",retVal);
        }

        printf("SECRETIDLIST:\n");
        for( i = 0 ; i < secretIDList.returnedIDs; i++ )
        {
            printf("%s\n",secretIDList.secIDList[i].id);
        }

        free(secretIDList.secIDList);
    }
}
	
void TestCacheAddKeyChain_Valid(void)
{
    SSCS_SECRETSTORE_T secID;
    SSCS_SECRETSTORE_HANDLE_T *ssHandle = NULL;
    SSCS_KEYCHAIN_ID_LIST_T kcIDList;

    int retVal = 0;
    uint32_t ssFlags = 0;
    SSCS_KEYCHAIN_ID_T keychainID;
    memset(&keychainID,0,sizeof(SSCS_KEYCHAIN_ID_T));
    strcpy((char*)(keychainID.keychainID),"MyKeychain");
    keychainID.len = strlen("MyKeychain") +1 ;

    DECORATE
    secID.version = 0x00040000;
    strcpy((char *)secID.ssName,"SecretStore");

    ssHandle = sscs_CacheOpenSecretStore(&secID,ssFlags, NULL);
    if(!ssHandle)
    {
        printf("sscs_CacheOpenSecretStore failed\n");
    }
    else
    {
        printf("sscs_CacheOpenSecretStore succeeded\n");
    }
    printf("Platform ID is %d; socketID is %d\n",ssHandle->platformID,
                             *(int*)ssHandle->platHandle);

    ssFlags |= SSCS_LOCAL_KEY_CHAIN_F;
    printf("Adding keychain - %s\n",keychainID.keychainID);

    retVal = sscs_CacheAddKeychain(ssHandle,ssFlags,&keychainID,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheAddKeychain failed: %d\n",retVal);
    }
    EnumerateIDs(ssHandle,0,NULL);

    retVal = sscs_CacheRemoveKeychain(ssHandle,ssFlags, &keychainID,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheRemoveKeychain failed: %d\n",retVal);
    }
    
    retVal = sscs_CacheCloseSecretStore(ssHandle, ssFlags, NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheCloseSecretStore failed: %d\n",retVal);
    }
    DECORATE
}

void TestCacheAddKeyChain_LongKeychainId(void)
{
    SSCS_SECRETSTORE_T secID;
    SSCS_SECRETSTORE_HANDLE_T *ssHandle = NULL;
    SSCS_KEYCHAIN_ID_LIST_T kcIDList;
    int retVal = 0;
    uint32_t ssFlags = 0;

    SSCS_KEYCHAIN_ID_T keychainID;
    memset(&keychainID,0,sizeof(SSCS_KEYCHAIN_ID_T));
    strcpy((char*)(keychainID.keychainID),LONG_WSTRING);
    keychainID.len = strlen(LONG_WSTRING) + 1;

    /* sscs_CacheOpenSecretStore */

    DECORATE
    secID.version = 0x00040000;
    strcpy((char *)secID.ssName,"SecretStore");

    ssHandle = sscs_CacheOpenSecretStore(&secID, ssFlags, NULL);
    if(!ssHandle)
    {
        printf("sscs_CacheOpenSecretStore failed\n");
    }
    else
    {
        printf("sscs_CacheOpenSecretStore succeeded\n");
    }
    printf("Platform ID is %d; socketID is %d\n",ssHandle->platformID,
                             *(int*)ssHandle->platHandle);

    ssFlags |= SSCS_LOCAL_KEY_CHAIN_F;
    retVal = sscs_CacheAddKeychain(ssHandle,ssFlags,&keychainID,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheAddKeychain failed: %d\n",retVal);
    }
    else
    {
        PRINT_ERR;
        retVal = sscs_CacheRemoveKeychain(ssHandle,ssFlags,&keychainID,NULL);
        if(retVal != 0)
        {
            printf("sscs_CacheRemoveKeychain failed: %d\n",retVal);
        }
    }

    retVal = sscs_CacheCloseSecretStore(ssHandle, ssFlags, NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheCloseSecretStore failed: %d\n",retVal);
    }
    DECORATE
}

void TestCacheAddKeyChain_ExistingKeychain(void)
{
    SSCS_SECRETSTORE_T secID;
    SSCS_SECRETSTORE_HANDLE_T *ssHandle = NULL;
    SSCS_KEYCHAIN_ID_LIST_T kcIDList;
    unsigned int bytesRequired = 0;
    int retVal = 0;
    uint32_t ssFlags = 0;

    SSCS_KEYCHAIN_ID_T keychainID;
    memset(&keychainID,0,sizeof(SSCS_KEYCHAIN_ID_T));
    strcpy((char*)(keychainID.keychainID),"MyKeychain");
    keychainID.len = strlen("MyKeychain")  + 1;

    /* sscs_CacheOpenSecretStore */

    DECORATE
    secID.version = 0x00040000;
    strcpy((char *)secID.ssName,"SecretStore");

    ssHandle = sscs_CacheOpenSecretStore(&secID, ssFlags, NULL);
    if(!ssHandle)
    {
        printf("sscs_CacheOpenSecretStore failed\n");
    }
    else
    {
        printf("sscs_CacheOpenSecretStore succeeded\n");
    }
    printf("Platform ID is %d; socketID is %d\n",ssHandle->platformID,
                             *(int*)ssHandle->platHandle);

    ssFlags |= SSCS_LOCAL_KEY_CHAIN_F;

    printf("Adding keychain %s\n",keychainID.keychainID);
    retVal = sscs_CacheAddKeychain(ssHandle,ssFlags,&keychainID,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheAddKeychain failed: %d\n",retVal);
    }
    EnumerateIDs(ssHandle,0,NULL);

    printf("Re-adding keychain %S\n",keychainID.keychainID);
    retVal = sscs_CacheAddKeychain(ssHandle,ssFlags,&keychainID,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheAddKeychain failed: %d\n",retVal);
    }
    EnumerateIDs(ssHandle,0,NULL);

    retVal = sscs_CacheRemoveKeychain(ssHandle,ssFlags,&keychainID,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheRemoveKeychain failed: %d\n",retVal);
    }

    retVal = sscs_CacheCloseSecretStore(ssHandle, ssFlags,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheCloseSecretStore failed: %d\n",retVal);
    }
    DECORATE
}
#define NSSCS_MAX_KEYCHAINS                10

void TestCacheAddKeyChain_MaxKeychains(void)
{
    SSCS_SECRETSTORE_T secID;
    SSCS_SECRETSTORE_HANDLE_T *ssHandle = NULL;
    SSCS_KEYCHAIN_ID_LIST_T kcIDList;
    int retVal = 0;
    int i = 0;
    uint32_t ssFlags = 0;
//    wchar_t *keychainID = L"MyKeychain";
    char keychainID[256] = "";
    char ch = 'a';

    SSCS_KEYCHAIN_ID_T keychainIDStruct;
    memset(&keychainIDStruct,0,sizeof(SSCS_KEYCHAIN_ID_T));

    /* sscs_CacheOpenSecretStore */

    DECORATE
    printf("INPUT: {0x00040000, SecretStore}\n");

    secID.version = 0x00040000;
    strcpy((char *)secID.ssName,"SecretStore");

    ssHandle = sscs_CacheOpenSecretStore(&secID, ssFlags, NULL);
    if(!ssHandle)
    {
        printf("sscs_CacheOpenSecretStore failed\n");
    }
    else
    {
        printf("sscs_CacheOpenSecretStore succeeded\n");
    }
    printf("Platform ID is %d; socketID is %d\n",ssHandle->platformID,
                             *(int*)ssHandle->platHandle);

    ssFlags |= SSCS_LOCAL_KEY_CHAIN_F;

    for( i = 0 ; i < NSSCS_MAX_KEYCHAINS + 1 ; i++ )
    {
        sprintf(keychainID,"key%c",ch+i);

        printf("Adding %s\n",keychainIDStruct.keychainID);

        strcpy((char*)(keychainIDStruct.keychainID),keychainID);
        keychainIDStruct.len = strlen(keychainID)+1;

        retVal = sscs_CacheAddKeychain(ssHandle,ssFlags,&keychainIDStruct,NULL);
        if(retVal != 0)
        {
            printf("sscs_CacheAddKeychain failed: %d\n",retVal);
        }
    }

    memset(keychainID,0,sizeof(keychainID));
    for( i = 0 ; i < NSSCS_MAX_KEYCHAINS + 1 ; i++ )
    {
        sprintf(keychainID,"key%c",ch+i);

        printf("Removing %s\n",keychainIDStruct.keychainID);
        strcpy((char*)(keychainIDStruct.keychainID),keychainID);
        keychainIDStruct.len = strlen(keychainID)+1;

        retVal = sscs_CacheRemoveKeychain(ssHandle,ssFlags, &keychainIDStruct,NULL);
        if(retVal != 0)
        {
            printf("sscs_CacheRemoveKeychain failed: %d\n",retVal);
        }
    }


    retVal = sscs_CacheCloseSecretStore(ssHandle, ssFlags, NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheCloseSecretStore failed: %d\n",retVal);
    }
    DECORATE
}

void TestCacheEnumerateKeyChainIds_Valid(void)
{
    SSCS_SECRETSTORE_T secID;
    SSCS_SECRETSTORE_HANDLE_T *ssHandle = NULL;
    SSCS_KEYCHAIN_ID_LIST_T kcIDList;
    int retVal = 0;
    int i = 0;
    uint32_t ssFlags = 0;
    /* sscs_CacheOpenSecretStore */

    DECORATE
    printf("INPUT: {0x00040000, SecretStore}\n");

    secID.version = 0x00040000;
    strcpy((char *)secID.ssName,"SecretStore");

    ssHandle = sscs_CacheOpenSecretStore(&secID, ssFlags, NULL);
    if(!ssHandle)
    {
        printf("sscs_CacheOpenSecretStore failed\n");
    }
    else
    {
        printf("sscs_CacheOpenSecretStore succeeded\n");
    }
    printf("Platform ID is %d; socketID is %d\n",ssHandle->platformID,
                             *(int*)ssHandle->platHandle);

    kcIDList.keyChainIDList = (SSCS_KEYCHAIN_ID_T *)malloc(
                       sizeof(SSCS_KEYCHAIN_ID_T) * MAX_RETURNED_IDS );
    assert(kcIDList.keyChainIDList);

//    kcIDList.bufferSizeRequired = sizeof(SSCS_KEYCHAIN_ID_T) * MAX_RETURNED_IDS;
    kcIDList.returnedIDs = MAX_RETURNED_IDS;
    

    retVal = sscs_CacheEnumerateKeychainIDs(ssHandle,ssFlags, NULL,&kcIDList, 
                                           NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheEnumerateKeychainIDs failed: %d\n",retVal);
    }

    printf("KEYCHAINLIST\n");
    for( i = 0 ; i < kcIDList.returnedIDs; i++ )
    {
        printf("%s\n",kcIDList.keyChainIDList[i].keychainID);
    }

    free(kcIDList.keyChainIDList);

    retVal = sscs_CacheCloseSecretStore(ssHandle, ssFlags, NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheCloseSecretStore failed: %d\n",retVal);
    }
    DECORATE
}


void TestCacheEnumerateKeyChainIds_WithoutOpen(void)
{
    SSCS_SECRETSTORE_T secID;
    SSCS_SECRETSTORE_HANDLE_T cookedUpSSHandle;
    SSCS_KEYCHAIN_ID_LIST_T kcIDList;
    int socketFd = FAKE_SOCK_FD;
    int retVal = 0;
    int i = 0;
    uint32_t ssFlags = 0;

    DECORATE
    
    /* Passing a cookedup SSHandle */
    printf("INPUT: Cookedup SSHandle\n");
    cookedUpSSHandle.platformID = 1;
    cookedUpSSHandle.platHandle = (int*)&socketFd;

    kcIDList.keyChainIDList = (SSCS_KEYCHAIN_ID_T *)malloc(
                       sizeof(SSCS_KEYCHAIN_ID_T) * MAX_RETURNED_IDS );
    assert(kcIDList.keyChainIDList);

//    kcIDList.bufferSizeRequired = sizeof(SSCS_KEYCHAIN_ID_T) * MAX_RETURNED_IDS;
    kcIDList.returnedIDs = MAX_RETURNED_IDS;

    retVal = sscs_CacheEnumerateKeychainIDs(&cookedUpSSHandle,ssFlags, NULL, &kcIDList,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheEnumerateKeychainIDs failed: %d\n",retVal);
    }

    printf("KEYCHAINLIST\n");
    for( i = 0 ; i < kcIDList.returnedIDs; i++ )
    {
        printf("%s\n",kcIDList.keyChainIDList[i].keychainID);
    }

    free(kcIDList.keyChainIDList);

    DECORATE
}

void TestCacheEnumerateKeyChainIds_LessBufferLen(void)
{
    SSCS_SECRETSTORE_T secID;
    SSCS_SECRETSTORE_HANDLE_T *ssHandle = NULL;
    SSCS_KEYCHAIN_ID_LIST_T kcIDList;
    uint32_t ssFlags = 0;
    int retVal = 0;
    int i = 0;
    SSCS_KEYCHAIN_ID_T keychainID;
    memset(&keychainID,0,sizeof(SSCS_KEYCHAIN_ID_T));
    strcpy((char*)(keychainID.keychainID),"MyKeychain1");
    keychainID.len = strlen("MyKeychain1")+1;
    

    /* sscs_CacheOpenSecretStore */

    DECORATE
    printf("INPUT: {0x00040000, SecretStore}\n");

    secID.version = 0x00040000;
    strcpy((char *)secID.ssName,"SecretStore");

    ssHandle = sscs_CacheOpenSecretStore(&secID, ssFlags, NULL);
    if(!ssHandle)
    {
        printf("sscs_CacheOpenSecretStore failed\n");
    }
    else
    {
        printf("sscs_CacheOpenSecretStore succeeded\n");
    }
    printf("Platform ID is %d; socketID is %d\n",ssHandle->platformID,
                             *(int*)ssHandle->platHandle);

    printf("Adding keychain..%s\n",keychainID.keychainID);
    ssFlags |= SSCS_LOCAL_KEY_CHAIN_F;

    retVal = sscs_CacheAddKeychain(ssHandle,ssFlags,&keychainID,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheAddKeychain failed: %d\n",retVal);
    }

    strcpy((char*)(keychainID.keychainID),"MyKeychain2");
    keychainID.len = strlen("MyKeychain2")+1;

    printf("Adding keychain..%s\n",keychainID.keychainID);

    retVal = sscs_CacheAddKeychain(ssHandle,ssFlags,&keychainID,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheAddKeychain failed: %d\n",retVal);
    }

    kcIDList.keyChainIDList = (SSCS_KEYCHAIN_ID_T *)malloc(
                       sizeof(SSCS_KEYCHAIN_ID_T) * MAX_RETURNED_IDS );
    assert(kcIDList.keyChainIDList);

//    kcIDList.bufferSizeRequired = sizeof(SSCS_KEYCHAIN_ID_T) * 1;
    kcIDList.returnedIDs = 1;


    retVal = sscs_CacheEnumerateKeychainIDs(ssHandle, ssFlags, NULL, &kcIDList,
                                           NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheEnumerateKeychainIDs failed: %d\n",retVal);
    }

    printf("KEYCHAINLIST\n");
    for( i = 0 ; i < kcIDList.returnedIDs; i++ )
    {
        printf("%s\n",kcIDList.keyChainIDList[i].keychainID);
    }

    free(kcIDList.keyChainIDList);

    retVal = sscs_CacheRemoveKeychain(ssHandle,ssFlags, &keychainID, NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheRemoveKeychain failed: %d\n",retVal);
    }

    strcpy((char*)(keychainID.keychainID),"MyKeychain1");
    keychainID.len = strlen("MyKeychain1")+1;
    
    retVal = sscs_CacheRemoveKeychain(ssHandle,ssFlags, &keychainID, NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheRemoveKeychain failed: %d\n",retVal);
    }


    retVal = sscs_CacheCloseSecretStore(ssHandle, ssFlags, NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheCloseSecretStore failed: %d\n",retVal);
    }

    DECORATE
}

void TestCacheEnumerateKeyChainIds_WithNoKeychains(void)
{
    SSCS_SECRETSTORE_T secID;
    SSCS_SECRETSTORE_HANDLE_T *ssHandle = NULL;
    SSCS_KEYCHAIN_ID_LIST_T kcIDList;
    int retVal = 0;
    uint32_t ssFlags = 0;
    int i = 0;
    /* sscs_CacheOpenSecretStore */

    DECORATE
    printf("INPUT: {0x00040000, SecretStore}\n");

    secID.version = 0x00040000;
    strcpy((char *)secID.ssName,"SecretStore");

    ssHandle = sscs_CacheOpenSecretStore(&secID, ssFlags, NULL);
    if(!ssHandle)
    {
        printf("sscs_CacheOpenSecretStore failed\n");
    }
    else
    {
        printf("sscs_CacheOpenSecretStore succeeded\n");
    }
    printf("Platform ID is %d; socketID is %d\n",ssHandle->platformID,
                             *(int*)ssHandle->platHandle);

    kcIDList.keyChainIDList = (SSCS_KEYCHAIN_ID_T *)malloc(
                       sizeof(SSCS_KEYCHAIN_ID_T) * MAX_RETURNED_IDS );
    assert(kcIDList.keyChainIDList);

//    kcIDList.bufferSizeRequired = sizeof(SSCS_KEYCHAIN_ID_T) * MAX_RETURNED_IDS;
    kcIDList.returnedIDs = MAX_RETURNED_IDS;
    retVal = sscs_CacheEnumerateKeychainIDs(ssHandle, ssFlags,NULL, &kcIDList,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheEnumerateKeychainIDs failed: %d\n",retVal);
    }
    else
    {
        printf("KEYCHAINLIST\n");
        for( i = 0 ; i < kcIDList.returnedIDs; i++ )
        {
            printf("%s\n",kcIDList.keyChainIDList[i].keychainID);
        }
    }
    free(kcIDList.keyChainIDList);
    kcIDList.keyChainIDList = NULL;

    retVal = sscs_CacheCloseSecretStore(ssHandle, ssFlags, NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheCloseSecretStore failed: %d\n",retVal);
    }
    DECORATE
}


void TestCacheRemoveKeyChain_Valid(void)
{
    SSCS_SECRETSTORE_T secID;
    SSCS_SECRETSTORE_HANDLE_T *ssHandle = NULL;
    SSCS_KEYCHAIN_ID_LIST_T kcIDList;
    int retVal = 0;
    uint32_t ssFlags = 0;
    SSCS_KEYCHAIN_ID_T keychainID;
    memset(&keychainID,0,sizeof(SSCS_KEYCHAIN_ID_T));
    strcpy((char*)(keychainID.keychainID),"MyKeychain");
    keychainID.len = strlen("MyKeychain")+1;

    /* sscs_CacheOpenSecretStore */

    DECORATE
    secID.version = 0x00040000;
    strcpy((char *)secID.ssName,"SecretStore");

    ssHandle = sscs_CacheOpenSecretStore(&secID, ssFlags, NULL);
    if(!ssHandle)
    {
        printf("sscs_CacheOpenSecretStore failed\n");
    }
    else
    {
        printf("sscs_CacheOpenSecretStore succeeded\n");
    }
    printf("Platform ID is %d; socketID is %d\n",ssHandle->platformID,
                             *(int*)ssHandle->platHandle);

    ssFlags |= SSCS_LOCAL_KEY_CHAIN_F;

    printf("Adding %s \n",keychainID.keychainID);
    
    retVal = sscs_CacheAddKeychain(ssHandle,ssFlags,&keychainID,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheAddKeychain failed: %d\n",retVal);
    }
    EnumerateIDs(ssHandle,0,NULL);

    printf("Removing %s\n",keychainID.keychainID);

    retVal = sscs_CacheRemoveKeychain(ssHandle,ssFlags,&keychainID,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheRemoveKeychain failed: %d\n",retVal);
    }

    EnumerateIDs(ssHandle,0,&keychainID);

    retVal = sscs_CacheCloseSecretStore(ssHandle, ssFlags, NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheCloseSecretStore failed: %d\n",retVal);
    }
    DECORATE
}

void TestCacheRemoveKeyChain_NonExistentKeychain(void)
{
    SSCS_SECRETSTORE_T secID;
    SSCS_SECRETSTORE_HANDLE_T *ssHandle = NULL;
    SSCS_KEYCHAIN_ID_LIST_T kcIDList;
    int retVal = 0;
    uint32_t ssFlags = 0;
    SSCS_KEYCHAIN_ID_T keychainID;
    memset(&keychainID,0,sizeof(SSCS_KEYCHAIN_ID_T));
    strcpy((char*)(keychainID.keychainID),"Non-existent");
    keychainID.len = strlen("Non-existent")+1;

    DECORATE
    printf("INPUT: {0x00040000, SecretStore}\n");

    secID.version = 0x00040000;
    strcpy((char *)secID.ssName,"SecretStore");

    ssHandle = sscs_CacheOpenSecretStore(&secID, ssFlags, NULL);
    if(!ssHandle)
    {
        printf("sscs_CacheOpenSecretStore failed\n");
    }
    else
    {
        printf("sscs_CacheOpenSecretStore succeeded\n");
    }
    printf("Platform ID is %d; socketID is %d\n",ssHandle->platformID,
                             *(int*)ssHandle->platHandle);

    printf("Removing %s\n",keychainID.keychainID);

    retVal = sscs_CacheRemoveKeychain(ssHandle,ssFlags,&keychainID,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheAddKeychain failed: %d\n",retVal);
    }

    EnumerateIDs(ssHandle,0,&keychainID);

    retVal = sscs_CacheCloseSecretStore(ssHandle, ssFlags,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheCloseSecretStore failed: %d\n",retVal);
    }
    DECORATE
}

void TestCacheRemoveKeyChain_OverlappingNames(void)
{
    SSCS_SECRETSTORE_T secID;
    SSCS_SECRETSTORE_HANDLE_T *ssHandle = NULL;
    SSCS_KEYCHAIN_ID_LIST_T kcIDList;
    int retVal = 0;
    uint32_t ssFlags = 0;
    SSCS_KEYCHAIN_ID_T keychainID;
    memset(&keychainID,0,sizeof(SSCS_KEYCHAIN_ID_T));
    strcpy((char*)(keychainID.keychainID),"Keychain1");
    keychainID.len = strlen("Keychain1")+1;

    /* sscs_CacheOpenSecretStore */

    DECORATE
    secID.version = 0x00040000;
    strcpy((char *)secID.ssName,"SecretStore");

    ssHandle = sscs_CacheOpenSecretStore(&secID, ssFlags, NULL);
    if(!ssHandle)
    {
        printf("sscs_CacheOpenSecretStore failed\n");
    }
    else
    {
        printf("sscs_CacheOpenSecretStore succeeded\n");
    }
    printf("Platform ID is %d; socketID is %d\n",ssHandle->platformID,
                             *(int*)ssHandle->platHandle);

    ssFlags |= SSCS_LOCAL_KEY_CHAIN_F;
    printf("Adding %s \n",keychainID.keychainID);

    retVal = sscs_CacheAddKeychain(ssHandle,ssFlags,&keychainID,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheAddKeychain failed: %d\n",retVal);
    }

    strcpy(keychainID.keychainID,"Keychain1");
    keychainID.len = strlen("Keychain1")+1;
    printf("Adding %s \n",keychainID.keychainID);

    retVal = sscs_CacheAddKeychain(ssHandle,ssFlags,&keychainID,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheAddKeychain failed: %d\n",retVal);
    }

    strcpy(keychainID.keychainID,"Keychain");
    keychainID.len = strlen("Keychain")+1;

    printf("Removing %s\n",keychainID.keychainID);

    retVal = sscs_CacheRemoveKeychain(ssHandle,ssFlags, &keychainID,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheRemoveKeychain failed: %d\n",retVal);
    }

    EnumerateIDs(ssHandle,0,&keychainID);

    strcpy(keychainID.keychainID,"Keychain1");
    keychainID.len = strlen("Keychain1")+1;
    printf("Removing %s\n",keychainID.keychainID);

    retVal = sscs_CacheRemoveKeychain(ssHandle,ssFlags,&keychainID,NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheRemoveKeychain failed: %d\n",retVal);
    }
    EnumerateIDs(ssHandle,0,&keychainID);

    retVal = sscs_CacheCloseSecretStore(ssHandle, ssFlags, NULL);
    if(retVal != 0)
    {
        printf("sscs_CacheCloseSecretStore failed: %d\n",retVal);
    }
    DECORATE
}