my $value = $self->get($key);
- if ($value && !$self->{test_mode}) {
+ if ($value) {
# cache hit!
return $value;
}
sub hget {
my ($self, $key, $field) = @_;
- return if $self->{test_mode};
my $r = $self->_connect;
my $result = $r->hget($key, $field);
return $result;
}
+sub hash_set {
+ my ($self, $key, $hash, $expire) = @_;
+ if (ref($hash) ne "HASH") {
+ return;
+ }
+
+ my $r = $self->_connect;
+ my $result;
+
+ my @args;
+ push @args, $key;
+ for my $item (%$hash) {
+ if (ref($item)) {
+ push @args, $self->_encode($item);
+ }
+ else {
+ push @args, $item;
+ }
+ }
+ $result = $r->hmset(@args);
+
+ if (!$result) {
+ $self->_quit;
+ return $result;
+ }
+ if ($expire) {
+ $r->expire($key, $expire);
+ }
+ $self->_quit;
+ return $result;
+}
+
+sub hash_get {
+ my ($self, $key) = @_;
+
+ my $r = $self->_connect;
+ my $result;
+ if ($r->exists($key)) {
+ $result = $r->hgetall($key);
+ }
+ $self->_quit;
+
+ if ($result) {
+ return {@$result};
+ }
+ return;
+}
+
sub set {
my ($self, $key, $value, $expire, $flag, @rest) = @_;
my $option = {@rest};
my $self = shift;
my $key = shift;
- return if $self->{test_mode};
-
my $r = $self->_connect;
my $result = $r->get($key);
$self->_quit;
my $cnf = $app->config->{KeyValueStore} ||= {};
$cnf->{type} ||= "redis";
$cnf->{host} ||= "localhost:6379";
- $cnf->{test_mode} ||= 0;
$cnf->{index_number} ||= 0;
$self->{conf} = {%$conf, %$cnf};
- if ($self->{conf}->{test_mode}) {
- # if test_mode == 1, already yield cache miss
- $self->{test_mode} = 1;
- }
$self->{index_number} = $self->{conf}->{index_number} || 0;
$self->{app} = $app;
--- /dev/null
+# -*-Perl-*-
+use Mojo::Base -strict;
+
+use Test::More;
+use Test::Mojo;
+
+use IO::Compress::Gzip qw(gzip);
+use IO::Uncompress::Gunzip qw(gunzip);
+
+my $t = Test::Mojo->new('Newslash::Web');
+my $app = $t->app;
+
+my $kvs = $app->kvs;
+ok($kvs, "KeyValueStore enabled");
+
+use constant EXPIRE => 10;
+
+subtest 'KeyValueStore test' => sub {
+ plan skip_all => "KeyValueStore is not enabled" if !$kvs;
+
+ # simple cache
+ my $testvalue = "testvalue";
+ ok($kvs->set(".testkey1", $testvalue, EXPIRE), "cache testvalue");
+ is($kvs->get(".testkey1"), $testvalue, "get testvalue");
+ ok($kvs->del(".testkey1"), "delete cache");
+
+ my $testvalue2 = { foo => "bar", hoge => 1 };
+ ok($kvs->set(".testkey2", $testvalue2, EXPIRE), "cache hashvalue");
+ is_deeply($kvs->get(".testkey2"), $testvalue2, "get hashvalue");
+ ok($kvs->del(".testkey2"), "delete cache");
+
+ # hash cache
+ my $testvalue3 = { foo => "bar", hoge => 1 };
+ ok($kvs->hash_set(".testkey3", $testvalue3, EXPIRE), "kvs cache hashvalue");
+ is_deeply($kvs->hash_get(".testkey3"), $testvalue3, "kvs get hashvalue");
+ ok($kvs->del(".testkey3"), "delete kvs cache");
+
+ # binary data caching
+ my $test_text = "あいうえおかきくけこ";
+ my $test_text_bin = Encode::encode_utf8($test_text);
+ gzip(\$test_text_bin, \my $compressed);
+ my $testvalue4 = { foo => "bar", gzipped => $compressed };
+ ok($kvs->hash_set(".testkey4", $testvalue4, EXPIRE), "kvs cache binary value");
+ is_deeply($kvs->hash_get(".testkey4"), $testvalue4, "kvs get binary value");
+
+ my $gunzipped;
+ my $c = $kvs->hash_get(".testkey4")->{gzipped};
+ is($c, $compressed, "get gzipped item");
+
+ gunzip(\$compressed, \$gunzipped);
+ is($gunzipped, $test_text_bin, "gunzip succeeded (not cached item)");
+ is(Encode::decode_utf8($gunzipped), $test_text, "gunzipped item is valid text");
+
+ gunzip(\$c, \$gunzipped);
+ is($gunzipped, $test_text_bin, "gunzip succeeded (cached item)");
+ is(Encode::decode_utf8($gunzipped), $test_text, "gunzipped item is valid text");
+
+ ok($kvs->del(".testkey4"), "delete kvs cache");
+
+};
+
+done_testing;