Пример #1
0
static void test_CSSOM_errors(void) {
  const char * css =
"p { color:green }\n"
"p { color:green; color } /* malformed declaration missing ':', value */\n"
"p { color:red; color; color:green } /* same with expected recovery */\n"
"p { color:green; color: } /* malformed declaration missing value */\n"
"p { color:red; color:; color:green } /* same with expected recovery */\n"
"p { color:green; color{;color:maroon} } /* unexpected tokens { } */\n"
"p { color:red; color{;color:maroon}; color:green } /* same with recovery */\n";

  CSSOM *cssom;
  CSSOM_CSSStyleSheet *styleSheet;
  const CSSOM_CSSRuleList *cssRules;
  CSSOM_CSSRule *cssRule;
  const CSSOM_CSSStyleDeclaration *style;
  size_t errors = 0;

  cssom = CSSOM_create();
  CSSOM_setUserData(cssom, &errors);
  CSSOM_setErrorHandler(cssom, errorHandler);

  styleSheet = CSSOM_parse(cssom, css, strlen(css));

  assert(errors == 6);

  cssRules = CSSOM_CSSStyleSheet_cssRules(styleSheet);
  assert(CSSOM_CSSRuleList_length(cssRules) == 7);

  cssRule = CSSOM_CSSRuleList_at(cssRules, 6);
  assert(cssRule != NULL);

  assert(CSSOM_CSSRule_type(cssRule) == CSSOM_CSSRule_STYLE_RULE);

  ASSERT_EQUAL_STRINGS("p",
    CSSOM_CSSStyleRule_selectorText((CSSOM_CSSStyleRule*)cssRule));

  style = CSSOM_CSSStyleRule_style((CSSOM_CSSStyleRule*)cssRule);

  assert(CSSOM_CSSStyleDeclaration_length(style) == 1);

  ASSERT_EQUAL_STRINGS("green",
    CSSOM_CSSStyleDeclaration_getPropertyValue(style, "color"));
  ASSERT_EQUAL_STRINGS("",
    CSSOM_CSSStyleDeclaration_getPropertyPriority(style, "color"));
  ASSERT_EQUAL_STRINGS("color : green;",
    CSSOM_CSSStyleDeclaration_cssText(style));

  CSSOM_CSSStyleSheet_release(styleSheet);
  CSSOM_release(cssom);
}
Пример #2
0
static void test_write_concern_input( mongo *conn ) {
    mongo_write_concern wc[1], wcbad[1];
    bson b[1];

    mongo_cmd_drop_collection( conn, TEST_DB, TEST_COL, NULL );

    bson_init( b );
    bson_append_new_oid( b, "_id" );
    bson_finish( b );

    mongo_write_concern_init( wc );    
    mongo_write_concern_set_w( wc, 1 );

    /* Failure to finish write concern object. */
    ASSERT( mongo_insert( conn, TEST_NS, b, wc ) != MONGO_OK );
    ASSERT( conn->err == MONGO_WRITE_CONCERN_INVALID );
    ASSERT_EQUAL_STRINGS( conn->errstr,
        "Must call mongo_write_concern_finish() before using *write_concern." );

    mongo_write_concern_finish( wc );

    /* Use a bad write concern. */
    mongo_clear_errors( conn );
    mongo_write_concern_init( wcbad );    
    mongo_write_concern_set_w( wcbad, 2 );
    mongo_write_concern_finish( wcbad );
    mongo_set_write_concern( conn, wcbad );
    ASSERT( mongo_insert( conn, TEST_NS, b, NULL ) != MONGO_OK );
    ASSERT( conn->err == MONGO_WRITE_ERROR );
    ASSERT_EQUAL_STRINGS( conn->lasterrstr, "norepl" );

    /* Ensure that supplied write concern overrides default. */
    mongo_clear_errors( conn );
    ASSERT( mongo_insert( conn, TEST_NS, b, wc ) != MONGO_OK );
    ASSERT( conn->err == MONGO_WRITE_ERROR );
    ASSERT_EQUAL_STRINGS( conn->errstr, "See conn->lasterrstr for details." );
    ASSERT_EQUAL_STRINGS( conn->lasterrstr, "E11000 duplicate key error index" );
    ASSERT( conn->lasterrcode == 11000 );

    conn->write_concern = NULL;
    mongo_write_concern_destroy( wc );
    mongo_write_concern_destroy( wcbad );
    bson_destroy( b );
}
Пример #3
0
static void test_CSSOM_basics(void) {
  const char *css =
"p {\n"
"  color : green\n"
"}\n";

  CSSOM *cssom;
  CSSOM_CSSStyleSheet *styleSheet;
  const CSSOM_CSSRuleList *cssRules;
  CSSOM_CSSRule *cssRule;
  const CSSOM_CSSStyleDeclaration *style;
  
  cssom = CSSOM_create();
  styleSheet = CSSOM_parse(cssom, css, strlen(css));

  cssRules = CSSOM_CSSStyleSheet_cssRules(styleSheet);
  assert(CSSOM_CSSRuleList_length(cssRules) == 1);

  cssRule = CSSOM_CSSRuleList_at(cssRules, 0);
  assert(cssRule != NULL);

  assert(CSSOM_CSSRule_type(cssRule) == CSSOM_CSSRule_STYLE_RULE);

  ASSERT_EQUAL_STRINGS("p",
    CSSOM_CSSStyleRule_selectorText((CSSOM_CSSStyleRule*)cssRule));

  style = CSSOM_CSSStyleRule_style((CSSOM_CSSStyleRule*)cssRule);

  assert(CSSOM_CSSStyleDeclaration_length(style) == 1);

  ASSERT_EQUAL_STRINGS("green",
    CSSOM_CSSStyleDeclaration_getPropertyValue(style, "color"));
  ASSERT_EQUAL_STRINGS("",
    CSSOM_CSSStyleDeclaration_getPropertyPriority(style, "color"));
  ASSERT_EQUAL_STRINGS("color : green;",
    CSSOM_CSSStyleDeclaration_cssText(style));

  CSSOM_CSSStyleSheet_release(styleSheet);
  CSSOM_release(cssom);
}
Пример #4
0
static void test_condition_factory(void) {
  SAC_MPool mpool;
  SAC_Condition *condition;
  SAC_Condition *firstCondition;
  SAC_Condition *secondCondition;
  SAC_Selector *selector;
  SAC_LexicalUnit *ident;

  mpool = SAC_mpool_open(256);

  condition = SAC_condition_class(mpool, "foo");
  assert(condition->conditionType == SAC_CLASS_CONDITION);
  assert(condition->desc.attribute.prefix == NULL);
  assert(condition->desc.attribute.name == NULL);
  assert(condition->desc.attribute.specified == SAC_TRUE);
  ASSERT_EQUAL_STRINGS("foo", condition->desc.attribute.value);

  condition = SAC_condition_id(mpool, "foo");
  assert(condition->conditionType == SAC_ID_CONDITION);
  assert(condition->desc.attribute.prefix == NULL);
  assert(condition->desc.attribute.name == NULL);
  assert(condition->desc.attribute.specified == SAC_TRUE);
  ASSERT_EQUAL_STRINGS("foo", condition->desc.attribute.value);

  condition = SAC_condition_prefix_attribute(mpool, "ns", "foo", "bar");
  assert(condition->conditionType == SAC_PREFIX_ATTRIBUTE_CONDITION);
  ASSERT_EQUAL_STRINGS("ns", condition->desc.attribute.prefix);
  ASSERT_EQUAL_STRINGS("foo", condition->desc.attribute.name);
  assert(condition->desc.attribute.specified == SAC_FALSE);
  ASSERT_EQUAL_STRINGS("bar", condition->desc.attribute.value);

  condition = SAC_condition_suffix_attribute(mpool, "ns", "foo", "bar");
  assert(condition->conditionType == SAC_SUFFIX_ATTRIBUTE_CONDITION);
  ASSERT_EQUAL_STRINGS("ns", condition->desc.attribute.prefix);
  ASSERT_EQUAL_STRINGS("foo", condition->desc.attribute.name);
  assert(condition->desc.attribute.specified == SAC_FALSE);
  ASSERT_EQUAL_STRINGS("bar", condition->desc.attribute.value);

  condition = SAC_condition_substring_attribute(mpool, "ns", "foo", "bar");
  assert(condition->conditionType == SAC_SUBSTRING_ATTRIBUTE_CONDITION);
  ASSERT_EQUAL_STRINGS("ns", condition->desc.attribute.prefix);
  ASSERT_EQUAL_STRINGS("foo", condition->desc.attribute.name);
  assert(condition->desc.attribute.specified == SAC_FALSE);
  ASSERT_EQUAL_STRINGS("bar", condition->desc.attribute.value);

  condition = SAC_condition_attribute(mpool, "ns", "foo", "bar");
  assert(condition->conditionType == SAC_ATTRIBUTE_CONDITION);
  ASSERT_EQUAL_STRINGS("ns", condition->desc.attribute.prefix);
  ASSERT_EQUAL_STRINGS("foo", condition->desc.attribute.name);
  assert(condition->desc.attribute.specified == SAC_TRUE);
  ASSERT_EQUAL_STRINGS("bar", condition->desc.attribute.value);

  condition = SAC_condition_attribute(mpool, "ns", "foo", NULL);
  assert(condition->conditionType == SAC_ATTRIBUTE_CONDITION);
  ASSERT_EQUAL_STRINGS("ns", condition->desc.attribute.prefix);
  ASSERT_EQUAL_STRINGS("foo", condition->desc.attribute.name);
  assert(condition->desc.attribute.specified == SAC_FALSE);
  assert(condition->desc.attribute.value == NULL);

  condition = SAC_condition_one_of_attribute(mpool, "ns", "foo", "bar");
  assert(condition->conditionType == SAC_ONE_OF_ATTRIBUTE_CONDITION);
  ASSERT_EQUAL_STRINGS("ns", condition->desc.attribute.prefix);
  ASSERT_EQUAL_STRINGS("foo", condition->desc.attribute.name);
  assert(condition->desc.attribute.specified == SAC_FALSE);
  ASSERT_EQUAL_STRINGS("bar", condition->desc.attribute.value);

  condition = SAC_condition_begin_hyphen_attribute(mpool, "ns", "foo", "bar");
  assert(condition->conditionType == SAC_BEGIN_HYPHEN_ATTRIBUTE_CONDITION);
  ASSERT_EQUAL_STRINGS("ns", condition->desc.attribute.prefix);
  ASSERT_EQUAL_STRINGS("foo", condition->desc.attribute.name);
  assert(condition->desc.attribute.specified == SAC_FALSE);
  ASSERT_EQUAL_STRINGS("bar", condition->desc.attribute.value);

  ident = SAC_lexical_unit_ident(mpool, "foo");
  condition = SAC_condition_pseudo_class(mpool, ident);
  assert(condition->conditionType == SAC_PSEUDO_CLASS_CONDITION);
  assert(condition->desc.pseudo == ident);

  ident = SAC_lexical_unit_ident(mpool, "foo");
  condition = SAC_condition_pseudo_element(mpool, ident);
  assert(condition->conditionType == SAC_PSEUDO_ELEMENT_CONDITION);
  assert(condition->desc.pseudo == ident);

  firstCondition = SAC_condition_class(mpool, "foo");
  secondCondition = SAC_condition_class(mpool, "bar");
  condition = SAC_condition_and(mpool, firstCondition, secondCondition);
  assert(condition->conditionType == SAC_AND_CONDITION);
  assert(condition->desc.combinator.firstCondition == firstCondition);
  assert(condition->desc.combinator.secondCondition == secondCondition);

  selector = SAC_selector_any_node(mpool);
  condition = SAC_condition_negation(mpool, selector);
  assert(condition->conditionType == SAC_NEGATIVE_CONDITION);
  assert(condition->desc.selector == selector);
  
  SAC_mpool_close(mpool);
}
Пример #5
0
static void test_insert( mongo *conn ) {
    mongo_write_concern wc0[1], wc1[1];
    bson b[1], b2[1], b3[1], b4[1];
    bson *objs[2];

    mongo_cmd_drop_collection( conn, TEST_DB, TEST_COL, NULL );

    mongo_write_concern_init( wc0 );    
    mongo_write_concern_set_w( wc0, 0 );
    mongo_write_concern_finish( wc0 );
    mongo_write_concern_init( wc1 );    
    mongo_write_concern_set_w( wc1, 1 );
    mongo_write_concern_finish( wc1 );

    bson_init( b4 );
    bson_append_string( b4, "foo", "bar" );
    bson_finish( b4 );

    ASSERT( mongo_insert( conn, TEST_NS, b4, wc1 ) == MONGO_OK );

    ASSERT( mongo_remove( conn, TEST_NS, bson_shared_empty( ), wc1 ) == MONGO_OK );

    bson_init( b );
    bson_append_new_oid( b, "_id" );
    bson_finish( b );

    ASSERT( mongo_insert( conn, TEST_NS, b, NULL ) == MONGO_OK );

    /* This fails but returns OK with write concern w = 0 */
    ASSERT( mongo_insert( conn, TEST_NS, b, wc0 ) == MONGO_OK ); /* no getLastError request */

    ASSERT( mongo_insert( conn, TEST_NS, b, wc1 ) == MONGO_ERROR );
    ASSERT( conn->err == MONGO_WRITE_ERROR );
    ASSERT_EQUAL_STRINGS( conn->errstr, "See conn->lasterrstr for details." );
    ASSERT_EQUAL_STRINGS( conn->lasterrstr, "E11000 duplicate key error index" );
    ASSERT( conn->lasterrcode == 11000 );
    mongo_clear_errors( conn );

    /* Still fails but returns OK with write concern w = 0 */
    ASSERT( mongo_insert( conn, TEST_NS, b, wc0 ) == MONGO_OK );

    /* But not when we set a default write concern on the conn. */
    mongo_set_write_concern( conn, wc1 );
    ASSERT( mongo_insert( conn, TEST_NS, b, NULL ) != MONGO_OK );
    ASSERT( conn->err == MONGO_WRITE_ERROR );
    ASSERT_EQUAL_STRINGS( conn->errstr, "See conn->lasterrstr for details." );
    ASSERT_EQUAL_STRINGS( conn->lasterrstr, "E11000 duplicate key error index" );
    ASSERT( conn->lasterrcode == 11000 );

    /* Now test batch insert. */
    bson_init( b2 );
    bson_append_new_oid( b2, "_id" );
    bson_finish( b2 );

    bson_init( b3 );
    bson_append_new_oid( b3, "_id" );
    bson_finish( b3 );

    objs[0] = b2;
    objs[1] = b3;

    /* Insert two new documents by insert_batch. */
    conn->write_concern = NULL;
    ASSERT( mongo_count( conn, TEST_DB, TEST_COL, bson_shared_empty( ) ) == 1 );
    ASSERT( mongo_insert_batch( conn, TEST_NS, (const bson **)objs, 2, NULL, 0 ) == MONGO_OK );
    ASSERT( mongo_count( conn, TEST_DB, TEST_COL, bson_shared_empty( ) ) == 3 );

    /* This should definitely fail if we try again with write concern. */
    mongo_clear_errors( conn );
    ASSERT( mongo_insert_batch( conn, TEST_NS, (const bson **)objs, 2, wc1, 0 ) == MONGO_ERROR );
    ASSERT( conn->err == MONGO_WRITE_ERROR );
    ASSERT_EQUAL_STRINGS( conn->errstr, "See conn->lasterrstr for details." );
    ASSERT_EQUAL_STRINGS( conn->lasterrstr, "E11000 duplicate key error index" );
    ASSERT( conn->lasterrcode == 11000 );

    /* But it will succeed without the write concern set. */
    ASSERT( mongo_insert_batch( conn, TEST_NS, (const bson **)objs, 2, NULL, 0 ) == MONGO_OK );

    bson_destroy( b );
    bson_destroy( b2 );
    bson_destroy( b3 );
    bson_destroy( b4 );
    mongo_write_concern_destroy( wc0 );
    mongo_write_concern_destroy( wc1 );
}
Пример #6
0
/* We can test write concern for update
 * and remove by doing operations on a capped collection. */
static void test_update_and_remove( mongo *conn ) {
    mongo_write_concern wc[1];
    bson *objs[5];
    bson query[1], update[1];
    int i;

    create_capped_collection( conn );

    for( i=0; i<5; i++ ) {
        objs[i] = bson_alloc();
        bson_init( objs[i] );
        bson_append_int( objs[i], "n", i );
        bson_finish( objs[i] );
    }

    ASSERT( mongo_insert_batch( conn, "test.wc", (const bson **)objs, 5,
        NULL, 0 ) == MONGO_OK );

    ASSERT( mongo_count( conn, "test", "wc", bson_shared_empty( ) ) == 5 );

    bson_init( query );
    bson_append_int( query, "n", 2 );
    bson_finish( query );

    ASSERT( mongo_find_one( conn, "test.wc", query, bson_shared_empty( ), NULL ) == MONGO_OK );

    bson_init( update );
        bson_append_start_object( update, "$set" );
            bson_append_string( update, "n", "a big long string" );
        bson_append_finish_object( update );
    bson_finish( update );

    /* Update will appear to succeed with no write concern specified, but doesn't. */
    ASSERT( mongo_find_one( conn, "test.wc", query, bson_shared_empty( ), NULL ) == MONGO_OK );
    ASSERT( mongo_update( conn, "test.wc", query, update, 0, NULL ) == MONGO_OK );
    ASSERT( mongo_find_one( conn, "test.wc", query, bson_shared_empty( ), NULL ) == MONGO_OK );

    /* Remove will appear to succeed with no write concern specified, but doesn't. */
    ASSERT( mongo_remove( conn, "test.wc", query, NULL ) == MONGO_OK );
    ASSERT( mongo_find_one( conn, "test.wc", query, bson_shared_empty( ), NULL ) == MONGO_OK );

    mongo_write_concern_init( wc );    
    mongo_write_concern_set_w( wc, 1 );
    mongo_write_concern_finish( wc );

    mongo_clear_errors( conn );
    ASSERT( mongo_update( conn, "test.wc", query, update, 0, wc ) == MONGO_ERROR );
    ASSERT( conn->err == MONGO_WRITE_ERROR );
    ASSERT_EQUAL_STRINGS( conn->lasterrstr, "failing update: objects in a capped ns cannot grow" );

    mongo_clear_errors( conn );
    ASSERT( mongo_remove( conn, "test.wc", query, wc ) == MONGO_ERROR );
    ASSERT( conn->err == MONGO_WRITE_ERROR );
    ASSERT_EQUAL_STRINGS( conn->lasterrstr, "can't remove from a capped collection" );

    mongo_write_concern_destroy( wc );
    bson_destroy( query );
    bson_destroy( update );
    for( i=0; i<5; i++ ) {
        bson_destroy( objs[i] );
        bson_dealloc( objs[i] );
    }
}