예제 #1
0
LONGBOW_TEST_CASE(Global, ccnxPortal_Receive_ImmediateTimeout)
{
    TestData *data = longBowTestCase_GetClipBoardData(testCase);
   
    CCNxPortal *portalOut = ccnxPortalFactory_CreatePortal(data->factory, TEST_STACK);
    CCNxPortal *portalIn = ccnxPortalFactory_CreatePortal(data->factory, TEST_STACK);
   
    CCNxName *name = ccnxName_CreateFromCString("lci:/Hello/World");
    CCNxInterest *interest = ccnxInterest_CreateSimple(name);
    ccnxName_Release(&name);
   
    CCNxMetaMessage *interestMessage = ccnxMetaMessage_CreateFromInterest(interest);
   
    if (ccnxPortal_Send(portalOut, interestMessage, CCNxStackTimeout_Never)) {
        sleep(2);
        ccnxMetaMessage_Release(&interestMessage);
        CCNxMetaMessage *message = ccnxPortal_Receive(portalIn, CCNxStackTimeout_Immediate);
       
        assertTrue(ccnxInterest_Equals(interest, ccnxMetaMessage_GetInterest(message)), "Expected Interest to be received.");
        ccnxMetaMessage_Release(&message);
    }
   
    ccnxInterest_Release(&interest);
    ccnxPortal_Release(&portalIn);
    ccnxPortal_Release(&portalOut);
}
예제 #2
0
/**
 * Given a command (e.g "fetch") and an optional target name (e.g. "file.txt"), create an appropriate CCNxInterest
 * and write it to the Portal.
 *
 * @param command The command to be handled.
 * @param targetName The name of the target content, if any, that the command applies to.
 *
 * @return true If a CCNxInterest for the specified command and optional target was successfully issued and answered.
 */
static bool
_executeUserCommand(const char *command, const char *targetName)
{
    bool result = false;
    CCNxPortalFactory *factory = _setupConsumerPortalFactory();

    CCNxPortal *portal = ccnxPortalFactory_CreatePortal(factory, ccnxPortalRTA_Chunked);

    assertNotNull(portal, "Expected a non-null CCNxPortal pointer.");

    // Given the user's command and optional target, create an Interest.
    CCNxInterest *interest = _createInterest(command, targetName);

    // Send the Interest through the Portal, and wait for a response.
    CCNxMetaMessage *message = ccnxMetaMessage_CreateFromInterest(interest);
    if (ccnxPortal_Send(portal, message, CCNxStackTimeout_Never)) {
        CCNxName *domainPrefix = ccnxName_CreateFromURI(tutorialCommon_DomainPrefix);  // e.g. 'lci:/ccnx/tutorial'

        result = _receiveResponseToIssuedInterest(portal, domainPrefix);

        ccnxName_Release(&domainPrefix);
    }

    ccnxMetaMessage_Release(&message);
    ccnxInterest_Release(&interest);
    ccnxPortal_Release(&portal);
    ccnxPortalFactory_Release(&factory);

    return result;
}
예제 #3
0
LONGBOW_TEST_CASE(Global, ccnxPortal_Send_ImmediateTimeout_WouldBlock)
{
    TestData *data = longBowTestCase_GetClipBoardData(testCase);
   
    CCNxPortal *portalOut = ccnxPortalFactory_CreatePortal(data->factory, TEST_STACK);
   
    CCNxName *name = ccnxName_CreateFromCString("lci:/Hello/World");
    CCNxInterest *interest = ccnxInterest_CreateSimple(name);
    ccnxName_Release(&name);
   
    CCNxMetaMessage *interestMessage = ccnxMetaMessage_CreateFromInterest(interest);

    for (int count = 0; count < 10000; count++) {
        if (ccnxPortal_Send(portalOut, interestMessage, CCNxStackTimeout_Immediate) == false) {
            break;
        }
        count++;
    }
   
    assertFalse(ccnxPortal_Send(portalOut, interestMessage, CCNxStackTimeout_Immediate),
                "Expected send to fail due to blocking");
   
    ccnxMetaMessage_Release(&interestMessage);
    ccnxInterest_Release(&interest);
    ccnxPortal_Release(&portalOut);
}
LONGBOW_TEST_CASE(Local, _athenaLRUContentStore_ProcessMessage_StatHits)
{
    AthenaLRUContentStore *impl = _createLRUContentStore();

    CCNxName *name = ccnxName_CreateFromURI(CCNxNameAthena_ContentStore "/stat/hits");
    CCNxInterest *interest = ccnxInterest_CreateSimple(name);
    ccnxName_Release(&name);

    CCNxMetaMessage *message = ccnxMetaMessage_CreateFromInterest(interest);
    ccnxInterest_Release(&interest);

    CCNxMetaMessage *response = _athenaLRUContentStore_ProcessMessage(impl, message);

    assertNotNull(response, "Expected a response to ProcessMessage()");
    assertTrue(ccnxMetaMessage_IsContentObject(response), "Expected a content object");

    CCNxContentObject *content = ccnxMetaMessage_GetContentObject(response);

    PARCBuffer *payload = ccnxContentObject_GetPayload(content);
    parcBuffer_Display(payload, 0);

    ccnxMetaMessage_Release(&message);
    ccnxMetaMessage_Release(&response);
    _athenaLRUContentStore_Release((AthenaContentStoreImplementation *) &impl);
}
LONGBOW_TEST_CASE(Global, ccnxMetaMessage_CreateFromInterest)
{
    CCNxName *name = ccnxName_CreateFromCString("lci:/foo/bar");
    CCNxInterest *interest = ccnxInterest_CreateSimple(name);

    CCNxMetaMessage *portalMessage = ccnxMetaMessage_CreateFromInterest(interest);
    assertNotNull(portalMessage, "Expected a non-null portal message");
    ccnxMetaMessage_Release(&portalMessage);

    ccnxInterest_Release(&interest);
    ccnxName_Release(&name);
}
LONGBOW_TEST_CASE(Global, ccnxMetaMessage_GetInterest)
{
    CCNxName *name = ccnxName_CreateFromCString("lci:/foo/bar");
    CCNxInterest *interest = ccnxInterest_CreateSimple(name);
    CCNxMetaMessage *portalMessage = ccnxMetaMessage_CreateFromInterest(interest);
    CCNxInterest *reference = ccnxMetaMessage_GetInterest(portalMessage);

    assertTrue(ccnxInterest_Equals(interest, reference), "Expected reference to equal original interest");
    ccnxInterest_AssertValid(reference);

    ccnxInterest_Release(&reference);
    ccnxMetaMessage_Release(&portalMessage);
    ccnxName_Release(&name);
}
LONGBOW_TEST_CASE(Global, ccnxMetaMessage_IsInterest)
{
    CCNxName *name = ccnxName_CreateFromCString("lci:/foo/bar");
    CCNxInterest *interest = ccnxInterest_CreateSimple(name);
    CCNxMetaMessage *portalMessage = ccnxMetaMessage_CreateFromInterest(interest);

    assertTrue(ccnxMetaMessage_IsInterest(portalMessage), "Expected portal message to be an Interest");
    assertFalse(ccnxMetaMessage_IsContentObject(portalMessage), "Did not expect portal message to be a ContentObject");
    assertFalse(ccnxMetaMessage_IsControl(portalMessage), "Did not expect portal message to be a Control message");

    ccnxMetaMessage_Release(&portalMessage);
    ccnxInterest_Release(&interest);
    ccnxName_Release(&name);
}
LONGBOW_TEST_CASE(Global, ccnxPortalStack_Send)
{
    CCNxPortalStack *stack = (CCNxPortalStack *) longBowTestCase_GetClipBoardData(testCase);

    CCNxName *name = ccnxName_Create();
    CCNxInterest *interest = ccnxInterest_CreateSimple(name);
    ccnxName_Release(&name);

    CCNxMetaMessage *message = ccnxMetaMessage_CreateFromInterest(interest);
    ccnxInterest_Release(&interest);

    bool result = ccnxPortalStack_Send(stack, message, CCNxStackTimeout_Never);
    ccnxMetaMessage_Release(&message);
    assertTrue(result, "Expected ccnxPortalStack_Ignore to return true.");
}
예제 #9
0
int
consumer(void)
{
    parcSecurity_Init();
    
    CCNxPortalFactory *factory = setupConsumerFactory();
   
    CCNxPortal *portal = ccnxPortalFactory_CreatePortal(factory, ccnxPortalRTA_Message);

    assertNotNull(portal, "Expected a non-null CCNxPortal pointer.");

    CCNxName *name = ccnxName_CreateFromCString("lci:/Hello/World");

    CCNxInterest *interest = ccnxInterest_CreateSimple(name);
    ccnxName_Release(&name);

    CCNxMetaMessage *message = ccnxMetaMessage_CreateFromInterest(interest);
    
    if (ccnxPortal_Send(portal, message,CCNxStackTimeout_Never)) {
        while (ccnxPortal_IsError(portal) == false) {
            CCNxMetaMessage *response = ccnxPortal_Receive(portal,CCNxStackTimeout_Never);
            if (response != NULL) {
                if (ccnxMetaMessage_IsContentObject(response)) {
                    CCNxContentObject *contentObject = ccnxMetaMessage_GetContentObject(response);

                    PARCBuffer *payload = ccnxContentObject_GetPayload(contentObject);

                    char *string = parcBuffer_ToString(payload);
                    printf("%s\n", string);
                    parcMemory_Deallocate((void **)&string);

                    break;
                }
            }
            ccnxMetaMessage_Release(&response);
        }
    }

    ccnxPortal_Release(&portal);

    ccnxPortalFactory_Release(&factory);
    
    parcSecurity_Fini();
    return 0;
}
예제 #10
0
LONGBOW_TEST_CASE(Global, ccnxPortal_GetFileId)
{
    TestData *data = longBowTestCase_GetClipBoardData(testCase);

    CCNxPortal *portal = ccnxPortalFactory_CreatePortal(data->factory, TEST_STACK);

    CCNxName *name = ccnxName_CreateFromCString("lci:/Hello/World");
    CCNxInterest *interest = ccnxInterest_CreateSimple(name);
    ccnxName_Release(&name);

    CCNxMetaMessage *message = ccnxMetaMessage_CreateFromInterest(interest);
    ccnxInterest_Release(&interest);

    ccnxPortal_Send(portal, message, CCNxStackTimeout_Never);
    ccnxMetaMessage_Release(&message);
    ccnxPortal_Flush(portal, CCNxStackTimeout_Never);
    int fileId = ccnxPortal_GetFileId(portal);
    assertTrue(fileId != -1, "Expected ccnxPortal_GetFileId to not return -1");
    ccnxPortal_Release(&portal);
}
예제 #11
0
int
ccnGet(PARCIdentity *identity, CCNxName *name)
{
    CCNxPortalFactory *factory = ccnxPortalFactory_Create(identity);

    CCNxPortal *portal = ccnxPortalFactory_CreatePortal(factory, ccnxPortalRTA_Message);

    assertNotNull(portal, "Expected a non-null CCNxPortal pointer.");

    CCNxInterest *interest = ccnxInterest_CreateSimple(name);
    ccnxName_Release(&name);

    CCNxMetaMessage *message = ccnxMetaMessage_CreateFromInterest(interest);

    if (ccnxPortal_Send(portal, message, CCNxStackTimeout_Never)) {
        while (ccnxPortal_IsError(portal) == false) {
            CCNxMetaMessage *response = ccnxPortal_Receive(portal, CCNxStackTimeout_Never);
            if (response != NULL) {
                if (ccnxMetaMessage_IsContentObject(response)) {
                    CCNxContentObject *contentObject = ccnxMetaMessage_GetContentObject(response);

                    PARCBuffer *payload = ccnxContentObject_GetPayload(contentObject);

                    size_t length = parcBuffer_Remaining(payload);
                    ssize_t nwritten = write(1, parcBuffer_Overlay(payload, length), length);
                    assertTrue(nwritten == length, "Did not write whole buffer, got %zd expected %zu", nwritten, length);

                    break;
                }
                ccnxMetaMessage_Release(&response);
            }
        }
    }

    ccnxPortal_Release(&portal);

    ccnxPortalFactory_Release(&factory);

    return 0;
}
예제 #12
0
LONGBOW_TEST_CASE(Global, Hello)
{
    TestData *data = longBowTestCase_GetClipBoardData(testCase);
   
    CCNxPortal *portal = ccnxPortalFactory_CreatePortal(data->factory, TEST_STACK);
    CCNxPortal *portalIn = ccnxPortalFactory_CreatePortal(data->factory, TEST_STACK);

    assertNotNull(portal, "Expected a non-null CCNxPortal pointer.");

    CCNxName *name = ccnxName_CreateFromCString("lci:/Hello/World");
    CCNxInterest *interest = ccnxInterest_CreateSimple(name);

    CCNxMetaMessage *interestMessage = ccnxMetaMessage_CreateFromInterest(interest);

    if (ccnxPortal_Send(portal, interestMessage, CCNxStackTimeout_Never)) {
        for (int responses = 0; responses == 0; ) {
            CCNxMetaMessage *message = ccnxPortal_Receive(portalIn, CCNxStackTimeout_Never);
            if (message != NULL) {
                if (ccnxMetaMessage_IsContentObject(message)) {
                    CCNxContentObject *contentObject = ccnxMetaMessage_GetContentObject(message);

                    PARCBuffer *payload = ccnxContentObject_GetPayload(contentObject);
                    if (parcBuffer_HasRemaining(payload) == false) {
                        fprintf(stderr, "**************** Content object has arrived WITH EMPTY CONTENT\n");
                    } else {
                        char *string = parcBuffer_ToString(payload);
                        fprintf(stderr, "**************** Content object has arrived: %s\n", string);
                        parcMemory_Deallocate((void **)&string);
                    }
                    responses++;
                }
                ccnxMetaMessage_Release(&message);
            }
        }
    }

    ccnxMetaMessage_Release(&interestMessage);
    ccnxPortal_Release(&portal);
}
예제 #13
0
LONGBOW_TEST_CASE(Global, ccnxPortal_IsEOF)
{
    TestData *data = longBowTestCase_GetClipBoardData(testCase);
    CCNxPortal *portal = ccnxPortalFactory_CreatePortal(data->factory, TEST_STACK);

    CCNxName *name = ccnxName_CreateFromCString("lci:/Hello/World");
    CCNxInterest *interest = ccnxInterest_CreateSimple(name);
    ccnxName_Release(&name);

    CCNxMetaMessage *message = ccnxMetaMessage_CreateFromInterest(interest);

    ccnxPortal_Send(portal, message, CCNxStackTimeout_Never);
    ccnxPortal_Flush(portal, CCNxStackTimeout_Never);

    bool actual = ccnxPortal_IsEOF(portal);
   
    ccnxInterest_Release(&interest);
    ccnxMetaMessage_Release(&message);
   
    ccnxPortal_Release(&portal);

    assertFalse(actual, "Expected to not be at EOF");
}
예제 #14
0
LONGBOW_TEST_CASE(Global, ccnxPortal_Send_NeverTimeout)
{
    TestData *data = longBowTestCase_GetClipBoardData(testCase);
   
    CCNxPortal *portalOut = ccnxPortalFactory_CreatePortal(data->factory, TEST_STACK);
    CCNxPortal *portalIn = ccnxPortalFactory_CreatePortal(data->factory, TEST_STACK);
   
    CCNxName *name = ccnxName_CreateFromCString("lci:/Hello/World");
    CCNxInterest *interest = ccnxInterest_CreateSimple(name);
    ccnxName_Release(&name);
   
    CCNxMetaMessage *interestMessage = ccnxMetaMessage_CreateFromInterest(interest);
    ccnxInterest_Release(&interest);
   
    if (ccnxPortal_Send(portalOut, interestMessage, CCNxStackTimeout_Never)) {
        ccnxMetaMessage_Release(&interestMessage);
        CCNxMetaMessage *message = ccnxPortal_Receive(portalIn, CCNxStackTimeout_Never);
        ccnxMetaMessage_Release(&message);
    }
   
    ccnxPortal_Release(&portalIn);
    ccnxPortal_Release(&portalOut);
}
LONGBOW_TEST_CASE(Global, ccnxMetaMessage_Acquire_Release)
{
    CCNxName *name = ccnxName_CreateFromCString("lci:/foo/bar");
    CCNxInterest *interest = ccnxInterest_CreateSimple(name);
    CCNxMetaMessage *portalMessage = ccnxMetaMessage_CreateFromInterest(interest);

    CCNxMetaMessage *ref1 = ccnxMetaMessage_Acquire(portalMessage);
    CCNxMetaMessage *ref2 = ccnxMetaMessage_Acquire(portalMessage);
    CCNxMetaMessage *ref3 = ccnxMetaMessage_Acquire(portalMessage);

    ccnxMetaMessage_Release(&ref1);
    assertNull(ref1, "Expected pointer to pointer to be null after Release()");

    ccnxMetaMessage_Release(&ref2);
    assertNull(ref2, "Expected pointer to pointer to be null after Release()");

    ccnxMetaMessage_Release(&ref3);
    assertNull(ref3, "Expected pointer to pointer to be null after Release()");

    ccnxMetaMessage_Release(&portalMessage);
    ccnxInterest_Release(&interest);
    ccnxName_Release(&name);
}
예제 #16
0
LONGBOW_TEST_CASE(Global, ccnxPortal_GetError)
{
    TestData *data = longBowTestCase_GetClipBoardData(testCase);
   
    CCNxPortal *portal = ccnxPortalFactory_CreatePortal(data->factory, TEST_STACK);

    CCNxName *name = ccnxName_CreateFromCString("lci:/Hello/World");
    CCNxInterest *interest = ccnxInterest_CreateSimple(name);
    ccnxName_Release(&name);
   
    CCNxMetaMessage *message = ccnxMetaMessage_CreateFromInterest(interest);
   
    ccnxPortal_Send(portal, message, CCNxStackTimeout_Never);
    ccnxPortal_Flush(portal, CCNxStackTimeout_Never);
   
    const int error = ccnxPortal_GetError(portal);
   
    ccnxMetaMessage_Release(&message);
    ccnxInterest_Release(&interest);
   
    ccnxPortal_Release(&portal);
   
    assertTrue(error == 0, "Expected 0 result from ccnxPortal_GetError");
}
예제 #17
0
LONGBOW_TEST_CASE(Global, processMessage)
{
    AthenaLRUContentStoreConfig config;
    config.capacityInMB = 10;
    AthenaContentStore *store = athenaContentStore_Create(&AthenaContentStore_LRUImplementation, &config);

    CCNxName *name = ccnxName_CreateFromURI(CCNxNameAthena_ContentStore "/stat/size");
    CCNxInterest *interest = ccnxInterest_CreateSimple(name);

    CCNxMetaMessage *message = ccnxMetaMessage_CreateFromInterest(interest);

    athena_EncodeMessage(message);

    CCNxMetaMessage *result = athenaContentStore_ProcessMessage(store, message);

    assertNotNull(result, "Expected a response from the store");

    ccnxMetaMessage_Release(&result);
    ccnxMetaMessage_Release(&message);
    ccnxInterest_Release(&interest);
    ccnxName_Release(&name);

    athenaContentStore_Release(&store);
}
예제 #18
0
/**
 * Run the consumer to fetch the specified file. Save it to disk once transferred.
 *
 * @param [in] target Name of the content to request.
 * @param [in] outFile Name of the file to which the buffer will be written.
 */
static int
_ccnxFileRepoClient_Run(char *target, char *outFile)
{
    parcSecurity_Init();

    PARCLog *log = _ccnxFileRepoClient_CreateLogger();

    CCNxPortalFactory *factory = _setupConsumerPortalFactory();
    CCNxPortal *portal = ccnxPortalFactory_CreatePortal(factory, ccnxPortalRTA_Message);
    assertNotNull(portal, "Expected a non-null CCNxPortal pointer.");

    CCNxName *name = ccnxName_CreateFromCString(target);
    CCNxInterest *interest = ccnxInterest_CreateSimple(name);
    CCNxMetaMessage *message = ccnxMetaMessage_CreateFromInterest(interest);

    if (ccnxPortal_Send(portal, message, CCNxStackTimeout_Never)) {
        while (ccnxPortal_IsError(portal) == false) {
            CCNxMetaMessage *response = ccnxPortal_Receive(portal, CCNxStackTimeout_Never);
            if (response != NULL) {
                if (ccnxMetaMessage_IsManifest(response)) {
                    parcLog_Info(log, "Received root manifest. Beginning to retrieve the content.");

                    // Extract the manifest and instantiate a new fetcher for it
                    CCNxManifest *root = ccnxMetaMessage_GetManifest(response);
                    CCNxFileRepoManifestFetcher *fetcher = ccnxFileRepoManifestFetcher_Create(portal, root);

                    // Initialize the file offset and I/O buffer
                    size_t fileOffset = 0;
                    PARCBuffer *chunkBuffer = parcBuffer_Allocate(ccnxFileRepoCommon_ClientBufferSize);

                    // Start reading from the manifest until done
                    bool done = false;
                    while (!done) {
                        // Reset the buffer information
                        parcBuffer_SetPosition(chunkBuffer, 0);
                        parcBuffer_SetLimit(chunkBuffer, ccnxFileRepoCommon_ClientBufferSize);

                        // Fill the buffer with data from the manifest
                        done = ccnxFileRepoManifestFetcher_FillBuffer(fetcher, chunkBuffer);
                        parcBuffer_Flip(chunkBuffer);

                        // Write the buffer to the file
                        size_t totalSize = parcBuffer_Remaining(chunkBuffer);
                        _ccnxFileRepoClient_AppendBufferToFile(outFile, chunkBuffer, fileOffset);
                        fileOffset += totalSize;

                        // Flip the buffer back around for writing
                        parcBuffer_Flip(chunkBuffer);
                    }
                    parcBuffer_Release(&chunkBuffer);

                    break;
                } else if (ccnxMetaMessage_IsContentObject(response)) {
                    parcLog_Info(log, "Received a content object. Dump the payload and exit.");
                    CCNxContentObject *contentObject = ccnxMetaMessage_GetContentObject(response);
                    PARCBuffer *payload = ccnxContentObject_GetPayload(contentObject);
                    _ccnxFileRepoClient_AppendBufferToFile(outFile, payload, 0);
                    break;
                }
            }
            ccnxMetaMessage_Release(&response);
        }
    }

    ccnxPortal_Release(&portal);
    ccnxPortalFactory_Release(&factory);

    parcSecurity_Fini();
    return 0;
}