memcache_check 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 93a54941a1ac5c17564d14f5ab974f3d1ace1148
4
- data.tar.gz: faf2d53e47d3f989b43960978f7682b449f423a8
3
+ metadata.gz: e8c9f252507107f19b6767e5e377372087a3d0e9
4
+ data.tar.gz: ea8b9a78e5dbe898b2ff9b8ec0f2c06e4f1282e8
5
5
  SHA512:
6
- metadata.gz: 3f9f221d9aba6cc31ab5c560abf0e48e369e7cc8e18471f8bec4f953d6a2a60b7e7e7bb179678317fcfc5671ef58063ead40d7f29d623c07c1bb24ccd8fc48c6
7
- data.tar.gz: 506bdb02a49042a93ff2c2316fdd9aa242a9c5b815ffeb5e688e229e2a073392d451a3f9b724393082f0efc6b72d4e025c5714b716f24c12dc140b566c9db7cc
6
+ metadata.gz: b4bc79da94b12c7751d3fbb1e80beccee64df3aa47aeff0ce62ad05a15ac1d4ee8c563bf5439881c43220be112d7941dac57f2fb041a81c09d1532bbe9eebb06
7
+ data.tar.gz: 38291151d049fb7d0de9215a3537419fe2f524dd31779d1c377f50cb1f8402cdc45d9fc9ec916ee635a5a9bb96cee5a269a3d7862d89b1c50a2d7c8a5f885fe1
data/README.md CHANGED
@@ -24,6 +24,11 @@ Or install it yourself as:
24
24
 
25
25
  ## Usage
26
26
 
27
+ There are now 2 primary methods to use the gem. The original single server
28
+ benchmark and the new group benchmark.
29
+
30
+ ### Single
31
+
27
32
  Create an instance of MemcacheCheck::Checker and pass in an argument of
28
33
  the server's IP address as a string. If you don't pass an IP address in it
29
34
  will default to localhost. You can optionally pass in a second argument of
@@ -41,6 +46,7 @@ The start method returns an array of 3 numbers:
41
46
 
42
47
  example.rb
43
48
 
49
+ ```ruby
44
50
  require 'memcache_check'
45
51
 
46
52
  memcache_check = MemcacheCheck::Checker.new('127.0.0.1')
@@ -49,13 +55,61 @@ example.rb
49
55
  puts "Number of passes: #{passes}"
50
56
  puts "Number of failures: #{fails}"
51
57
  puts "Total time: #{time} seconds"
58
+ ```
52
59
 
53
60
  Running on my local machine this produces:
54
61
 
55
62
  Number of passes: 500
56
63
  Number of failures: 0
57
- Total time: 0.61212 seconds
64
+ Total time: 0.369204 seconds
65
+
66
+ ### Group
67
+
68
+ Pass a list of hostnames and/or IP addresses to
69
+ MemcacheCheck::Checker.group_benchmark. It runs 100 set and get checks
70
+ against each hostname and returns an array of Server objects once the
71
+ benchmark has completed.
72
+
73
+ The Server attributes available are:
74
+ - hostname (string)
75
+ - port (string)
76
+ - passes (fixnum)
77
+ - fails (fixnum)
78
+ - time (Benchmark::Tms)
79
+
80
+ example.rb
81
+
82
+ ```ruby
83
+ require 'memcache_check'
84
+
85
+ memcache_check = MemcacheCheck::Checker.group_benchmark('127.0.0.1', 'localhost', '127.0.0.1')
58
86
 
87
+ memcache_check.each do |server|
88
+ puts "Server: #{server.hostname}"
89
+ puts "Number of passes: #{server.passes}"
90
+ puts "Number of failures: #{server.fails}"
91
+ puts "Total time: #{server.time.real.round(3)}"
92
+ puts
93
+ end
94
+ ```
95
+
96
+ Running on my local machine this produces:
97
+
98
+ Server: 127.0.0.1
99
+ Number of passes: 100
100
+ Number of failures: 0
101
+ Total time: 0.074
102
+
103
+ Server: localhost
104
+ Number of passes: 100
105
+ Number of failures: 0
106
+ Total time: 0.066
107
+
108
+
109
+ Server: 127.0.0.1
110
+ Number of passes: 100
111
+ Number of failures: 0
112
+ Total time: 0.082
59
113
 
60
114
 
61
115
  ## Contributing
@@ -1,78 +1,3 @@
1
- require "memcache_check/version"
2
- require 'dalli'
3
- require 'faker'
4
- require 'benchmark'
5
-
6
- module MemcacheCheck
7
- class Checker
8
- attr_reader :passes, :fails
9
-
10
- def initialize(server = 'localhost', port = '11211')
11
- @server = Server.new(server, port)
12
- @passes = 0
13
- @fails = 0
14
- end
15
-
16
- def start(num_times = 50)
17
- time = Benchmark.measure do
18
- num_times.times do
19
- test_server
20
- end
21
- end
22
- [@passes, @fails, time.real]
23
- end
24
-
25
- def test_server
26
- key, value = create_key_value_pair
27
- begin
28
- @server.set(key, value)
29
- if is_valid?(key, value)
30
- @passes += 1
31
- else
32
- @fails += 1
33
- end
34
- rescue
35
- @fails += 1
36
- end
37
- end
38
-
39
- def create_key_value_pair
40
- [Utils.generate_key, Utils.generate_test_data]
41
- end
42
-
43
- def is_valid?(key, value)
44
- value == @server.get(key)
45
- end
46
- end
47
-
48
- class Server
49
- def initialize(host, port)
50
- @memcache = Dalli::Client.new("#{host}:#{port}")
51
- end
52
-
53
- def set(key, value)
54
- @memcache.set(key, value)
55
- end
56
-
57
- def get(key)
58
- @memcache.get(key)
59
- end
60
- end
61
-
62
- class Utils
63
- def self.generate_key
64
- "MemcacheCheck" + Time.now.strftime("%s%6N")
65
- end
66
-
67
- def self.generate_test_data
68
- {
69
- name: Faker::Name.name,
70
- email: Faker::Internet.email,
71
- phone: Faker::PhoneNumber.phone_number,
72
- city: Faker::Address.city,
73
- state: Faker::Address.state,
74
- bio: Faker::Lorem.words(num = 100).join(", ")
75
- }
76
- end
77
- end
78
- end
1
+ require 'memcache_check/utils'
2
+ require 'memcache_check/server'
3
+ require 'memcache_check/checker'
@@ -0,0 +1,22 @@
1
+ module MemcacheCheck
2
+ class Checker
3
+ def initialize(hostname = 'localhost', port = '11211')
4
+ @server = Server.new(hostname, port)
5
+ end
6
+
7
+ def start(num_times = 50)
8
+ @server.benchmark(num_times)
9
+ [@server.passes, @server.fails, @server.time.real]
10
+ end
11
+
12
+ def self.group_benchmark(*args)
13
+ group = []
14
+ args.each do |hostname|
15
+ server = Server.new(hostname)
16
+ server.benchmark(100)
17
+ group << server
18
+ end
19
+ group
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,60 @@
1
+ require 'dalli'
2
+ require 'benchmark'
3
+
4
+ module MemcacheCheck
5
+ class Server
6
+ attr_reader :hostname, :port, :passes, :fails, :time
7
+
8
+ def initialize(hostname = '127.0.0.1', port = '11211')
9
+ @memcache_client = Dalli::Client.new("#{hostname}:#{port}")
10
+ @hostname = hostname
11
+ @port = port
12
+ @passes = 0
13
+ @fails = 0
14
+ end
15
+
16
+ def benchmark(num_times)
17
+ test_run
18
+ @time = Benchmark.measure do
19
+ num_times.times do
20
+ run_test
21
+ end
22
+ end
23
+ end
24
+
25
+ def run_test
26
+ key, value = Utils.generate_key_value_pair
27
+ begin
28
+ set(key, value)
29
+ if is_valid?(key, value)
30
+ @passes += 1
31
+ else
32
+ @fails += 1
33
+ end
34
+ rescue
35
+ @fails += 1
36
+ end
37
+ end
38
+
39
+ def test_run
40
+ key, value = Utils.generate_key_value_pair
41
+ begin
42
+ set(key, value)
43
+ get(key)
44
+ rescue
45
+ end
46
+ end
47
+
48
+ def set(key, value)
49
+ @memcache_client.set(key, value)
50
+ end
51
+
52
+ def get(key)
53
+ @memcache_client.get(key)
54
+ end
55
+
56
+ def is_valid?(key, value)
57
+ value == get(key)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,26 @@
1
+ require 'faker'
2
+
3
+ module MemcacheCheck
4
+ module Utils
5
+ extend self
6
+
7
+ def generate_key_value_pair
8
+ [generate_key, generate_test_data]
9
+ end
10
+
11
+ def generate_key
12
+ "MemcacheCheck" + Time.now.strftime("%s%6N")
13
+ end
14
+
15
+ def generate_test_data
16
+ {
17
+ name: Faker::Name.name,
18
+ email: Faker::Internet.email,
19
+ phone: Faker::PhoneNumber.phone_number,
20
+ city: Faker::Address.city,
21
+ state: Faker::Address.state,
22
+ bio: Faker::Lorem.words(num = 100).join(", ")
23
+ }
24
+ end
25
+ end
26
+ end
@@ -1,3 +1,3 @@
1
1
  module MemcacheCheck
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.version = MemcacheCheck::VERSION
9
9
  spec.authors = ["Mike Admire"]
10
10
  spec.email = ["mike@mikeadmire.com"]
11
- spec.description = %q{Run checks against a Memcached server}
11
+ spec.description = %q{Ruby gem to test the speed of a Memcached server and verify that it's working correctly.}
12
12
  spec.summary = %q{MemcacheCheck runs a series of set and get commands against a Memcache host to validate data integrity, verify that the host is responding correctly, and benchmark host speed.}
13
13
  spec.homepage = "https://github.com/mikeadmire/memcache_check"
14
14
  spec.license = "MIT"
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rspec"
24
- spec.add_development_dependency "ZenTest", "~> 4.9.2"
24
+ spec.add_development_dependency "ZenTest", "~> 4.9.3"
25
25
 
26
26
  spec.add_runtime_dependency "dalli"
27
27
  spec.add_runtime_dependency "faker"
@@ -5,34 +5,81 @@ require 'memcache_check'
5
5
  describe MemcacheCheck do
6
6
 
7
7
  describe "Checker" do
8
-
9
8
  before(:each) do
10
9
  @checker = MemcacheCheck::Checker.new
11
10
  end
12
11
 
13
12
  it { MemcacheCheck::Checker.should respond_to(:new) }
14
13
 
15
- context "start" do
16
- it { @checker.should respond_to(:start).with(1).arguments }
14
+ describe "start" do
15
+ it { @checker.should respond_to(:start).with(1).arguments }
16
+
17
+ it "returns an array" do
18
+ expect(@checker.start).to be_an_instance_of(Array)
19
+ end
20
+
21
+ it "returns an array with 3 numeric elements" do
22
+ passes, fails, time = @checker.start
23
+ expect(passes).to be_an_instance_of(Fixnum)
24
+ expect(fails).to be_an_instance_of(Fixnum)
25
+ expect(time).to be_an_instance_of(Float)
26
+ end
27
+
28
+ it "passes and fails should add up to correct number" do
29
+ passes, fails, time = @checker.start(50)
30
+ expect(passes + fails).to eq(50)
31
+ end
17
32
 
18
- it "returns an array" do
19
- expect(@checker.start).to be_an_instance_of(Array)
33
+ it "passes while running locally" do
34
+ passes, fails, time = @checker.start(50)
35
+ expect(passes).to eq(50)
36
+ end
37
+ end # context 'start'
38
+
39
+ describe "group_benchmark" do
40
+ before(:each) do
41
+ @response_array = MemcacheCheck::Checker.group_benchmark('localhost', '127.0.0.1', 'localhost')
42
+ end
43
+
44
+ it { MemcacheCheck::Checker.should respond_to(:group_benchmark) }
45
+
46
+ it "returns an array the same length as the number of hostname arguments" do
47
+ expect(@response_array.length).to eq(3)
48
+ end
49
+
50
+ it "returns an array of Server objects" do
51
+ expect(@response_array.first).to be_an_instance_of(MemcacheCheck::Server)
52
+ end
53
+
54
+ it "passes and fails should add up to the correct number" do
55
+ @response_array.each do |i|
56
+ expect(i.passes + i.fails).to eq(100)
20
57
  end
58
+ end
21
59
 
22
- it "returns an array with 3 numeric elements" do
23
- passes, fails, time = @checker.start
24
- expect(passes).to be_an_instance_of(Fixnum)
25
- expect(fails).to be_an_instance_of(Fixnum)
26
- expect(time).to be_an_instance_of(Float)
60
+ it "passes every time when running local" do
61
+ @response_array.each do |i|
62
+ expect(i.passes).to eq(100)
27
63
  end
64
+ end
28
65
 
29
- it "passes and fails should add up to correct number" do
30
- passes, fails, time = @checker.start(50)
31
- expect(passes + fails).to eq(50)
66
+ it "response hostname and time are populated" do
67
+ @response_array.each do |i|
68
+ expect(i.hostname).to_not be_nil
69
+ expect(i.time).to be_an_instance_of(Benchmark::Tms)
32
70
  end
33
- end
71
+ end
34
72
 
35
- end
73
+ it "localhost should be close to the same twice in a row" do
74
+ first = @response_array[0]
75
+ second = @response_array[1]
76
+ third = @response_array[2]
77
+ expect(first.time.real.round(1)).to eq(second.time.real.round(1))
78
+ expect(second.time.real.round(1)).to eq(third.time.real.round(1))
79
+ end
80
+ end # group_benchmark
81
+
82
+ end # Checker
36
83
 
37
84
  context "Server" do
38
85
  before(:each) do
@@ -49,69 +96,67 @@ describe MemcacheCheck do
49
96
  it "set and retrieve data from memcached" do
50
97
  key = "abc123"
51
98
  value = {name: 'Mike Admire',
52
- text: "Lorem ipsum dolor sit amet, consectetur adipisicing" }
99
+ text: "Lorem ipsum dolor sit amet, consectetur adipisicing" }
53
100
  @tester.set(key, value)
54
101
  expect(@tester.get(key)).to eq(value)
55
102
  end
56
- end
103
+ end # context 'Server'
57
104
 
58
105
 
59
106
  describe "Utils" do
60
- it { MemcacheCheck::Utils.should respond_to :generate_key }
61
- it { MemcacheCheck::Utils.should respond_to :generate_test_data }
107
+ it { MemcacheCheck::Utils.should respond_to :generate_key_value_pair }
62
108
 
63
- context "generate_key" do
109
+ describe "generate_key_value_pair" do
64
110
  before(:each) do
65
- @key = MemcacheCheck::Utils.generate_key
111
+ @key, @data = MemcacheCheck::Utils.generate_key_value_pair
66
112
  end
67
113
 
68
- it "can generate an appropriate sized key" do
69
- expect(@key.length).to be >= 25
70
- end
114
+ context "key" do
115
+ it "can generate an appropriate sized key" do
116
+ expect(@key.length).to be >= 25
117
+ end
71
118
 
72
- it "starts with the string MemCacheCheck in key" do
73
- expect(@key).to start_with("MemcacheCheck")
74
- end
119
+ it "starts with the string MemCacheCheck in key" do
120
+ expect(@key).to start_with("MemcacheCheck")
121
+ end
75
122
 
76
- it "is unique" do
77
- key1 = MemcacheCheck::Utils.generate_key
78
- key2 = MemcacheCheck::Utils.generate_key
79
- key3 = MemcacheCheck::Utils.generate_key
80
- expect(@key).to_not eq(key1)
81
- expect(@key).to_not eq(key2)
82
- expect(@key).to_not eq(key3)
83
- expect(key1).to_not eq(key2)
84
- expect(key1).to_not eq(key3)
85
- expect(key2).to_not eq(key3)
86
- end
87
- end # generate_key
123
+ it "is unique" do
124
+ key1 = MemcacheCheck::Utils.generate_key_value_pair.first
125
+ key2 = MemcacheCheck::Utils.generate_key_value_pair.first
126
+ key3 = MemcacheCheck::Utils.generate_key_value_pair.first
127
+ expect(@key).to_not eq(key1)
128
+ expect(@key).to_not eq(key2)
129
+ expect(@key).to_not eq(key3)
130
+ expect(key1).to_not eq(key2)
131
+ expect(key1).to_not eq(key3)
132
+ expect(key2).to_not eq(key3)
133
+ end
134
+ end # context 'key'
88
135
 
89
- context "generate_test_data" do
90
- before(:each) do
91
- @data = MemcacheCheck::Utils.generate_test_data
92
- end
136
+ context "value" do
137
+ it "generates a data hash" do
138
+ expect(@data).to be_an_instance_of(Hash)
139
+ end
93
140
 
94
- it "generates a data hash" do
95
- expect(@data).to be_an_instance_of(Hash)
96
- end
141
+ it "is a reasonable amount of data" do
142
+ expect(@data.length).to be >= 5
143
+ expect(@data.to_s.length).to be >= 500
144
+ end
97
145
 
98
- it "is a reasonable amount of data" do
99
- expect(@data.length).to be >= 5
100
- expect(@data.to_s.length).to be >= 500
101
- end
146
+ it "is unique" do
147
+ data1 = MemcacheCheck::Utils.generate_key_value_pair.last
148
+ data2 = MemcacheCheck::Utils.generate_key_value_pair.last
149
+ data3 = MemcacheCheck::Utils.generate_key_value_pair.last
150
+ expect(@data).to_not eq(data1)
151
+ expect(@data).to_not eq(data2)
152
+ expect(@data).to_not eq(data3)
153
+ expect(data1).to_not eq(data2)
154
+ expect(data1).to_not eq(data3)
155
+ expect(data2).to_not eq(data3)
156
+ end
157
+ end # context 'value'
102
158
 
103
- it "is unique" do
104
- data1 = MemcacheCheck::Utils.generate_test_data
105
- data2 = MemcacheCheck::Utils.generate_test_data
106
- data3 = MemcacheCheck::Utils.generate_test_data
107
- expect(@data).to_not eq(data1)
108
- expect(@data).to_not eq(data2)
109
- expect(@data).to_not eq(data3)
110
- expect(data1).to_not eq(data2)
111
- expect(data1).to_not eq(data3)
112
- expect(data2).to_not eq(data3)
113
- end
114
- end # generate_test_data
159
+ end # generate_key_value_pair
115
160
  end # Utils
116
-
161
+
117
162
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: memcache_check
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Admire
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-08 00:00:00.000000000 Z
11
+ date: 2013-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: 4.9.2
61
+ version: 4.9.3
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: 4.9.2
68
+ version: 4.9.3
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: dalli
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -94,7 +94,8 @@ dependencies:
94
94
  - - '>='
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
- description: Run checks against a Memcached server
97
+ description: Ruby gem to test the speed of a Memcached server and verify that it's
98
+ working correctly.
98
99
  email:
99
100
  - mike@mikeadmire.com
100
101
  executables: []
@@ -109,6 +110,9 @@ files:
109
110
  - Rakefile
110
111
  - autotest/discover.rb
111
112
  - lib/memcache_check.rb
113
+ - lib/memcache_check/checker.rb
114
+ - lib/memcache_check/server.rb
115
+ - lib/memcache_check/utils.rb
112
116
  - lib/memcache_check/version.rb
113
117
  - memcache_check.gemspec
114
118
  - spec/lib/memcache_check_spec.rb