You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2016/07/15 11:12:04 UTC
[12/22] lucy git commit: Move tests to separate directory
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Search/TestSortSpec.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Search/TestSortSpec.c b/core/Lucy/Test/Search/TestSortSpec.c
deleted file mode 100644
index be6d23f..0000000
--- a/core/Lucy/Test/Search/TestSortSpec.c
+++ /dev/null
@@ -1,642 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#define C_TESTLUCY_TESTREVERSETYPE
-#define TESTLUCY_USE_SHORT_NAMES
-#include "Lucy/Util/ToolSet.h"
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "charmony.h"
-
-#include "Clownfish/TestHarness/TestBatchRunner.h"
-#include "Clownfish/TestHarness/TestUtils.h"
-#include "Lucy/Test.h"
-#include "Lucy/Test/Search/TestSortSpec.h"
-#include "Lucy/Test/TestUtils.h"
-#include "Lucy/Search/SortSpec.h"
-
-#include "Clownfish/CharBuf.h"
-#include "Clownfish/Num.h"
-#include "Lucy/Analysis/StandardTokenizer.h"
-#include "Lucy/Document/Doc.h"
-#include "Lucy/Document/HitDoc.h"
-#include "Lucy/Index/Indexer.h"
-#include "Lucy/Plan/FullTextType.h"
-#include "Lucy/Plan/NumericType.h"
-#include "Lucy/Plan/Schema.h"
-#include "Lucy/Plan/StringType.h"
-#include "Lucy/Search/Hits.h"
-#include "Lucy/Search/IndexSearcher.h"
-#include "Lucy/Search/SortRule.h"
-#include "Lucy/Store/RAMFolder.h"
-
-static String *air_str;
-static String *airplane_str;
-static String *bike_str;
-static String *car_str;
-static String *carrot_str;
-static String *cat_str;
-static String *float32_str;
-static String *float64_str;
-static String *food_str;
-static String *home_str;
-static String *int32_str;
-static String *int64_str;
-static String *land_str;
-static String *name_str;
-static String *nope_str;
-static String *num_str;
-static String *random_str;
-static String *sloth_str;
-static String *speed_str;
-static String *unknown_str;
-static String *unused_str;
-static String *vehicle_str;
-static String *weight_str;
-
-static String *random_float32s_str;
-static String *random_float64s_str;
-static String *random_int32s_str;
-static String *random_int64s_str;
-
-TestSortSpec*
-TestSortSpec_new() {
- return (TestSortSpec*)Class_Make_Obj(TESTSORTSPEC);
-}
-
-static void
-S_init_strings() {
- air_str = Str_newf("air");
- airplane_str = Str_newf("airplane");
- bike_str = Str_newf("bike");
- car_str = Str_newf("car");
- carrot_str = Str_newf("carrot");
- cat_str = Str_newf("cat");
- float32_str = Str_newf("float32");
- float64_str = Str_newf("float64");
- food_str = Str_newf("food");
- home_str = Str_newf("home");
- int32_str = Str_newf("int32");
- int64_str = Str_newf("int64");
- land_str = Str_newf("land");
- name_str = Str_newf("name");
- nope_str = Str_newf("nope");
- num_str = Str_newf("num");
- random_str = Str_newf("random");
- sloth_str = Str_newf("sloth");
- speed_str = Str_newf("speed");
- unknown_str = Str_newf("unknown");
- unused_str = Str_newf("unused");
- vehicle_str = Str_newf("vehicle");
- weight_str = Str_newf("weight");
-
- random_float32s_str = Str_newf("random_float32s");
- random_float64s_str = Str_newf("random_float64s");
- random_int32s_str = Str_newf("random_int32s");
- random_int64s_str = Str_newf("random_int64s");
-}
-
-static void
-S_destroy_strings() {
- DECREF(air_str);
- DECREF(airplane_str);
- DECREF(bike_str);
- DECREF(car_str);
- DECREF(carrot_str);
- DECREF(cat_str);
- DECREF(float32_str);
- DECREF(float64_str);
- DECREF(food_str);
- DECREF(home_str);
- DECREF(int32_str);
- DECREF(int64_str);
- DECREF(land_str);
- DECREF(name_str);
- DECREF(nope_str);
- DECREF(num_str);
- DECREF(random_str);
- DECREF(sloth_str);
- DECREF(speed_str);
- DECREF(unknown_str);
- DECREF(unused_str);
- DECREF(vehicle_str);
- DECREF(weight_str);
-
- DECREF(random_float32s_str);
- DECREF(random_float64s_str);
- DECREF(random_int32s_str);
- DECREF(random_int64s_str);
-}
-
-TestReverseType*
-TestReverseType_new() {
- TestReverseType *self = (TestReverseType*)Class_Make_Obj(TESTREVERSETYPE);
- return TestReverseType_init(self);
-}
-
-TestReverseType*
-TestReverseType_init(TestReverseType *self) {
- return TestReverseType_init2(self, 1.0, false, true, true);
-}
-
-TestReverseType*
-TestReverseType_init2(TestReverseType *self, float boost, bool indexed,
- bool stored, bool sortable) {
- Int32Type_init2((Int32Type*)self, boost, indexed, stored, sortable);
- return self;
-}
-
-int32_t
-TestReverseType_Compare_Values_IMP(TestReverseType *self, Obj *a, Obj *b) {
- UNUSED_VAR(self);
- return Obj_Compare_To(b, a);
-}
-
-static Schema*
-S_create_schema() {
- Schema *schema = Schema_new();
-
- StandardTokenizer *tokenizer = StandardTokenizer_new();
- FullTextType *unsortable = FullTextType_new((Analyzer*)tokenizer);
- DECREF(tokenizer);
-
- StringType *string_type = StringType_new();
- StringType_Set_Sortable(string_type, true);
-
- Int32Type *int32_type = Int32Type_new();
- Int32Type_Set_Indexed(int32_type, false);
- Int32Type_Set_Sortable(int32_type, true);
-
- Int64Type *int64_type = Int64Type_new();
- Int64Type_Set_Indexed(int64_type, false);
- Int64Type_Set_Sortable(int64_type, true);
-
- Float32Type *float32_type = Float32Type_new();
- Float32Type_Set_Indexed(float32_type, false);
- Float32Type_Set_Sortable(float32_type, true);
-
- Float64Type *float64_type = Float64Type_new();
- Float64Type_Set_Indexed(float64_type, false);
- Float64Type_Set_Sortable(float64_type, true);
-
- TestReverseType *reverse_type = TestReverseType_new();
-
- Schema_Spec_Field(schema, name_str, (FieldType*)string_type);
- Schema_Spec_Field(schema, speed_str, (FieldType*)int32_type);
- Schema_Spec_Field(schema, sloth_str, (FieldType*)reverse_type);
- Schema_Spec_Field(schema, weight_str, (FieldType*)int32_type);
- Schema_Spec_Field(schema, int32_str, (FieldType*)int32_type);
- Schema_Spec_Field(schema, int64_str, (FieldType*)int64_type);
- Schema_Spec_Field(schema, float32_str, (FieldType*)float32_type);
- Schema_Spec_Field(schema, float64_str, (FieldType*)float64_type);
- Schema_Spec_Field(schema, home_str, (FieldType*)string_type);
- Schema_Spec_Field(schema, cat_str, (FieldType*)string_type);
- Schema_Spec_Field(schema, unused_str, (FieldType*)string_type);
- Schema_Spec_Field(schema, nope_str, (FieldType*)unsortable);
-
- DECREF(reverse_type);
- DECREF(float64_type);
- DECREF(float32_type);
- DECREF(int64_type);
- DECREF(int32_type);
- DECREF(string_type);
- DECREF(unsortable);
-
- return schema;
-}
-
-static void
-S_refresh_indexer(Indexer **indexer, Schema *schema, RAMFolder *folder) {
- if (*indexer) {
- Indexer_Commit(*indexer);
- DECREF(*indexer);
- }
- *indexer = Indexer_new(schema, (Obj*)folder, NULL, 0);
-}
-
-static void
-S_add_vehicle(Indexer *indexer, String *name, int32_t speed, int32_t sloth,
- int32_t weight, String *home, String *cat) {
- Doc *doc = Doc_new(NULL, 0);
-
- Doc_Store(doc, name_str, (Obj*)name);
- Doc_Store(doc, home_str, (Obj*)home);
- Doc_Store(doc, cat_str, (Obj*)cat);
-
- Integer *speed_obj = Int_new(speed);
- Doc_Store(doc, speed_str, (Obj*)speed_obj);
- DECREF(speed_obj);
- Integer *sloth_obj = Int_new(sloth);
- Doc_Store(doc, sloth_str, (Obj*)sloth_obj);
- DECREF(sloth_obj);
- Integer *weight_obj = Int_new(weight);
- Doc_Store(doc, weight_str, (Obj*)weight_obj);
- DECREF(weight_obj);
-
- Indexer_Add_Doc(indexer, doc, 1.0f);
-
- DECREF(doc);
-}
-
-static void
-S_add_doc(Indexer *indexer, Obj *value, String *cat, String *field_name) {
- Doc *doc = Doc_new(NULL, 0);
- String *name = Obj_To_String(value);
- Doc_Store(doc, name_str, (Obj*)name);
- Doc_Store(doc, cat_str, (Obj*)cat);
- if (field_name) {
- Doc_Store(doc, field_name, value);
- }
- Indexer_Add_Doc(indexer, doc, 1.0f);
- DECREF(name);
- DECREF(doc);
-}
-
-typedef Obj* (*random_generator_t)();
-
-static Obj*
-S_random_string() {
- size_t length = 1 + rand() % 10;
- CharBuf *buf = CB_new(length);
- while (length--) {
- int32_t code_point = 'a' + rand() % ('z' - 'a' + 1);
- CB_Cat_Char(buf, code_point);
- }
- String *string = CB_Yield_String(buf);
- DECREF(buf);
- return (Obj*)string;
-}
-
-static Obj*
-S_random_int32() {
- uint64_t num = TestUtils_random_u64();
- return (Obj*)Int_new(num & 0x7FFFFFFF);
-}
-
-static Obj*
-S_random_int64() {
- uint64_t num = TestUtils_random_u64();
- return (Obj*)Int_new(num & INT64_C(0x7FFFFFFFFFFFFFFF));
-}
-
-static Obj*
-S_random_float32() {
- uint64_t num = TestUtils_random_u64();
- double d = CHY_U64_TO_DOUBLE(num) * (10.0 / UINT64_MAX);
- return (Obj*)Float_new((float)d);
-}
-
-static Obj*
-S_random_float64() {
- uint64_t num = TestUtils_random_u64();
- return (Obj*)Float_new(CHY_U64_TO_DOUBLE(num) * (10.0 / UINT64_MAX));
-}
-
-static Vector*
-S_add_random_objects(Indexer **indexer, Schema *schema, RAMFolder *folder,
- random_generator_t rng, String *field_name,
- String *cat) {
- Vector *objects = Vec_new(100);
-
- for (int i = 0; i < 100; ++i) {
- Obj *object = rng();
- S_add_doc(*indexer, object, cat, field_name);
- Vec_Push(objects, object);
- if (i % 10 == 0) {
- S_refresh_indexer(indexer, schema, folder);
- }
- }
-
- Vec_Sort(objects);
-
- for (size_t i = 0; i < 100; ++i) {
- Obj *obj = Vec_Fetch(objects, i);
- String *string = Obj_To_String(obj);
- Vec_Store(objects, i, (Obj*)string);
- }
-
- return objects;
-}
-
-static Vector*
-S_test_sorted_search(IndexSearcher *searcher, String *query,
- uint32_t num_wanted, ...) {
- Vector *rules = Vec_new(2);
- String *field;
- va_list args;
-
- va_start(args, num_wanted);
- while (NULL != (field = va_arg(args, String*))) {
- int reverse = va_arg(args, int);
- SortRule *rule = SortRule_new(SortRule_FIELD, field, !!reverse);
- Vec_Push(rules, (Obj*)rule);
- }
- va_end(args);
- SortRule *rule = SortRule_new(SortRule_DOC_ID, NULL, 0);
- Vec_Push(rules, (Obj*)rule);
- SortSpec *spec = SortSpec_new(rules);
-
- Hits *hits = IxSearcher_Hits(searcher, (Obj*)query, 0, num_wanted, spec);
-
- Vector *results = Vec_new(10);
- HitDoc *hit_doc;
- while (NULL != (hit_doc = Hits_Next(hits))) {
- String *name = (String*)HitDoc_Extract(hit_doc, name_str);
- Vec_Push(results, (Obj*)Str_Clone((String*)name));
- DECREF(name);
- DECREF(hit_doc);
- }
-
- DECREF(hits);
- DECREF(spec);
- DECREF(rules);
-
- return results;
-}
-
-typedef struct SortContext {
- IndexSearcher *searcher;
- String *sort_field;
-} SortContext;
-
-static void
-S_attempt_sorted_search(void *context) {
- SortContext *sort_ctx = (SortContext*)context;
- Vector *results = S_test_sorted_search(sort_ctx->searcher, vehicle_str, 100,
- sort_ctx->sort_field, false, NULL);
- DECREF(results);
-}
-
-static void
-test_sort_spec(TestBatchRunner *runner) {
- RAMFolder *folder = RAMFolder_new(NULL);
- Schema *schema = S_create_schema();
- Indexer *indexer = NULL;
- Vector *wanted = Vec_new(10);
- Vector *results;
- Vector *results2;
-
- // First, add vehicles.
- S_refresh_indexer(&indexer, schema, folder);
- S_add_vehicle(indexer, airplane_str, 200, 200, 8000, air_str, vehicle_str);
- S_add_vehicle(indexer, bike_str, 15, 15, 25, land_str, vehicle_str);
- S_add_vehicle(indexer, car_str, 70, 70, 3000, land_str, vehicle_str);
-
- // Add random objects.
- Vector *random_strings =
- S_add_random_objects(&indexer, schema, folder, S_random_string,
- NULL, random_str);
- Vector *random_int32s =
- S_add_random_objects(&indexer, schema, folder, S_random_int32,
- int32_str, random_int32s_str);
- Vector *random_int64s =
- S_add_random_objects(&indexer, schema, folder, S_random_int64,
- int64_str, random_int64s_str);
- Vector *random_float32s =
- S_add_random_objects(&indexer, schema, folder, S_random_float32,
- float32_str, random_float32s_str);
- Vector *random_float64s =
- S_add_random_objects(&indexer, schema, folder, S_random_float64,
- float64_str, random_float64s_str);
-
- // Add numbers to verify consistent ordering.
- int32_t *nums = (int32_t*)MALLOCATE(100 * sizeof(int32_t));
- for (int i = 0; i < 100; ++i) {
- nums[i] = i;
- }
- // Shuffle
- for (int i = 99; i > 0; --i) {
- int r = rand() % (i + 1);
- if (r != i) {
- // Swap
- int32_t tmp = nums[i];
- nums[i] = nums[r];
- nums[r] = tmp;
- }
- }
- for (int i = 0; i < 100; ++i) {
- char name_buf[3];
- sprintf(name_buf, "%02d", nums[i]);
- String *name = SSTR_WRAP_UTF8(name_buf, 2);
- S_add_doc(indexer, (Obj*)name, num_str, NULL);
- if (i % 10 == 0) {
- S_refresh_indexer(&indexer, schema, folder);
- }
- }
- FREEMEM(nums);
-
- Indexer_Commit(indexer);
- DECREF(indexer);
-
- // Start tests
-
- IndexSearcher *searcher = IxSearcher_new((Obj*)folder);
-
- results = S_test_sorted_search(searcher, vehicle_str, 100,
- name_str, false, NULL);
- Vec_Clear(wanted);
- Vec_Push(wanted, INCREF(airplane_str));
- Vec_Push(wanted, INCREF(bike_str));
- Vec_Push(wanted, INCREF(car_str));
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)wanted), "sort by one criteria");
- DECREF(results);
-
-#ifdef LUCY_VALGRIND
- SKIP(runner, 2, "known leaks");
-#else
- Err *error;
- SortContext sort_ctx;
- sort_ctx.searcher = searcher;
-
- sort_ctx.sort_field = nope_str;
- error = Err_trap(S_attempt_sorted_search, &sort_ctx);
- TEST_TRUE(runner, error != NULL
- && Err_is_a(error, ERR)
- && Str_Contains_Utf8(Err_Get_Mess(error), "sortable", 8),
- "sorting on a non-sortable field throws an error");
- DECREF(error);
-
- sort_ctx.sort_field = unknown_str;
- error = Err_trap(S_attempt_sorted_search, &sort_ctx);
- TEST_TRUE(runner, error != NULL
- && Err_is_a(error, ERR)
- && Str_Contains_Utf8(Err_Get_Mess(error), "sortable", 8),
- "sorting on an unknown field throws an error");
- DECREF(error);
-#endif
-
- results = S_test_sorted_search(searcher, vehicle_str, 100,
- weight_str, false, NULL);
- Vec_Clear(wanted);
- Vec_Push(wanted, INCREF(bike_str));
- Vec_Push(wanted, INCREF(car_str));
- Vec_Push(wanted, INCREF(airplane_str));
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)wanted), "sort by one criteria");
- DECREF(results);
-
- results = S_test_sorted_search(searcher, vehicle_str, 100,
- name_str, true, NULL);
- Vec_Clear(wanted);
- Vec_Push(wanted, INCREF(car_str));
- Vec_Push(wanted, INCREF(bike_str));
- Vec_Push(wanted, INCREF(airplane_str));
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)wanted), "reverse sort");
- DECREF(results);
-
- results = S_test_sorted_search(searcher, vehicle_str, 100,
- home_str, false, name_str, false, NULL);
- Vec_Clear(wanted);
- Vec_Push(wanted, INCREF(airplane_str));
- Vec_Push(wanted, INCREF(bike_str));
- Vec_Push(wanted, INCREF(car_str));
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)wanted), "multiple criteria");
- DECREF(results);
-
- results = S_test_sorted_search(searcher, vehicle_str, 100,
- home_str, false, name_str, true, NULL);
- Vec_Clear(wanted);
- Vec_Push(wanted, INCREF(airplane_str));
- Vec_Push(wanted, INCREF(car_str));
- Vec_Push(wanted, INCREF(bike_str));
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)wanted),
- "multiple criteria with reverse");
- DECREF(results);
-
- results = S_test_sorted_search(searcher, vehicle_str, 100,
- speed_str, true, NULL);
- results2 = S_test_sorted_search(searcher, vehicle_str, 100,
- sloth_str, false, NULL);
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)results2),
- "FieldType_Compare_Values");
- DECREF(results2);
- DECREF(results);
-
- results = S_test_sorted_search(searcher, random_str, 100,
- name_str, false, NULL);
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)random_strings),
- "random strings");
- DECREF(results);
-
- results = S_test_sorted_search(searcher, random_int32s_str, 100,
- int32_str, false, NULL);
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)random_int32s),
- "int32");
- DECREF(results);
-
- results = S_test_sorted_search(searcher, random_int64s_str, 100,
- int64_str, false, NULL);
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)random_int64s),
- "int64");
- DECREF(results);
-
- results = S_test_sorted_search(searcher, random_float32s_str, 100,
- float32_str, false, NULL);
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)random_float32s),
- "float32");
- DECREF(results);
-
- results = S_test_sorted_search(searcher, random_float64s_str, 100,
- float64_str, false, NULL);
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)random_float64s),
- "float64");
- DECREF(results);
-
- String *bbbcca_str = Str_newf("bike bike bike car car airplane");
- results = S_test_sorted_search(searcher, bbbcca_str, 100,
- unused_str, false, NULL);
- Vec_Clear(wanted);
- Vec_Push(wanted, INCREF(airplane_str));
- Vec_Push(wanted, INCREF(bike_str));
- Vec_Push(wanted, INCREF(car_str));
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)wanted),
- "sorting on field with no values sorts by doc id");
- DECREF(results);
- DECREF(bbbcca_str);
-
- String *nn_str = Str_newf("99");
- String *nn_or_car_str = Str_newf("99 OR car");
- results = S_test_sorted_search(searcher, nn_or_car_str, 10,
- speed_str, false, NULL);
- Vec_Clear(wanted);
- Vec_Push(wanted, INCREF(car_str));
- Vec_Push(wanted, INCREF(nn_str));
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)wanted),
- "doc with NULL value sorts last");
- DECREF(results);
- DECREF(nn_str);
- DECREF(nn_or_car_str);
-
- results = S_test_sorted_search(searcher, num_str, 10,
- name_str, false, NULL);
- results2 = S_test_sorted_search(searcher, num_str, 30,
- name_str, false, NULL);
- Vec_Resize(results2, 10);
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)results2),
- "same order regardless of queue size");
- DECREF(results2);
- DECREF(results);
-
- results = S_test_sorted_search(searcher, num_str, 10,
- name_str, true, NULL);
- results2 = S_test_sorted_search(searcher, num_str, 30,
- name_str, true, NULL);
- Vec_Resize(results2, 10);
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)results2),
- "same order regardless of queue size (reverse sort)");
- DECREF(results2);
- DECREF(results);
-
- DECREF(searcher);
-
- // Add another seg to index.
- indexer = Indexer_new(schema, (Obj*)folder, NULL, 0);
- S_add_vehicle(indexer, carrot_str, 0, 0, 1, land_str, food_str);
- Indexer_Commit(indexer);
- DECREF(indexer);
-
- searcher = IxSearcher_new((Obj*)folder);
- results = S_test_sorted_search(searcher, vehicle_str, 100,
- name_str, false, NULL);
- Vec_Clear(wanted);
- Vec_Push(wanted, INCREF(airplane_str));
- Vec_Push(wanted, INCREF(bike_str));
- Vec_Push(wanted, INCREF(car_str));
- TEST_TRUE(runner, Vec_Equals(results, (Obj*)wanted), "Multi-segment sort");
- DECREF(results);
- DECREF(searcher);
-
- DECREF(random_strings);
- DECREF(random_int32s);
- DECREF(random_int64s);
- DECREF(random_float32s);
- DECREF(random_float64s);
-
- DECREF(wanted);
- DECREF(schema);
- DECREF(folder);
-}
-
-void
-TestSortSpec_Run_IMP(TestSortSpec *self, TestBatchRunner *runner) {
- TestBatchRunner_Plan(runner, (TestBatch*)self, 18);
- S_init_strings();
- test_sort_spec(runner);
- S_destroy_strings();
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Search/TestSortSpec.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Search/TestSortSpec.cfh b/core/Lucy/Test/Search/TestSortSpec.cfh
deleted file mode 100644
index 1d559da..0000000
--- a/core/Lucy/Test/Search/TestSortSpec.cfh
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel TestLucy;
-
-class Lucy::Test::Search::TestSortSpec
- inherits Clownfish::TestHarness::TestBatch {
-
- inert incremented TestSortSpec*
- new();
-
- void
- Run(TestSortSpec *self, TestBatchRunner *runner);
-}
-
-class Lucy::Test::Search::TestReverseType inherits Lucy::Plan::Int32Type {
- public inert TestReverseType*
- new();
-
- public inert TestReverseType*
- init(TestReverseType *self);
-
- inert TestReverseType*
- init2(TestReverseType *self, float boost = 1.0, bool indexed = true,
- bool stored = true, bool sortable = false);
-
- int32_t
- Compare_Values(TestReverseType *self, Obj *a, Obj *b);
-}
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Search/TestSpan.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Search/TestSpan.c b/core/Lucy/Test/Search/TestSpan.c
deleted file mode 100644
index 6743f22..0000000
--- a/core/Lucy/Test/Search/TestSpan.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define C_TESTLUCY_TESTTERMINFO
-#define TESTLUCY_USE_SHORT_NAMES
-#include "Lucy/Util/ToolSet.h"
-
-#include "Clownfish/TestHarness/TestBatchRunner.h"
-#include "Lucy/Test.h"
-#include "Lucy/Test/Search/TestSpan.h"
-#include "Lucy/Search/Span.h"
-
-TestSpan*
-TestSpan_new() {
- return (TestSpan*)Class_Make_Obj(TESTSPAN);
-}
-
-void
-test_span_init_values(TestBatchRunner *runner) {
- Span* span = Span_new(2,3,7.0);
- TEST_INT_EQ(runner, Span_Get_Offset(span), 2, "get_offset" );
- TEST_INT_EQ(runner, Span_Get_Length(span), 3, "get_length" );
- TEST_FLOAT_EQ(runner, Span_Get_Weight(span), 7.0, "get_weight" );
-
- Span_Set_Offset(span, 10);
- Span_Set_Length(span, 1);
- Span_Set_Weight(span, 4.0);
-
- TEST_INT_EQ(runner, Span_Get_Offset(span), 10, "set_offset" );
- TEST_INT_EQ(runner, Span_Get_Length(span), 1, "set_length" );
- TEST_FLOAT_EQ(runner, Span_Get_Weight(span), 4.0, "set_weight" );
-
- DECREF(span);
-}
-
-void
-TestSpan_Run_IMP(TestSpan *self, TestBatchRunner *runner) {
- TestBatchRunner_Plan(runner, (TestBatch*)self, 6);
- test_span_init_values(runner);
-}
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Search/TestSpan.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Search/TestSpan.cfh b/core/Lucy/Test/Search/TestSpan.cfh
deleted file mode 100644
index d84c45f..0000000
--- a/core/Lucy/Test/Search/TestSpan.cfh
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel TestLucy;
-
-class Lucy::Test::Search::TestSpan
- inherits Clownfish::TestHarness::TestBatch {
-
- inert incremented TestSpan*
- new();
-
- void
- Run(TestSpan *self, TestBatchRunner *runner);
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Search/TestTermQuery.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Search/TestTermQuery.c b/core/Lucy/Test/Search/TestTermQuery.c
deleted file mode 100644
index a330913..0000000
--- a/core/Lucy/Test/Search/TestTermQuery.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define C_TESTLUCY_TESTTERMQUERY
-#define TESTLUCY_USE_SHORT_NAMES
-#include "Lucy/Util/ToolSet.h"
-#include <math.h>
-
-#include "Clownfish/TestHarness/TestBatchRunner.h"
-#include "Lucy/Test.h"
-#include "Lucy/Test/Search/TestTermQuery.h"
-#include "Lucy/Test/TestUtils.h"
-#include "Lucy/Search/TermQuery.h"
-
-TestTermQuery*
-TestTermQuery_new() {
- return (TestTermQuery*)Class_Make_Obj(TESTTERMQUERY);
-}
-
-static void
-test_Dump_Load_and_Equals(TestBatchRunner *runner) {
- TermQuery *query = TestUtils_make_term_query("content", "foo");
- TermQuery *field_differs = TestUtils_make_term_query("stuff", "foo");
- TermQuery *term_differs = TestUtils_make_term_query("content", "bar");
- TermQuery *boost_differs = TestUtils_make_term_query("content", "foo");
- Obj *dump = (Obj*)TermQuery_Dump(query);
- TermQuery *clone = (TermQuery*)TermQuery_Load(term_differs, dump);
-
- TEST_FALSE(runner, TermQuery_Equals(query, (Obj*)field_differs),
- "Equals() false with different field");
- TEST_FALSE(runner, TermQuery_Equals(query, (Obj*)term_differs),
- "Equals() false with different term");
- TermQuery_Set_Boost(boost_differs, 0.5);
- TEST_FALSE(runner, TermQuery_Equals(query, (Obj*)boost_differs),
- "Equals() false with different boost");
- TEST_TRUE(runner, TermQuery_Equals(query, (Obj*)clone),
- "Dump => Load round trip");
-
- DECREF(query);
- DECREF(term_differs);
- DECREF(field_differs);
- DECREF(boost_differs);
- DECREF(dump);
- DECREF(clone);
-}
-
-void
-TestTermQuery_Run_IMP(TestTermQuery *self, TestBatchRunner *runner) {
- TestBatchRunner_Plan(runner, (TestBatch*)self, 4);
- test_Dump_Load_and_Equals(runner);
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Search/TestTermQuery.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Search/TestTermQuery.cfh b/core/Lucy/Test/Search/TestTermQuery.cfh
deleted file mode 100644
index ac997aa..0000000
--- a/core/Lucy/Test/Search/TestTermQuery.cfh
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel TestLucy;
-
-class Lucy::Test::Search::TestTermQuery
- inherits Clownfish::TestHarness::TestBatch {
-
- inert incremented TestTermQuery*
- new();
-
- void
- Run(TestTermQuery *self, TestBatchRunner *runner);
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Store/MockFileHandle.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Store/MockFileHandle.c b/core/Lucy/Test/Store/MockFileHandle.c
deleted file mode 100644
index 029eb5f..0000000
--- a/core/Lucy/Test/Store/MockFileHandle.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define C_TESTLUCY_MOCKFILEHANDLE
-#define C_LUCY_FILEWINDOW
-#define TESTLUCY_USE_SHORT_NAMES
-#include "Lucy/Util/ToolSet.h"
-
-#include "Lucy/Test/Store/MockFileHandle.h"
-#include "Lucy/Store/FileWindow.h"
-
-MockFileHandle*
-MockFileHandle_new(String *path, int64_t length) {
- MockFileHandle *self = (MockFileHandle*)Class_Make_Obj(MOCKFILEHANDLE);
- return MockFileHandle_init(self, path, length);
-}
-
-MockFileHandle*
-MockFileHandle_init(MockFileHandle *self, String *path,
- int64_t length) {
- FH_do_open((FileHandle*)self, path, 0);
- MockFileHandleIVARS *const ivars = MockFileHandle_IVARS(self);
- ivars->len = length;
- return self;
-}
-
-bool
-MockFileHandle_Window_IMP(MockFileHandle *self, FileWindow *window,
- int64_t offset, int64_t len) {
- UNUSED_VAR(self);
- FileWindow_Set_Window(window, NULL, offset, len);
- return true;
-}
-
-bool
-MockFileHandle_Release_Window_IMP(MockFileHandle *self, FileWindow *window) {
- UNUSED_VAR(self);
- FileWindow_Set_Window(window, NULL, 0, 0);
- return true;
-}
-
-int64_t
-MockFileHandle_Length_IMP(MockFileHandle *self) {
- return MockFileHandle_IVARS(self)->len;
-}
-
-bool
-MockFileHandle_Close_IMP(MockFileHandle *self) {
- UNUSED_VAR(self);
- return true;
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Store/MockFileHandle.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Store/MockFileHandle.cfh b/core/Lucy/Test/Store/MockFileHandle.cfh
deleted file mode 100644
index fe979f4..0000000
--- a/core/Lucy/Test/Store/MockFileHandle.cfh
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel TestLucy;
-
-/** Mock-object FileHandle for testing InStream/OutStream.
- */
-class Lucy::Store::MockFileHandle inherits Lucy::Store::FileHandle {
-
- int64_t len;
-
- inert incremented MockFileHandle*
- new(String *path = NULL, int64_t length);
-
- inert MockFileHandle*
- init(MockFileHandle *self, String *path = NULL, int64_t length);
-
- bool
- Window(MockFileHandle *self, FileWindow *window, int64_t offset, int64_t len);
-
- bool
- Release_Window(MockFileHandle *self, FileWindow *window);
-
- int64_t
- Length(MockFileHandle *self);
-
- bool
- Close(MockFileHandle *self);
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Store/TestCompoundFileReader.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Store/TestCompoundFileReader.c b/core/Lucy/Test/Store/TestCompoundFileReader.c
deleted file mode 100644
index f3cb6f3..0000000
--- a/core/Lucy/Test/Store/TestCompoundFileReader.c
+++ /dev/null
@@ -1,375 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define C_LUCY_RAMFOLDER
-#define TESTLUCY_USE_SHORT_NAMES
-#include "Lucy/Util/ToolSet.h"
-
-#include "Clownfish/TestHarness/TestBatchRunner.h"
-#include "Lucy/Test.h"
-#include "Lucy/Test/Store/TestCompoundFileReader.h"
-#include "Lucy/Store/CompoundFileReader.h"
-#include "Lucy/Store/CompoundFileWriter.h"
-#include "Lucy/Store/FileHandle.h"
-#include "Lucy/Store/InStream.h"
-#include "Lucy/Store/OutStream.h"
-#include "Lucy/Store/RAMFolder.h"
-#include "Lucy/Util/Json.h"
-
-static String *cfmeta_file = NULL;
-static String *cfmeta_temp = NULL;
-static String *cf_file = NULL;
-static String *foo = NULL;
-static String *bar = NULL;
-static String *baz = NULL;
-static String *seg_1 = NULL;
-static String *stuff = NULL;
-
-TestCompoundFileReader*
-TestCFReader_new() {
- return (TestCompoundFileReader*)Class_Make_Obj(TESTCOMPOUNDFILEREADER);
-}
-
-static void
-S_init_strings(void) {
- cfmeta_file = Str_newf("cfmeta.json");
- cfmeta_temp = Str_newf("cfmeta.json.temp");
- cf_file = Str_newf("cf.dat");
- foo = Str_newf("foo");
- bar = Str_newf("bar");
- baz = Str_newf("baz");
- seg_1 = Str_newf("seg_1");
- stuff = Str_newf("stuff");
-}
-
-static void
-S_destroy_strings(void) {
- DECREF(cfmeta_file);
- DECREF(cfmeta_temp);
- DECREF(cf_file);
- DECREF(foo);
- DECREF(bar);
- DECREF(baz);
- DECREF(seg_1);
- DECREF(stuff);
-}
-
-static Folder*
-S_folder_with_contents() {
- RAMFolder *folder = RAMFolder_new(seg_1);
- OutStream *foo_out = RAMFolder_Open_Out(folder, foo);
- OutStream *bar_out = RAMFolder_Open_Out(folder, bar);
- OutStream_Write_Bytes(foo_out, "foo", 3);
- OutStream_Write_Bytes(bar_out, "bar", 3);
- OutStream_Close(foo_out);
- OutStream_Close(bar_out);
- DECREF(foo_out);
- DECREF(bar_out);
- String *empty = SSTR_BLANK();
- RAMFolder_Consolidate(folder, empty);
- return (Folder*)folder;
-}
-
-static void
-test_open(TestBatchRunner *runner) {
- Folder *real_folder;
- CompoundFileReader *cf_reader;
- Hash *metadata;
-
- Err_set_error(NULL);
- real_folder = S_folder_with_contents();
- Folder_Delete(real_folder, cfmeta_file);
- cf_reader = CFReader_open(real_folder);
- TEST_TRUE(runner, cf_reader == NULL,
- "Return NULL when cfmeta file missing");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Set global error when cfmeta file missing");
- DECREF(real_folder);
-
- Err_set_error(NULL);
- real_folder = S_folder_with_contents();
- Folder_Delete(real_folder, cf_file);
- cf_reader = CFReader_open(real_folder);
- TEST_TRUE(runner, cf_reader == NULL,
- "Return NULL when cf.dat file missing");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Set global error when cf.dat file missing");
- DECREF(real_folder);
-
- Err_set_error(NULL);
- real_folder = S_folder_with_contents();
- metadata = (Hash*)Json_slurp_json(real_folder, cfmeta_file);
- Hash_Store_Utf8(metadata, "format", 6, (Obj*)Str_newf("%i32", -1));
- Folder_Delete(real_folder, cfmeta_file);
- Json_spew_json((Obj*)metadata, real_folder, cfmeta_file);
- cf_reader = CFReader_open(real_folder);
- TEST_TRUE(runner, cf_reader == NULL,
- "Return NULL when format is invalid");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Set global error when format is invalid");
-
- Err_set_error(NULL);
- Hash_Store_Utf8(metadata, "format", 6, (Obj*)Str_newf("%i32", 1000));
- Folder_Delete(real_folder, cfmeta_file);
- Json_spew_json((Obj*)metadata, real_folder, cfmeta_file);
- cf_reader = CFReader_open(real_folder);
- TEST_TRUE(runner, cf_reader == NULL,
- "Return NULL when format is too recent");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Set global error when format too recent");
-
- Err_set_error(NULL);
- DECREF(Hash_Delete_Utf8(metadata, "format", 6));
- Folder_Delete(real_folder, cfmeta_file);
- Json_spew_json((Obj*)metadata, real_folder, cfmeta_file);
- cf_reader = CFReader_open(real_folder);
- TEST_TRUE(runner, cf_reader == NULL,
- "Return NULL when format key is missing");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Set global error when format key is missing");
-
- Hash_Store_Utf8(metadata, "format", 6,
- (Obj*)Str_newf("%i32", CFWriter_current_file_format));
- DECREF(Hash_Delete_Utf8(metadata, "files", 5));
- Folder_Delete(real_folder, cfmeta_file);
- Json_spew_json((Obj*)metadata, real_folder, cfmeta_file);
- cf_reader = CFReader_open(real_folder);
- TEST_TRUE(runner, cf_reader == NULL,
- "Return NULL when files key is missing");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Set global error when files key is missing");
-
- DECREF(metadata);
- DECREF(real_folder);
-}
-
-static void
-test_Local_MkDir_and_Find_Folder(TestBatchRunner *runner) {
- Folder *real_folder = S_folder_with_contents();
- CompoundFileReader *cf_reader = CFReader_open(real_folder);
-
- TEST_FALSE(runner,
- CFReader_Local_Is_Directory(cf_reader, stuff),
- "Local_Is_Directory returns false for non-existent entry");
-
- TEST_TRUE(runner, CFReader_MkDir(cf_reader, stuff),
- "MkDir returns true");
- TEST_TRUE(runner,
- Folder_Find_Folder(real_folder, stuff) != NULL,
- "Local_MkDir pass-through");
- TEST_TRUE(runner,
- Folder_Find_Folder(real_folder, stuff)
- == CFReader_Find_Folder(cf_reader, stuff),
- "Local_Find_Folder pass-through");
- TEST_TRUE(runner,
- CFReader_Local_Is_Directory(cf_reader, stuff),
- "Local_Is_Directory pass through");
-
- Err_set_error(NULL);
- TEST_FALSE(runner, CFReader_MkDir(cf_reader, stuff),
- "MkDir returns false when dir already exists");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "MkDir sets global error when dir already exists");
-
- Err_set_error(NULL);
- TEST_FALSE(runner, CFReader_MkDir(cf_reader, foo),
- "MkDir returns false when virtual file exists");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "MkDir sets global error when virtual file exists");
-
- TEST_TRUE(runner,
- CFReader_Find_Folder(cf_reader, foo) == NULL,
- "Virtual file not reported as directory");
- TEST_FALSE(runner, CFReader_Local_Is_Directory(cf_reader, foo),
- "Local_Is_Directory returns false for virtual file");
-
- DECREF(real_folder);
- DECREF(cf_reader);
-}
-
-static void
-test_Local_Delete_and_Exists(TestBatchRunner *runner) {
- Folder *real_folder = S_folder_with_contents();
- CompoundFileReader *cf_reader = CFReader_open(real_folder);
-
- CFReader_MkDir(cf_reader, stuff);
- TEST_TRUE(runner, CFReader_Local_Exists(cf_reader, stuff),
- "pass through for Local_Exists");
- TEST_TRUE(runner, CFReader_Local_Exists(cf_reader, foo),
- "Local_Exists returns true for virtual file");
-
- TEST_TRUE(runner,
- CFReader_Local_Exists(cf_reader, cfmeta_file),
- "cfmeta file exists");
-
- TEST_TRUE(runner, CFReader_Local_Delete(cf_reader, stuff),
- "Local_Delete returns true when zapping real entity");
- TEST_FALSE(runner, CFReader_Local_Exists(cf_reader, stuff),
- "Local_Exists returns false after real entity zapped");
-
- TEST_TRUE(runner, CFReader_Local_Delete(cf_reader, foo),
- "Local_Delete returns true when zapping virtual file");
- TEST_FALSE(runner, CFReader_Local_Exists(cf_reader, foo),
- "Local_Exists returns false after virtual file zapped");
-
- TEST_TRUE(runner, CFReader_Local_Delete(cf_reader, bar),
- "Local_Delete returns true when zapping last virtual file");
- TEST_FALSE(runner,
- CFReader_Local_Exists(cf_reader, cfmeta_file),
- "cfmeta file deleted when last virtual file deleted");
- TEST_FALSE(runner,
- CFReader_Local_Exists(cf_reader, cf_file),
- "compound data file deleted when last virtual file deleted");
-
- DECREF(cf_reader);
- DECREF(real_folder);
-}
-
-static void
-test_Local_Open_Dir(TestBatchRunner *runner) {
-
- Folder *real_folder = S_folder_with_contents();
- CompoundFileReader *cf_reader = CFReader_open(real_folder);
- bool saw_foo = false;
- bool saw_stuff = false;
- bool stuff_was_dir = false;
-
- CFReader_MkDir(cf_reader, stuff);
-
- DirHandle *dh = CFReader_Local_Open_Dir(cf_reader);
- while (DH_Next(dh)) {
- String *entry = DH_Get_Entry(dh);
- if (Str_Equals(entry, (Obj*)foo)) {
- saw_foo = true;
- }
- else if (Str_Equals(entry, (Obj*)stuff)) {
- saw_stuff = true;
- stuff_was_dir = DH_Entry_Is_Dir(dh);
- }
- DECREF(entry);
- }
-
- TEST_TRUE(runner, saw_foo, "DirHandle iterated over virtual file");
- TEST_TRUE(runner, saw_stuff, "DirHandle iterated over real directory");
- TEST_TRUE(runner, stuff_was_dir,
- "DirHandle knew that real entry was dir");
-
- DECREF(dh);
- DECREF(cf_reader);
- DECREF(real_folder);
-}
-
-static void
-test_Local_Open_FileHandle(TestBatchRunner *runner) {
- Folder *real_folder = S_folder_with_contents();
- CompoundFileReader *cf_reader = CFReader_open(real_folder);
- FileHandle *fh;
-
- OutStream *outstream = CFReader_Open_Out(cf_reader, baz);
- OutStream_Write_Bytes(outstream, "baz", 3);
- OutStream_Close(outstream);
- DECREF(outstream);
-
- fh = CFReader_Local_Open_FileHandle(cf_reader, baz,
- FH_READ_ONLY);
- TEST_TRUE(runner, fh != NULL,
- "Local_Open_FileHandle pass-through for real file");
- DECREF(fh);
-
- Err_set_error(NULL);
- fh = CFReader_Local_Open_FileHandle(cf_reader, stuff,
- FH_READ_ONLY);
- TEST_TRUE(runner, fh == NULL,
- "Local_Open_FileHandle for non-existent file returns NULL");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Local_Open_FileHandle for non-existent file sets global error");
-
- Err_set_error(NULL);
- fh = CFReader_Local_Open_FileHandle(cf_reader, foo,
- FH_READ_ONLY);
- TEST_TRUE(runner, fh == NULL,
- "Local_Open_FileHandle for virtual file returns NULL");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Local_Open_FileHandle for virtual file sets global error");
-
- DECREF(cf_reader);
- DECREF(real_folder);
-}
-
-static void
-test_Local_Open_In(TestBatchRunner *runner) {
- Folder *real_folder = S_folder_with_contents();
- CompoundFileReader *cf_reader = CFReader_open(real_folder);
- InStream *instream;
-
- instream = CFReader_Local_Open_In(cf_reader, foo);
- TEST_TRUE(runner, instream != NULL,
- "Local_Open_In for virtual file");
- TEST_TRUE(runner,
- Str_Starts_With(InStream_Get_Filename(instream), CFReader_Get_Path(cf_reader)),
- "InStream's path includes directory");
- DECREF(instream);
-
- OutStream *outstream = CFReader_Open_Out(cf_reader, baz);
- OutStream_Write_Bytes(outstream, "baz", 3);
- OutStream_Close(outstream);
- DECREF(outstream);
- instream = CFReader_Local_Open_In(cf_reader, baz);
- TEST_TRUE(runner, instream != NULL,
- "Local_Open_In pass-through for real file");
- DECREF(instream);
-
- Err_set_error(NULL);
- instream = CFReader_Local_Open_In(cf_reader, stuff);
- TEST_TRUE(runner, instream == NULL,
- "Local_Open_In for non-existent file returns NULL");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Local_Open_In for non-existent file sets global error");
-
- DECREF(cf_reader);
- DECREF(real_folder);
-}
-
-static void
-test_Close(TestBatchRunner *runner) {
- Folder *real_folder = S_folder_with_contents();
- CompoundFileReader *cf_reader = CFReader_open(real_folder);
-
- CFReader_Close(cf_reader);
- PASS(runner, "Close completes without incident");
-
- CFReader_Close(cf_reader);
- PASS(runner, "Calling Close() multiple times is ok");
-
- DECREF(cf_reader);
- DECREF(real_folder);
-}
-
-void
-TestCFReader_Run_IMP(TestCompoundFileReader *self, TestBatchRunner *runner) {
- TestBatchRunner_Plan(runner, (TestBatch*)self, 48);
- S_init_strings();
- test_open(runner);
- test_Local_MkDir_and_Find_Folder(runner);
- test_Local_Delete_and_Exists(runner);
- test_Local_Open_Dir(runner);
- test_Local_Open_FileHandle(runner);
- test_Local_Open_In(runner);
- test_Close(runner);
- S_destroy_strings();
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Store/TestCompoundFileReader.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Store/TestCompoundFileReader.cfh b/core/Lucy/Test/Store/TestCompoundFileReader.cfh
deleted file mode 100644
index 69af74d..0000000
--- a/core/Lucy/Test/Store/TestCompoundFileReader.cfh
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel TestLucy;
-
-class Lucy::Test::Store::TestCompoundFileReader nickname TestCFReader
- inherits Clownfish::TestHarness::TestBatch {
-
- inert incremented TestCompoundFileReader*
- new();
-
- void
- Run(TestCompoundFileReader *self, TestBatchRunner *runner);
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Store/TestCompoundFileWriter.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Store/TestCompoundFileWriter.c b/core/Lucy/Test/Store/TestCompoundFileWriter.c
deleted file mode 100644
index 22a27cb..0000000
--- a/core/Lucy/Test/Store/TestCompoundFileWriter.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdlib.h>
-
-#define TESTLUCY_USE_SHORT_NAMES
-#include "Lucy/Util/ToolSet.h"
-
-#include "charmony.h"
-
-#include "Clownfish/HashIterator.h"
-#include "Clownfish/TestHarness/TestBatchRunner.h"
-#include "Lucy/Test.h"
-#include "Lucy/Test/Store/TestCompoundFileWriter.h"
-#include "Lucy/Store/CompoundFileWriter.h"
-#include "Lucy/Store/FileHandle.h"
-#include "Lucy/Store/OutStream.h"
-#include "Lucy/Store/RAMFolder.h"
-#include "Lucy/Util/Json.h"
-
-static String *cfmeta_file = NULL;
-static String *cfmeta_temp = NULL;
-static String *cf_file = NULL;
-static String *foo = NULL;
-static String *bar = NULL;
-static String *seg_1 = NULL;
-
-TestCompoundFileWriter*
-TestCFWriter_new() {
- return (TestCompoundFileWriter*)Class_Make_Obj(TESTCOMPOUNDFILEWRITER);
-}
-
-static void
-S_init_strings(void) {
- cfmeta_file = Str_newf("cfmeta.json");
- cfmeta_temp = Str_newf("cfmeta.json.temp");
- cf_file = Str_newf("cf.dat");
- foo = Str_newf("foo");
- bar = Str_newf("bar");
- seg_1 = Str_newf("seg_1");
-}
-
-static void
-S_destroy_strings(void) {
- DECREF(cfmeta_file);
- DECREF(cfmeta_temp);
- DECREF(cf_file);
- DECREF(foo);
- DECREF(bar);
- DECREF(seg_1);
-}
-
-static Folder*
-S_folder_with_contents() {
- RAMFolder *folder = RAMFolder_new(seg_1);
- OutStream *foo_out = RAMFolder_Open_Out(folder, foo);
- OutStream *bar_out = RAMFolder_Open_Out(folder, bar);
- OutStream_Write_Bytes(foo_out, "foo", 3);
- OutStream_Write_Bytes(bar_out, "bar", 3);
- OutStream_Close(foo_out);
- OutStream_Close(bar_out);
- DECREF(foo_out);
- DECREF(bar_out);
- return (Folder*)folder;
-}
-
-static void
-test_Consolidate(TestBatchRunner *runner) {
- Folder *folder = S_folder_with_contents();
- FileHandle *fh;
-
- // Fake up detritus from failed consolidation.
- fh = Folder_Open_FileHandle(folder, cf_file,
- FH_CREATE | FH_WRITE_ONLY | FH_EXCLUSIVE);
- DECREF(fh);
- fh = Folder_Open_FileHandle(folder, cfmeta_temp,
- FH_CREATE | FH_WRITE_ONLY | FH_EXCLUSIVE);
- DECREF(fh);
-
- CompoundFileWriter *cf_writer = CFWriter_new(folder);
- CFWriter_Consolidate(cf_writer);
- PASS(runner, "Consolidate completes despite leftover files");
- DECREF(cf_writer);
-
- TEST_TRUE(runner, Folder_Exists(folder, cf_file),
- "cf.dat file written");
- TEST_TRUE(runner, Folder_Exists(folder, cfmeta_file),
- "cfmeta.json file written");
- TEST_FALSE(runner, Folder_Exists(folder, foo),
- "original file zapped");
- TEST_FALSE(runner, Folder_Exists(folder, cfmeta_temp),
- "detritus from failed consolidation zapped");
-
- DECREF(folder);
-}
-
-static void
-test_offsets(TestBatchRunner *runner) {
- Folder *folder = S_folder_with_contents();
- CompoundFileWriter *cf_writer = CFWriter_new(folder);
- Hash *cf_metadata;
- Hash *files;
-
- CFWriter_Consolidate(cf_writer);
-
- cf_metadata = (Hash*)CERTIFY(
- Json_slurp_json(folder, cfmeta_file), HASH);
- files = (Hash*)CERTIFY(
- Hash_Fetch_Utf8(cf_metadata, "files", 5), HASH);
-
- bool offsets_ok = true;
-
- TEST_TRUE(runner, Hash_Get_Size(files) > 0, "Multiple files");
-
- HashIterator *iter = HashIter_new(files);
- while (HashIter_Next(iter)) {
- String *file = HashIter_Get_Key(iter);
- Hash *stats = (Hash*)CERTIFY(HashIter_Get_Value(iter), HASH);
- Obj *offset = CERTIFY(Hash_Fetch_Utf8(stats, "offset", 6), OBJ);
- int64_t offs = Json_obj_to_i64(offset);
- if (offs % 8 != 0) {
- offsets_ok = false;
- char *str = Str_To_Utf8(file);
- FAIL(runner, "Offset %" PRId64 " for %s not a multiple of 8",
- offset, str);
- free(str);
- break;
- }
- }
- DECREF(iter);
- if (offsets_ok) {
- PASS(runner, "All offsets are multiples of 8");
- }
-
- DECREF(cf_metadata);
- DECREF(cf_writer);
- DECREF(folder);
-}
-
-void
-TestCFWriter_Run_IMP(TestCompoundFileWriter *self, TestBatchRunner *runner) {
- TestBatchRunner_Plan(runner, (TestBatch*)self, 7);
- S_init_strings();
- test_Consolidate(runner);
- test_offsets(runner);
- S_destroy_strings();
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Store/TestCompoundFileWriter.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Store/TestCompoundFileWriter.cfh b/core/Lucy/Test/Store/TestCompoundFileWriter.cfh
deleted file mode 100644
index 051ad65..0000000
--- a/core/Lucy/Test/Store/TestCompoundFileWriter.cfh
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel TestLucy;
-
-class Lucy::Test::Store::TestCompoundFileWriter nickname TestCFWriter
- inherits Clownfish::TestHarness::TestBatch {
-
- inert incremented TestCompoundFileWriter*
- new();
-
- void
- Run(TestCompoundFileWriter *self, TestBatchRunner *runner);
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Store/TestFSDirHandle.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Store/TestFSDirHandle.c b/core/Lucy/Test/Store/TestFSDirHandle.c
deleted file mode 100644
index 4be2b84..0000000
--- a/core/Lucy/Test/Store/TestFSDirHandle.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define TESTLUCY_USE_SHORT_NAMES
-#include "Lucy/Util/ToolSet.h"
-
-#include "charmony.h"
-
-// rmdir
-#ifdef CHY_HAS_DIRECT_H
- #include <direct.h>
-#endif
-
-// rmdir
-#ifdef CHY_HAS_UNISTD_H
- #include <unistd.h>
-#endif
-
-#include "Clownfish/TestHarness/TestBatchRunner.h"
-#include "Lucy/Test.h"
-#include "Lucy/Test/Store/TestFSDirHandle.h"
-#include "Lucy/Store/FSDirHandle.h"
-#include "Lucy/Store/FSFolder.h"
-#include "Lucy/Store/OutStream.h"
-
-TestFSDirHandle*
-TestFSDH_new() {
- return (TestFSDirHandle*)Class_Make_Obj(TESTFSDIRHANDLE);
-}
-
-static void
-test_all(TestBatchRunner *runner) {
- String *foo = SSTR_WRAP_C("foo");
- String *boffo = SSTR_WRAP_C("boffo");
- String *foo_boffo = SSTR_WRAP_C("foo/boffo");
- String *test_dir = SSTR_WRAP_C("_fsdir_test");
- FSFolder *folder = FSFolder_new(test_dir);
- bool saw_foo = false;
- bool saw_boffo = false;
- bool foo_was_dir = false;
- bool boffo_was_dir = false;
- int count = 0;
-
- // Clean up after previous failed runs.
- FSFolder_Delete(folder, foo_boffo);
- FSFolder_Delete(folder, foo);
- FSFolder_Delete(folder, boffo);
- rmdir("_fsdir_test");
-
- FSFolder_Initialize(folder);
- FSFolder_MkDir(folder, foo);
- OutStream *outstream = FSFolder_Open_Out(folder, boffo);
- DECREF(outstream);
- outstream = FSFolder_Open_Out(folder, foo_boffo);
- DECREF(outstream);
-
- FSDirHandle *dh = FSDH_open(test_dir);
- while (FSDH_Next(dh)) {
- count++;
- String *entry = FSDH_Get_Entry(dh);
- if (Str_Equals(entry, (Obj*)foo)) {
- saw_foo = true;
- foo_was_dir = FSDH_Entry_Is_Dir(dh);
- }
- else if (Str_Equals(entry, (Obj*)boffo)) {
- saw_boffo = true;
- boffo_was_dir = FSDH_Entry_Is_Dir(dh);
- }
- DECREF(entry);
- }
- TEST_INT_EQ(runner, 2, count, "correct number of entries");
- TEST_TRUE(runner, saw_foo, "Directory was iterated over");
- TEST_TRUE(runner, foo_was_dir,
- "Dir correctly identified by Entry_Is_Dir");
- TEST_TRUE(runner, saw_boffo, "File was iterated over");
- TEST_FALSE(runner, boffo_was_dir,
- "File correctly identified by Entry_Is_Dir");
-
- DECREF(dh);
- FSFolder_Delete(folder, foo_boffo);
- FSFolder_Delete(folder, foo);
- FSFolder_Delete(folder, boffo);
- DECREF(folder);
- rmdir("_fsdir_test");
-}
-
-void
-TestFSDH_Run_IMP(TestFSDirHandle *self, TestBatchRunner *runner) {
- TestBatchRunner_Plan(runner, (TestBatch*)self, 5);
- test_all(runner);
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Store/TestFSDirHandle.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Store/TestFSDirHandle.cfh b/core/Lucy/Test/Store/TestFSDirHandle.cfh
deleted file mode 100644
index 9b10d79..0000000
--- a/core/Lucy/Test/Store/TestFSDirHandle.cfh
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel TestLucy;
-
-class Lucy::Test::Store::TestFSDirHandle nickname TestFSDH
- inherits Clownfish::TestHarness::TestBatch {
-
- inert incremented TestFSDirHandle*
- new();
-
- void
- Run(TestFSDirHandle *self, TestBatchRunner *runner);
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Store/TestFSFileHandle.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Store/TestFSFileHandle.c b/core/Lucy/Test/Store/TestFSFileHandle.c
deleted file mode 100644
index 7f9f2f1..0000000
--- a/core/Lucy/Test/Store/TestFSFileHandle.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h> // for remove()
-#include <stdlib.h>
-
-#define C_LUCY_FSFILEHANDLE
-#define C_LUCY_FILEWINDOW
-#define TESTLUCY_USE_SHORT_NAMES
-#include "Lucy/Util/ToolSet.h"
-
-#ifdef CHY_HAS_UNISTD_H
- #include <unistd.h> // close
-#elif defined(CHY_HAS_IO_H)
- #include <io.h> // close
-#endif
-
-#include "Clownfish/TestHarness/TestBatchRunner.h"
-#include "Lucy/Test.h"
-#include "Lucy/Test/Store/TestFSFileHandle.h"
-#include "Lucy/Store/FSFileHandle.h"
-#include "Lucy/Store/FileWindow.h"
-
-static void
-S_remove(String *path) {
- char *str = Str_To_Utf8(path);
- remove(str);
- free(str);
-}
-
-TestFSFileHandle*
-TestFSFH_new() {
- return (TestFSFileHandle*)Class_Make_Obj(TESTFSFILEHANDLE);
-}
-
-static void
-test_open(TestBatchRunner *runner) {
-
- FSFileHandle *fh;
- String *test_filename = SSTR_WRAP_C("_fstest");
-
- S_remove(test_filename);
-
- Err_set_error(NULL);
- fh = FSFH_open(test_filename, FH_READ_ONLY);
- TEST_TRUE(runner, fh == NULL,
- "open() with FH_READ_ONLY on non-existent file returns NULL");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "open() with FH_READ_ONLY on non-existent file sets error");
-
- Err_set_error(NULL);
- fh = FSFH_open(test_filename, FH_WRITE_ONLY);
- TEST_TRUE(runner, fh == NULL,
- "open() without FH_CREATE returns NULL");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "open() without FH_CREATE sets error");
-
- Err_set_error(NULL);
- fh = FSFH_open(test_filename, FH_CREATE);
- TEST_TRUE(runner, fh == NULL,
- "open() without FH_WRITE_ONLY returns NULL");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "open() without FH_WRITE_ONLY sets error");
-
- Err_set_error(NULL);
- fh = FSFH_open(test_filename, FH_CREATE | FH_WRITE_ONLY | FH_EXCLUSIVE);
- TEST_TRUE(runner, fh && FSFH_is_a(fh, FSFILEHANDLE), "open() succeeds");
- TEST_TRUE(runner, Err_get_error() == NULL, "open() no errors");
- FSFH_Write(fh, "foo", 3);
- if (!FSFH_Close(fh)) { RETHROW(INCREF(Err_get_error())); }
- DECREF(fh);
-
- Err_set_error(NULL);
- fh = FSFH_open(test_filename, FH_CREATE | FH_WRITE_ONLY | FH_EXCLUSIVE);
- TEST_TRUE(runner, fh == NULL, "FH_EXCLUSIVE blocks open()");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "FH_EXCLUSIVE blocks open(), sets error");
-
- Err_set_error(NULL);
- fh = FSFH_open(test_filename, FH_CREATE | FH_WRITE_ONLY);
- TEST_TRUE(runner, fh && FSFH_is_a(fh, FSFILEHANDLE),
- "open() for append");
- TEST_TRUE(runner, Err_get_error() == NULL,
- "open() for append -- no errors");
- FSFH_Write(fh, "bar", 3);
- if (!FSFH_Close(fh)) { RETHROW(INCREF(Err_get_error())); }
- DECREF(fh);
-
- Err_set_error(NULL);
- fh = FSFH_open(test_filename, FH_READ_ONLY);
- TEST_TRUE(runner, fh && FSFH_is_a(fh, FSFILEHANDLE), "open() read only");
- TEST_TRUE(runner, Err_get_error() == NULL,
- "open() read only -- no errors");
- DECREF(fh);
-
- S_remove(test_filename);
-}
-
-static void
-test_Read_Write(TestBatchRunner *runner) {
- FSFileHandle *fh;
- const char *foo = "foo";
- const char *bar = "bar";
- char buffer[12];
- char *buf = buffer;
- String *test_filename = SSTR_WRAP_C("_fstest");
-
- S_remove(test_filename);
- fh = FSFH_open(test_filename,
- FH_CREATE | FH_WRITE_ONLY | FH_EXCLUSIVE);
-
- TEST_TRUE(runner, FSFH_Length(fh) == INT64_C(0), "Length initially 0");
- TEST_TRUE(runner, FSFH_Write(fh, foo, 3), "Write returns success");
- TEST_TRUE(runner, FSFH_Length(fh) == INT64_C(3), "Length after Write");
- TEST_TRUE(runner, FSFH_Write(fh, bar, 3), "Write returns success");
- TEST_TRUE(runner, FSFH_Length(fh) == INT64_C(6), "Length after 2 Writes");
-
- Err_set_error(NULL);
- TEST_FALSE(runner, FSFH_Read(fh, buf, 0, 2),
- "Reading from a write-only handle returns false");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Reading from a write-only handle sets error");
- if (!FSFH_Close(fh)) { RETHROW(INCREF(Err_get_error())); }
- DECREF(fh);
-
- // Reopen for reading.
- Err_set_error(NULL);
- fh = FSFH_open(test_filename, FH_READ_ONLY);
-
- TEST_TRUE(runner, FSFH_Length(fh) == INT64_C(6), "Length on Read");
- TEST_TRUE(runner, FSFH_Read(fh, buf, 0, 6), "Read returns success");
- TEST_TRUE(runner, strncmp(buf, "foobar", 6) == 0, "Read/Write");
- TEST_TRUE(runner, FSFH_Read(fh, buf, 2, 3), "Read returns success");
- TEST_TRUE(runner, strncmp(buf, "oba", 3) == 0, "Read with offset");
-
- Err_set_error(NULL);
- TEST_FALSE(runner, FSFH_Read(fh, buf, -1, 4),
- "Read() with a negative offset returns false");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Read() with a negative offset sets error");
-
- Err_set_error(NULL);
- TEST_FALSE(runner, FSFH_Read(fh, buf, 6, 1),
- "Read() past EOF returns false");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Read() past EOF sets error");
-
- Err_set_error(NULL);
- TEST_FALSE(runner, FSFH_Write(fh, foo, 3),
- "Writing to a read-only handle returns false");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Writing to a read-only handle sets error");
-
- DECREF(fh);
- S_remove(test_filename);
-}
-
-static void
-test_Close(TestBatchRunner *runner) {
- String *test_filename = SSTR_WRAP_C("_fstest");
- FSFileHandle *fh;
-
- S_remove(test_filename);
- fh = FSFH_open(test_filename,
- FH_CREATE | FH_WRITE_ONLY | FH_EXCLUSIVE);
- TEST_TRUE(runner, FSFH_Close(fh), "Close returns true for write-only");
- DECREF(fh);
-
- // Simulate an OS error when closing the file descriptor. This
- // approximates what would happen if, say, we run out of disk space.
- S_remove(test_filename);
- fh = FSFH_open(test_filename,
- FH_CREATE | FH_WRITE_ONLY | FH_EXCLUSIVE);
-#ifdef _MSC_VER
- SKIP(runner, 2, "LUCY-155");
-#else
- int saved_fd = FSFH_IVARS(fh)->fd;
- FSFH_IVARS(fh)->fd = -1;
- Err_set_error(NULL);
- bool result = FSFH_Close(fh);
- TEST_FALSE(runner, result, "Failed Close() returns false");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Failed Close() sets global error");
- FSFH_IVARS(fh)->fd = saved_fd;
-#endif /* _MSC_VER */
- DECREF(fh);
-
- fh = FSFH_open(test_filename, FH_READ_ONLY);
- TEST_TRUE(runner, FSFH_Close(fh), "Close returns true for read-only");
-
- DECREF(fh);
- S_remove(test_filename);
-}
-
-static void
-test_Window(TestBatchRunner *runner) {
- String *test_filename = SSTR_WRAP_C("_fstest");
- FSFileHandle *fh;
- FileWindow *window = FileWindow_new();
- FileWindowIVARS *const window_ivars = FileWindow_IVARS(window);
- uint32_t i;
-
- S_remove(test_filename);
- fh = FSFH_open(test_filename,
- FH_CREATE | FH_WRITE_ONLY | FH_EXCLUSIVE);
- for (i = 0; i < 1024; i++) {
- FSFH_Write(fh, "foo ", 4);
- }
- if (!FSFH_Close(fh)) { RETHROW(INCREF(Err_get_error())); }
-
- // Reopen for reading.
- DECREF(fh);
- fh = FSFH_open(test_filename, FH_READ_ONLY);
- if (!fh) { RETHROW(INCREF(Err_get_error())); }
-
- Err_set_error(NULL);
- TEST_FALSE(runner, FSFH_Window(fh, window, -1, 4),
- "Window() with a negative offset returns false");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Window() with a negative offset sets error");
-
- Err_set_error(NULL);
- TEST_FALSE(runner, FSFH_Window(fh, window, 4000, 1000),
- "Window() past EOF returns false");
- TEST_TRUE(runner, Err_get_error() != NULL,
- "Window() past EOF sets error");
-
- TEST_TRUE(runner, FSFH_Window(fh, window, 1021, 2),
- "Window() returns true");
- TEST_TRUE(runner,
- strncmp(window_ivars->buf - window_ivars->offset + 1021, "oo", 2) == 0,
- "Window()");
-
- TEST_TRUE(runner, FSFH_Release_Window(fh, window),
- "Release_Window() returns true");
- TEST_TRUE(runner, window_ivars->buf == NULL, "Release_Window() resets buf");
- TEST_TRUE(runner, window_ivars->offset == 0, "Release_Window() resets offset");
- TEST_TRUE(runner, window_ivars->len == 0, "Release_Window() resets len");
-
- DECREF(window);
- DECREF(fh);
- S_remove(test_filename);
-}
-
-void
-TestFSFH_Run_IMP(TestFSFileHandle *self, TestBatchRunner *runner) {
- TestBatchRunner_Plan(runner, (TestBatch*)self, 46);
- test_open(runner);
- test_Read_Write(runner);
- test_Close(runner);
- test_Window(runner);
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Store/TestFSFileHandle.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Store/TestFSFileHandle.cfh b/core/Lucy/Test/Store/TestFSFileHandle.cfh
deleted file mode 100644
index b9825b8..0000000
--- a/core/Lucy/Test/Store/TestFSFileHandle.cfh
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel TestLucy;
-
-class Lucy::Test::Store::TestFSFileHandle nickname TestFSFH
- inherits Clownfish::TestHarness::TestBatch {
-
- inert incremented TestFSFileHandle*
- new();
-
- void
- Run(TestFSFileHandle *self, TestBatchRunner *runner);
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Store/TestFSFolder.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Store/TestFSFolder.c b/core/Lucy/Test/Store/TestFSFolder.c
deleted file mode 100644
index 03eef57..0000000
--- a/core/Lucy/Test/Store/TestFSFolder.c
+++ /dev/null
@@ -1,218 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define TESTLUCY_USE_SHORT_NAMES
-#include "Lucy/Util/ToolSet.h"
-
-#include "charmony.h"
-
-// mkdir, rmdir
-#ifdef CHY_HAS_DIRECT_H
- #include <direct.h>
-#endif
-
-// rmdir
-#ifdef CHY_HAS_UNISTD_H
- #include <unistd.h>
-#endif
-
-// mkdir, stat
-#ifdef CHY_HAS_SYS_STAT_H
- #include <sys/stat.h>
-#endif
-
-#ifdef CHY_HAS_ERRNO_H
- #include "errno.h"
-#endif
-
-#include "Clownfish/TestHarness/TestBatchRunner.h"
-#include "Lucy/Test.h"
-#include "Lucy/Test/Store/TestFSFolder.h"
-#include "Lucy/Test/Store/TestFolderCommon.h"
-#include "Lucy/Store/FSFolder.h"
-#include "Lucy/Store/OutStream.h"
-
-/* The tests involving symlinks have to be run with administrator privileges
- * under Windows, so disable by default.
- */
-#ifndef CHY_HAS_WINDOWS_H
-#define ENABLE_SYMLINK_TESTS
-// Create the symlinks needed by test_protect_symlinks().
-static bool
-S_create_test_symlinks(void);
-#endif /* CHY_HAS_WINDOWS_H */
-
-TestFSFolder*
-TestFSFolder_new() {
- return (TestFSFolder*)Class_Make_Obj(TESTFSFOLDER);
-}
-
-static Folder*
-S_set_up() {
- rmdir("_fstest");
- String *test_dir = SSTR_WRAP_C("_fstest");
- FSFolder *folder = FSFolder_new(test_dir);
- FSFolder_Initialize(folder);
- if (!FSFolder_Check(folder)) {
- RETHROW(INCREF(Err_get_error()));
- }
- return (Folder*)folder;
-}
-
-static void
-S_tear_down() {
- struct stat stat_buf;
- int result = rmdir("_fstest");
- if (result < 0) {
- /* FIXME: This can fail on Windows with ENOTEMPTY. */
- THROW(ERR, "Can't clean up directory _fstest: %s", strerror(errno));
- }
- /* FIXME: This can also fail on Windows even if rmdir was successful. */
- if (stat("_fstest", &stat_buf) != -1) {
- THROW(ERR, "Can't clean up directory _fstest");
- }
-}
-
-static void
-test_Initialize_and_Check(TestBatchRunner *runner) {
- rmdir("_fstest");
- String *test_dir = SSTR_WRAP_C("_fstest");
- FSFolder *folder = FSFolder_new(test_dir);
- TEST_FALSE(runner, FSFolder_Check(folder),
- "Check() returns false when folder dir doesn't exist");
- FSFolder_Initialize(folder);
- PASS(runner, "Initialize() concludes without incident");
- TEST_TRUE(runner, FSFolder_Check(folder),
- "Initialize() created dir, and now Check() succeeds");
- DECREF(folder);
- S_tear_down();
-}
-
-static void
-test_protect_symlinks(TestBatchRunner *runner) {
-#ifdef ENABLE_SYMLINK_TESTS
- FSFolder *folder = (FSFolder*)S_set_up();
- String *foo = SSTR_WRAP_C("foo");
- String *bar = SSTR_WRAP_C("bar");
- String *foo_boffo = SSTR_WRAP_C("foo/boffo");
-
- FSFolder_MkDir(folder, foo);
- FSFolder_MkDir(folder, bar);
- OutStream *outstream = FSFolder_Open_Out(folder, foo_boffo);
- DECREF(outstream);
-
- if (!S_create_test_symlinks()) {
- FAIL(runner, "symlink creation failed");
- FAIL(runner, "symlink creation failed");
- FAIL(runner, "symlink creation failed");
- FAIL(runner, "symlink creation failed");
- FAIL(runner, "symlink creation failed");
- // Try to clean up anyway.
- FSFolder_Delete_Tree(folder, foo);
- FSFolder_Delete_Tree(folder, bar);
- }
- else {
- Vector *list = FSFolder_List_R(folder, NULL);
- bool saw_bazooka_boffo = false;
- for (size_t i = 0, max = Vec_Get_Size(list); i < max; i++) {
- String *entry = (String*)Vec_Fetch(list, i);
- if (Str_Ends_With_Utf8(entry, "bazooka/boffo", 13)) {
- saw_bazooka_boffo = true;
- }
- }
- TEST_FALSE(runner, saw_bazooka_boffo,
- "List_R() shouldn't follow symlinks");
- DECREF(list);
-
- TEST_TRUE(runner, FSFolder_Delete_Tree(folder, bar),
- "Delete_Tree() returns true");
- TEST_FALSE(runner, FSFolder_Exists(folder, bar),
- "Tree is really gone");
- TEST_TRUE(runner, FSFolder_Exists(folder, foo),
- "Original folder sill there");
- TEST_TRUE(runner, FSFolder_Exists(folder, foo_boffo),
- "Delete_Tree() did not follow directory symlink");
- FSFolder_Delete_Tree(folder, foo);
- }
- DECREF(folder);
- S_tear_down();
-#else
- SKIP(runner, 5, "Tests requiring symlink() disabled");
-#endif // ENABLE_SYMLINK_TESTS
-}
-
-void
-test_disallow_updir(TestBatchRunner *runner) {
- FSFolder *outer_folder = (FSFolder*)S_set_up();
-
- String *foo = SSTR_WRAP_C("foo");
- String *bar = SSTR_WRAP_C("bar");
- FSFolder_MkDir(outer_folder, foo);
- FSFolder_MkDir(outer_folder, bar);
-
- String *inner_path = SSTR_WRAP_C("_fstest/foo");
- FSFolder *foo_folder = FSFolder_new(inner_path);
- String *up_bar = SSTR_WRAP_C("../bar");
- TEST_FALSE(runner, FSFolder_Exists(foo_folder, up_bar),
- "up-dirs are inaccessible.");
-
- DECREF(foo_folder);
- FSFolder_Delete(outer_folder, foo);
- FSFolder_Delete(outer_folder, bar);
- DECREF(outer_folder);
- S_tear_down();
-}
-
-void
-TestFSFolder_Run_IMP(TestFSFolder *self, TestBatchRunner *runner) {
- TestBatchRunner_Plan(runner, (TestBatch*)self,
- TestFolderCommon_num_tests() + 9);
- test_Initialize_and_Check(runner);
- TestFolderCommon_run_tests(runner, S_set_up, S_tear_down);
- test_protect_symlinks(runner);
- test_disallow_updir(runner);
-}
-
-#ifdef ENABLE_SYMLINK_TESTS
-
-#ifdef CHY_HAS_WINDOWS_H
-#include "windows.h"
-#elif defined(CHY_HAS_UNISTD_H)
-#include <unistd.h>
-#else
-#error "Don't have either windows.h or unistd.h"
-#endif
-
-static bool
-S_create_test_symlinks(void) {
-#ifdef CHY_HAS_WINDOWS_H
- if (!CreateSymbolicLink("_fstest\\bar\\banana", "_fstest\\foo\\boffo", 0)
- || !CreateSymbolicLink("_fstest\\bar\\bazooka", "_fstest\\foo", 1)
- ) {
- return false;
- }
-#else
- if (symlink("_fstest/foo/boffo", "_fstest/bar/banana")
- || symlink("_fstest/foo", "_fstest/bar/bazooka")
- ) {
- return false;
- }
-#endif
- return true;
-}
-
-#endif /* ENABLE_SYMLINK_TESTS */
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Store/TestFSFolder.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Store/TestFSFolder.cfh b/core/Lucy/Test/Store/TestFSFolder.cfh
deleted file mode 100644
index bbdae58..0000000
--- a/core/Lucy/Test/Store/TestFSFolder.cfh
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel TestLucy;
-
-class Lucy::Test::Store::TestFSFolder
- inherits Clownfish::TestHarness::TestBatch {
-
- inert incremented TestFSFolder*
- new();
-
- void
- Run(TestFSFolder *self, TestBatchRunner *runner);
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Store/TestFileHandle.c
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Store/TestFileHandle.c b/core/Lucy/Test/Store/TestFileHandle.c
deleted file mode 100644
index 2e9850f..0000000
--- a/core/Lucy/Test/Store/TestFileHandle.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define C_TESTLUCY_TESTINSTREAM
-#define C_LUCY_INSTREAM
-#define C_LUCY_FILEWINDOW
-#define TESTLUCY_USE_SHORT_NAMES
-#include "Lucy/Util/ToolSet.h"
-
-#include "Clownfish/TestHarness/TestBatchRunner.h"
-#include "Lucy/Test.h"
-#include "Lucy/Test/Store/TestFileHandle.h"
-#include "Lucy/Store/FileHandle.h"
-#include "Lucy/Store/FileWindow.h"
-
-TestFileHandle*
-TestFH_new() {
- return (TestFileHandle*)Class_Make_Obj(TESTFILEHANDLE);
-}
-
-static void
-S_no_op_method(const void *vself) {
- UNUSED_VAR(vself);
-}
-
-static FileHandle*
-S_new_filehandle() {
- String *class_name = SSTR_WRAP_C("TestFileHandle");
- FileHandle *fh;
- Class *klass = Class_fetch_class(class_name);
- if (!klass) {
- klass = Class_singleton(class_name, FILEHANDLE);
- }
- Class_Override(klass, S_no_op_method, LUCY_FH_Close_OFFSET);
- fh = (FileHandle*)Class_Make_Obj(klass);
- return FH_do_open(fh, NULL, 0);
-}
-
-void
-TestFH_Run_IMP(TestFileHandle *self, TestBatchRunner *runner) {
- TestBatchRunner_Plan(runner, (TestBatch*)self, 2);
-
- FileHandle *fh = S_new_filehandle();
- String *foo = SSTR_WRAP_C("foo");
-
- TEST_TRUE(runner, Str_Equals_Utf8(FH_Get_Path(fh), "", 0), "Get_Path");
- FH_Set_Path(fh, foo);
- TEST_TRUE(runner, Str_Equals(FH_Get_Path(fh), (Obj*)foo), "Set_Path");
-
- DECREF(fh);
-}
-
-
http://git-wip-us.apache.org/repos/asf/lucy/blob/572d3564/core/Lucy/Test/Store/TestFileHandle.cfh
----------------------------------------------------------------------
diff --git a/core/Lucy/Test/Store/TestFileHandle.cfh b/core/Lucy/Test/Store/TestFileHandle.cfh
deleted file mode 100644
index 1c97c5f..0000000
--- a/core/Lucy/Test/Store/TestFileHandle.cfh
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-parcel TestLucy;
-
-class Lucy::Test::Store::TestFileHandle nickname TestFH
- inherits Clownfish::TestHarness::TestBatch {
-
- inert incremented TestFileHandle*
- new();
-
- void
- Run(TestFileHandle *self, TestBatchRunner *runner);
-}
-
-