litmus 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Matt Fawcett
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,56 @@
1
+ Litmus
2
+ ======
3
+
4
+ A simple wrapper around the Litmus *customer* API using httparty. This does not use the reseller API and should not be used to reset Litmus services. See the [API documentation](http://docs.litmus.com/w/page/18056603/Customer-API-documentation) for details
5
+
6
+ Currently Implmented
7
+ --------------------
8
+ * Litmus::EmailTest.list
9
+ * Litmus::EmailTest.show(id)
10
+ * Litmus::EmailTest.create
11
+ * Litmus::PageTest.list
12
+ * Litmus::PageTest.show(id)
13
+ * Litmus::PageTest.create(url)
14
+ * Litmus::TestVersion.list(test_id)
15
+ * Litmus::TestVersion.show(test_id, test_version_id)
16
+ * Litmus::TestVersion.poll(test_id, test_version_id)
17
+ * Litmus::TestVersion.create(test_id)
18
+ * Litmus::Result.list(test_id, test_version_id)
19
+ * Litmus::Result.show(test_id, test_version_id, result_id)
20
+
21
+
22
+ Example Usage
23
+ -------------
24
+
25
+ # Setup the authentication details
26
+ Litmus::Base.new("your_company_subdomain", "username", "password")
27
+
28
+ # Lets create an email test
29
+ email_test = Litmus::EmailTest.create
30
+ send_test_to = email_test["test_set_versions"].first["url_or_guid"] #=> "f1b17db@emailtests.com"
31
+ test_id = email_test["id"] #=> 1716534
32
+ version = email_test["test_set_versions"].first["version"] #=> 1
33
+
34
+ # If we query our new version we can see Litmus have not had the email yet
35
+ Litmus::TestVersion.show(test_id, version)["received"] #=> false
36
+
37
+ # Lets send them the email
38
+ Pony.mail(:to => send_test_to, :from => 'mail@matthewfawcett.co.uk', :subject => 'hi', :body => 'Hello there, this is a test')
39
+
40
+ # Now they have it
41
+ Litmus::TestVersion.show(test_id, version)["received"] #=> "true"
42
+
43
+ # Lets poll the results and look at the first client
44
+ Litmus::TestVersion.poll(test_id, version)["results"].first.inspect #=> {"id"=>33539350, "test_code"=>"hotmail", "state"=>"pending"}
45
+
46
+ # The hotmail test is still pending, lets wait for a while
47
+ sleep 10
48
+
49
+ # Lets poll the results again and see that its complete
50
+ Litmus::TestVersion.poll(test_id, version).first.inspect #=> {"id"=>33539350, "test_code"=>"hotmail", "state"=>"complete"}
51
+
52
+ # Now lets show the result for this test version
53
+ image_url = Litmus::Result.show(test_id, version, 33539350)["result_images"].first["full_image"] #=> "s3.amazonaws.com/resultcaptures/2f21fc9c-08f6-4429-b53d-2e224189526b.fullpageon.png"
54
+
55
+ system("open http://#{image_url}")
56
+ # Looks good!
@@ -0,0 +1,46 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "litmus"
8
+ gem.summary = %Q{A wrapper to the Litmus customer API}
9
+ gem.description = %Q{A wrapper to the Litmus customer API}
10
+ gem.email = "mail@matthewfawcett.co.uk"
11
+ gem.homepage = "http://github.com/mattfawcett/litmus"
12
+ gem.authors = ["Matt Fawcett"]
13
+ gem.add_development_dependency "rspec", ">= 1.2.9"
14
+ gem.add_dependency 'httparty', ">= 0.6.1"
15
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
+ end
17
+ Jeweler::GemcutterTasks.new
18
+ rescue LoadError
19
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
20
+ end
21
+
22
+ require 'spec/rake/spectask'
23
+ Spec::Rake::SpecTask.new(:spec) do |spec|
24
+ spec.libs << 'lib' << 'spec'
25
+ spec.spec_files = FileList['spec/**/*_spec.rb']
26
+ end
27
+
28
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
29
+ spec.libs << 'lib' << 'spec'
30
+ spec.pattern = 'spec/**/*_spec.rb'
31
+ spec.rcov = true
32
+ end
33
+
34
+ task :spec => :check_dependencies
35
+
36
+ task :default => :spec
37
+
38
+ require 'rake/rdoctask'
39
+ Rake::RDocTask.new do |rdoc|
40
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
41
+
42
+ rdoc.rdoc_dir = 'rdoc'
43
+ rdoc.title = "litmus #{version}"
44
+ rdoc.rdoc_files.include('README*')
45
+ rdoc.rdoc_files.include('lib/**/*.rb')
46
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,11 @@
1
+ require "httparty"
2
+ require "builder"
3
+ require "litmus/base"
4
+ require "litmus/test"
5
+ require "litmus/email_test"
6
+ require "litmus/page_test"
7
+ require "litmus/test_version"
8
+ require "litmus/result"
9
+
10
+ module Litmus
11
+ end
@@ -0,0 +1,10 @@
1
+ module Litmus
2
+ class Base
3
+ include HTTParty
4
+
5
+ def initialize(company, username, password)
6
+ self.class.base_uri "#{company}.litmus.com"
7
+ self.class.basic_auth(username, password)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,17 @@
1
+ module Litmus
2
+ class EmailTest < Test
3
+ def self.list
4
+ super.reject{|test| test["service"] != 'email'}
5
+ end
6
+
7
+ def self.create
8
+ builder = Builder::XmlMarkup.new
9
+ builder.instruct! :xml, :version=>"1.0"
10
+ builder.test_set do |test_set|
11
+ test_set.use_defaults true
12
+ test_set.save_defaults false
13
+ end
14
+ post('/emails.xml', :body => builder.target!, :headers => {"Content-type" => "application/xml"})["test_set"]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module Litmus
2
+ class PageTest < Test
3
+ def self.list
4
+ super.reject{|test| test["service"] != 'page'}
5
+ end
6
+
7
+ def self.create(url)
8
+ builder = Builder::XmlMarkup.new
9
+ builder.instruct! :xml, :version=>"1.0"
10
+ builder.test_set do |test_set|
11
+ test_set.use_defaults true
12
+ test_set.url url
13
+ end
14
+ post('/pages.xml', :body => builder.target!, :headers => {"Content-type" => "application/xml"})["test_set"]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ module Litmus
2
+ class Result < Base
3
+ def self.list(test_id, version_id)
4
+ get("/tests/#{test_id}/versions/#{version_id}/results.xml")["results"]
5
+ end
6
+
7
+ def self.show(test_id, version_id, id)
8
+ get("/tests/#{test_id}/versions/#{version_id}/results/#{id}.xml")["result"]
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Litmus
2
+ class Test < Base
3
+ def self.list
4
+ get('/tests.xml')["test_sets"]
5
+ end
6
+
7
+ def self.show(id)
8
+ get("/tests/#{id}.xml")["test_set"]
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ module Litmus
2
+ class TestVersion < Base
3
+ def self.show(test_id, id)
4
+ get("/tests/#{test_id}/versions/#{id}.xml")["test_set_version"]
5
+ end
6
+
7
+ def self.list(test_id)
8
+ get("/tests/#{test_id}/versions.xml")["test_set_versions"]
9
+ end
10
+
11
+ def self.create(test_id)
12
+ post("/tests/#{test_id}/versions.xml")["test_set_version"]
13
+ end
14
+
15
+ def self.poll(test_id, id)
16
+ get("/tests/#{test_id}/versions/#{id}/poll.xml")["test_set_version"]
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,81 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{litmus}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Matt Fawcett"]
12
+ s.date = %q{2010-12-19}
13
+ s.description = %q{A wrapper to the Litmus customer API}
14
+ s.email = %q{mail@matthewfawcett.co.uk}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ "LICENSE",
22
+ "README.md",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "lib/litmus.rb",
26
+ "lib/litmus/base.rb",
27
+ "lib/litmus/email_test.rb",
28
+ "lib/litmus/page_test.rb",
29
+ "lib/litmus/result.rb",
30
+ "lib/litmus/test.rb",
31
+ "lib/litmus/test_version.rb",
32
+ "litmus.gemspec",
33
+ "spec/email_test_spec.rb",
34
+ "spec/fixtures/all_tests.xml",
35
+ "spec/fixtures/create_email_test.xml",
36
+ "spec/fixtures/create_page_test.xml",
37
+ "spec/fixtures/create_test_version.xml",
38
+ "spec/fixtures/list_results.xml",
39
+ "spec/fixtures/list_test_versions.xml",
40
+ "spec/fixtures/poll_test_version.xml",
41
+ "spec/fixtures/show_result.xml",
42
+ "spec/fixtures/show_test.xml",
43
+ "spec/fixtures/show_test_version.xml",
44
+ "spec/litmus_spec.rb",
45
+ "spec/page_test_spec.rb",
46
+ "spec/result_spec.rb",
47
+ "spec/spec_helper.rb",
48
+ "spec/test_spec.rb",
49
+ "spec/test_version_spec.rb"
50
+ ]
51
+ s.homepage = %q{http://github.com/mattfawcett/litmus}
52
+ s.require_paths = ["lib"]
53
+ s.rubygems_version = %q{1.3.6}
54
+ s.summary = %q{A wrapper to the Litmus customer API}
55
+ s.test_files = [
56
+ "spec/email_test_spec.rb",
57
+ "spec/litmus_spec.rb",
58
+ "spec/page_test_spec.rb",
59
+ "spec/result_spec.rb",
60
+ "spec/spec_helper.rb",
61
+ "spec/test_spec.rb",
62
+ "spec/test_version_spec.rb"
63
+ ]
64
+
65
+ if s.respond_to? :specification_version then
66
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
67
+ s.specification_version = 3
68
+
69
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
70
+ s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
71
+ s.add_runtime_dependency(%q<httparty>, [">= 0.6.1"])
72
+ else
73
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
74
+ s.add_dependency(%q<httparty>, [">= 0.6.1"])
75
+ end
76
+ else
77
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
78
+ s.add_dependency(%q<httparty>, [">= 0.6.1"])
79
+ end
80
+ end
81
+
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe Litmus::EmailTest do
4
+ describe ".list" do
5
+ it "should give me a list of email test objects" do
6
+ list = Litmus::EmailTest.list
7
+ list.length.should eql(1)
8
+ list.first["name"].should eql("A really good email")
9
+ list.first["id"].should eql(1715760)
10
+ end
11
+ end
12
+
13
+ describe ".create" do
14
+ it "should give me back a new email object" do
15
+ email_test = Litmus::EmailTest.create
16
+ email_test["test_set_versions"].first["version"].should == 1
17
+ email_test["test_set_versions"].first["url_or_guid"].should =~ /@emailtests\.com/
18
+ email_test["id"].should be_a(Integer)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ <test_sets type="array">
2
+ <test_set>
3
+ <created_at type="datetime">2010-12-18T22:43:23Z</created_at>
4
+ <delta type="boolean">true</delta>
5
+ <id type="integer">1715760</id>
6
+ <updated_at type="datetime">2010-12-18T22:43:25Z</updated_at>
7
+ <name>A really good email</name>
8
+ <service>email</service>
9
+ <state>complete</state>
10
+ <public_sharing>false</public_sharing>
11
+ <url_or_guid>236e723</url_or_guid>
12
+ </test_set>
13
+ <test_set>
14
+ <created_at type="datetime">2010-12-18T22:40:47Z</created_at>
15
+ <delta type="boolean">true</delta>
16
+ <id type="integer">1715752</id>
17
+ <updated_at type="datetime">2010-12-18T22:40:48Z</updated_at>
18
+ <name>Home | Real Ale Hunter</name>
19
+ <service>page</service>
20
+ <state>complete</state>
21
+ <public_sharing>false</public_sharing>
22
+ <url_or_guid>http://www.realalehunter.co.uk</url_or_guid>
23
+ </test_set>
24
+ </test_sets>
@@ -0,0 +1,651 @@
1
+ <test_set>
2
+ <created_at type="datetime">2010-12-19T16:36:59Z</created_at>
3
+ <delta type="boolean">true</delta>
4
+ <id type="integer">1716450</id>
5
+ <updated_at type="datetime">2010-12-19T16:37:01Z</updated_at>
6
+ <name>No subject</name>
7
+ <service>email</service>
8
+ <state>waiting</state>
9
+ <public_sharing>false</public_sharing>
10
+ <test_set_versions type="array">
11
+ <test_set_version>
12
+ <version type="integer">1</version>
13
+ <url_or_guid>62e1101@emailtests.com</url_or_guid>
14
+ <received>false</received>
15
+ <source_url>s3.amazonaws.com/sitevista/missing_source</source_url>
16
+ <inline_css />
17
+ <results type="array">
18
+ <result>
19
+ <check_state nil="true" />
20
+ <error_at type="datetime" nil="true" />
21
+ <finished_at type="datetime" nil="true" />
22
+ <id type="integer">33537708</id>
23
+ <started_at type="datetime" nil="true" />
24
+ <test_code>hotmail</test_code>
25
+ <state>pending</state>
26
+ <result_type>email</result_type>
27
+ <rendered_html_url />
28
+ <testing_application>
29
+ <average_time_to_process type="integer">212</average_time_to_process>
30
+ <business>false</business>
31
+ <result_type>email</result_type>
32
+ <supports_content_blocking>false</supports_content_blocking>
33
+ <desktop_client>false</desktop_client>
34
+ <status>0</status>
35
+ <platform_name>Web-based</platform_name>
36
+ <platform_long_name>Web-based</platform_long_name>
37
+ <application_code>hotmail</application_code>
38
+ <application_long_name>Hotmail (Explorer)</application_long_name>
39
+ </testing_application>
40
+ <result_images type="array">
41
+ <result_image>
42
+ <image_type>window_on</image_type>
43
+ </result_image>
44
+ <result_image>
45
+ <image_type>full_on</image_type>
46
+ </result_image>
47
+ <result_image>
48
+ <image_type>window_off</image_type>
49
+ </result_image>
50
+ <result_image>
51
+ <image_type>full_off</image_type>
52
+ </result_image>
53
+ </result_images>
54
+ </result>
55
+ <result>
56
+ <check_state nil="true" />
57
+ <error_at type="datetime" nil="true" />
58
+ <finished_at type="datetime" nil="true" />
59
+ <id type="integer">33537710</id>
60
+ <started_at type="datetime" nil="true" />
61
+ <test_code>yahoo</test_code>
62
+ <state>pending</state>
63
+ <result_type>email</result_type>
64
+ <rendered_html_url />
65
+ <testing_application>
66
+ <average_time_to_process type="integer">115</average_time_to_process>
67
+ <business>false</business>
68
+ <result_type>email</result_type>
69
+ <supports_content_blocking>true</supports_content_blocking>
70
+ <desktop_client>false</desktop_client>
71
+ <status>0</status>
72
+ <platform_name>Web-based</platform_name>
73
+ <platform_long_name>Web-based</platform_long_name>
74
+ <application_code>yahoo</application_code>
75
+ <application_long_name>Yahoo! Mail (Explorer)</application_long_name>
76
+ </testing_application>
77
+ <result_images type="array">
78
+ <result_image>
79
+ <image_type>window_on</image_type>
80
+ </result_image>
81
+ <result_image>
82
+ <image_type>full_on</image_type>
83
+ </result_image>
84
+ <result_image>
85
+ <image_type>window_off</image_type>
86
+ </result_image>
87
+ <result_image>
88
+ <image_type>full_off</image_type>
89
+ </result_image>
90
+ </result_images>
91
+ </result>
92
+ <result>
93
+ <check_state nil="true" />
94
+ <error_at type="datetime" nil="true" />
95
+ <finished_at type="datetime" nil="true" />
96
+ <id type="integer">33537712</id>
97
+ <started_at type="datetime" nil="true" />
98
+ <test_code>ol2000</test_code>
99
+ <state>pending</state>
100
+ <result_type>email</result_type>
101
+ <rendered_html_url />
102
+ <testing_application>
103
+ <average_time_to_process type="integer">64</average_time_to_process>
104
+ <business>true</business>
105
+ <result_type>email</result_type>
106
+ <supports_content_blocking>false</supports_content_blocking>
107
+ <desktop_client>true</desktop_client>
108
+ <status>0</status>
109
+ <platform_name>Windows</platform_name>
110
+ <platform_long_name>Microsoft Windows</platform_long_name>
111
+ <application_code>ol2000</application_code>
112
+ <application_long_name>Outlook 2000</application_long_name>
113
+ </testing_application>
114
+ <result_images type="array">
115
+ <result_image>
116
+ <image_type>window_on</image_type>
117
+ </result_image>
118
+ <result_image>
119
+ <image_type>full_on</image_type>
120
+ </result_image>
121
+ <result_image>
122
+ <image_type>window_off</image_type>
123
+ </result_image>
124
+ <result_image>
125
+ <image_type>full_off</image_type>
126
+ </result_image>
127
+ </result_images>
128
+ </result>
129
+ <result>
130
+ <check_state nil="true" />
131
+ <error_at type="datetime" nil="true" />
132
+ <finished_at type="datetime" nil="true" />
133
+ <id type="integer">33537714</id>
134
+ <started_at type="datetime" nil="true" />
135
+ <test_code>ol2002</test_code>
136
+ <state>pending</state>
137
+ <result_type>email</result_type>
138
+ <rendered_html_url />
139
+ <testing_application>
140
+ <average_time_to_process type="integer">62</average_time_to_process>
141
+ <business>true</business>
142
+ <result_type>email</result_type>
143
+ <supports_content_blocking>false</supports_content_blocking>
144
+ <desktop_client>true</desktop_client>
145
+ <status>0</status>
146
+ <platform_name>Windows</platform_name>
147
+ <platform_long_name>Microsoft Windows</platform_long_name>
148
+ <application_code>ol2002</application_code>
149
+ <application_long_name>Outlook 2002/XP</application_long_name>
150
+ </testing_application>
151
+ <result_images type="array">
152
+ <result_image>
153
+ <image_type>window_on</image_type>
154
+ </result_image>
155
+ <result_image>
156
+ <image_type>full_on</image_type>
157
+ </result_image>
158
+ <result_image>
159
+ <image_type>window_off</image_type>
160
+ </result_image>
161
+ <result_image>
162
+ <image_type>full_off</image_type>
163
+ </result_image>
164
+ </result_images>
165
+ </result>
166
+ <result>
167
+ <check_state nil="true" />
168
+ <error_at type="datetime" nil="true" />
169
+ <finished_at type="datetime" nil="true" />
170
+ <id type="integer">33537716</id>
171
+ <started_at type="datetime" nil="true" />
172
+ <test_code>ol2003</test_code>
173
+ <state>pending</state>
174
+ <result_type>email</result_type>
175
+ <rendered_html_url />
176
+ <testing_application>
177
+ <average_time_to_process type="integer">165</average_time_to_process>
178
+ <business>true</business>
179
+ <result_type>email</result_type>
180
+ <supports_content_blocking>true</supports_content_blocking>
181
+ <desktop_client>true</desktop_client>
182
+ <status>0</status>
183
+ <platform_name>Windows</platform_name>
184
+ <platform_long_name>Microsoft Windows</platform_long_name>
185
+ <application_code>ol2003</application_code>
186
+ <application_long_name>Outlook 2003</application_long_name>
187
+ </testing_application>
188
+ <result_images type="array">
189
+ <result_image>
190
+ <image_type>window_on</image_type>
191
+ </result_image>
192
+ <result_image>
193
+ <image_type>full_on</image_type>
194
+ </result_image>
195
+ <result_image>
196
+ <image_type>window_off</image_type>
197
+ </result_image>
198
+ <result_image>
199
+ <image_type>full_off</image_type>
200
+ </result_image>
201
+ </result_images>
202
+ </result>
203
+ <result>
204
+ <check_state nil="true" />
205
+ <error_at type="datetime" nil="true" />
206
+ <finished_at type="datetime" nil="true" />
207
+ <id type="integer">33537718</id>
208
+ <started_at type="datetime" nil="true" />
209
+ <test_code>ol2007</test_code>
210
+ <state>pending</state>
211
+ <result_type>email</result_type>
212
+ <rendered_html_url />
213
+ <testing_application>
214
+ <average_time_to_process type="integer">79</average_time_to_process>
215
+ <business>true</business>
216
+ <result_type>email</result_type>
217
+ <supports_content_blocking>true</supports_content_blocking>
218
+ <desktop_client>true</desktop_client>
219
+ <status>0</status>
220
+ <platform_name>Windows</platform_name>
221
+ <platform_long_name>Microsoft Windows</platform_long_name>
222
+ <application_code>ol2007</application_code>
223
+ <application_long_name>Outlook 2007</application_long_name>
224
+ </testing_application>
225
+ <result_images type="array">
226
+ <result_image>
227
+ <image_type>window_on</image_type>
228
+ </result_image>
229
+ <result_image>
230
+ <image_type>full_on</image_type>
231
+ </result_image>
232
+ <result_image>
233
+ <image_type>window_off</image_type>
234
+ </result_image>
235
+ <result_image>
236
+ <image_type>full_off</image_type>
237
+ </result_image>
238
+ </result_images>
239
+ </result>
240
+ <result>
241
+ <check_state nil="true" />
242
+ <error_at type="datetime" nil="true" />
243
+ <finished_at type="datetime" nil="true" />
244
+ <id type="integer">33537720</id>
245
+ <started_at type="datetime" nil="true" />
246
+ <test_code>notes8</test_code>
247
+ <state>pending</state>
248
+ <result_type>email</result_type>
249
+ <rendered_html_url />
250
+ <testing_application>
251
+ <average_time_to_process type="integer">141</average_time_to_process>
252
+ <business>true</business>
253
+ <result_type>email</result_type>
254
+ <supports_content_blocking>false</supports_content_blocking>
255
+ <desktop_client>true</desktop_client>
256
+ <status>0</status>
257
+ <platform_name>Windows</platform_name>
258
+ <platform_long_name>Microsoft Windows</platform_long_name>
259
+ <application_code>notes8</application_code>
260
+ <application_long_name>Lotus Notes 8</application_long_name>
261
+ </testing_application>
262
+ <result_images type="array">
263
+ <result_image>
264
+ <image_type>window_on</image_type>
265
+ </result_image>
266
+ <result_image>
267
+ <image_type>full_on</image_type>
268
+ </result_image>
269
+ <result_image>
270
+ <image_type>window_off</image_type>
271
+ </result_image>
272
+ <result_image>
273
+ <image_type>full_off</image_type>
274
+ </result_image>
275
+ </result_images>
276
+ </result>
277
+ <result>
278
+ <check_state nil="true" />
279
+ <error_at type="datetime" nil="true" />
280
+ <finished_at type="datetime" nil="true" />
281
+ <id type="integer">33537722</id>
282
+ <started_at type="datetime" nil="true" />
283
+ <test_code>appmail3</test_code>
284
+ <state>pending</state>
285
+ <result_type>email</result_type>
286
+ <rendered_html_url />
287
+ <testing_application>
288
+ <average_time_to_process type="integer">172</average_time_to_process>
289
+ <business>false</business>
290
+ <result_type>email</result_type>
291
+ <supports_content_blocking>false</supports_content_blocking>
292
+ <desktop_client>true</desktop_client>
293
+ <status>0</status>
294
+ <platform_name>Mac OS</platform_name>
295
+ <platform_long_name>Mac OS X</platform_long_name>
296
+ <application_code>appmail3</application_code>
297
+ <application_long_name>Apple Mail 3</application_long_name>
298
+ </testing_application>
299
+ <result_images type="array">
300
+ <result_image>
301
+ <image_type>window_on</image_type>
302
+ </result_image>
303
+ <result_image>
304
+ <image_type>full_on</image_type>
305
+ </result_image>
306
+ <result_image>
307
+ <image_type>window_off</image_type>
308
+ </result_image>
309
+ <result_image>
310
+ <image_type>full_off</image_type>
311
+ </result_image>
312
+ </result_images>
313
+ </result>
314
+ <result>
315
+ <check_state nil="true" />
316
+ <error_at type="datetime" nil="true" />
317
+ <finished_at type="datetime" nil="true" />
318
+ <id type="integer">33537724</id>
319
+ <started_at type="datetime" nil="true" />
320
+ <test_code>gmailnew</test_code>
321
+ <state>pending</state>
322
+ <result_type>email</result_type>
323
+ <rendered_html_url />
324
+ <testing_application>
325
+ <average_time_to_process type="integer">81</average_time_to_process>
326
+ <business>false</business>
327
+ <result_type>email</result_type>
328
+ <supports_content_blocking>true</supports_content_blocking>
329
+ <desktop_client>false</desktop_client>
330
+ <status>0</status>
331
+ <platform_name>Web-based</platform_name>
332
+ <platform_long_name>Web-based</platform_long_name>
333
+ <application_code>gmailnew</application_code>
334
+ <application_long_name>Gmail (Explorer)</application_long_name>
335
+ </testing_application>
336
+ <result_images type="array">
337
+ <result_image>
338
+ <image_type>window_on</image_type>
339
+ </result_image>
340
+ <result_image>
341
+ <image_type>full_on</image_type>
342
+ </result_image>
343
+ <result_image>
344
+ <image_type>window_off</image_type>
345
+ </result_image>
346
+ <result_image>
347
+ <image_type>full_off</image_type>
348
+ </result_image>
349
+ </result_images>
350
+ </result>
351
+ <result>
352
+ <check_state nil="true" />
353
+ <error_at type="datetime" nil="true" />
354
+ <finished_at type="datetime" nil="true" />
355
+ <id type="integer">33537726</id>
356
+ <started_at type="datetime" nil="true" />
357
+ <test_code>iphone3</test_code>
358
+ <state>pending</state>
359
+ <result_type>email</result_type>
360
+ <rendered_html_url />
361
+ <testing_application>
362
+ <average_time_to_process type="integer">112</average_time_to_process>
363
+ <business>false</business>
364
+ <result_type>email</result_type>
365
+ <supports_content_blocking>false</supports_content_blocking>
366
+ <desktop_client>false</desktop_client>
367
+ <status>0</status>
368
+ <platform_name>Mobile devices</platform_name>
369
+ <platform_long_name>Cell phones and other mobile devices</platform_long_name>
370
+ <application_code>iphone3</application_code>
371
+ <application_long_name>iPhone</application_long_name>
372
+ </testing_application>
373
+ <result_images type="array">
374
+ <result_image>
375
+ <image_type>window_on</image_type>
376
+ </result_image>
377
+ <result_image>
378
+ <image_type>full_on</image_type>
379
+ </result_image>
380
+ <result_image>
381
+ <image_type>window_off</image_type>
382
+ </result_image>
383
+ <result_image>
384
+ <image_type>full_off</image_type>
385
+ </result_image>
386
+ </result_images>
387
+ </result>
388
+ <result>
389
+ <check_state nil="true" />
390
+ <error_at type="datetime" nil="true" />
391
+ <finished_at type="datetime" nil="true" />
392
+ <id type="integer">33537728</id>
393
+ <started_at type="datetime" nil="true" />
394
+ <test_code>appmail4</test_code>
395
+ <state>pending</state>
396
+ <result_type>email</result_type>
397
+ <rendered_html_url />
398
+ <testing_application>
399
+ <average_time_to_process type="integer">310</average_time_to_process>
400
+ <business>false</business>
401
+ <result_type>email</result_type>
402
+ <supports_content_blocking>false</supports_content_blocking>
403
+ <desktop_client>true</desktop_client>
404
+ <status>0</status>
405
+ <platform_name>Mac OS</platform_name>
406
+ <platform_long_name>Mac OS X</platform_long_name>
407
+ <application_code>appmail4</application_code>
408
+ <application_long_name>Apple Mail 4</application_long_name>
409
+ </testing_application>
410
+ <result_images type="array">
411
+ <result_image>
412
+ <image_type>window_on</image_type>
413
+ </result_image>
414
+ <result_image>
415
+ <image_type>full_on</image_type>
416
+ </result_image>
417
+ <result_image>
418
+ <image_type>window_off</image_type>
419
+ </result_image>
420
+ <result_image>
421
+ <image_type>full_off</image_type>
422
+ </result_image>
423
+ </result_images>
424
+ </result>
425
+ <result>
426
+ <check_state nil="true" />
427
+ <error_at type="datetime" nil="true" />
428
+ <finished_at type="datetime" nil="true" />
429
+ <id type="integer">33537730</id>
430
+ <started_at type="datetime" nil="true" />
431
+ <test_code>ol2010</test_code>
432
+ <state>pending</state>
433
+ <result_type>email</result_type>
434
+ <rendered_html_url />
435
+ <testing_application>
436
+ <average_time_to_process type="integer">171</average_time_to_process>
437
+ <business>true</business>
438
+ <result_type>email</result_type>
439
+ <supports_content_blocking>true</supports_content_blocking>
440
+ <desktop_client>true</desktop_client>
441
+ <status>0</status>
442
+ <platform_name>Windows</platform_name>
443
+ <platform_long_name>Microsoft Windows</platform_long_name>
444
+ <application_code>ol2010</application_code>
445
+ <application_long_name>Outlook 2010</application_long_name>
446
+ </testing_application>
447
+ <result_images type="array">
448
+ <result_image>
449
+ <image_type>window_on</image_type>
450
+ </result_image>
451
+ <result_image>
452
+ <image_type>full_on</image_type>
453
+ </result_image>
454
+ <result_image>
455
+ <image_type>window_off</image_type>
456
+ </result_image>
457
+ <result_image>
458
+ <image_type>full_off</image_type>
459
+ </result_image>
460
+ </result_images>
461
+ </result>
462
+ <result>
463
+ <check_state nil="true" />
464
+ <error_at type="datetime" nil="true" />
465
+ <finished_at type="datetime" nil="true" />
466
+ <id type="integer">33537732</id>
467
+ <started_at type="datetime" nil="true" />
468
+ <test_code>ffgmailnew</test_code>
469
+ <state>pending</state>
470
+ <result_type>email</result_type>
471
+ <rendered_html_url />
472
+ <testing_application>
473
+ <average_time_to_process type="integer">90</average_time_to_process>
474
+ <business>false</business>
475
+ <result_type>email</result_type>
476
+ <supports_content_blocking>true</supports_content_blocking>
477
+ <desktop_client>false</desktop_client>
478
+ <status>0</status>
479
+ <platform_name>Web-based</platform_name>
480
+ <platform_long_name>Web-based</platform_long_name>
481
+ <application_code>ffgmailnew</application_code>
482
+ <application_long_name>Gmail (Firefox)</application_long_name>
483
+ </testing_application>
484
+ <result_images type="array">
485
+ <result_image>
486
+ <image_type>window_on</image_type>
487
+ </result_image>
488
+ <result_image>
489
+ <image_type>full_on</image_type>
490
+ </result_image>
491
+ <result_image>
492
+ <image_type>window_off</image_type>
493
+ </result_image>
494
+ <result_image>
495
+ <image_type>full_off</image_type>
496
+ </result_image>
497
+ </result_images>
498
+ </result>
499
+ <result>
500
+ <check_state nil="true" />
501
+ <error_at type="datetime" nil="true" />
502
+ <finished_at type="datetime" nil="true" />
503
+ <id type="integer">33537734</id>
504
+ <started_at type="datetime" nil="true" />
505
+ <test_code>ffhotmail</test_code>
506
+ <state>pending</state>
507
+ <result_type>email</result_type>
508
+ <rendered_html_url />
509
+ <testing_application>
510
+ <average_time_to_process type="integer">502</average_time_to_process>
511
+ <business>false</business>
512
+ <result_type>email</result_type>
513
+ <supports_content_blocking>false</supports_content_blocking>
514
+ <desktop_client>false</desktop_client>
515
+ <status>0</status>
516
+ <platform_name>Web-based</platform_name>
517
+ <platform_long_name>Web-based</platform_long_name>
518
+ <application_code>ffhotmail</application_code>
519
+ <application_long_name>Hotmail (Firefox)</application_long_name>
520
+ </testing_application>
521
+ <result_images type="array">
522
+ <result_image>
523
+ <image_type>window_on</image_type>
524
+ </result_image>
525
+ <result_image>
526
+ <image_type>full_on</image_type>
527
+ </result_image>
528
+ <result_image>
529
+ <image_type>window_off</image_type>
530
+ </result_image>
531
+ <result_image>
532
+ <image_type>full_off</image_type>
533
+ </result_image>
534
+ </result_images>
535
+ </result>
536
+ <result>
537
+ <check_state nil="true" />
538
+ <error_at type="datetime" nil="true" />
539
+ <finished_at type="datetime" nil="true" />
540
+ <id type="integer">33537736</id>
541
+ <started_at type="datetime" nil="true" />
542
+ <test_code>ffaolonline</test_code>
543
+ <state>pending</state>
544
+ <result_type>email</result_type>
545
+ <rendered_html_url />
546
+ <testing_application>
547
+ <average_time_to_process type="integer">221</average_time_to_process>
548
+ <business>false</business>
549
+ <result_type>email</result_type>
550
+ <supports_content_blocking>true</supports_content_blocking>
551
+ <desktop_client>false</desktop_client>
552
+ <status>0</status>
553
+ <platform_name>Web-based</platform_name>
554
+ <platform_long_name>Web-based</platform_long_name>
555
+ <application_code>ffaolonline</application_code>
556
+ <application_long_name>AOL Mail (Firefox)</application_long_name>
557
+ </testing_application>
558
+ <result_images type="array">
559
+ <result_image>
560
+ <image_type>window_on</image_type>
561
+ </result_image>
562
+ <result_image>
563
+ <image_type>full_on</image_type>
564
+ </result_image>
565
+ <result_image>
566
+ <image_type>window_off</image_type>
567
+ </result_image>
568
+ <result_image>
569
+ <image_type>full_off</image_type>
570
+ </result_image>
571
+ </result_images>
572
+ </result>
573
+ <result>
574
+ <check_state nil="true" />
575
+ <error_at type="datetime" nil="true" />
576
+ <finished_at type="datetime" nil="true" />
577
+ <id type="integer">33537738</id>
578
+ <started_at type="datetime" nil="true" />
579
+ <test_code>ffyahoo</test_code>
580
+ <state>pending</state>
581
+ <result_type>email</result_type>
582
+ <rendered_html_url />
583
+ <testing_application>
584
+ <average_time_to_process type="integer">114</average_time_to_process>
585
+ <business>false</business>
586
+ <result_type>email</result_type>
587
+ <supports_content_blocking>true</supports_content_blocking>
588
+ <desktop_client>false</desktop_client>
589
+ <status>0</status>
590
+ <platform_name>Web-based</platform_name>
591
+ <platform_long_name>Web-based</platform_long_name>
592
+ <application_code>ffyahoo</application_code>
593
+ <application_long_name>Yahoo! Mail (Firefox)</application_long_name>
594
+ </testing_application>
595
+ <result_images type="array">
596
+ <result_image>
597
+ <image_type>window_on</image_type>
598
+ </result_image>
599
+ <result_image>
600
+ <image_type>full_on</image_type>
601
+ </result_image>
602
+ <result_image>
603
+ <image_type>window_off</image_type>
604
+ </result_image>
605
+ <result_image>
606
+ <image_type>full_off</image_type>
607
+ </result_image>
608
+ </result_images>
609
+ </result>
610
+ <result>
611
+ <check_state nil="true" />
612
+ <error_at type="datetime" nil="true" />
613
+ <finished_at type="datetime" nil="true" />
614
+ <id type="integer">33537740</id>
615
+ <started_at type="datetime" nil="true" />
616
+ <test_code>ipad3</test_code>
617
+ <state>pending</state>
618
+ <result_type>email</result_type>
619
+ <rendered_html_url />
620
+ <testing_application>
621
+ <average_time_to_process type="integer">137</average_time_to_process>
622
+ <business>false</business>
623
+ <result_type>email</result_type>
624
+ <supports_content_blocking>false</supports_content_blocking>
625
+ <desktop_client>false</desktop_client>
626
+ <status>0</status>
627
+ <platform_name>Mobile devices</platform_name>
628
+ <platform_long_name>Cell phones and other mobile devices</platform_long_name>
629
+ <application_code>ipad3</application_code>
630
+ <application_long_name>iPad</application_long_name>
631
+ </testing_application>
632
+ <result_images type="array">
633
+ <result_image>
634
+ <image_type>window_on</image_type>
635
+ </result_image>
636
+ <result_image>
637
+ <image_type>full_on</image_type>
638
+ </result_image>
639
+ <result_image>
640
+ <image_type>window_off</image_type>
641
+ </result_image>
642
+ <result_image>
643
+ <image_type>full_off</image_type>
644
+ </result_image>
645
+ </result_images>
646
+ </result>
647
+ </results>
648
+ </test_set_version>
649
+ </test_set_versions>
650
+ <url_or_guid>62e1101</url_or_guid>
651
+ </test_set>