rhoconnect 4.0.0.beta.12 → 4.0.0.beta.24

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.
Files changed (88) hide show
  1. data/CHANGELOG.md +34 -0
  2. data/Gemfile +5 -8
  3. data/Gemfile.lock +34 -32
  4. data/Rakefile +2 -12
  5. data/bench/run_bench.sh +1 -1
  6. data/bench/spec/bench_spec_helper.rb +3 -5
  7. data/bin/rhoconnect +20 -13
  8. data/commands/dtach/dtach_install.rb +3 -3
  9. data/commands/generators/update.rb +1 -0
  10. data/commands/parser.rb +180 -0
  11. data/commands/rhoconnect/config.rb +8 -4
  12. data/commands/rhoconnect/get_token.rb +3 -1
  13. data/commands/rhoconnect/routes.rb +34 -0
  14. data/commands/rhoconnect/secret.rb +1 -1
  15. data/commands/rhoconnect/set_admin_password.rb +2 -1
  16. data/commands/rhoconnect/startbg.rb +4 -4
  17. data/commands/rhoconnect/stop.rb +2 -2
  18. data/commands/rhoconnect_console/console.rb +6 -6
  19. data/commands/rhoconnect_spec/spec.rb +2 -1
  20. data/commands/rhoconnect_war/war.rb +1 -0
  21. data/commands/utilities/redis_runner.rb +2 -2
  22. data/doc/data-partitioning.txt +20 -7
  23. data/doc/extending-rhoconnect-server.txt +36 -7
  24. data/doc/push-client-setup-rps.txt +3 -3
  25. data/doc/source-adapters-js.txt +41 -4
  26. data/doc/source-adapters.txt +3 -0
  27. data/generators/templates/application/rcgemfile +1 -5
  28. data/generators/templates/application/spec/spec_helper.rb +0 -9
  29. data/generators/templates/source/models/js/model.js +8 -0
  30. data/generators/templates/source/models/ruby/model.rb +5 -11
  31. data/install.sh +2 -2
  32. data/installer/unix-like/rho_connect_install_constants.rb +3 -3
  33. data/installer/utils/delete_from_s3.rb +3 -6
  34. data/installer/utils/download_from_s3.rb +5 -9
  35. data/installer/utils/verify_checksum.rb +16 -11
  36. data/js-adapters/ballroom.js +9 -0
  37. data/js-adapters/exceptions.js +60 -0
  38. data/js-adapters/node.rb +14 -5
  39. data/js-adapters/node_channel.rb +68 -48
  40. data/js-adapters/rhoconnect_helpers.js +8 -2
  41. data/js-adapters/router.js +16 -14
  42. data/lib/rhoconnect.rb +5 -5
  43. data/lib/rhoconnect/client.rb +2 -2
  44. data/lib/rhoconnect/condition/add_parameter.rb +21 -0
  45. data/lib/rhoconnect/controller/clients_controller.rb +1 -1
  46. data/lib/rhoconnect/controller/js_base.rb +1 -2
  47. data/lib/rhoconnect/controller/system_controller.rb +33 -10
  48. data/lib/rhoconnect/db_adapter.rb +1 -1
  49. data/lib/rhoconnect/document.rb +11 -3
  50. data/lib/rhoconnect/handler/changes.rb +20 -19
  51. data/lib/rhoconnect/handler/changes/engine.rb +48 -25
  52. data/lib/rhoconnect/handler/changes/hooks.rb +36 -0
  53. data/lib/rhoconnect/handler/changes/runner.rb +12 -2
  54. data/lib/rhoconnect/handler/helpers.rb +4 -4
  55. data/lib/rhoconnect/jobs/source_job.rb +1 -1
  56. data/lib/rhoconnect/model/base.rb +32 -8
  57. data/lib/rhoconnect/model/helpers.rb +15 -0
  58. data/lib/rhoconnect/model/helpers/find_duplicates_on_update.rb +85 -0
  59. data/lib/rhoconnect/model/js_base.rb +23 -28
  60. data/lib/rhoconnect/server.rb +23 -18
  61. data/lib/rhoconnect/source.rb +10 -17
  62. data/lib/rhoconnect/store.rb +36 -57
  63. data/lib/rhoconnect/test_methods.rb +5 -4
  64. data/lib/rhoconnect/utilities.rb +7 -5
  65. data/lib/rhoconnect/version.rb +2 -2
  66. data/lib/rhoconnect/web-console/server.rb +17 -16
  67. data/rhoconnect.gemspec +23 -24
  68. data/spec/apps/rhotestapp/controllers/js/js_sample_controller.js +4 -0
  69. data/spec/apps/rhotestapp/models/js/js_sample.js +36 -0
  70. data/spec/apps/rhotestapp/models/ruby/sample_adapter.rb +34 -19
  71. data/spec/async_spec.rb +1 -1
  72. data/spec/cli/cli_spec.rb +69 -31
  73. data/spec/client_sync_spec.rb +30 -13
  74. data/spec/controllers/js_base_spec.rb +10 -4
  75. data/spec/jobs/source_job_spec.rb +1 -1
  76. data/spec/models/{js_model_spec.rb → js_base_spec.rb} +63 -13
  77. data/spec/server/server_spec.rb +20 -0
  78. data/spec/server/stats_spec.rb +7 -17
  79. data/spec/source_adapter_spec.rb +6 -0
  80. data/spec/source_sync_spec.rb +219 -54
  81. data/spec/spec_helper.rb +8 -13
  82. data/spec/store_spec.rb +6 -4
  83. data/spec/test_methods_spec.rb +4 -4
  84. metadata +14 -27
  85. data/commands/execute.rb +0 -48
  86. data/commands/utilities/utilities.rb +0 -6
  87. data/generators/templates/application/controllers/application_controller.rb +0 -17
  88. data/lib/rhoconnect/js_adapter.rb +0 -79
@@ -240,7 +240,7 @@ module Rhoconnect
240
240
  end
241
241
 
242
242
 
243
- def put_zdata(dockey,assoc_key,data={},append=false)
243
+ def put_zdata(dockey,assoc_key,data=[],append=false)
244
244
  get_store(0).put_zdata(dockey, assoc_key, data, append)
245
245
  end
246
246
 
@@ -774,18 +774,25 @@ module Rhoconnect
774
774
  end
775
775
  end
776
776
 
777
- def put_zdata(dockey,assoc_key,data={},append=false)
777
+ def put_zdata(dockey,assoc_key,data=[],append=false)
778
778
  return true unless (dockey and assoc_key and data)
779
779
  flush_zdata(dockey) unless append
780
780
  current_score = 0
781
781
  current_score_data = @db.zrevrange(dockey,0,0,:with_scores => true)
782
782
  current_score = current_score_data[-1][1].to_i if current_score_data and current_score_data[-1]
783
783
  current_score += 1
784
- data.each do |key,hash_value|
785
- unique_record_key = setelement(current_score,assoc_key, key)
786
- @db.zadd(dockey, current_score, unique_record_key)
787
- put_data("#{dockey}:#{unique_record_key}",{key => hash_value})
788
- end
784
+
785
+ data.each_with_index do |source_queue_entry, source_entry_index|
786
+ source_id = source_queue_entry[0]
787
+ source_id_with_index = "#{source_id}:#{source_entry_index}"
788
+ source_entry_data = source_queue_entry[1]
789
+ source_entry_docname = setelement(current_score,assoc_key, source_id_with_index)
790
+ source_entry_data.each_with_index do |obj_entry, obj_index|
791
+ obj_key_with_index = "#{obj_index}_#{obj_entry[0]}"
792
+ put_data("#{dockey}:#{source_entry_docname}",{obj_key_with_index => obj_entry[1]},true)
793
+ end if source_entry_data
794
+ @db.zadd(dockey, current_score, source_entry_docname)
795
+ end if data
789
796
  true
790
797
  end
791
798
 
@@ -793,29 +800,34 @@ module Rhoconnect
793
800
  def get_zdata(dockey)
794
801
  data = @db.zrange(dockey, 0, -1)
795
802
  ret = []
796
- keys = []
797
- unless data.nil?
798
- scores = []
799
- data.each do |zsetkey|
800
- obj_hash = get_data "#{dockey}:#{zsetkey}"
801
- score,key,objkey = getelement(zsetkey)
802
- if scores[-1] != score
803
- ret << obj_hash
804
- keys << key
805
- scores << score
806
- else
807
- ret[-1].merge!(obj_hash)
808
- end
803
+ assoc_keys = []
804
+ scores = []
805
+ data.each do |zsetkey|
806
+ obj_entries = []
807
+ obj_hash = get_data "#{dockey}:#{zsetkey}"
808
+ obj_hash.each do |obj_key_with_index, objdata|
809
+ index,objkey = obj_key_with_index.split('_', 2)
810
+ obj_entries[index.to_i] = [objkey, objdata]
809
811
  end
810
- end
811
- [ret, keys]
812
+ score,assoc_key,source_id_with_index = getelement(zsetkey)
813
+ source_id, source_index = source_id_with_index.split(':', 2)
814
+
815
+ if scores[-1] != score
816
+ ret << [[source_id, obj_entries]]
817
+ assoc_keys << assoc_key
818
+ scores << score
819
+ else
820
+ ret[-1] << [source_id, obj_entries]
821
+ end
822
+ end if data
823
+ [ret, assoc_keys]
812
824
  end
813
825
 
814
826
  # Deletes all keys and their hashes from the Redis DB
815
827
  def flush_zdata(dockey)
816
828
  data = @db.zrange(dockey, 0, -1)
817
- data.each do |hash_key|
818
- _delete_doc("#{dockey}:#{hash_key}")
829
+ data.each do |zsetkey|
830
+ _delete_doc("#{dockey}:#{zsetkey}")
819
831
  end
820
832
  @db.zremrangebyrank(dockey, 0, -1)
821
833
  end
@@ -859,7 +871,6 @@ module Rhoconnect
859
871
 
860
872
  private
861
873
 
862
- if RUBY_VERSION =~ /1.9/
863
874
  def _get_redis(server=nil)
864
875
  url = ENV[REDIS_URL] || ENV[REDISTOGO_URL] || nil
865
876
  if url
@@ -882,23 +893,6 @@ if RUBY_VERSION =~ /1.9/
882
893
  end
883
894
  end
884
895
  end
885
- else # Ruby 1.8 does not support Connnection Pools
886
- def _get_redis(server=nil)
887
- url = ENV[REDIS_URL] || ENV[REDISTOGO_URL] || nil
888
- if url
889
- Redis.connect(:url => url, :timeout => Rhoconnect.redis_timeout, :thread_safe => true)
890
- elsif server and server.is_a?(String)
891
- host,port,db,password = server.split(':')
892
- Redis.connect(:thread_safe => true, :host => host,
893
- :port => port, :db => db, :password => password, :timeout => Rhoconnect.redis_timeout)
894
- elsif server and (server.is_a?(Redis) or server.is_a?(ConnectionPool::Wrapper))
895
- server
896
- else
897
- Redis.connect(:timeout => 30, :thread_safe => true)
898
- end
899
- end
900
- end # end of if RUBY_VERSION
901
-
902
896
 
903
897
  def _lock_key(dockey)
904
898
  "lock:#{dockey}"
@@ -1063,22 +1057,8 @@ end # end of if RUBY_VERSION
1063
1057
  end
1064
1058
 
1065
1059
  # Set Obj Element MUST ensure the order of attribs
1066
- # In 1.8.7 Hash keys are not-sorted - therefore
1067
- # to ensure same order - we sort them before storing
1068
- if RUBY_VERSION =~ /1.8/
1069
- def set_obj_element(key, obj)
1070
- return unless (key and key.size > 0 and obj and obj.size > 0)
1071
- elem = "#{key}"
1072
- obj.sort.each do |attrib, value|
1073
- unless _is_reserved?(attrib,value)
1074
- elem += ":^rho&:#{attrib}:#{value}"
1075
- end
1076
- end
1077
- elem
1078
- end
1079
1060
  # in Ruby 1.9.x Hash keys are sorted (always in the same order), so
1080
1061
  # we do not need to do redundant sorting
1081
- else
1082
1062
  def set_obj_element(key, obj)
1083
1063
  return unless (key and key.size > 0 and obj and obj.size > 0)
1084
1064
  elem = "#{key}"
@@ -1089,6 +1069,5 @@ else
1089
1069
  end
1090
1070
  elem
1091
1071
  end
1092
- end # if Ruby 1.8
1093
1072
  end
1094
1073
  end
@@ -29,9 +29,10 @@ module Rhoconnect
29
29
  handler_sync = lambda { @model.query(params[:query])}
30
30
  @query_engine = Rhoconnect::Handler::Query::Engine.new(@model, handler_sync, {})
31
31
  handler_cud = lambda { @model.send params[:operation].to_sym, params["#{params[:operation]}_object".to_sym] }
32
- @cud_engine = Rhoconnect::Handler::Changes::Engine.new(['create', 'update', 'delete'], @model, handler_cud, {})
32
+ @cud_engine = Rhoconnect::Handler::Changes::Engine.new(['create', 'update', 'delete'], @model, handler_cud, {:queue_key => 'post:/'})
33
33
  handler_search = lambda { @model.search(params[:search]) }
34
34
  @search_engine = Rhoconnect::Handler::Search::Engine.new(@model, @c, handler_search, {})
35
+ Source.define_valid_queues(["create:post:/", "update:post:/", "delete:post:/"])
35
36
  end
36
37
 
37
38
  # Executes the adapter's query method and returns
@@ -163,7 +164,7 @@ module Rhoconnect
163
164
  @cud_engine.params = {'create'=> {'temp-id' => record}}
164
165
  @cud_engine.do_pass_through_cud
165
166
  else
166
- @s.push_queue(:create,@c.id,{'temp-id' => record},true)
167
+ @s.push_queue("create:post:/",@c.id,[[@s.name,[['temp-id', record]]]],true)
167
168
  @cud_engine.do_cud
168
169
  links = @c.get_data(:create_links)['temp-id']
169
170
  links ? links['l'] : nil
@@ -193,7 +194,7 @@ module Rhoconnect
193
194
  @cud_engine.params = {'update'=> record }
194
195
  @cud_engine.do_pass_through_cud
195
196
  else
196
- @s.push_queue(:update,@c.id,record,true)
197
+ @s.push_queue("update:post:/",@c.id,[[@s.name,record.to_a]],true)
197
198
  @cud_engine.do_cud
198
199
  end
199
200
  end
@@ -227,7 +228,7 @@ module Rhoconnect
227
228
  @cud_engine.params = {'delete'=> record }
228
229
  @cud_engine.do_pass_through_cud
229
230
  else
230
- @s.push_queue(:delete,@c.id,record,true)
231
+ @s.push_queue("delete:post:/",@c.id,[[@s.name, record.to_a]],true)
231
232
  @cud_engine.do_cud
232
233
  end
233
234
  end
@@ -110,11 +110,13 @@ EOF
110
110
  exit 1
111
111
  end
112
112
 
113
- # def jetty_rackup?
114
- # 'jruby -S jetty-rackup'
115
- # end
116
-
117
113
  def trinidad?
118
114
  'bundle exec jruby -S trinidad'
119
115
  end
120
- end #Utilities
116
+
117
+ def dtach_installed?
118
+ return false if windows? # n/a on windows
119
+ `which dtach` != ''
120
+ end
121
+
122
+ end
@@ -1,3 +1,3 @@
1
1
  module Rhoconnect
2
- VERSION = '4.0.0.beta.12'
3
- end
2
+ VERSION = '4.0.0.beta.24'
3
+ end
@@ -3,27 +3,28 @@ require 'erb'
3
3
  require 'json'
4
4
  require 'rhoconnect/graph_helper'
5
5
 
6
- module RhoconnectConsole
6
+ module RhoconnectConsole
7
7
  class << self
8
8
  ROOT_DIR = File.dirname(File.expand_path(__FILE__)) unless defined? ROOT_DIR
9
9
  def root_path(*args)
10
10
  File.join(ROOT_DIR, *args)
11
11
  end
12
- end
12
+ end
13
13
 
14
14
  class Server < Sinatra::Base
15
15
  set :views, RhoconnectConsole.root_path('templates')
16
16
  set :public_folder, RhoconnectConsole.root_path
17
- set :static, true
18
- use Rack::Session::Cookie
17
+ set :static, true
18
+ use Rack::Session::Cookie, :key => 'rhoconnect.console',
19
+ :secret => SecureRandom.hex(64)
19
20
  HEROKU_NAV = ENV['INSTANCE_ID'] ? RestClient.get('http://nav.heroku.com/v1/providers/header') : nil
20
21
  before do
21
22
  headers['Expires'] = 'Sun, 19 Nov 1978 05:00:00 GMT'
22
- headers['Cache-Control'] = 'no-store, no-cache, must-revalidate'
23
+ headers['Cache-Control'] = 'no-store, no-cache, must-revalidate'
23
24
  headers['Pragma'] = 'no-cache'
24
25
  end
25
26
  include GraphHelper
26
-
27
+
27
28
  get '/' do
28
29
  #if heroku instance single sign will already have logged in a have token in session
29
30
  @token = session[:token] if ENV['INSTANCE_ID']
@@ -33,17 +34,17 @@ module RhoconnectConsole
33
34
  @domain += "/application" if @domain and !ENV['RHODES_URL']
34
35
  erb :index
35
36
  end
36
-
37
+
37
38
  get "/heroku/resources/:id" do
38
39
  begin
39
40
  # check heroku addon started app
40
41
  halt 403 unless ENV['INSTANCE_ID'] == params[:id] && params[:token] == ENV['API_TOKEN']
41
42
  # rhoconnect authentication
42
- session[:login] = 'rhoadmin'
43
+ session[:login] = 'rhoadmin'
43
44
  session[:token] = User.load(session[:login]).token.value
44
45
  rescue Exception => e
45
46
  session[:token] = nil
46
- halt 403
47
+ halt 403
47
48
  end
48
49
  response.set_cookie('heroku-nav-data', :value => params[:nav], :path => '/')
49
50
  redirect '/'
@@ -60,7 +61,7 @@ module RhoconnectConsole
60
61
  post '/http_timing' do
61
62
  http_timing(params)
62
63
  end
63
-
64
+
64
65
  post '/http_timing_key' do
65
66
  http_timing_key(params)
66
67
  end
@@ -68,16 +69,16 @@ module RhoconnectConsole
68
69
  post '/device_count' do
69
70
  count_graph('timing/devicecount', "Device Count", "Devices", "clients")
70
71
  end
71
-
72
+
72
73
  get '/get_sources' do
73
74
  sources = App.load(APP_NAME).sources
74
75
  sources.to_json
75
76
  end
76
-
77
+
77
78
  get '/get_http_routes' do
78
79
  # keys = get_user_count("http:*:*")
79
80
  # sources = get_sources('all')
80
- #
81
+ #
81
82
  # #loop through arrays and remove any regex matches
82
83
  # keysf = keys.inject([]) do |keys_final, element|
83
84
  # found = true
@@ -87,11 +88,11 @@ module RhoconnectConsole
87
88
  # keys_final << element.strip if found
88
89
  # keys_final
89
90
  # end
90
-
91
+
91
92
  keysf = get_http_routes()
92
-
93
+
93
94
  keysf.to_json
94
95
  end
95
-
96
+
96
97
  end
97
98
  end
@@ -1,12 +1,12 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "rhoconnect/version"
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'rhoconnect/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = "rhoconnect"
6
+ s.name = 'rhoconnect'
7
7
  s.version = Rhoconnect::VERSION
8
8
  s.platform = Gem::Platform::RUBY
9
- s.authors = ["Rhomobile"]
9
+ s.authors = ['Rhomobile']
10
10
  s.date = Time.now.strftime('%Y-%m-%d')
11
11
  s.email = %q{dev@rhomobile.com}
12
12
  s.homepage = %q{http://rhomobile.com/products/rhoconnect}
@@ -18,30 +18,30 @@ Gem::Specification.new do |s|
18
18
  s.files = %w(
19
19
  CHANGELOG.md CREDITS Gemfile Gemfile.lock install.sh README.md Rakefile LICENSE Rakefile rhoconnect.gemspec
20
20
  )
21
- s.files += Dir.glob("bench/**/*")
22
- s.files += Dir.glob("commands/**/*")
23
- s.files += Dir.glob("doc/**/*")
24
- s.files += Dir.glob("examples/**/*")
25
- s.files += Dir.glob("generators/**/*")
26
- s.files += Dir.glob("generators/templates/application/.rcgemfile")
27
- s.files += Dir.glob("installer/**/*")
28
- s.files += Dir.glob("lib/**/*")
29
- s.files += Dir.glob("js-adapters/**/*")
30
- s.files += Dir.glob("tasks/**/*")
31
- s.test_files = Dir.glob("spec/**/*")
32
- s.executables = Dir.glob("bin/*").map{ |f| File.basename(f) }
33
- s.require_paths = ["lib"]
21
+ s.files += Dir.glob('bench/**/*')
22
+ s.files += Dir.glob('commands/**/*')
23
+ s.files += Dir.glob('doc/**/*')
24
+ s.files += Dir.glob('examples/**/*')
25
+ s.files += Dir.glob('generators/**/*')
26
+ s.files += Dir.glob('generators/templates/application/.rcgemfile')
27
+ s.files += Dir.glob('installer/**/*')
28
+ s.files += Dir.glob('lib/**/*')
29
+ s.files += Dir.glob('js-adapters/**/*')
30
+ s.files += Dir.glob('tasks/**/*')
31
+ s.test_files = Dir.glob('spec/**/*')
32
+ s.executables = Dir.glob('bin/*').map{ |f| File.basename(f) }
33
+ s.require_paths = ['lib']
34
34
 
35
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
35
+ s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
36
36
  s.rubygems_version = %q{1.5.0}
37
37
  s.extra_rdoc_files = [
38
- "LICENSE",
39
- "README.md"
38
+ 'LICENSE',
39
+ 'README.md'
40
40
  ]
41
41
 
42
42
  s.add_dependency('bundler', '~> 1.0')
43
- s.add_dependency("rack", '~> 1.5.2')
44
- s.add_dependency("sinatra", '~> 1.3')
43
+ s.add_dependency('rack', '~> 1.5.2')
44
+ s.add_dependency('sinatra', '~> 1.3')
45
45
  s.add_dependency('rake', '~> 10.0.0')
46
46
  s.add_dependency('json', '~> 1.7.7')
47
47
  s.add_dependency('rubyzip', '~> 0.9.4')
@@ -51,6 +51,5 @@ Gem::Specification.new do |s|
51
51
  s.add_dependency('resque', '>= 1.22.0')
52
52
  s.add_dependency('rest-client', '~> 1.6.1')
53
53
  s.add_dependency('templater', '~> 1.0.0')
54
- s.add_dependency('thor', '~> 0.15.0')
55
- s.add_dependency('ohm', '~> 0.1.3')
54
+ s.add_dependency('thor', '~> 0.18.0')
56
55
  end
@@ -17,6 +17,10 @@ app.get('/custom_route3',{}, function(req,resp){
17
17
  JsSample.get_stash_result(resp);
18
18
  });
19
19
 
20
+ app.get('/no_client_route', {login_required: false, client_required: false}, function(req,resp){
21
+ resp.send('no client required!');
22
+ });
23
+
20
24
  app.post('/',{"rc_handler":"query"}, function(req,resp){
21
25
  var result = {'id':req.params};
22
26
  resp.send(result);
@@ -5,6 +5,13 @@ var JsSample = function() {
5
5
 
6
6
  this.query = function(resp){
7
7
  var result = {'1': {'name': 'iPhone'}};
8
+ if(resp.params && resp.params.raise_an_error){
9
+ new rc.ServerErrorException(resp, 'query error occured');
10
+ }
11
+
12
+ if(resp.params && resp.params.test_non_hash){
13
+ result = true;
14
+ }
8
15
  resp.send(result);
9
16
  };
10
17
 
@@ -88,6 +95,35 @@ var JsSample = function() {
88
95
  resp.send(true);
89
96
  };
90
97
 
98
+ this.testRaiseException = function(resp){
99
+ new rc.Exception(resp, 'some custom message');
100
+ };
101
+
102
+ this.testRaiseLoginException = function(resp){
103
+ new rc.LoginException(resp, 'some login message');
104
+ };
105
+
106
+ this.testRaiseLogoffException = function(resp){
107
+ new rc.LogoffException(resp, 'some logoff message');
108
+ };
109
+
110
+ this.testRaiseTimeoutException = function(resp){
111
+ new rc.ServerTimeoutException(resp, 'some timeout message');
112
+ };
113
+
114
+ this.testRaiseErrorException = function(resp){
115
+ new rc.ServerErrorException(resp, 'some error message');
116
+ };
117
+
118
+ this.testRaiseConflictException = function(resp){
119
+ new rc.ObjectConflictErrorException(resp, 'some object conflict message');
120
+ };
121
+
122
+ this.partitionName = function(resp){
123
+ resp.send(resp.params.user_id + '_partition');
124
+ };
125
+
126
+
91
127
  this.storeBlob = function(resp){
92
128
  var fs = require('fs');
93
129
  if(fs.existsSync(resp.params.path)){