Test idempotence of bootstrap process
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/7cc75eb8 Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/7cc75eb8 Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/7cc75eb8 Branch: refs/heads/master Commit: 7cc75eb8dd53bb63966170629ec66cdbc62e7d34 Parents: 25f58a6 Author: Nick Wellnhofer <wellnho...@aevum.de> Authored: Thu Mar 10 20:05:20 2016 +0100 Committer: Nick Wellnhofer <wellnho...@aevum.de> Committed: Thu Mar 10 21:49:25 2016 +0100 ---------------------------------------------------------------------- compiler/src/CFCBindCore.c | 10 +-- runtime/core/Clownfish/Test.c | 2 + runtime/core/Clownfish/Test/TestClass.c | 93 ++++++++++++++++++++++++++ runtime/core/Clownfish/Test/TestClass.cfh | 28 ++++++++ runtime/perl/t/core/010-class.t | 23 +++++++ 5 files changed, 151 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7cc75eb8/compiler/src/CFCBindCore.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCBindCore.c b/compiler/src/CFCBindCore.c index 4b2d3c6..7d43415 100644 --- a/compiler/src/CFCBindCore.c +++ b/compiler/src/CFCBindCore.c @@ -362,7 +362,7 @@ S_write_parcel_h(CFCBindCore *self, CFCParcel *parcel) { "\n" "%s" // Extra definitions. "%sVISIBLE void\n" - "%sbootstrap_internal(void);\n" + "%sbootstrap_internal(int force);\n" "\n" "%sVISIBLE void\n" "%sbootstrap_parcel(void);\n" @@ -444,7 +444,7 @@ S_write_parcel_c(CFCBindCore *self, CFCParcel *parcel) { for (size_t i = 0; prereq_parcels[i]; ++i) { const char *prereq_prefix = CFCParcel_get_prefix(prereq_parcels[i]); prereq_bootstrap = CFCUtil_cat(prereq_bootstrap, " ", prereq_prefix, - "bootstrap_internal();\n", NULL); + "bootstrap_internal(0);\n", NULL); } FREEMEM(prereq_parcels); @@ -473,9 +473,9 @@ S_write_parcel_c(CFCBindCore *self, CFCParcel *parcel) { "%s" // spec_init_func "\n" "void\n" - "%sbootstrap_internal() {\n" + "%sbootstrap_internal(int force) {\n" " static int bootstrapped = 0;\n" - " if (bootstrapped) { return; }\n" + " if (bootstrapped && !force) { return; }\n" " S_bootstrap_specs();\n" " %sinit_parcel();\n" " bootstrapped = 1;\n" @@ -484,7 +484,7 @@ S_write_parcel_c(CFCBindCore *self, CFCParcel *parcel) { "void\n" "%sbootstrap_parcel() {\n" "%s" // Bootstrap prerequisite parcels. - " %sbootstrap_internal();\n" + " %sbootstrap_internal(0);\n" "}\n" "\n" "%s\n"; http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7cc75eb8/runtime/core/Clownfish/Test.c ---------------------------------------------------------------------- diff --git a/runtime/core/Clownfish/Test.c b/runtime/core/Clownfish/Test.c index 9f03448..a275b0c 100644 --- a/runtime/core/Clownfish/Test.c +++ b/runtime/core/Clownfish/Test.c @@ -26,6 +26,7 @@ #include "Clownfish/Test/TestByteBuf.h" #include "Clownfish/Test/TestString.h" #include "Clownfish/Test/TestCharBuf.h" +#include "Clownfish/Test/TestClass.h" #include "Clownfish/Test/TestErr.h" #include "Clownfish/Test/TestHash.h" #include "Clownfish/Test/TestHashIterator.h" @@ -41,6 +42,7 @@ TestSuite* Test_create_test_suite() { TestSuite *suite = TestSuite_new(); + TestSuite_Add_Batch(suite, (TestBatch*)TestClass_new()); TestSuite_Add_Batch(suite, (TestBatch*)TestVector_new()); TestSuite_Add_Batch(suite, (TestBatch*)TestHash_new()); TestSuite_Add_Batch(suite, (TestBatch*)TestHashIterator_new()); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7cc75eb8/runtime/core/Clownfish/Test/TestClass.c ---------------------------------------------------------------------- diff --git a/runtime/core/Clownfish/Test/TestClass.c b/runtime/core/Clownfish/Test/TestClass.c new file mode 100644 index 0000000..fc16a90 --- /dev/null +++ b/runtime/core/Clownfish/Test/TestClass.c @@ -0,0 +1,93 @@ +/* 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> + +#define C_CFISH_BOOLEAN +#define C_CFISH_CLASS +#define CFISH_USE_SHORT_NAMES +#define TESTCFISH_USE_SHORT_NAMES + +#include "charmony.h" + +#include <string.h> + +#include "Clownfish/Test/TestClass.h" + +#include "Clownfish/Boolean.h" +#include "Clownfish/Class.h" +#include "Clownfish/TestHarness/TestBatchRunner.h" +#include "Clownfish/Util/Memory.h" + +TestClass* +TestClass_new() { + return (TestClass*)Class_Make_Obj(TESTCLASS); +} + +#if DEBUG_CLASS_CONTENTS + +#include <stdio.h> + +static void +S_memdump(void *vptr, size_t size) { + unsigned char *ptr = (unsigned char*)vptr; + for (size_t i = 0; i < size; i++) { + printf("%02X ", ptr[i]); + } + printf("\n"); +} + +#endif /* DEBUG_CLASS_CONTENTS */ + +static void +test_bootstrap_idempotence(TestBatchRunner *runner) { + Class *bool_class = BOOLEAN; + uint32_t bool_class_size = BOOLEAN->class_alloc_size; + uint32_t bool_ivars_offset = cfish_Bool_IVARS_OFFSET; + Boolean *true_singleton = Bool_true_singleton; + + char *bool_class_contents = (char*)MALLOCATE(bool_class_size); + memcpy(bool_class_contents, BOOLEAN, bool_class_size); + + // Force another bootstrap run. + cfish_bootstrap_internal(1); + +#if DEBUG_CLASS_CONTENTS + printf("Before\n"); + S_memdump(bool_class_contents, bool_class_size); + printf("After\n"); + S_memdump(BOOLEAN, bool_class_size); +#endif + + TEST_TRUE(runner, bool_class == BOOLEAN, + "Boolean class pointer unchanged"); + TEST_TRUE(runner, + memcmp(bool_class_contents, BOOLEAN, bool_class_size) == 0, + "Boolean class unchanged"); + TEST_TRUE(runner, bool_ivars_offset == cfish_Bool_IVARS_OFFSET, + "Boolean ivars offset unchanged"); + TEST_TRUE(runner, true_singleton == Bool_true_singleton, + "Boolean singleton unchanged"); + + FREEMEM(bool_class_contents); +} + +void +TestClass_Run_IMP(TestClass *self, TestBatchRunner *runner) { + TestBatchRunner_Plan(runner, (TestBatch*)self, 4); + test_bootstrap_idempotence(runner); +} + http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7cc75eb8/runtime/core/Clownfish/Test/TestClass.cfh ---------------------------------------------------------------------- diff --git a/runtime/core/Clownfish/Test/TestClass.cfh b/runtime/core/Clownfish/Test/TestClass.cfh new file mode 100644 index 0000000..615c34e --- /dev/null +++ b/runtime/core/Clownfish/Test/TestClass.cfh @@ -0,0 +1,28 @@ +/* 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 TestClownfish; + +class Clownfish::Test::TestClass + inherits Clownfish::TestHarness::TestBatch { + + inert incremented TestClass* + new(); + + void + Run(TestClass *self, TestBatchRunner *runner); +} + http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7cc75eb8/runtime/perl/t/core/010-class.t ---------------------------------------------------------------------- diff --git a/runtime/perl/t/core/010-class.t b/runtime/perl/t/core/010-class.t new file mode 100644 index 0000000..4577941 --- /dev/null +++ b/runtime/perl/t/core/010-class.t @@ -0,0 +1,23 @@ +# 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. + +use strict; +use warnings; + +use Clownfish::Test; +my $success = Clownfish::Test::run_tests("Clownfish::Test::TestClass"); + +exit($success ? 0 : 1); +