opentoken 1.2.3 → 1.2.5

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 454da937c0af7d6f9156b0d1cc82e0c3bc22d2b8
4
+ data.tar.gz: 9dca1286d13a5c1f273065b5fefa5482eae24d74
5
+ SHA512:
6
+ metadata.gz: 2ce6c44f2d4b5e0e5cc1679c485ce1b2089afa84de9b5a49e2a83cd7840f8d8d9dab49ae4ea3d527dfd23c24faf1cd620ccf32bfaf081df72926e4f21587daef
7
+ data.tar.gz: bed7bdb2ba6d142b41af5c2499684f7096915aea78e1539b471110ae24cbc189da7828a8389f5af6d7cb7ca58633a9eb3c7fd24188c38a9269b1400959a007dc
data/.rvmrc CHANGED
@@ -1,5 +1 @@
1
- rvm use 1.9.3-p125@opentoken --create
2
- if ! command -v bundle ; then
3
- gem install bundler
4
- bundle install --local
5
- fi
1
+ rvm use default@opentoken --create
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.1
data/README.md CHANGED
@@ -1,3 +1,4 @@
1
+ [![Build Status](https://travis-ci.org/socialcast/opentoken.svg)](https://travis-ci.org/socialcast/opentoken)
1
2
  # opentoken
2
3
 
3
4
  Parse encrypted opentoken properties
@@ -17,9 +18,9 @@ attributes = OpenToken.decode 'opentoken-hashed-string'
17
18
  attributes = { 'subject' => 'foo', 'bar' => 'bak' }
18
19
  token = OpenToken.encode attributes, OpenToken::Cipher::AES_128_CBC
19
20
  ```
20
-
21
+
21
22
  ## Contributing
22
-
23
+
23
24
  * Fork the project
24
25
  * Fix the issue
25
26
  * Add tests
data/Rakefile CHANGED
@@ -1,11 +1,6 @@
1
1
  require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
3
 
4
- require 'rake/testtask'
5
- Rake::TestTask.new(:test) do |test|
6
- test.libs << 'lib' << 'test'
7
- test.test_files = FileList['test/test*.rb']
8
- test.verbose = true
9
- end
10
-
11
- task :default => :test
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new('spec')
6
+ task :default => :spec
@@ -1,6 +1,6 @@
1
1
  module OpenToken
2
2
  class PasswordKeyGenerator
3
- SHA1_DIGEST = OpenSSL::Digest::Digest.new('sha1')
3
+ SHA1_DIGEST = OpenSSL::Digest.new('sha1')
4
4
 
5
5
  class << self
6
6
  def generate(password, cipher)
@@ -12,16 +12,16 @@ module OpenToken
12
12
  def generate_block(password, salt, count, index)
13
13
  mac = salt
14
14
  mac += [index].pack("N")
15
-
15
+
16
16
  result = OpenSSL::HMAC.digest(SHA1_DIGEST, password, mac)
17
17
  cur = result
18
-
18
+
19
19
  i_count = 1
20
20
  while i_count < count
21
21
  i_count +=1
22
-
22
+
23
23
  cur = OpenSSL::HMAC.digest(SHA1_DIGEST, password, cur)
24
-
24
+
25
25
  20.times do |i|
26
26
  if RUBY_VERSION < "1.9"
27
27
  result[i] = result[i] ^ cur[i]
@@ -33,14 +33,14 @@ module OpenToken
33
33
 
34
34
  return result
35
35
  end
36
-
36
+
37
37
  def generate_impl(password, cipher, salt, iterations)
38
38
  return unless cipher.algorithm
39
39
 
40
40
  key_size = cipher.key_length / 8
41
41
  numblocks = key_size / 20
42
42
  numblocks += 1 if (key_size % 20) > 0
43
-
43
+
44
44
  # Generate the appropriate number of blocks and write their output to
45
45
  # the key bytes; note that it's important to start from 1 (vs. 0) as the
46
46
  # initial block number affects the hash. It's not clear that this fact
@@ -48,7 +48,7 @@ module OpenToken
48
48
  # keys will not match up with test cases defined in RFC 3962.
49
49
  key_buffer_index = 0
50
50
  key = ""
51
-
51
+
52
52
  numblocks.times do |i|
53
53
  i+=1 # Previously zero based, needs to be 1 based
54
54
  block = generate_block(password, salt, iterations, i)
@@ -56,10 +56,10 @@ module OpenToken
56
56
  key += block[0, len]
57
57
  key_buffer_index += len
58
58
  end
59
-
59
+
60
60
  return key
61
61
  end
62
62
  end
63
63
 
64
- end
64
+ end
65
65
  end
@@ -1,3 +1,3 @@
1
1
  module OpenToken
2
- VERSION = '1.2.3'
2
+ VERSION = '1.2.5'
3
3
  end
@@ -6,19 +6,19 @@ Gem::Specification.new do |s|
6
6
  s.name = "opentoken"
7
7
  s.version = OpenToken::VERSION
8
8
  s.platform = Gem::Platform::RUBY
9
- s.authors = ["Ryan Sonnek"]
10
- s.email = ["ryan@socialcast.com"]
11
- s.homepage = "http://github.com/socialcast/opentoken"
9
+ s.authors = ["Socialcast Developers", "Ryan Sonnek"]
10
+ s.email = ["developers@socialcast.com"]
11
+ s.homepage = "https://github.com/socialcast/opentoken"
12
12
  s.summary = %q{ruby implementation of the opentoken specification}
13
13
  s.description = %q{parse opentoken properties passed for Single Signon requests}
14
-
14
+ s.license = "MIT"
15
15
  s.rubyforge_project = "opentoken"
16
16
 
17
17
  s.add_runtime_dependency(%q<activesupport>, [">= 3.0.3"])
18
18
  s.add_runtime_dependency(%q<i18n>, [">= 0"])
19
- s.add_development_dependency(%q<shoulda>, ["2.11.3"])
20
- s.add_development_dependency(%q<timecop>, ["0.3.5"])
21
- s.add_development_dependency(%q<rake>, ["0.9.2"])
19
+ s.add_development_dependency 'rspec', '>= 2.11'
20
+ s.add_development_dependency 'timecop', '>= 0.7'
21
+ s.add_development_dependency 'rake', '>= 0.9.2.2'
22
22
 
23
23
  s.files = `git ls-files`.split("\n")
24
24
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -0,0 +1,85 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe OpenToken do
5
+
6
+ #"renew-until"=>"2010-03-05T07:19:15Z"
7
+ #"not-before"=>"2010-03-04T19:19:15Z"
8
+ #"not-on-or-after"=>"2010-03-04T19:24:15Z"
9
+ describe ".decode" do
10
+
11
+ before do
12
+ OpenToken.password = 'Test123'
13
+ end
14
+
15
+ context "with an aes-128-cbc token with a subject attribute" do
16
+ let(:opentoken) { "T1RLAQJ0Ca97sl6MLJAZDa_hdFzMlicMQBDjqUzrXl0EOXKmpj5oo7L5AACgaWoW8fZizrsLbtxb_F00aTdFmhw8flGy4iGqPWPtqYpdIzQZzg5WvrvYH8Rnq7ckJpYk2YPZw6yNyA4ohG-BgFdTHc0U7CwZTFmodg1MuO0cTh7T98s2RXiTcaZa21MNO0yuXKm2Q10cbrWhnB5yHJUhSHx6JLxlgMTZ0oE0DoUOB6JmoLMYHcyL9hKRiPTh62ky_QmXRaifDNOdl4sH2w**" }
17
+ context "when current time is between expiration dates" do
18
+ subject(:token) do
19
+ result = nil
20
+ Timecop.freeze(Time.iso8601('2010-03-04T19:20:10Z')) do
21
+ result = OpenToken.decode opentoken
22
+ end
23
+ result
24
+ end
25
+ it "decrypts subject from token payload" do
26
+ token[:subject].should == 'john@example.com'
27
+ end
28
+ it "decrypts subject using string or symbol" do
29
+ token['subject'].should == 'john@example.com'
30
+ end
31
+ it "parses 'renew-until' date" do
32
+ token.valid_until.should == Time.iso8601('2010-03-05T07:19:15Z')
33
+ end
34
+ end
35
+ context "when current time is outside clock skew tolerance before expiration date" do
36
+ it do
37
+ Timecop.freeze(Time.iso8601('2010-03-04T19:19:05Z')) do
38
+ expect { OpenToken.decode opentoken }.to raise_error OpenToken::TokenExpiredError
39
+ end
40
+ end
41
+ end
42
+ context "when current time is within clock skew tolerance before expiration date" do
43
+ it do
44
+ Timecop.freeze(Time.iso8601('2010-03-04T19:19:11Z')) do
45
+ expect { OpenToken.decode opentoken }.to_not raise_error
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ context "with a token with an attribute value containing an apostrophe" do
52
+ subject(:token) do
53
+ result = nil
54
+ Timecop.freeze(Time.iso8601('2011-01-13T11:08:02Z')) do
55
+ result = OpenToken.decode("T1RLAQLIjiqgexqi1PQcEKCetvGoSYR2jhDFSIfE5ctlSBxEnq3S1ydjAADQUNRIKJx6_14aE3MQZnDABupGJrKNfoJHFS5VOnKexjMtboeOgst31Hf-D9CZBrpB7Jv0KBwnQ7DN3HizecPT76oX3UGtq_Vi5j5bKYCeObYm9W6h7NY-VzcZY5TTqIuulc2Jit381usAWZ2Sv1c_CWwhrH4hw-x7vUQMSjErvXK1qvsrFCpfNr7XlArx0HjI6kT5XEaHgQNdC0zrLw9cZ4rewoEisR3H5oM7B6gMaP82wTSFVBXvpn5r0KT-Iuc3JuG2en1zVh3GNf110oQCKQ**")
56
+ end
57
+ result
58
+ end
59
+ it "preserves the apostrophe" do
60
+ token[:last_name].should == "D'angelo"
61
+ end
62
+ end
63
+
64
+ context "with a nil token" do
65
+ it { expect { OpenToken.decode(nil) }.to raise_error OpenToken::TokenInvalidError }
66
+ end
67
+
68
+ end
69
+
70
+ describe ".encode" do
71
+ before { OpenToken.password = 'Password1' }
72
+
73
+ context "with aes-128-cbc and subject attribute" do
74
+ let(:attributes_in) { { "subject" => "john", "email" => "john@example.com" } }
75
+ let(:token) { OpenToken.encode attributes_in, OpenToken::Cipher::AES_128_CBC }
76
+ it { OpenToken.decode(token).should == attributes_in }
77
+ end
78
+
79
+ context "with non-ascii utf-8 values" do
80
+ let(:attributes_in) { { "subject" => "André", "email" => "john@example.com" } }
81
+ let(:token) { OpenToken.encode attributes_in, OpenToken::Cipher::AES_128_CBC }
82
+ it { OpenToken.decode(token).should == attributes_in }
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,5 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'rspec/mocks'
4
+ require 'timecop'
5
+ require 'opentoken'
metadata CHANGED
@@ -1,106 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentoken
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
5
- prerelease:
4
+ version: 1.2.5
6
5
  platform: ruby
7
6
  authors:
7
+ - Socialcast Developers
8
8
  - Ryan Sonnek
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-27 00:00:00.000000000 Z
12
+ date: 2014-06-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
16
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
17
  requirements:
19
- - - ! '>='
18
+ - - ">="
20
19
  - !ruby/object:Gem::Version
21
20
  version: 3.0.3
22
21
  type: :runtime
23
22
  prerelease: false
24
23
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
24
  requirements:
27
- - - ! '>='
25
+ - - ">="
28
26
  - !ruby/object:Gem::Version
29
27
  version: 3.0.3
30
28
  - !ruby/object:Gem::Dependency
31
29
  name: i18n
32
30
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
31
  requirements:
35
- - - ! '>='
32
+ - - ">="
36
33
  - !ruby/object:Gem::Version
37
34
  version: '0'
38
35
  type: :runtime
39
36
  prerelease: false
40
37
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
38
  requirements:
43
- - - ! '>='
39
+ - - ">="
44
40
  - !ruby/object:Gem::Version
45
41
  version: '0'
46
42
  - !ruby/object:Gem::Dependency
47
- name: shoulda
43
+ name: rspec
48
44
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
45
  requirements:
51
- - - '='
46
+ - - ">="
52
47
  - !ruby/object:Gem::Version
53
- version: 2.11.3
48
+ version: '2.11'
54
49
  type: :development
55
50
  prerelease: false
56
51
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
52
  requirements:
59
- - - '='
53
+ - - ">="
60
54
  - !ruby/object:Gem::Version
61
- version: 2.11.3
55
+ version: '2.11'
62
56
  - !ruby/object:Gem::Dependency
63
57
  name: timecop
64
58
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
59
  requirements:
67
- - - '='
60
+ - - ">="
68
61
  - !ruby/object:Gem::Version
69
- version: 0.3.5
62
+ version: '0.7'
70
63
  type: :development
71
64
  prerelease: false
72
65
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
66
  requirements:
75
- - - '='
67
+ - - ">="
76
68
  - !ruby/object:Gem::Version
77
- version: 0.3.5
69
+ version: '0.7'
78
70
  - !ruby/object:Gem::Dependency
79
71
  name: rake
80
72
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
73
  requirements:
83
- - - '='
74
+ - - ">="
84
75
  - !ruby/object:Gem::Version
85
- version: 0.9.2
76
+ version: 0.9.2.2
86
77
  type: :development
87
78
  prerelease: false
88
79
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
80
  requirements:
91
- - - '='
81
+ - - ">="
92
82
  - !ruby/object:Gem::Version
93
- version: 0.9.2
83
+ version: 0.9.2.2
94
84
  description: parse opentoken properties passed for Single Signon requests
95
85
  email:
96
- - ryan@socialcast.com
86
+ - developers@socialcast.com
97
87
  executables: []
98
88
  extensions: []
99
89
  extra_rdoc_files: []
100
90
  files:
101
- - .document
102
- - .gitignore
103
- - .rvmrc
91
+ - ".document"
92
+ - ".gitignore"
93
+ - ".rvmrc"
94
+ - ".travis.yml"
104
95
  - CONTRIBUTORS.txt
105
96
  - Gemfile
106
97
  - LICENSE.txt
@@ -113,38 +104,32 @@ files:
113
104
  - lib/opentoken/token.rb
114
105
  - lib/opentoken/version.rb
115
106
  - opentoken.gemspec
116
- - test/helper.rb
117
- - test/test_opentoken.rb
118
- homepage: http://github.com/socialcast/opentoken
119
- licenses: []
107
+ - spec/opentoken_spec.rb
108
+ - spec/spec_helper.rb
109
+ homepage: https://github.com/socialcast/opentoken
110
+ licenses:
111
+ - MIT
112
+ metadata: {}
120
113
  post_install_message:
121
114
  rdoc_options: []
122
115
  require_paths:
123
116
  - lib
124
117
  required_ruby_version: !ruby/object:Gem::Requirement
125
- none: false
126
118
  requirements:
127
- - - ! '>='
119
+ - - ">="
128
120
  - !ruby/object:Gem::Version
129
121
  version: '0'
130
- segments:
131
- - 0
132
- hash: 4385898841292862662
133
122
  required_rubygems_version: !ruby/object:Gem::Requirement
134
- none: false
135
123
  requirements:
136
- - - ! '>='
124
+ - - ">="
137
125
  - !ruby/object:Gem::Version
138
126
  version: '0'
139
- segments:
140
- - 0
141
- hash: 4385898841292862662
142
127
  requirements: []
143
128
  rubyforge_project: opentoken
144
- rubygems_version: 1.8.24
129
+ rubygems_version: 2.2.2
145
130
  signing_key:
146
- specification_version: 3
131
+ specification_version: 4
147
132
  summary: ruby implementation of the opentoken specification
148
133
  test_files:
149
- - test/helper.rb
150
- - test/test_opentoken.rb
134
+ - spec/opentoken_spec.rb
135
+ - spec/spec_helper.rb
@@ -1,19 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
10
- require 'test/unit'
11
- require 'shoulda'
12
- require 'timecop'
13
-
14
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
15
- $LOAD_PATH.unshift(File.dirname(__FILE__))
16
- require 'opentoken'
17
-
18
- class Test::Unit::TestCase
19
- end
@@ -1,135 +0,0 @@
1
- require 'helper'
2
-
3
- class TestOpentoken < Test::Unit::TestCase
4
- # OpenToken.debug = true
5
-
6
- #"renew-until"=>"2010-03-05T07:19:15Z"
7
- #"not-before"=>"2010-03-04T19:19:15Z"
8
- #"not-on-or-after"=>"2010-03-04T19:24:15Z"
9
- context "aes-128-cbc token with subject attribute" do
10
- setup do
11
- @opentoken = "T1RLAQJ0Ca97sl6MLJAZDa_hdFzMlicMQBDjqUzrXl0EOXKmpj5oo7L5AACgaWoW8fZizrsLbtxb_F00aTdFmhw8flGy4iGqPWPtqYpdIzQZzg5WvrvYH8Rnq7ckJpYk2YPZw6yNyA4ohG-BgFdTHc0U7CwZTFmodg1MuO0cTh7T98s2RXiTcaZa21MNO0yuXKm2Q10cbrWhnB5yHJUhSHx6JLxlgMTZ0oE0DoUOB6JmoLMYHcyL9hKRiPTh62ky_QmXRaifDNOdl4sH2w**"
12
- @password = 'Test123'
13
- OpenToken.password = @password
14
- end
15
- context "decoding token between expiration dates" do
16
- setup do
17
- Timecop.travel(Time.iso8601('2010-03-04T19:20:10Z')) do
18
- assert_nothing_raised do
19
- @token = OpenToken.decode @opentoken
20
- end
21
- end
22
- end
23
- should "decrypt subject from token payload" do
24
- assert_equal 'john@example.com', @token[:subject]
25
- end
26
- should "decrypt subject using string or symbol" do
27
- assert_equal 'john@example.com', @token['subject']
28
- end
29
- should "parse 'renew-until' date" do
30
- assert_equal Time.iso8601('2010-03-05T07:19:15Z'), @token.valid_until
31
- end
32
- end
33
-
34
- context "decoding token when current time is outside clock skew tolerance of before expiration date" do
35
- should "raise TokenExpiredError" do
36
- Timecop.travel(Time.iso8601('2010-03-04T19:19:05Z')) do
37
- assert_raises OpenToken::TokenExpiredError do
38
- @token = OpenToken.decode @opentoken
39
- end
40
- end
41
- end
42
- end
43
-
44
- context "decoding token when current time is within clock skew tolerance of before expiration date" do
45
- should "not raise TokenExpiredError" do
46
- Timecop.travel(Time.iso8601('2010-03-04T19:19:10Z')) do
47
- assert_nothing_raised do
48
- @token = OpenToken.decode @opentoken
49
- end
50
- end
51
- end
52
- end
53
-
54
- context "decoding token when current time is equal to expiration date" do
55
- should "not raise TokenExpiredError" do
56
- Timecop.travel(Time.iso8601('2010-03-04T19:24:15Z')) do
57
- assert_nothing_raised do
58
- @token = OpenToken.decode @opentoken
59
- end
60
- end
61
- end
62
- end
63
-
64
- context "decoding token when current time is within clock skew tolerance of expiration date" do
65
- should "not raise TokenExpiredError" do
66
- Timecop.travel(Time.iso8601('2010-03-04T19:24:19Z')) do
67
- assert_nothing_raised do
68
- @token = OpenToken.decode @opentoken
69
- end
70
- end
71
- end
72
- end
73
-
74
- context "decoding token when current time is outside clock skew tolerance of expiration date" do
75
- should "raise TokenExpiredError" do
76
- Timecop.travel(Time.iso8601('2010-03-04T19:24:25Z')) do
77
- assert_raises OpenToken::TokenExpiredError do
78
- @token = OpenToken.decode @opentoken
79
- end
80
- end
81
- end
82
- end
83
-
84
- context "decoding token with attribute value containing apostrophe" do
85
- setup do
86
- Timecop.travel(Time.iso8601('2011-01-13T11:08:01Z')) do
87
- @opentoken = "T1RLAQLIjiqgexqi1PQcEKCetvGoSYR2jhDFSIfE5ctlSBxEnq3S1ydjAADQUNRIKJx6_14aE3MQZnDABupGJrKNfoJHFS5VOnKexjMtboeOgst31Hf-D9CZBrpB7Jv0KBwnQ7DN3HizecPT76oX3UGtq_Vi5j5bKYCeObYm9W6h7NY-VzcZY5TTqIuulc2Jit381usAWZ2Sv1c_CWwhrH4hw-x7vUQMSjErvXK1qvsrFCpfNr7XlArx0HjI6kT5XEaHgQNdC0zrLw9cZ4rewoEisR3H5oM7B6gMaP82wTSFVBXvpn5r0KT-Iuc3JuG2en1zVh3GNf110oQCKQ**"
88
- @token = OpenToken.decode @opentoken
89
- end
90
- end
91
- should 'preserve apostrophe in attribute payload' do
92
- assert_equal "D'angelo", @token[:last_name]
93
- end
94
- end
95
-
96
- should 'raise invalid token error parsing nil token' do
97
- assert_raises OpenToken::TokenInvalidError do
98
- OpenToken.decode nil
99
- end
100
- end
101
- end
102
-
103
- context "encoding token" do
104
- setup do
105
- OpenToken.password = "Password1"
106
- end
107
- context "with aes-128-cbc and subject attribute" do
108
- setup do
109
- @attributesIn = { "subject" => "john", "email" => "john@example.com"}
110
- @token = OpenToken.encode @attributesIn, OpenToken::Cipher::AES_128_CBC
111
- end
112
- should "be decodable" do
113
- @attributesOut = OpenToken.decode @token
114
- assert_equal @attributesIn, @attributesOut
115
- end
116
- end
117
- end
118
-
119
- context "encoding token with utf-8 values" do
120
- setup do
121
- OpenToken.password = "Password1"
122
- end
123
- context "with aes-128-cbc and subject attribute" do
124
- setup do
125
- @subject = OpenToken.send(:force_encoding, "Andr\xC3\xA9", 'UTF-8')
126
- @attributesIn = { "subject" => @subject, "email" => "john@example.com"}
127
- @token = OpenToken.encode @attributesIn, OpenToken::Cipher::AES_128_CBC
128
- end
129
- should "be decodable" do
130
- @attributesOut = OpenToken.decode @token
131
- assert_equal @attributesIn, @attributesOut
132
- end
133
- end
134
- end
135
- end