Skip to content

Instantly share code, notes, and snippets.

@stesla
Created November 6, 2009 06:27
Show Gist options
  • Save stesla/227775 to your computer and use it in GitHub Desktop.
Save stesla/227775 to your computer and use it in GitHub Desktop.
diff --git a/Rakefile b/Rakefile
index 3ab2592..96c8c83 100644
--- a/Rakefile
+++ b/Rakefile
@@ -49,7 +49,7 @@ Rake::GemPackageTask.new(gemspec) do |pkg|
end
namespace :test do
- Rake::TestTask.new :all => [:extension] do |t|
+ Rake::TestTask.new :all => [:test_extension] do |t|
t.libs << 'test'
t.libs << 'ext'
t.pattern = 'test/**/*_test.rb'
@@ -59,12 +59,19 @@ namespace :test do
end
task :extension => "ext/base32.bundle"
+task :test_extension do
+ sh 'rake TEST=1 ext/base32.bundle'
+end
extension_source = FileList["ext/**/*.c", "ext/**/*.h"]
file "ext/base32.bundle" => ["ext/Makefile", *extension_source] do
cd "ext" do
- sh "make"
+ if ENV['TEST']
+ sh "make cflags=\"-D TEST\""
+ else
+ sh "make"
+ end
end
end
diff --git a/ext/decoder.c b/ext/decoder.c
index c234451..24628d4 100644
--- a/ext/decoder.c
+++ b/ext/decoder.c
@@ -53,7 +53,7 @@ base32_decode_buffer_size (const size_t encodedTextLength)
{
if (encodedTextLength == 0 || encodedTextLength % 8 != 0)
return 0;
- return encodedTextLength * 8 / 5;
+ return encodedTextLength * 5 / 8;
}
size_t
diff --git a/ext/ext.c b/ext/ext.c
index c038add..46015e2 100644
--- a/ext/ext.c
+++ b/ext/ext.c
@@ -39,6 +39,9 @@ b32_decode (VALUE self, VALUE value)
return value;
VALUE result = rb_str_new (0, base32_decode_buffer_size (RSTRING (value)->len));
+#ifdef TEST
+ memset(RSTRING (result)->ptr, 0xff, RSTRING (result)->len);
+#endif
size_t length = base32_decode ((uint8_t *) RSTRING (result)->ptr, RSTRING (result)->len,
(uint8_t *) RSTRING (value)->ptr, RSTRING (value)->len);
if (length == 0)
@@ -60,17 +63,36 @@ b32_encode (VALUE self, VALUE value)
value = StringValue(value);
VALUE result = rb_str_new (0, base32_encoder_buffer_size (RSTRING (value)->len));
+#ifdef TEST
+ memset(RSTRING (result)->ptr, 0xff, RSTRING (result)->len);
+#endif
base32_encode ((uint8_t *) RSTRING (result)->ptr, RSTRING (result)->len,
(uint8_t *) RSTRING (value)->ptr, RSTRING (value)->len);
return result;
}
+#ifdef TEST
+static VALUE
+b32_test_strlen (VALUE self, VALUE value)
+{
+ return UINT2NUM (strlen (RSTRING (value)->ptr));
+}
+#endif
+
+
VALUE mBase32;
+#ifdef TEST
+VALUE mBase32Test;
+#endif
void Init_base32 ()
{
mBase32 = rb_define_module ("Base32");
rb_define_module_function(mBase32, "decode", b32_decode, 1);
rb_define_module_function(mBase32, "encode", b32_encode, 1);
+#ifdef TEST
+ mBase32Test = rb_define_module ("Base32Test");
+ rb_define_module_function(mBase32Test, "strlen", b32_test_strlen, 1);
+#endif
}
diff --git a/test/base32_test.rb b/test/base32_test.rb
index 8bceae9..f2a7b3e 100644
--- a/test/base32_test.rb
+++ b/test/base32_test.rb
@@ -23,11 +23,15 @@ require 'base32'
class TestBase32 < Test::Unit::TestCase
def assert_decoding(encoded, plain)
- assert_equal(plain, Base32.decode(encoded))
+ decoded = Base32.decode(encoded)
+ assert_equal(plain, decoded)
+ assert_equal(decoded.size, Base32Test.strlen(decoded))
end
def assert_encoding(encoded, plain)
- assert_equal(encoded, Base32.encode(plain))
+ actual = Base32.encode(plain)
+ assert_equal(encoded, actual)
+ assert_equal(actual.size, Base32Test.strlen(actual))
end
def assert_encode_and_decode(encoded, plain)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment