Esempio n. 1
0
struct channel *
create_data_channel(void) {
  static uint8_t cnt;
  char buf[256];
  struct channel *channel;
  lagopus_session_t session;
  struct addrunion addr;
  uint64_t dpid = 0xabc;

  if (s_is_init == false) {
    s_is_init = true;

    /* init dataplane. */
    TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK, dp_api_init());

    /* interface. */
    s_interface_info.type = DATASTORE_INTERFACE_TYPE_ETHERNET_RAWSOCK;
    s_interface_info.eth_rawsock.port_number = 0;
    s_interface_info.eth_dpdk_phy.device = strdup("eth0");
    if (s_interface_info.eth_dpdk_phy.device == NULL) {
      TEST_FAIL_MESSAGE("device is NULL.");
    }
    TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                      dp_interface_create(interface_name));
    dp_interface_info_set(interface_name, &s_interface_info);

    /* port. */
    TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                      dp_port_create(port_name));
    TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                      dp_port_interface_set(port_name, interface_name));

    /* bridge. */
    ofp_bridgeq_mgr_initialize(NULL);
    s_bridge_info.dpid = dpid;
    s_bridge_info.fail_mode = DATASTORE_BRIDGE_FAIL_MODE_SECURE;
    s_bridge_info.max_buffered_packets = UINT32_MAX;
    s_bridge_info.max_ports = UINT16_MAX;
    s_bridge_info.max_tables = UINT8_MAX;
    s_bridge_info.max_flows = UINT32_MAX;
    s_bridge_info.capabilities = UINT64_MAX;
    s_bridge_info.action_types = UINT64_MAX;
    s_bridge_info.instruction_types = UINT64_MAX;
    s_bridge_info.reserved_port_types = UINT64_MAX;
    s_bridge_info.group_types = UINT64_MAX;
    s_bridge_info.group_capabilities = UINT64_MAX;
    TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                      dp_bridge_create(bridge_name, &s_bridge_info));
    TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                      dp_bridge_port_set(bridge_name, port_name, 0));
    TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                      ofp_bridgeq_mgr_bridge_register(
                          dpid,
                          bridge_name,
                          &s_bridge_info,
                          &s_queue_info));
  }
  if (s_event_manager == NULL) {
    s_event_manager = event_manager_alloc();
    channel_mgr_initialize(s_event_manager);
  }

  snprintf(buf, sizeof(buf), "127.0.0.%u", cnt++);//XXX
  addrunion_ipv4_set(&addr, buf);
  channel_mgr_channel_add(bridge_name, dpid, &addr);
  channel_mgr_channel_lookup(bridge_name, &addr, &channel);


  session = channel_session_get(channel);
  session_write_set(session, s_write_tcp);
  session_sockfd_set(session, 3);

  channel_version_set(channel, 0x04);
  channel_xid_set(channel, s_xid);

  return channel;
}
void run_throughput_tests(KineticClient * client, size_t num_ops, size_t value_size)
{
    LOGF0("STRESS THREAD: object_size: %zu bytes, count: %zu entries", value_size, num_ops);

    // Configure and establish a session with the specified device
    KineticSession* session;
    const char HmacKeyString[] = "asdfasdf";
    KineticSessionConfig config = {
        .clusterVersion = 0,
        .identity = 1,
        .hmacKey = ByteArray_CreateWithCString(HmacKeyString),
    };
    strncpy(config.host, GetSystemTestHost1(), sizeof(config.host)-1);
    config.port = GetSystemTestPort1();
    KineticStatus status = KineticClient_CreateSession(&config, client, &session);
    if (status != KINETIC_STATUS_SUCCESS) {
        char msg[128];
        sprintf(msg, "Failed connecting to the Kinetic device w/status: %s", Kinetic_GetStatusDescription(status));
        TEST_FAIL_MESSAGE(msg);
    }

    // Generate test entry data
    ByteBuffer test_data = ByteBuffer_Malloc(value_size);
    ByteBuffer_AppendDummyData(&test_data, test_data.array.len);
    uint8_t tag_data[] = {0x00, 0x01, 0x02, 0x03};
    ByteBuffer tag = ByteBuffer_Create(tag_data, sizeof(tag_data), sizeof(tag_data));
    uint64_t r = rand();
    uint64_t keys[num_ops];
    KineticEntry entries[num_ops];
    for (uint32_t put = 0; put < num_ops; put++) {
        keys[put] = put | (r << 16);
    }

    // Measure PUT performance
    {
        OpStatus put_statuses[num_ops];
        for (size_t i = 0; i < num_ops; i++) {
            put_statuses[i] = (OpStatus){
                .sem = KineticSemaphore_Create(),
                .status = KINETIC_STATUS_INVALID,
            };
        };

        struct timeval start_time;
        gettimeofday(&start_time, NULL);

        for (uint32_t put = 0; put < num_ops; put++) {
            ByteBuffer key = ByteBuffer_Create(&keys[put], sizeof(keys[put]), sizeof(keys[put]));

            KineticSynchronization sync = (put == num_ops - 1)
                ? KINETIC_SYNCHRONIZATION_FLUSH
                : KINETIC_SYNCHRONIZATION_WRITEBACK;

            entries[put] = (KineticEntry) {
                .key = key,
                .tag = tag,
                .algorithm = KINETIC_ALGORITHM_SHA1,
                .value = test_data,
                .synchronization = sync,
            };

            KineticStatus status = KineticClient_Put(
                session,
                &entries[put],
                &(KineticCompletionClosure) {
                    .callback = op_finished,
                    .clientData = &put_statuses[put],
                }
            );

            if (status != KINETIC_STATUS_SUCCESS) {
                char msg[128];
                sprintf(msg, "PUT failed w/status: %s", Kinetic_GetStatusDescription(status));
                TEST_FAIL_MESSAGE(msg);
            }
        }

        for (size_t i = 0; i < num_ops; i++)
        {
            KineticSemaphore_WaitForSignalAndDestroy(put_statuses[i].sem);
            if (put_statuses[i].status != KINETIC_STATUS_SUCCESS) {
                char msg[128];
                sprintf(msg, "PUT failed w/status: %s", Kinetic_GetStatusDescription(put_statuses[i].status));
                TEST_FAIL_MESSAGE(msg);
            }
        }

        struct timeval stop_time;
        gettimeofday(&stop_time, NULL);
        size_t bytes_written = num_ops * test_data.array.len;
        int64_t elapsed_us = ((stop_time.tv_sec - start_time.tv_sec) * 1000000)
            + (stop_time.tv_usec - start_time.tv_usec);
        float elapsed_ms = elapsed_us / 1000.0f;
        float bandwidth = (bytes_written * 1000.0f) / (elapsed_ms * 1024 * 1024);
        LOGF0("PUT Performance: wrote: %.1f kB, duration: %.3f sec, throughput: %.2f MB/sec",
            bytes_written / 1024.0f, elapsed_ms / 1000.0f, bandwidth);
    }

    // Measure GET performance
    {
        OpStatus get_statuses[num_ops];
        for (size_t i = 0; i < num_ops; i++) {
            get_statuses[i] = (OpStatus){
                .sem = KineticSemaphore_Create(),
                .status = KINETIC_STATUS_INVALID,
            };
        };

        ByteBuffer test_get_datas[num_ops];
        for (size_t i = 0; i < num_ops; i++)
        {
            test_get_datas[i] = ByteBuffer_Malloc(value_size);
        }

        struct timeval start_time;
        gettimeofday(&start_time, NULL);

        for (uint32_t get = 0; get < num_ops; get++) {
            ByteBuffer key = ByteBuffer_Create(&keys[get], sizeof(keys[get]), sizeof(keys[get]));

            entries[get] = (KineticEntry) {
                .key = key,
                .tag = tag,
                .value = test_get_datas[get],
            };

            KineticStatus status = KineticClient_Get(
                session,
                &entries[get],
                &(KineticCompletionClosure) {
                    .callback = op_finished,
                    .clientData = &get_statuses[get],
                }
            );

            if (status != KINETIC_STATUS_SUCCESS) {
                char msg[128];
                sprintf(msg, "GET failed w/status: %s", Kinetic_GetStatusDescription(status));
                TEST_FAIL_MESSAGE(msg);
            }
        }

        size_t bytes_read = 0;
        for (size_t i = 0; i < num_ops; i++)
        {
            KineticSemaphore_WaitForSignalAndDestroy(get_statuses[i].sem);
            if (get_statuses[i].status != KINETIC_STATUS_SUCCESS) {
                char msg[128];
                sprintf(msg, "GET failed w/status: %s", Kinetic_GetStatusDescription(get_statuses[i].status));
                TEST_FAIL_MESSAGE(msg);
            }
            else
            {
                bytes_read += entries[i].value.bytesUsed;
            }
        }

        // Check data for integrity
        size_t numFailures = 0;
        for (size_t i = 0; i < num_ops; i++) {
            int res = memcmp(test_data.array.data, test_get_datas[i].array.data, test_data.array.len);
            if (res != 0) {
                LOGF0("Failed validating data in object %zu of %zu!", i+1, num_ops);
                numFailures++;
            }
        }
        TEST_ASSERT_EQUAL_MESSAGE(0, numFailures, "DATA INTEGRITY CHECK FAILED UPON READBACK!");

        // Calculate and report performance
        struct timeval stop_time;
        gettimeofday(&stop_time, NULL);
        int64_t elapsed_us = ((stop_time.tv_sec - start_time.tv_sec) * 1000000)
            + (stop_time.tv_usec - start_time.tv_usec);
        float elapsed_ms = elapsed_us / 1000.0f;
        float bandwidth = (bytes_read * 1000.0f) / (elapsed_ms * 1024 * 1024);
        LOGF0("GET Performance: read: %.1f kB, duration: %.3f sec, throughput: %.2f MB/sec",
            bytes_read / 1024.0f, elapsed_ms / 1000.0f, bandwidth);

        for (size_t i = 0; i < num_ops; i++) {
            ByteBuffer_Free(test_get_datas[i]);
        }
    }
Esempio n. 3
0
void
setUp(void) {
  struct sockaddr_storage so = {0,0,{0}};
  struct sockaddr_in *sin = (struct sockaddr_in *)&so;
  struct sockaddr_in6 *sin6;

  if (s4 != -1) {
    return;
  }

  sin->sin_family = AF_INET;
  sin->sin_port = htons(10022);
  sin->sin_addr.s_addr = INADDR_ANY;

  s4 = socket(AF_INET, SOCK_STREAM, 0);
  if (s4 < 0) {
    perror("socket");
    exit(1);
  }

  if (bind(s4, (struct sockaddr *) sin, sizeof(*sin)) < 0) {
    perror("bind");
    exit(1);
  }

  if (listen(s4, 5) < 0) {
    perror("listen");
    exit(1);
  }

  sin6 = (struct sockaddr_in6 *)&so;
  sin6->sin6_family = AF_INET6;
  sin6->sin6_port = htons(10023);
  sin6->sin6_addr = in6addr_any;

  s6 = socket(AF_INET6, SOCK_STREAM, 0);
  if (s6 < 0) {
    perror("socket");
    exit(1);
  }

  if (bind(s6, (struct sockaddr *) sin6, sizeof(*sin6)) < 0) {
    perror("bind");
    exit(1);
  }

  if (listen(s6, 5) < 0) {
    perror("listen");
    exit(1);
  }

  /* init datapath. */
  TEST_ASSERT_EQUAL(dp_api_init(), LAGOPUS_RESULT_OK);

  /* interface. */
  interface_info.type = DATASTORE_INTERFACE_TYPE_ETHERNET_RAWSOCK;
  interface_info.eth_rawsock.port_number = 0;
  interface_info.eth_dpdk_phy.device = strdup("eth0");
  if (interface_info.eth_dpdk_phy.device == NULL) {
    TEST_FAIL_MESSAGE("device is NULL.");
  }
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                    dp_interface_create(interface_name));
  dp_interface_info_set(interface_name, &interface_info);

  /* port. */
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                    dp_port_create(port_name));
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                    dp_port_interface_set(port_name, interface_name));

  /* bridge. */
  bridge_info.dpid = dpid;
  bridge_info.fail_mode = DATASTORE_BRIDGE_FAIL_MODE_SECURE;
  bridge_info.max_buffered_packets = UINT32_MAX;
  bridge_info.max_ports = UINT16_MAX;
  bridge_info.max_tables = UINT8_MAX;
  bridge_info.max_flows = UINT32_MAX;
  bridge_info.capabilities = UINT64_MAX;
  bridge_info.action_types = UINT64_MAX;
  bridge_info.instruction_types = UINT64_MAX;
  bridge_info.reserved_port_types = UINT64_MAX;
  bridge_info.group_types = UINT64_MAX;
  bridge_info.group_capabilities = UINT64_MAX;
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                    dp_bridge_create(bridge_name, &bridge_info));
  TEST_ASSERT_EQUAL(LAGOPUS_RESULT_OK,
                    dp_bridge_port_set(bridge_name, port_name, 0));


  printf("setup end\n");
}
 void test_shunting_yard_should_return_0_if_the_expression_is_null(){
	int check;
	Stack numberStack;
	Stack operatorStack;
	Error exception;
	String tokenizer = {.rawString = "0", .startIndex = 0, .length=1};
	
	Number number2 = {.type= NUMBER, .value=0};
	Token *token1 = (Token*)&number2;
	
	createStack_ExpectAndReturn(&numberStack);
	createStack_ExpectAndReturn(&operatorStack);
	stringCreate_ExpectAndReturn(NULL,&tokenizer);
	
	Try
	{
		check = evaluate(NULL);
		TEST_FAIL_MESSAGE("Should throw Error no expression ");
	}
	Catch(exception)
	{
		TEST_ASSERT_EQUAL(INVALID_EXPRESSION,exception);
	}
}

void test_should_return_3_for_1_plus_2(void){
	Stack dataStack;
	Stack operatorStack;
	int check;
	//Initialize tokenizer,token and stack
	String tokenizer = {.rawString = "1+2", .startIndex = 0, .length=3};
	
	Number number1 = {.type= NUMBER, .value=1};
	Number number2 = {.type= NUMBER, .value=2};	
	Number number3 = {.type= NUMBER, .value=3};
	Operator plus =  {.type= OPERATOR, .id=ADD, .precedence=70};
	
	createStack_ExpectAndReturn(&dataStack);
	createStack_ExpectAndReturn(&operatorStack);
	stringCreate_ExpectAndReturn("1+2",&tokenizer);
	//Number1
	getToken_ExpectAndReturn(&tokenizer, (Token *)&number1);
	isNumber_ExpectAndReturn((Token *)&number1, 1);
	stackPush_Expect((Token *)&number1, &dataStack);
	
	//Operator token plus
	getToken_ExpectAndReturn(&tokenizer, (Token *)&plus);
	isNumber_ExpectAndReturn((Token *)&plus, 0);
	isOperator_ExpectAndReturn((Token *)&plus, 1);
	stackPop_ExpectAndReturn(&operatorStack, NULL);
	stackPush_Expect((Token *)&plus, &operatorStack);
	
	//Number2
	getToken_ExpectAndReturn(&tokenizer, (Token *)&number2);
	isNumber_ExpectAndReturn((Token *)&number2, 1);
	stackPush_Expect((Token *)&number2, &dataStack);
	getToken_ExpectAndReturn(&tokenizer, NULL);
	
	//Calculation
	stackPop_ExpectAndReturn(&operatorStack, (Token *)&plus);
	stackPop_ExpectAndReturn(&dataStack, (Token *)&number2);
	stackPop_ExpectAndReturn(&dataStack, (Token *)&number1);
	createNumberToken_ExpectAndReturn(3, (Token *)&number3);
	stackPush_Expect((Token *)&number3, &dataStack);
	stackPop_ExpectAndReturn(&operatorStack, NULL);
	
	stackPop_ExpectAndReturn(&dataStack, (Token *)&number3);
	destroyStack_Expect(&dataStack);
	destroyStack_Expect(&operatorStack);
	check = evaluate("1+2");
	TEST_ASSERT_EQUAL(3, check);
	printf("Answer : %d ",check);
}

void test_should_return_6_for_60_divide_10(void){
	Stack dataStack;
	Stack operatorStack;
	int check;
	//Initialize tokenizer,token and stack
	String tokenizer = {.rawString = "60/10", .startIndex = 0, .length=3};
	
	Number number60 = {.type= NUMBER, .value=60};
	Token *token1 = (Token*)&number60;
	
	Operator divide = {.type= OPERATOR, .id=DIVIDE, .precedence=100};
	Token *token2 = (Token*)&divide;
	
	Number number10 = {.type= NUMBER, .value=10};
	Token *token3 = (Token*)&number10;
	
	Number answer = {.type= NUMBER, .value=6};
	Token *answerToken = (Token*)&answer;
	
	createStack_ExpectAndReturn(&dataStack);
	createStack_ExpectAndReturn(&operatorStack);
	stringCreate_ExpectAndReturn("60/10",&tokenizer);
	//Number60
	getToken_ExpectAndReturn(&tokenizer,token1);
	isNumber_ExpectAndReturn(token1,1);
	stackPush_Expect(token1,&dataStack);
	
	//Operator token divide
	getToken_ExpectAndReturn(&tokenizer,token2);
	isNumber_ExpectAndReturn(token2,0);
	isOperator_ExpectAndReturn(token2,1);
	stackPop_ExpectAndReturn(&operatorStack,NULL);
	stackPush_Expect(token2,&operatorStack);
	
	//Number10
	getToken_ExpectAndReturn(&tokenizer,token3);
	isNumber_ExpectAndReturn(token3,1);
	stackPush_Expect(token3,&dataStack);
	getToken_ExpectAndReturn(&tokenizer,NULL);
	
	//Calculation
	stackPop_ExpectAndReturn(&operatorStack,token2);
	stackPop_ExpectAndReturn(&dataStack,token3);
	stackPop_ExpectAndReturn(&dataStack,token1);
	createNumberToken_ExpectAndReturn(6,answerToken);
	stackPush_Expect(answerToken,&dataStack);
	stackPop_ExpectAndReturn(&operatorStack,NULL);
	
	stackPop_ExpectAndReturn(&dataStack,answerToken);
	destroyStack_Expect(&dataStack);
	destroyStack_Expect(&operatorStack);
	
	check=evaluate("60/10");
	TEST_ASSERT_EQUAL(6,check);
	printf("Answer : %d ",check);
}

void test_evaluate_2_MULTIPLY_3_PLUS_4(void){	
	
	int check;
	//Initialize tokenizer,token and stack
	String tokenizer = {.rawString = "2*3+4", .startIndex = 0, .length = 5};
	
	Number number2 = {.type= NUMBER, .value=2};
	Token *token1 = (Token*)&number2;
	
	Operator multiply = {.type= OPERATOR, .id = MULTIPLY ,.precedence=100};
	Token *token2 = (Token*)&multiply;
	
	Number number3 = {.type= NUMBER, .value=3};
	Token *token3 = (Token*)&number3;
	
	Operator plus = {.type= OPERATOR, .id = ADD ,.precedence=70};
	Token *token4 = (Token*)&plus;
	
	Number number4 = {.type= NUMBER, .value=4};
	Token *token5 = (Token*)&number4;
	
	Number tempAnswer = {.type=NUMBER, .value=6};
	Token *tempAnsToken = (Token*)&tempAnswer;

	Number finalAnswer = {.type=NUMBER, .value=10};
	Token *finalAnsToken = (Token*)&finalAnswer;

	//Evaluate the expression
	createStack_ExpectAndReturn(&numStack);
	createStack_ExpectAndReturn(&opeStack);
	stringCreate_ExpectAndReturn("2*3+4",&tokenizer);
	
	//Number token 2
	getToken_ExpectAndReturn(&tokenizer,token1);
	isNumber_ExpectAndReturn(token1,1);
	stackPush_Expect(token1,&numStack);
	
	//Operator token multiply
	getToken_ExpectAndReturn(&tokenizer,token2);
	isNumber_ExpectAndReturn(token2,0);
	isOperator_ExpectAndReturn(token2,1);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	stackPush_Expect(token2,&opeStack);
	
	//Number token 3
	getToken_ExpectAndReturn(&tokenizer,token3);
	isNumber_ExpectAndReturn(token3,1);
	stackPush_Expect(token3,&numStack);
	
	//Operator token plus cant push in and pop multiply out to evaluate
	getToken_ExpectAndReturn(&tokenizer,token4);
	isNumber_ExpectAndReturn(token4,0);
	isOperator_ExpectAndReturn(token4,1);
	stackPop_ExpectAndReturn(&opeStack,token2);
	stackPop_ExpectAndReturn(&numStack,token3);
	stackPop_ExpectAndReturn(&numStack,token1);
	createNumberToken_ExpectAndReturn(6,tempAnsToken);
	stackPush_Expect(tempAnsToken,&numStack);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	stackPush_Expect(token4,&opeStack);
	
	//Number token 4
	getToken_ExpectAndReturn(&tokenizer,token5);
	isNumber_ExpectAndReturn(token5,1);
	stackPush_Expect(token5,&numStack);
	getToken_ExpectAndReturn(&tokenizer,NULL);
	
	//Evaluate expression
	stackPop_ExpectAndReturn(&opeStack,token4);
	stackPop_ExpectAndReturn(&numStack,token5);
	stackPop_ExpectAndReturn(&numStack,tempAnsToken);
	createNumberToken_ExpectAndReturn(10,finalAnsToken);
	stackPush_Expect(finalAnsToken,&numStack);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	
	stackPop_ExpectAndReturn(&numStack,finalAnsToken); 
	
	destroyStack_Expect(&numStack);
	destroyStack_Expect(&opeStack);
	
	check=evaluate("2*3+4");
	TEST_ASSERT_EQUAL(10,check);
	printf("Answer : %d ",check);

}

void test_evaluate_2_PLUS_3_MULTIPLY_4_PLUS_5_MULTIPLY_6(void){
	int check;
	//Initialize tokenizer,token and stack
	String tokenizer = {.rawString = "2+3*4+5*6", .startIndex = 0, .length = 9};
	
	Number number2 = {.type= NUMBER, .value=2};
	Token *token1 = (Token*)&number2;
	
	Operator plus = {.type= OPERATOR, .id = ADD ,.precedence=70};
	Token *token2 = (Token*)&plus;
	
	Number number3 = {.type= NUMBER, .value=3};
	Token *token3 = (Token*)&number3;
	
	Operator multiply = {.type= OPERATOR, .id = MULTIPLY ,.precedence=100};
	Token *token4 = (Token*)&multiply;
	
	Number number4 = {.type= NUMBER, .value=4};
	Token *token5 = (Token*)&number4;
	
	Operator plus1 = {.type= OPERATOR, .id = ADD ,.precedence=70};
	Token *token6 = (Token*)&plus1;
	
	Number number5 = {.type= NUMBER, .value=5};
	Token *token7 = (Token*)&number5;
	
	Operator multiply1 = {.type= OPERATOR, .id = MULTIPLY ,.precedence=100};
	Token *token8 = (Token*)&multiply1;
	
	Number number6 = {.type= NUMBER, .value=6};
	Token *token9 = (Token*)&number6;
	
	Number tempAnswer1 = {.type=NUMBER, .value=12};
	Token *tempAnsToken1 = (Token*)&tempAnswer1;
	
	Number tempAnswer2 = {.type=NUMBER, .value=14};
	Token *tempAnsToken2 = (Token*)&tempAnswer2;
	
	Number tempAnswer3 = {.type=NUMBER, .value=30};
	Token *tempAnsToken3 = (Token*)&tempAnswer3;
	
	Number finalAnswer = {.type=NUMBER, .value=44};
	Token *finalAnsToken = (Token*)&finalAnswer;
	
	
	//Evaluate the expression
	createStack_ExpectAndReturn(&numStack);
	createStack_ExpectAndReturn(&opeStack);
	stringCreate_ExpectAndReturn("2+3*4+5*6",&tokenizer);
	
	//Token number 2
	getToken_ExpectAndReturn(&tokenizer,token1);
	isNumber_ExpectAndReturn(token1,1);
	stackPush_Expect(token1,&numStack);
	
	//Operator token plus
	getToken_ExpectAndReturn(&tokenizer,token2);
	isNumber_ExpectAndReturn(token2,0);
	isOperator_ExpectAndReturn(token2,1);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	stackPush_Expect(token2,&opeStack);
	
	//Token number 3
	getToken_ExpectAndReturn(&tokenizer,token3);
	isNumber_ExpectAndReturn(token3,1);
	stackPush_Expect(token3,&numStack);
	
	//Token operator multiply
	getToken_ExpectAndReturn(&tokenizer,token4);
	isNumber_ExpectAndReturn(token4,0);
	isOperator_ExpectAndReturn(token4,1);
	stackPop_ExpectAndReturn(&opeStack,token2);
	stackPush_Expect(token2,&opeStack);
	stackPush_Expect(token4,&opeStack);
	
	//Token number 4
	getToken_ExpectAndReturn(&tokenizer,token5);
	isNumber_ExpectAndReturn(token5,1);
	stackPush_Expect(token5,&numStack);
	
	//Token operator plus could not push in as multiply has higher
	//precedence .
	//After evaluate multiply,plus still cannot push in as there is
	//one more plus token inside the stack.
	//Thus , plus token inside the stack need to be evaluate first
	getToken_ExpectAndReturn(&tokenizer,token6);
	isNumber_ExpectAndReturn(token6,0);
	isOperator_ExpectAndReturn(token6,1);
	stackPop_ExpectAndReturn(&opeStack,token4);
	stackPop_ExpectAndReturn(&numStack,token5);
	stackPop_ExpectAndReturn(&numStack,token3);
	createNumberToken_ExpectAndReturn(12,tempAnsToken1);
	stackPush_Expect(tempAnsToken1,&numStack);
	stackPop_ExpectAndReturn(&opeStack,token2);
	stackPop_ExpectAndReturn(&numStack,tempAnsToken1);
	stackPop_ExpectAndReturn(&numStack,token1);
	createNumberToken_ExpectAndReturn(14,tempAnsToken2);
	stackPush_Expect(tempAnsToken2,&numStack);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	stackPush_Expect(token6,&opeStack);
	
	//Token number 5
	getToken_ExpectAndReturn(&tokenizer,token7);
	isNumber_ExpectAndReturn(token7,1);
	stackPush_Expect(token7,&numStack);
	
	//Token operator multiply
	getToken_ExpectAndReturn(&tokenizer,token8);
	isNumber_ExpectAndReturn(token8,0);
	isOperator_ExpectAndReturn(token8,1);
	stackPop_ExpectAndReturn(&opeStack,token6);
	stackPush_Expect(token6,&opeStack);
	stackPush_Expect(token8,&opeStack);
	
	//Token number 6
	getToken_ExpectAndReturn(&tokenizer,token9);
	isNumber_ExpectAndReturn(token9,1);
	stackPush_Expect(token9,&numStack);
	getToken_ExpectAndReturn(&tokenizer,NULL);
	
	//Evaluate expression
	stackPop_ExpectAndReturn(&opeStack,token8);
	stackPop_ExpectAndReturn(&numStack,token9);
	stackPop_ExpectAndReturn(&numStack,token7);
	createNumberToken_ExpectAndReturn(30,tempAnsToken3);
	stackPush_Expect(tempAnsToken3,&numStack);
	stackPop_ExpectAndReturn(&opeStack,token6);
	stackPop_ExpectAndReturn(&numStack,tempAnsToken3);
	stackPop_ExpectAndReturn(&numStack,tempAnsToken2);
	createNumberToken_ExpectAndReturn(44,finalAnsToken);
	stackPush_Expect(finalAnsToken,&numStack);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	
	stackPop_ExpectAndReturn(&numStack,finalAnsToken); 
	
	destroyStack_Expect(&numStack);
	destroyStack_Expect(&opeStack);
	
	check=evaluate("2+3*4+5*6");
	TEST_ASSERT_EQUAL(44,check);
	printf("Answer : %d ",check);
}

void test_evaluate_2_MULTIPLY_3_PLUS_4_MULTIPLY_5_PLUS_6(void){
	int check;
	//Initialize tokenizer,token and stack
	String tokenizer = {.rawString = "2*3+4*5+6", .startIndex = 0, .length = 9};
	
	Number number2 = {.type= NUMBER, .value=2};
	Token *token1 = (Token*)&number2;
	
	Operator multiply = {.type= OPERATOR, .id = MULTIPLY ,.precedence=100};
	Token *token2 = (Token*)&multiply;
	
	Number number3 = {.type= NUMBER, .value=3};
	Token *token3 = (Token*)&number3;
	
	Operator plus = {.type= OPERATOR, .id = ADD ,.precedence=70};
	Token *token4 = (Token*)&plus;
	
	Number number4 = {.type= NUMBER, .value=4};
	Token *token5 = (Token*)&number4;
	
	Operator multiply1 = {.type= OPERATOR, .id = MULTIPLY ,.precedence=100};
	Token *token6 = (Token*)&multiply1;
	
	Number number5 = {.type= NUMBER, .value=5};
	Token *token7 = (Token*)&number5;
	
	Operator plus1 = {.type= OPERATOR, .id = ADD ,.precedence=70};
	Token *token8 = (Token*)&plus1;
	
	Number number6 = {.type= NUMBER, .value=6};
	Token *token9 = (Token*)&number6;
	
	Number tempAnswer1 = {.type=NUMBER, .value=6};
	Token *tempAnsToken1 = (Token*)&tempAnswer1;
	
	Number tempAnswer2 = {.type=NUMBER, .value=20};
	Token *tempAnsToken2 = (Token*)&tempAnswer2;
	
	Number tempAnswer3 = {.type=NUMBER, .value=26};
	Token *tempAnsToken3 = (Token*)&tempAnswer3;
	
	Number finalAnswer = {.type=NUMBER, .value=32};
	Token *finalAnsToken = (Token*)&finalAnswer;

	//Evaluate the expression
	createStack_ExpectAndReturn(&numStack);
	createStack_ExpectAndReturn(&opeStack);
	stringCreate_ExpectAndReturn("2*3+4*5+6",&tokenizer);
	
	//Token number 2
	getToken_ExpectAndReturn(&tokenizer,token1);
	isNumber_ExpectAndReturn(token1,1);
	stackPush_Expect(token1,&numStack);
	
	//Token operator multiply
	getToken_ExpectAndReturn(&tokenizer,token2);
	isNumber_ExpectAndReturn(token2,0);
	isOperator_ExpectAndReturn(token2,1);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	stackPush_Expect(token2,&opeStack);
	
	//Token number 3
	getToken_ExpectAndReturn(&tokenizer,token3);
	isNumber_ExpectAndReturn(token3,1);
	stackPush_Expect(token3,&numStack);
	
	//Token operator plus
	getToken_ExpectAndReturn(&tokenizer,token4);
	isNumber_ExpectAndReturn(token4,0);
	isOperator_ExpectAndReturn(token4,1);
	stackPop_ExpectAndReturn(&opeStack,token2);
	stackPop_ExpectAndReturn(&numStack,token3);
	stackPop_ExpectAndReturn(&numStack,token1);
	createNumberToken_ExpectAndReturn(6,tempAnsToken1);
	stackPush_Expect(tempAnsToken1,&numStack);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	stackPush_Expect(token4,&opeStack);
	
	//Token number 4
	getToken_ExpectAndReturn(&tokenizer,token5);
	isNumber_ExpectAndReturn(token5,1);
	stackPush_Expect(token5,&numStack);
	
	//Token operator multiply 
	getToken_ExpectAndReturn(&tokenizer,token6);
	isNumber_ExpectAndReturn(token6,0);
	isOperator_ExpectAndReturn(token6,1);
	stackPop_ExpectAndReturn(&opeStack,token4);
	stackPush_Expect(token4,&opeStack);
	stackPush_Expect(token6,&opeStack);
	
	//Token number 5
	getToken_ExpectAndReturn(&tokenizer,token7);
	isNumber_ExpectAndReturn(token7,1);
	stackPush_Expect(token7,&numStack);
	
	//Token operator plus
	getToken_ExpectAndReturn(&tokenizer,token8);
	isNumber_ExpectAndReturn(token8,0);
	isOperator_ExpectAndReturn(token8,1);
	stackPop_ExpectAndReturn(&opeStack,token6);
	stackPop_ExpectAndReturn(&numStack,token7);
	stackPop_ExpectAndReturn(&numStack,token5);
	createNumberToken_ExpectAndReturn(20,tempAnsToken2);
	stackPush_Expect(tempAnsToken2,&numStack);
	stackPop_ExpectAndReturn(&opeStack,token4);
	stackPop_ExpectAndReturn(&numStack,tempAnsToken2);
	stackPop_ExpectAndReturn(&numStack,tempAnsToken1);
	createNumberToken_ExpectAndReturn(26,tempAnsToken3);
	stackPush_Expect(tempAnsToken3,&numStack);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	stackPush_Expect(token8,&opeStack);
	
	//Token number 6
	getToken_ExpectAndReturn(&tokenizer,token9);
	isNumber_ExpectAndReturn(token9,1);
	stackPush_Expect(token9,&numStack);
	getToken_ExpectAndReturn(&tokenizer,NULL);

	//Evaluate expression
	stackPop_ExpectAndReturn(&opeStack,token8);
	stackPop_ExpectAndReturn(&numStack,token9);
	stackPop_ExpectAndReturn(&numStack,tempAnsToken3);
	createNumberToken_ExpectAndReturn(32,finalAnsToken);
	stackPush_Expect(finalAnsToken,&numStack);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	
	stackPop_ExpectAndReturn(&numStack,finalAnsToken); 
	destroyStack_Expect(&numStack);
	destroyStack_Expect(&opeStack);
	
	check=evaluate("2*3+4*5+6");
	TEST_ASSERT_EQUAL(32,check);
	printf("Answer : %d ",check);
}

void test_2_OR_3_PLUS_4_MULTIPLY_5_MINUS_6_MINUS_10(void){
	
	int check;
	String tokenizer = {.rawString = "2|3+4*5-6-10", .startIndex = 0, .length = 11};
	
	Number number2 = {.type= NUMBER, .value=2};
	Token *token1 = (Token*)&number2;
	
	Operator OR = {.type= OPERATOR, .id = BITWISE_OR ,.precedence=10};
	Token *token2 = (Token*)&OR;
	
	Number number3 = {.type= NUMBER, .value=3};
	Token *token3 = (Token*)&number3;
	
	Operator plus = {.type= OPERATOR, .id = ADD ,.precedence=70};
	Token *token4 = (Token*)&plus;
	
	Number number4 = {.type= NUMBER, .value=4};
	Token *token5 = (Token*)&number4;
	
	Operator multiply = {.type= OPERATOR, .id = MULTIPLY ,.precedence=100};
	Token *token6 = (Token*)&multiply;
	
	Number number5 = {.type= NUMBER, .value=5};
	Token *token7 = (Token*)&number5;
	
	Operator subtract = {.type= OPERATOR, .id = SUBTRACT ,.precedence=70};
	Token *token8 = (Token*)&subtract;
	
	Number number6 = {.type= NUMBER, .value=6};
	Token *token9 = (Token*)&number6;
	
	Operator subtract1 = {.type= OPERATOR, .id = SUBTRACT ,.precedence=70};
	Token *token10 = (Token*)&subtract1;
	
	Number number10 = {.type= NUMBER, .value=10};
	Token *token11 = (Token*)&number10;
	
	Number tempAnswer1 = {.type=NUMBER, .value=20};
	Token *tempAnsToken1 = (Token*)&tempAnswer1;
	
	Number tempAnswer2 = {.type=NUMBER, .value=23};
	Token *tempAnsToken2 = (Token*)&tempAnswer2;
	
	Number tempAnswer3 = {.type=NUMBER, .value=17};
	Token *tempAnsToken3 = (Token*)&tempAnswer3;
	
	Number tempAnswer4 = {.type=NUMBER, .value=7};
	Token *tempAnsToken4 = (Token*)&tempAnswer4;
	
	Number finalAnswer = {.type=NUMBER, .value=7};
	Token *finalAnsToken = (Token*)&finalAnswer;
	
	//Evaluate the expression
	createStack_ExpectAndReturn(&numStack);
	createStack_ExpectAndReturn(&opeStack);
	stringCreate_ExpectAndReturn("2|3+4*5-6-10",&tokenizer);
	
	//Token number 2
	getToken_ExpectAndReturn(&tokenizer,token1);
	isNumber_ExpectAndReturn(token1,1);
	stackPush_Expect(token1,&numStack);
	
	//Token operator bitwize OR
	getToken_ExpectAndReturn(&tokenizer,token2);
	isNumber_ExpectAndReturn(token2,0);
	isOperator_ExpectAndReturn(token2,1);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	stackPush_Expect(token2,&opeStack);
	
	//Token number 3
	getToken_ExpectAndReturn(&tokenizer,token3);
	isNumber_ExpectAndReturn(token3,1);
	stackPush_Expect(token3,&numStack);
	
	//Token operator plus
	getToken_ExpectAndReturn(&tokenizer,token4);
	isNumber_ExpectAndReturn(token4,0);
	isOperator_ExpectAndReturn(token4,1);
	stackPop_ExpectAndReturn(&opeStack,token2);
	stackPush_Expect(token2,&opeStack);
	stackPush_Expect(token4,&opeStack);
	
	//Token number 4
	getToken_ExpectAndReturn(&tokenizer,token5);
	isNumber_ExpectAndReturn(token5,1);
	stackPush_Expect(token5,&numStack);
	
	//Token operator multiply 
	getToken_ExpectAndReturn(&tokenizer,token6);
	isNumber_ExpectAndReturn(token6,0);
	isOperator_ExpectAndReturn(token6,1);
	stackPop_ExpectAndReturn(&opeStack,token4);
	stackPush_Expect(token4,&opeStack);
	stackPush_Expect(token6,&opeStack);
	
	//Token number 5
	getToken_ExpectAndReturn(&tokenizer,token7);
	isNumber_ExpectAndReturn(token7,1);
	stackPush_Expect(token7,&numStack);
	
	//Token operator minus
	getToken_ExpectAndReturn(&tokenizer,token8);
	isNumber_ExpectAndReturn(token8,0);
	isOperator_ExpectAndReturn(token8,1);
	stackPop_ExpectAndReturn(&opeStack,token6);
	stackPop_ExpectAndReturn(&numStack,token7);
	stackPop_ExpectAndReturn(&numStack,token5);
	createNumberToken_ExpectAndReturn(20,tempAnsToken1);
	stackPush_Expect(tempAnsToken1,&numStack);
	stackPop_ExpectAndReturn(&opeStack,token4);
	stackPop_ExpectAndReturn(&numStack,tempAnsToken1);
	stackPop_ExpectAndReturn(&numStack,token3);
	createNumberToken_ExpectAndReturn(23,tempAnsToken2);
	stackPush_Expect(tempAnsToken2,&numStack);
	stackPop_ExpectAndReturn(&opeStack,token2);
	stackPush_Expect(token2,&opeStack);
	stackPush_Expect(token8,&opeStack);
	
	//Token number 6
	getToken_ExpectAndReturn(&tokenizer,token9);
	isNumber_ExpectAndReturn(token9,1);
	stackPush_Expect(token9,&numStack);
	
	//Token operator minus
	getToken_ExpectAndReturn(&tokenizer,token10);
	isNumber_ExpectAndReturn(token10,0);
	isOperator_ExpectAndReturn(token10,1);
	stackPop_ExpectAndReturn(&opeStack,token8);
	stackPop_ExpectAndReturn(&numStack,token9);
	stackPop_ExpectAndReturn(&numStack,tempAnsToken2);
	createNumberToken_ExpectAndReturn(17,tempAnsToken3);
	stackPush_Expect(tempAnsToken3,&numStack);
	stackPop_ExpectAndReturn(&opeStack,token2);
	stackPush_Expect(token2,&opeStack);
	stackPush_Expect(token10,&opeStack);
	
	//Token	number 10 
	getToken_ExpectAndReturn(&tokenizer,token11);
	isNumber_ExpectAndReturn(token11,1);
	stackPush_Expect(token11,&numStack);
	getToken_ExpectAndReturn(&tokenizer,NULL);
	
	//Evaluate expression
	stackPop_ExpectAndReturn(&opeStack,token10);
	stackPop_ExpectAndReturn(&numStack,token11);
	stackPop_ExpectAndReturn(&numStack,tempAnsToken3);
	createNumberToken_ExpectAndReturn(7,tempAnsToken4);
	stackPush_Expect(tempAnsToken4,&numStack);
	stackPop_ExpectAndReturn(&opeStack,token2);
	stackPop_ExpectAndReturn(&numStack,tempAnsToken4);
	stackPop_ExpectAndReturn(&numStack,token1);
	createNumberToken_ExpectAndReturn(7,finalAnsToken);
	stackPush_Expect(finalAnsToken,&numStack);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	
	stackPop_ExpectAndReturn(&numStack,finalAnsToken); 
	destroyStack_Expect(&numStack);
	destroyStack_Expect(&opeStack);
	
	check=evaluate("2|3+4*5-6-10");
	TEST_ASSERT_EQUAL(7,check);
	printf("Answer : %d ",check);
}

void test_should_evaluate_43_HASHTAG_42_and_throw_error_invalid_operator(void){
	
	Stack dataStack;
	Stack operatorStack;
	int check;
	Error e;
	//Initialize tokenizer,token and stack
	String tokenizer = {.rawString = "43)42", .startIndex = 0};
	
	Number number43 = {.type= NUMBER, .value=43};
	Token *token1 = (Token*)&number43;
	
	Operator hashtag = {.type= OPERATOR, .id=RIGHT_PARENTHESIS, .precedence=50};
	Token *token2 = (Token*)&hashtag;
	
	Number number42 = {.type= NUMBER, .value=42};
	Token *token3 = (Token*)&number42;
	
	createStack_ExpectAndReturn(&dataStack);
	createStack_ExpectAndReturn(&operatorStack);
	stringCreate_ExpectAndReturn("43#42",&tokenizer);
	//44
	getToken_ExpectAndReturn(&tokenizer,token1);
	isNumber_ExpectAndReturn(token1,1);
	stackPush_Expect(token1,&dataStack);
	//HASHTAG
	getToken_ExpectAndThrow(&tokenizer,UNKNOWN_OPERATOR);
	
	Try{
		evaluate("43#42");
		 TEST_FAIL_MESSAGE("Should throw ERR_INVALID_OPERATOR");
	 }Catch(e){
		 TEST_ASSERT_EQUAL(UNKNOWN_OPERATOR,e);
	 }
}

void test_should_evaluate_left_parenthesis_2_right_parenthesis(void){
	Stack dataStack;
	Stack operatorStack;
	int check;
	int e;
	//Initialize tokenizer,token and stack
	String tokenizer = {.rawString = "(2)", .startIndex = 0, .length = 3};
	
	Operator leftBracket = {.type= OPERATOR, .id = LEFT_PARENTHESIS ,.precedence=2};
	Token *token1 = (Token*)&leftBracket;

	Number number2 = {.type= NUMBER, .value=2};
	Token *token2 = (Token*)&number2;
	
	Operator rightBracket = {.type= OPERATOR, .id = RIGHT_PARENTHESIS ,.precedence=1};
	Token *token3 = (Token*)&rightBracket;	
	
	Number answer = {.type= NUMBER, .value=2};
	Token *answerToken = (Token*)&answer;
	
	createStack_ExpectAndReturn(&dataStack);
	createStack_ExpectAndReturn(&operatorStack);
	stringCreate_ExpectAndReturn("(2)",&tokenizer);
	
	//Operator token left parenthesis
	getToken_ExpectAndReturn(&tokenizer,token1);
	isNumber_ExpectAndReturn(token1,0);
	isOperator_ExpectAndReturn(token1,1);
	stackPop_ExpectAndReturn(&operatorStack,NULL); //If operator stack is null,
	stackPush_Expect(token1,&operatorStack);	  //then push a operator token inside
	
	//Number2
	getToken_ExpectAndReturn(&tokenizer,token2);
	isNumber_ExpectAndReturn(token2,1);
	stackPush_Expect(token2,&dataStack);
	
	//Operator token right parenthesis
	getToken_ExpectAndReturn(&tokenizer,token3);
	isNumber_ExpectAndReturn(token3,0);
	isOperator_ExpectAndReturn(token3,1);
	stackPop_ExpectAndReturn(&operatorStack,token1); //Operator stack has token1 inside
	stackPop_ExpectAndReturn(&dataStack,token2); //Once left and right bracket is detected, pop the token1 and number token and evaluate
	createNumberToken_ExpectAndReturn(2,answerToken);
	stackPush_Expect(answerToken,&dataStack);
	stackPop_ExpectAndReturn(&operatorStack,NULL);
	getToken_ExpectAndReturn(&tokenizer,NULL);
	
	//Evaluate
	stackPop_ExpectAndReturn(&operatorStack,NULL);
	stackPop_ExpectAndReturn(&dataStack,answerToken);
	destroyStack_Expect(&dataStack);
	destroyStack_Expect(&operatorStack);
	
	check=evaluate("(2)");
	TEST_ASSERT_EQUAL(2,check);
	printf("Answer : %d ",check);
	
}

void test_should_evaluate_left_parenthesis_22_right_parenthesis(void){
	Stack dataStack;
	Stack operatorStack;
	int check;
	int e;
	//Initialize tokenizer,token and stack
	String tokenizer = {.rawString = "(22)", .startIndex = 0, .length = 3};
	
	Operator leftBracket = {.type= OPERATOR, .id = LEFT_PARENTHESIS ,.precedence=2};
	Token *token1 = (Token*)&leftBracket;

	Number number22 = {.type= NUMBER, .value=22};
	Token *token2 = (Token*)&number22;
	
	Operator rightBracket = {.type= OPERATOR, .id = RIGHT_PARENTHESIS ,.precedence=1};
	Token *token3 = (Token*)&rightBracket;	
	
	Number answer = {.type= NUMBER, .value=22};
	Token *answerToken = (Token*)&answer;
	
	createStack_ExpectAndReturn(&dataStack);
	createStack_ExpectAndReturn(&operatorStack);
	stringCreate_ExpectAndReturn("(22)",&tokenizer);
	
	//Operator token left parenthesis
	getToken_ExpectAndReturn(&tokenizer,token1);
	isNumber_ExpectAndReturn(token1,0);
	isOperator_ExpectAndReturn(token1,1);
	stackPop_ExpectAndReturn(&operatorStack,NULL);
	stackPush_Expect(token1,&operatorStack);
	
	//Number22
	getToken_ExpectAndReturn(&tokenizer,token2);
	isNumber_ExpectAndReturn(token2,1);
	stackPush_Expect(token2,&dataStack);
	
	//Operator token right parenthesis
	getToken_ExpectAndReturn(&tokenizer,token3);
	isNumber_ExpectAndReturn(token3,0);
	isOperator_ExpectAndReturn(token3,1);
	stackPop_ExpectAndReturn(&operatorStack,token1);
	stackPop_ExpectAndReturn(&dataStack,token2);
	createNumberToken_ExpectAndReturn(22,answerToken);
	stackPush_Expect(answerToken,&dataStack);
	stackPop_ExpectAndReturn(&operatorStack,NULL);
	getToken_ExpectAndReturn(&tokenizer,NULL);
	
	//Evaluate
	stackPop_ExpectAndReturn(&operatorStack,NULL);
	stackPop_ExpectAndReturn(&dataStack,answerToken);
	destroyStack_Expect(&dataStack);
	destroyStack_Expect(&operatorStack);
	
	check=evaluate("(22)");
	TEST_ASSERT_EQUAL(22,check);
	printf("Answer : %d ",check);
	
}

void test_left_bracket_2_plus_3_right_bracket(void){
	Stack dataStack;
	Stack operatorStack;
	int check;
	//Initialize tokenizer,token and stack
	String tokenizer = {.rawString = "(2+3)", .startIndex = 0, .length = 5};
	
	Operator leftBracket = {.type= OPERATOR, .id = LEFT_PARENTHESIS ,.precedence=2};
	Token *token1 = (Token*)&leftBracket;
	
	Number number2 = {.type= NUMBER, .value=2};
	Token *token2 = (Token*)&number2;
	
	Operator plus = {.type= OPERATOR, .id = ADD ,.precedence=60};
	Token *token3 = (Token*)&plus;
	
	Number number3 = {.type= NUMBER, .value=3};
	Token *token4 = (Token*)&number3;
	
	Operator rightBracket = {.type= OPERATOR, .id = RIGHT_PARENTHESIS ,.precedence=1};
	Token *token5 = (Token*)&rightBracket;
	
	Number answer = {.type= NUMBER, .value=5};
	Token *ansToken = (Token*)&answer;
	
	createStack_ExpectAndReturn(&dataStack);
	createStack_ExpectAndReturn(&operatorStack);
	stringCreate_ExpectAndReturn("(2+3)",&tokenizer);
	//(
	getToken_ExpectAndReturn(&tokenizer,token1);
	isNumber_ExpectAndReturn(token1,0);
	isOperator_ExpectAndReturn(token1,1);
	stackPop_ExpectAndReturn(&operatorStack,NULL);
	stackPush_Expect(token1,&operatorStack);
	//2
	getToken_ExpectAndReturn(&tokenizer,token2);
	isNumber_ExpectAndReturn(token2,1);
	stackPush_Expect(token2,&dataStack);
	//+
	getToken_ExpectAndReturn(&tokenizer,token3);
	isNumber_ExpectAndReturn(token3,0);
	isOperator_ExpectAndReturn(token3,1);
	stackPop_ExpectAndReturn(&operatorStack,token1);
	stackPush_Expect(token1,&operatorStack);
	stackPush_Expect(token3,&operatorStack);
	//3
	getToken_ExpectAndReturn(&tokenizer,token4);
	isNumber_ExpectAndReturn(token4,1);
	stackPush_Expect(token4,&dataStack);
	//)
	getToken_ExpectAndReturn(&tokenizer,token5);
	isNumber_ExpectAndReturn(token5,0);
	isOperator_ExpectAndReturn(token5,1);
	stackPop_ExpectAndReturn(&operatorStack,token3);
	stackPop_ExpectAndReturn(&dataStack,token4);
	stackPop_ExpectAndReturn(&dataStack,token2);
	createNumberToken_ExpectAndReturn(5,ansToken);
	stackPush_Expect(ansToken,&dataStack);
	stackPop_ExpectAndReturn(&operatorStack,NULL);
	getToken_ExpectAndReturn(&tokenizer,NULL);
	
	//Evaluate
	stackPop_ExpectAndReturn(&operatorStack,NULL);
	stackPop_ExpectAndReturn(&dataStack,ansToken);
	destroyStack_Expect(&dataStack);
	destroyStack_Expect(&operatorStack);
	
	check=evaluate("(2+3)");
	TEST_ASSERT_EQUAL(5,check);
	printf("Answer : %d ",check);
}

void test_left_bracket_20_multiply_3_subtract_50_right_bracket(void){
	Stack dataStack;
	Stack operatorStack;
	int check;
	//Initialize tokenizer,token and stack
	String tokenizer = {.rawString = "(20*3-50)", .startIndex = 0, .length = 7};
	
	Operator leftBracket = {.type= OPERATOR, .id = LEFT_PARENTHESIS ,.precedence=2};
	Token *token1 = (Token*)&leftBracket;
	
	Number number20 = {.type= NUMBER, .value=20};
	Token *token2 = (Token*)&number20;
	
	Operator multiply = {.type= OPERATOR, .id = MULTIPLY ,.precedence=70};
	Token *token3 = (Token*)&multiply;
	
	Number number3 = {.type= NUMBER, .value=3};
	Token *token4 = (Token*)&number3;
	
	Operator minus = {.type= OPERATOR, .id = SUBTRACT ,.precedence=60};
	Token *token5 = (Token*)&minus;
	
	Number number50 = {.type= NUMBER, .value=50};
	Token *token6 = (Token*)&number50;
	
	Operator rightBracket = {.type= OPERATOR, .id = RIGHT_PARENTHESIS ,.precedence=1};
	Token *token7 = (Token*)&rightBracket;
	
	Number tempAnswer = {.type= NUMBER, .value=60};
	Token *tempAnsToken = (Token*)&tempAnswer;
	
	Number answer = {.type= NUMBER, .value=10};
	Token *ansToken = (Token*)&answer;
	
	createStack_ExpectAndReturn(&dataStack);
	createStack_ExpectAndReturn(&operatorStack);
	stringCreate_ExpectAndReturn("(20*3-50)",&tokenizer);
	//(
	getToken_ExpectAndReturn(&tokenizer,token1);
	isNumber_ExpectAndReturn(token1,0);
	isOperator_ExpectAndReturn(token1,1);
	stackPop_ExpectAndReturn(&operatorStack,NULL);
	stackPush_Expect(token1,&operatorStack);
	//20
	getToken_ExpectAndReturn(&tokenizer,token2);
	isNumber_ExpectAndReturn(token2,1);
	stackPush_Expect(token2,&dataStack);
	//*
	getToken_ExpectAndReturn(&tokenizer,token3);
	isNumber_ExpectAndReturn(token3,0);
	isOperator_ExpectAndReturn(token3,1);
	stackPop_ExpectAndReturn(&operatorStack,token1);
	stackPush_Expect(token1,&operatorStack);
	stackPush_Expect(token3,&operatorStack);
	//3
	getToken_ExpectAndReturn(&tokenizer,token4);
	isNumber_ExpectAndReturn(token4,1);
	stackPush_Expect(token4,&dataStack);
	//-
	getToken_ExpectAndReturn(&tokenizer,token5);
	isNumber_ExpectAndReturn(token5,0);
	isOperator_ExpectAndReturn(token5,1);
	stackPop_ExpectAndReturn(&operatorStack,token3);
	stackPop_ExpectAndReturn(&dataStack,token4);
	stackPop_ExpectAndReturn(&dataStack,token2);
	createNumberToken_ExpectAndReturn(60,tempAnsToken);
	stackPush_Expect(tempAnsToken,&dataStack);
	stackPop_ExpectAndReturn(&operatorStack,token1);
	stackPush_Expect(token1,&operatorStack);
	stackPush_Expect(token5,&operatorStack);
	//50
	getToken_ExpectAndReturn(&tokenizer,token6);
	isNumber_ExpectAndReturn(token6,1);
	stackPush_Expect(token6,&dataStack);
	// )
	getToken_ExpectAndReturn(&tokenizer,token7);
	isNumber_ExpectAndReturn(token7,0);
	isOperator_ExpectAndReturn(token7,1);
	stackPop_ExpectAndReturn(&operatorStack,token5);
	stackPop_ExpectAndReturn(&dataStack,token6);
	stackPop_ExpectAndReturn(&dataStack,tempAnsToken);
	createNumberToken_ExpectAndReturn(10,ansToken);
	stackPush_Expect(ansToken,&dataStack);
	stackPop_ExpectAndReturn(&operatorStack,NULL);
	getToken_ExpectAndReturn(&tokenizer,NULL);
	
	//Evaluate
	stackPop_ExpectAndReturn(&operatorStack,NULL);
	stackPop_ExpectAndReturn(&dataStack,ansToken);
	destroyStack_Expect(&dataStack);
	destroyStack_Expect(&operatorStack);
	
	check=evaluate("(20*3-50)");
	TEST_ASSERT_EQUAL(10,check);
	printf("Answer : %d ",check);
}

void test_logic_not_12_SHOULD_RETURN_0(void){
	
	Stack numStack;
	Stack opeStack;
	int check;
	
	//Initialize tokenizer,token and stack
	String tokenizer = {.rawString = "!12", .startIndex = 0, .length = 2 };
	
	Operator logicNot = {.type= OPERATOR, .id = LOGIC_NOT, .precedence=80};
	Token *token1 = (Token*)&logicNot;
	
	Number number12 = {.type= NUMBER, .value=12};
	Token *token2 = (Token*)&number12;
	
	Number answer = {.type=NUMBER, .value=0};
	Token *ansToken = (Token*)&answer;
	
	//Evaluate the expression
	createStack_ExpectAndReturn(&numStack);
	createStack_ExpectAndReturn(&opeStack);
	stringCreate_ExpectAndReturn("!12",&tokenizer);
	
	//Token operator minus
	getToken_ExpectAndReturn(&tokenizer,token1);
	isNumber_ExpectAndReturn(token1,0);
	isOperator_ExpectAndReturn(token1,1);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	stackPush_Expect(token1,&opeStack);
	
	//Token number 2
	getToken_ExpectAndReturn(&tokenizer,token2);
	isNumber_ExpectAndReturn(token2,1);
	stackPush_Expect(token2,&numStack);
	getToken_ExpectAndReturn(&tokenizer,NULL);
	
	//Evaluate
	stackPop_ExpectAndReturn(&opeStack,token1);
	stackPop_ExpectAndReturn(&numStack,token2);
	stackPop_ExpectAndReturn(&numStack,NULL);
	createNumberToken_ExpectAndReturn(0,ansToken);
	stackPush_Expect(ansToken,&numStack);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	stackPop_ExpectAndReturn(&numStack,ansToken);
	destroyStack_Expect(&numStack);
	destroyStack_Expect(&opeStack);
	
	check=evaluate("!12");
	TEST_ASSERT_EQUAL(0,check);
	printf("Answer : %d ",check);

}

void test_NEGATIVE_2_SHOULD_RETURN_NEGATIVE_2(void){
	
	Stack numStack;
	Stack opeStack;
	int check;
	
	//Initialize tokenizer,token and stack
	String tokenizer = {.rawString = "-2", .startIndex = 0, .length = 2 };
	
	Operator subtract = {.type= OPERATOR, .id = SUBTRACT, .precedence=60};
	Token *token1 = (Token*)&subtract;
	
	Number number2 = {.type= NUMBER, .value=2};
	Token *token2 = (Token*)&number2;
	
	Number answer = {.type=NUMBER, .value=-2};
	Token *ansToken = (Token*)&answer;
	
	//Evaluate the expression
	createStack_ExpectAndReturn(&numStack);
	createStack_ExpectAndReturn(&opeStack);
	stringCreate_ExpectAndReturn("-2",&tokenizer);
	
	//Token operator minus
	getToken_ExpectAndReturn(&tokenizer,token1);
	isNumber_ExpectAndReturn(token1,0);
	isOperator_ExpectAndReturn(token1,1);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	stackPush_Expect(token1,&opeStack);
	
	//Token number 2
	getToken_ExpectAndReturn(&tokenizer,token2);
	isNumber_ExpectAndReturn(token2,1);
	stackPush_Expect(token2,&numStack);
	getToken_ExpectAndReturn(&tokenizer,NULL);
	
	//Evaluate
	stackPop_ExpectAndReturn(&opeStack,token1);
	stackPop_ExpectAndReturn(&numStack,token2);
	stackPop_ExpectAndReturn(&numStack,NULL);
	createNumberToken_ExpectAndReturn(-2,ansToken);
	stackPush_Expect(ansToken,&numStack);
	stackPop_ExpectAndReturn(&opeStack,NULL);
	stackPop_ExpectAndReturn(&numStack,ansToken);
	destroyStack_Expect(&numStack);
	destroyStack_Expect(&opeStack);
	
	check=evaluate("-2");
	TEST_ASSERT_EQUAL(-2,check);
	printf("Answer : %d ",check);

}
Esempio n. 5
0
void test_spiffs_opendir_readdir_rewinddir(const char* dir_prefix)
{
    char name_dir_inner_file[64];
    char name_dir_inner[64];
    char name_dir_file3[64];
    char name_dir_file2[64];
    char name_dir_file1[64];

    snprintf(name_dir_inner_file, sizeof(name_dir_inner_file), "%s/inner/3.txt", dir_prefix);
    snprintf(name_dir_inner, sizeof(name_dir_inner), "%s/inner", dir_prefix);
    snprintf(name_dir_file3, sizeof(name_dir_file2), "%s/boo.bin", dir_prefix);
    snprintf(name_dir_file2, sizeof(name_dir_file2), "%s/2.txt", dir_prefix);
    snprintf(name_dir_file1, sizeof(name_dir_file1), "%s/1.txt", dir_prefix);

    unlink(name_dir_inner_file);
    rmdir(name_dir_inner);
    unlink(name_dir_file1);
    unlink(name_dir_file2);
    unlink(name_dir_file3);
    rmdir(dir_prefix);

    test_spiffs_create_file_with_text(name_dir_file1, "1\n");
    test_spiffs_create_file_with_text(name_dir_file2, "2\n");
    test_spiffs_create_file_with_text(name_dir_file3, "\01\02\03");
    test_spiffs_create_file_with_text(name_dir_inner_file, "3\n");

    DIR* dir = opendir(dir_prefix);
    TEST_ASSERT_NOT_NULL(dir);
    int count = 0;
    const char* names[4];
    while(count < 4) {
        struct dirent* de = readdir(dir);
        if (!de) {
            break;
        }
        printf("found '%s'\n", de->d_name);
        if (strcasecmp(de->d_name, "1.txt") == 0) {
            TEST_ASSERT_TRUE(de->d_type == DT_REG);
            names[count] = "1.txt";
            ++count;
        } else if (strcasecmp(de->d_name, "2.txt") == 0) {
            TEST_ASSERT_TRUE(de->d_type == DT_REG);
            names[count] = "2.txt";
            ++count;
        } else if (strcasecmp(de->d_name, "inner/3.txt") == 0) {
            TEST_ASSERT_TRUE(de->d_type == DT_REG);
            names[count] = "inner/3.txt";
            ++count;
        } else if (strcasecmp(de->d_name, "boo.bin") == 0) {
            TEST_ASSERT_TRUE(de->d_type == DT_REG);
            names[count] = "boo.bin";
            ++count;
        } else {
            TEST_FAIL_MESSAGE("unexpected directory entry");
        }
    }
    TEST_ASSERT_EQUAL(count, 4);

    rewinddir(dir);
    struct dirent* de = readdir(dir);
    TEST_ASSERT_NOT_NULL(de);
    TEST_ASSERT_EQUAL(0, strcasecmp(de->d_name, names[0]));
    seekdir(dir, 3);
    de = readdir(dir);
    TEST_ASSERT_NOT_NULL(de);
    TEST_ASSERT_EQUAL(0, strcasecmp(de->d_name, names[3]));
    seekdir(dir, 1);
    de = readdir(dir);
    TEST_ASSERT_NOT_NULL(de);
    TEST_ASSERT_EQUAL(0, strcasecmp(de->d_name, names[1]));
    seekdir(dir, 2);
    de = readdir(dir);
    TEST_ASSERT_NOT_NULL(de);
    TEST_ASSERT_EQUAL(0, strcasecmp(de->d_name, names[2]));

    TEST_ASSERT_EQUAL(0, closedir(dir));
}
Esempio n. 6
0
void
test_ofp_flow_reply_create_02(void) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  struct flow_stats *flow_stats = NULL;
  struct match *match = NULL;
  const char *header_data[2] = {
    "04 13 ff b8 00 00 00 10 00 01 00 01 00 00 00 00 ",
    "04 13 00 58 00 00 00 10 00 01 00 00 00 00 00 00 "
  };
  const char *body_data[2] = {
    "00 48 01 00 00 00 00 02 00 00 00 03 00 04 00 05 "
    "00 06 00 07 00 00 00 00 00 00 00 00 00 00 00 08 "
    "00 00 00 00 00 00 00 09 00 00 00 00 00 00 00 0a "
    "00 01 00 18 00 00 01 10 00 00 00 00 00 00 00 00 "
    "00 00 00 00 00 00 00 00",
    "00 48 01 00 00 00 00 02 00 00 00 03 00 04 00 05 "
    "00 06 00 07 00 00 00 00 00 00 00 00 00 00 00 08 "
    "00 00 00 00 00 00 00 09 00 00 00 00 00 00 00 0a "
    "00 01 00 18 00 00 01 10 00 00 00 00 00 00 00 00 "
    "00 00 00 00 00 00 00 00"
  };
  size_t nums[2] = {909, 1};
  int i;

  /* data */
  TAILQ_INIT(&s_flow_stats_list);
  for (i = 0; i < 910; i++) {
    if ((flow_stats = s_flow_stats_alloc()) != NULL) {
      /* flow_stats = 48, match = 24, sum = 72 */
      flow_stats->ofp.length = 0;
      flow_stats->ofp.table_id = 0x01;
      flow_stats->ofp.duration_sec = 0x02;
      flow_stats->ofp.duration_nsec = 0x03;
      flow_stats->ofp.priority = 0x04;
      flow_stats->ofp.idle_timeout = 0x05;
      flow_stats->ofp.hard_timeout = 0x06;
      flow_stats->ofp.flags = 0x07;
      flow_stats->ofp.cookie = 0x08;
      flow_stats->ofp.packet_count = 0x09;
      flow_stats->ofp.byte_count = 0x0a;
      if ((match = match_alloc(16)) != NULL) {
        match->oxm_class = 0x00;
        match->oxm_field = 0x01;
        match->oxm_length = 0x10;
        TAILQ_INSERT_TAIL(&(flow_stats->match_list), match, entry);
      }
      TAILQ_INSERT_TAIL(&s_flow_stats_list, flow_stats, entry);
    } else {
      TEST_FAIL_MESSAGE("allocation error.");
    }
  }

  ret = check_pbuf_list_across_packet_create(s_ofp_flow_reply_create_wrap,
        header_data, body_data, nums, 2);
  TEST_ASSERT_EQUAL_MESSAGE(LAGOPUS_RESULT_OK, ret, "create port 0 error.");

  /* free */
  while ((flow_stats = TAILQ_FIRST(&s_flow_stats_list)) != NULL) {
    TAILQ_REMOVE(&s_flow_stats_list, flow_stats, entry);
    ofp_match_list_elem_free(&flow_stats->match_list);
    ofp_instruction_list_elem_free(&flow_stats->instruction_list);
    free(flow_stats);
  }
}