From bb8db654d6330c099b3dae735df2355d0f4d8a7e Mon Sep 17 00:00:00 2001
From: Maxwell Salzberg <maxwell@joindiaspora.com>
Date: Sat, 30 Jul 2011 11:44:11 -0700
Subject: [PATCH] add basic pod error logging, and added guard and removed
 autotest

---
 Gemfile                                       |  4 +++-
 Gemfile.lock                                  |  7 +++++++
 Guardfile                                     | 20 +++++++++++++++++++
 app/models/jobs/http_multi.rb                 |  5 ++++-
 app/models/pod.rb                             | 13 ++++++++++++
 app/models/pod_stat.rb                        |  4 ++++
 autotest/discover.rb                          | 15 --------------
 db/migrate/20110730173137_create_pods.rb      | 14 +++++++++++++
 db/migrate/20110730173443_create_pod_stats.rb | 16 +++++++++++++++
 db/schema.rb                                  | 18 ++++++++++++++++-
 db/seeds.rb                                   |  1 +
 spec/models/jobs/http_multi_spec.rb           |  6 +++---
 spec/models/pod_spec.rb                       | 19 ++++++++++++++++++
 spec/models/pod_stat_spec.rb                  |  5 +++++
 14 files changed, 126 insertions(+), 21 deletions(-)
 create mode 100644 Guardfile
 create mode 100644 app/models/pod.rb
 create mode 100644 app/models/pod_stat.rb
 delete mode 100644 autotest/discover.rb
 create mode 100644 db/migrate/20110730173137_create_pods.rb
 create mode 100644 db/migrate/20110730173443_create_pod_stats.rb
 create mode 100644 spec/models/pod_spec.rb
 create mode 100644 spec/models/pod_stat_spec.rb

diff --git a/Gemfile b/Gemfile
index 18c09345a0..e9cc4cb5c7 100644
--- a/Gemfile
+++ b/Gemfile
@@ -85,7 +85,9 @@ group :development do
 end
 
 group :test, :development do
-  gem 'factory_girl_rails', :require => false
+  gem 'rb-fsevent', :require => false if RUBY_PLATFORM =~ /darwin/i  
+  gem 'guard-rspec' 
+   gem 'factory_girl_rails', :require => false
   unless ENV["TRAVIS"]
     gem 'ruby-debug-base19', '0.11.23' if RUBY_VERSION.include? '1.9.1'
     gem 'ruby-debug19', :platforms => :ruby_19
diff --git a/Gemfile.lock b/Gemfile.lock
index cbe9d5ea74..b9c28f513b 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -209,6 +209,10 @@ GEM
     gem_plugin (0.2.3)
     gherkin (2.4.5)
       json (>= 1.4.6)
+    guard (0.5.1)
+      thor (~> 0.14.6)
+    guard-rspec (0.4.0)
+      guard (>= 0.4.0)
     haml (3.1.2)
     hashie (1.0.0)
     highline (1.6.2)
@@ -347,6 +351,7 @@ GEM
     rake (0.9.2)
     rash (0.3.0)
       hashie (~> 1.0.0)
+    rb-fsevent (0.4.1)
     rcov (0.9.9)
     rdoc (3.8)
     redis (2.2.1)
@@ -478,6 +483,7 @@ DEPENDENCIES
   fog (= 0.3.25)
   foreigner (= 0.9.1)
   fuubar
+  guard-rspec
   haml (= 3.1.2)
   http_accept_language!
   i18n-inflector-rails (~> 1.0)
@@ -497,6 +503,7 @@ DEPENDENCIES
   omniauth (= 0.2.6)
   rails (= 3.0.9)
   rails-i18n
+  rb-fsevent
   rcov
   resque (= 1.10.0)
   resque-ensure-connected
diff --git a/Guardfile b/Guardfile
new file mode 100644
index 0000000000..b975861e5c
--- /dev/null
+++ b/Guardfile
@@ -0,0 +1,20 @@
+# A sample Guardfile
+# More info at https://github.com/guard/guard#readme
+# also, http://asciicasts.com/episodes/264-guard
+guard 'rspec', :version => 2, :all_on_start => false do
+  watch(%r{^spec/.+_spec\.rb$})
+  watch(%r{^lib/(.+)\.rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
+  watch('spec/spec_helper.rb')  { "spec" }
+
+  # Rails example
+  watch(%r{^spec/.+_spec\.rb$})
+  watch(%r{^app/(.+)\.rb$})                           { |m| "spec/#{m[1]}_spec.rb" }
+  watch(%r{^lib/(.+)\.rb$})                           { |m| "spec/lib/#{m[1]}_spec.rb" }
+  watch(%r{^app/controllers/(.+)_(controller)\.rb$})  { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
+  watch(%r{^spec/support/(.+)\.rb$})                  { "spec" }
+  watch('spec/spec_helper.rb')                        { "spec" }
+  watch('config/routes.rb')                           { "spec/routing" }
+  watch('app/controllers/application_controller.rb')  { "spec/controllers" }
+  # Capybara request specs
+  watch(%r{^app/views/(.+)/.*\.(erb|haml)$})          { |m| "spec/requests/#{m[1]}_spec.rb" }
+end
diff --git a/app/models/jobs/http_multi.rb b/app/models/jobs/http_multi.rb
index d9ef788b8f..18cef93408 100644
--- a/app/models/jobs/http_multi.rb
+++ b/app/models/jobs/http_multi.rb
@@ -48,7 +48,10 @@ module Job
             end
           end
           unless response.success?
-            Rails.logger.info("event=http_multi_fail sender_id=#{user_id} recipient_id=#{person.id} url=#{response.effective_url} response_code='#{response.code}' xml='#{Base64.decode64(enc_object_xml)}'")
+            pod = Pod.find_or_create_by_url(response.effective_url)
+            log_line = "event=http_multi_fail sender_id=#{user_id} recipient_id=#{person.id} url=#{response.effective_url} response_code='#{response.code}' xml='#{Base64.decode64(enc_object_xml)}'"
+            Rails.logger.info(log_line)
+            pod.pod_stats.create(:error_message => log_line, :person_id => person.id, :error_code => response.code.to_i)
             failed_request_people << person.id
           end
         end
diff --git a/app/models/pod.rb b/app/models/pod.rb
new file mode 100644
index 0000000000..bd66a5630e
--- /dev/null
+++ b/app/models/pod.rb
@@ -0,0 +1,13 @@
+class Pod < ActiveRecord::Base
+  has_many :pod_stats
+
+  def self.find_or_create_by_url(url)
+    u = URI.parse(url)
+    pod = self.find_or_initialize_by_host(u.host)
+    unless pod.persisted?
+      pod.ssl = (u.scheme == 'https')? true : false
+      pod.save
+    end
+    pod
+  end
+end
diff --git a/app/models/pod_stat.rb b/app/models/pod_stat.rb
new file mode 100644
index 0000000000..5452d1f0a7
--- /dev/null
+++ b/app/models/pod_stat.rb
@@ -0,0 +1,4 @@
+class PodStat < ActiveRecord::Base
+  belongs_to :pod
+  
+end
diff --git a/autotest/discover.rb b/autotest/discover.rb
deleted file mode 100644
index f2eb1dff35..0000000000
--- a/autotest/discover.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-#   Copyright (c) 2010, Diaspora Inc.  This file is
-#   licensed under the Affero General Public License version 3 or later.  See
-#   the COPYRIGHT file.
-require 'autotest/growl'
-Autotest.add_discovery { "rails" }
-Autotest.add_discovery { "rspec2" }
-Autotest.add_hook :initialize do |at| 
-  at.add_mapping(%r%^spec/(intergration|mailers|config)/.*rb$%) { |filename, _| 
-    filename 
-  }
-
-  at.add_mapping(%r%^spec/misc_spec.rb$%) { |filename, _| 
-    filename 
-  }
-end
diff --git a/db/migrate/20110730173137_create_pods.rb b/db/migrate/20110730173137_create_pods.rb
new file mode 100644
index 0000000000..8fdb6c010d
--- /dev/null
+++ b/db/migrate/20110730173137_create_pods.rb
@@ -0,0 +1,14 @@
+class CreatePods < ActiveRecord::Migration
+  def self.up
+    create_table :pods do |t|
+      t.string :host
+      t.boolean :ssl
+
+      t.timestamps
+    end
+  end
+
+  def self.down
+    drop_table :pods
+  end
+end
diff --git a/db/migrate/20110730173443_create_pod_stats.rb b/db/migrate/20110730173443_create_pod_stats.rb
new file mode 100644
index 0000000000..506b607272
--- /dev/null
+++ b/db/migrate/20110730173443_create_pod_stats.rb
@@ -0,0 +1,16 @@
+class CreatePodStats < ActiveRecord::Migration
+  def self.up
+    create_table :pod_stats do |t|
+      t.integer :error_code
+      t.integer :person_id
+      t.text :error_message
+      t.integer :pod_id
+
+      t.timestamps
+    end
+  end
+
+  def self.down
+    drop_table :pod_stats
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 357eaa5701..b44897fee5 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended to check this file into your version control system.
 
-ActiveRecord::Schema.define(:version => 20110729045734) do
+ActiveRecord::Schema.define(:version => 20110730173443) do
 
   create_table "aspect_memberships", :force => true do |t|
     t.integer  "aspect_id",  :null => false
@@ -233,6 +233,22 @@ ActiveRecord::Schema.define(:version => 20110729045734) do
   add_index "people", ["guid"], :name => "index_people_on_guid", :unique => true
   add_index "people", ["owner_id"], :name => "index_people_on_owner_id", :unique => true
 
+  create_table "pod_stats", :force => true do |t|
+    t.integer  "error_code"
+    t.integer  "person_id"
+    t.text     "error_message"
+    t.integer  "pod_id"
+    t.datetime "created_at"
+    t.datetime "updated_at"
+  end
+
+  create_table "pods", :force => true do |t|
+    t.string   "host"
+    t.boolean  "ssl"
+    t.datetime "created_at"
+    t.datetime "updated_at"
+  end
+
   create_table "post_visibilities", :force => true do |t|
     t.integer  "post_id",                       :null => false
     t.datetime "created_at"
diff --git a/db/seeds.rb b/db/seeds.rb
index 3580035e88..583a0f1752 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -63,3 +63,4 @@ time_interval = 1000
     time_interval += 1000
   end
 end
+puts "successfully seed the db with users eve, bob, and alice (password: 'evankorth')"
diff --git a/spec/models/jobs/http_multi_spec.rb b/spec/models/jobs/http_multi_spec.rb
index 501fcf9229..257d6ec8f5 100644
--- a/spec/models/jobs/http_multi_spec.rb
+++ b/spec/models/jobs/http_multi_spec.rb
@@ -14,8 +14,8 @@ describe Job::HttpMulti do
 
 
     @hydra = Typhoeus::Hydra.new
-    @response = Typhoeus::Response.new(:code => 200, :headers => "", :body => "", :time => 0.2)
-    @failed_response = Typhoeus::Response.new(:code => 504, :headers => "", :body => "", :time => 0.2)
+    @response = Typhoeus::Response.new(:code => 200, :headers => "", :body => "", :time => 0.2, :effective_url => 'http://foobar.com')
+    @failed_response = Typhoeus::Response.new(:code => 504, :headers => "", :body => "", :time => 0.2, :effective_url => 'http://foobar.com')
   end
 
   it 'POSTs to more than one person' do
@@ -71,7 +71,7 @@ describe Job::HttpMulti do
     person = @people.first
     person.url = 'http://remote.net/'
     person.save
-    response = Typhoeus::Response.new(:code => 301, :headers_hash => {"Location" => person.receive_url.sub('http://', 'https://')}, :body => "", :time => 0.2)
+    response = Typhoeus::Response.new(:code => 301,:effective_url => 'https://foobar.com', :headers_hash => {"Location" => person.receive_url.sub('http://', 'https://')}, :body => "", :time => 0.2)
     @hydra.stub(:post, person.receive_url).and_return(response)
 
     Typhoeus::Hydra.stub!(:new).and_return(@hydra)
diff --git a/spec/models/pod_spec.rb b/spec/models/pod_spec.rb
new file mode 100644
index 0000000000..e6a5e63b96
--- /dev/null
+++ b/spec/models/pod_spec.rb
@@ -0,0 +1,19 @@
+require 'spec_helper'
+
+describe Pod do
+
+  it 'has many pod_stats' do
+    Pod.new.pod_stats.should be_empty
+  end
+  describe '.find_or_create_by_url' do
+    it 'takes a url, and makes one by host' do
+      pod = Pod.find_or_create_by_url('https://joindiaspora.com/maxwell')
+      pod.host.should == 'joindiaspora.com'
+    end
+
+    it 'sets ssl boolean(side-effect)' do
+      pod = Pod.find_or_create_by_url('https://joindiaspora.com/maxwell')
+      pod.ssl.should be_true
+    end
+  end
+end
diff --git a/spec/models/pod_stat_spec.rb b/spec/models/pod_stat_spec.rb
new file mode 100644
index 0000000000..15bc5b2b83
--- /dev/null
+++ b/spec/models/pod_stat_spec.rb
@@ -0,0 +1,5 @@
+require 'spec_helper'
+
+describe PodStat do
+  pending "add some examples to (or delete) #{__FILE__}"
+end
-- 
GitLab