conflict 0.1.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.
@@ -0,0 +1,98 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one
2
+ # or more contributor license agreements. See the NOTICE file
3
+ # distributed with this work for additional information
4
+ # regarding copyright ownership. The ASF licenses this file
5
+ # to you under the Apache License, Version 2.0 (the
6
+ # "License"); you may not use this file except in compliance
7
+ # with the License. You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
18
+ require 'test/unit'
19
+ require 'conflict'
20
+ include Conflict
21
+ require File.dirname(__FILE__) + '/common.rb'
22
+
23
+ class ParserTest < Test::Unit::TestCase
24
+ include ConflictConstants
25
+ COMMON_PROPERTIES = {:path=>".", :ttl=>Conflict::TTL}
26
+
27
+ def test_info_parser
28
+
29
+ parser = InfoParser::new
30
+ info = File.new(STOMP_1_INFO_PATH).to_s
31
+ properties = parser.parse info
32
+ assert_equal STOMP_1_URL, properties[:url]
33
+
34
+ info = File.new(STOMP_2_INFO_PATH).to_s
35
+ properties = parser.parse info
36
+ assert_equal STOMP_2_URL, properties[:url]
37
+ end
38
+
39
+ def test_diff_parser_with_info
40
+
41
+ diff = File::new(STOMP_1_DIFF_PATH).to_s
42
+ parser = DiffParser::new({:url=>STOMP_1_URL}.merge(COMMON_PROPERTIES))
43
+ events = parser.parse diff, CLIENT_ONE
44
+
45
+ assert_equal 1, events.size
46
+ first_event = events[0]
47
+
48
+ diff = File::new(STOMP_2_DIFF_PATH).to_s
49
+ parser = DiffParser::new({:url=>STOMP_2_URL}.merge(COMMON_PROPERTIES))
50
+ events = parser.parse diff, CLIENT_ONE
51
+
52
+ assert_equal 1, events.size
53
+ second_event = events[0]
54
+ assert first_event.eql?(second_event)
55
+ end
56
+
57
+ def test_diff_parser_two_changes_same_file
58
+
59
+ url = 'https://svn.apache.org/repos/asf/myfaces/core/trunk/api/src/main/java/javax'
60
+ parser = DiffParser::new({:url=>url}.merge(COMMON_PROPERTIES))
61
+ diff = File.new(DATA_DIR + 'apache_myfaces.diff.txt').to_s
62
+ events = parser.parse diff, CLIENT_ONE
63
+
64
+ assert_equal 1, events.size
65
+ assert events[0].eql?(Event::new(CLIENT_ONE, "changed", url + "/FacesServlet.java"))
66
+ end
67
+
68
+ def test_diff_parser_deleted_added_changed_in_same_patch
69
+
70
+ url = 'http://activemessaging.googlecode.com/svn/trunk/plugins/activemessaging/lib'
71
+ parser = DiffParser::new({:url=>url}.merge(COMMON_PROPERTIES))
72
+ diff = File.new(DATA_DIR + 'a13g.diff.txt').to_s
73
+ events = parser.parse diff, CLIENT_ONE
74
+
75
+ assert_equal 3, events.size
76
+ assert events[0].eql?(Event::new(CLIENT_ONE, "deleted", url + "/asqs.rb"))
77
+ assert events[1].eql?(Event::new(CLIENT_ONE, "changed", url + "/jms.rb"))
78
+ assert events[2].eql?(Event::new(CLIENT_ONE, "added", url + "/new.rb"))
79
+ end
80
+
81
+ def test_diff_parser_deleted_added_changed_in_different_files
82
+
83
+ resource = CONFLICT_URL + '/test_data.txt'
84
+ parser = DiffParser::new({:url=>CONFLICT_URL}.merge(COMMON_PROPERTIES))
85
+ added = File::new(DATA_DIR + "three/added.diff.txt").to_s
86
+ deleted = File::new(DATA_DIR + "three/deleted.diff.txt").to_s
87
+ changed = File::new(DATA_DIR + "three/changed.diff.txt").to_s
88
+
89
+ events = parser.parse added, CLIENT_ONE
90
+ assert events[0].eql?(Event::new(CLIENT_ONE, "added", resource))
91
+
92
+ events = parser.parse deleted, CLIENT_ONE
93
+ assert events[0].eql?(Event::new(CLIENT_ONE, "deleted", resource))
94
+
95
+ events = parser.parse changed, CLIENT_ONE
96
+ assert events[0].eql?(Event::new(CLIENT_ONE, "changed", resource))
97
+ end
98
+ end
@@ -0,0 +1,56 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one
2
+ # or more contributor license agreements. See the NOTICE file
3
+ # distributed with this work for additional information
4
+ # regarding copyright ownership. The ASF licenses this file
5
+ # to you under the Apache License, Version 2.0 (the
6
+ # "License"); you may not use this file except in compliance
7
+ # with the License. You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
18
+ require 'test/unit'
19
+ require 'conflict'
20
+ include Conflict
21
+
22
+ class RoundTripExpirationTest < Test::Unit::TestCase
23
+ include ConflictConstants
24
+
25
+ def test_expiration
26
+
27
+ diff = File.new("./test/data/rails.diff.txt").to_s
28
+ info = File.new("./test/data/rails.info.txt").to_s
29
+ ttl = 0
30
+
31
+ cfg = {:port=>86}
32
+ thread = Thread.new do
33
+ Server::new(cfg.merge({:ttl=>ttl})).start
34
+ end
35
+
36
+ client_one = Client::new({:id=>CLIENT_ONE}.merge(cfg))
37
+ client_two = Client::new({:id=>CLIENT_TWO}.merge(cfg))
38
+
39
+ conflicts = client_one.diff diff, info
40
+ assert_equal 0, conflicts.size
41
+ assert_equal 1, client_one.count
42
+
43
+ sleep(ttl + 1) # let it expire
44
+
45
+ assert_equal 1, client_one.count, "server will not dump the event until next request"
46
+
47
+ conflicts = client_two.diff diff, info
48
+ assert_equal 0, conflicts.size, "should not conflict w/ expired event"
49
+ assert_equal 1, client_one.count, "expired event should be gone"
50
+
51
+ thread.kill
52
+ thread.join(5)
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,105 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one
2
+ # or more contributor license agreements. See the NOTICE file
3
+ # distributed with this work for additional information
4
+ # regarding copyright ownership. The ASF licenses this file
5
+ # to you under the Apache License, Version 2.0 (the
6
+ # "License"); you may not use this file except in compliance
7
+ # with the License. You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
18
+ require 'test/unit'
19
+ require 'conflict'
20
+ include Conflict
21
+
22
+ class RoundTripTest < Test::Unit::TestCase
23
+ include ConflictConstants
24
+ RESOURCE = "http://svn.rubyonrails.org/rails/trunk/release.rb"
25
+
26
+ def setup
27
+ @diff = File.new("./test/data/rails.diff.txt").to_s
28
+ @info = File.new("./test/data/rails.info.txt").to_s
29
+
30
+ @first = Event::new(CLIENT_ONE, "changed", RESOURCE)
31
+ @second = Event::new(CLIENT_TWO, "changed", RESOURCE)
32
+ @third = Event::new(CLIENT_THREE, "changed", RESOURCE)
33
+
34
+ end
35
+
36
+ def test_happy_path_conflict_accumalation
37
+ happy_path_conflict_accumalation nil
38
+ end
39
+
40
+ def test_happy_path_conflict_accumalation_with_alternate_port_and_url
41
+ happy_path_conflict_accumalation 81
42
+ end
43
+
44
+ private
45
+ def happy_path_conflict_accumalation port
46
+
47
+ cfg = {:port=>port}
48
+ @thread = Thread.new do
49
+ Server::new(cfg).start
50
+ end
51
+
52
+ client_one = Client::new({:id=>CLIENT_ONE}.merge(cfg))
53
+ client_two = Client::new({:id=>CLIENT_TWO}.merge(cfg))
54
+ client_three = Client::new({:id=>CLIENT_THREE}.merge(cfg))
55
+
56
+ response = client_one.diff @diff, @info
57
+ assert [].eql?(response)
58
+ assert_equal 1, client_one.count
59
+
60
+ response = client_two.diff(@diff, @info)
61
+ assert [Conflict::Conflict.new(@second, @first)].eql?(response)
62
+ assert_equal 2, client_one.count
63
+
64
+ response = client_three.diff @diff, @info
65
+ assert [Conflict::Conflict.new(@third, @first), Conflict::Conflict::new(@third, @second)].eql?(response)
66
+ assert_equal 3, client_one.count
67
+
68
+ response = client_one.resend
69
+ assert [Conflict::Conflict.new(@first, @second), Conflict::Conflict::new(@first, @third)].eql?(response)
70
+ assert_equal 3, client_one.count
71
+
72
+ response = client_two.resend
73
+ assert [Conflict::Conflict.new(@second, @third), Conflict::Conflict::new(@second, @first)].eql?(response)
74
+ assert_equal 3, client_one.count
75
+
76
+ response = client_three.revert @info
77
+ assert [].eql?(response)
78
+ assert_equal 2, client_one.count
79
+
80
+ response = client_two.resend
81
+ assert [Conflict::Conflict.new(@second, @first)].eql?(response)
82
+ assert_equal 2, client_one.count
83
+
84
+ response = client_one.resend
85
+ assert [Conflict::Conflict.new(@first, @second)].eql?(response)
86
+ assert_equal 2, client_one.count
87
+
88
+ response = client_two.revert @info
89
+ assert [].eql?(response)
90
+ assert_equal 1, client_one.count
91
+
92
+ response = client_one.resend
93
+ assert [].eql?(response)
94
+ assert_equal 1, client_one.count
95
+
96
+ response = client_one.revert @info
97
+ assert [].eql?(response)
98
+ assert_equal 0, client_one.count
99
+
100
+ @thread.kill
101
+ @thread.join(5)
102
+
103
+ end
104
+
105
+ end
@@ -0,0 +1,67 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one
2
+ # or more contributor license agreements. See the NOTICE file
3
+ # distributed with this work for additional information
4
+ # regarding copyright ownership. The ASF licenses this file
5
+ # to you under the Apache License, Version 2.0 (the
6
+ # "License"); you may not use this file except in compliance
7
+ # with the License. You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
18
+ require 'test/unit'
19
+ require 'conflict'
20
+ include Conflict
21
+
22
+ class RoundTripMultiDiffTest < Test::Unit::TestCase
23
+ include ConflictConstants
24
+
25
+ def test_dev_with_no_conflicts
26
+
27
+ @cfg = {:port=>85}
28
+ @thread = Thread.new do
29
+ Server::new(@cfg).start
30
+ end
31
+
32
+ rails_diff = File.new("./test/data/rails.diff.txt").to_s
33
+ rails_info = File.new("./test/data/rails.info.txt").to_s
34
+ stomp_one_diff = File::new(STOMP_1_DIFF_PATH).to_s
35
+ stomp_one_info = File.new(STOMP_1_INFO_PATH).to_s
36
+ stomp_two_diff = File::new(STOMP_2_DIFF_PATH).to_s
37
+ stomp_two_info = File.new(STOMP_2_INFO_PATH).to_s
38
+
39
+ client_one = Client::new({:id=>CLIENT_ONE}.merge(@cfg))
40
+ client_two = Client::new({:id=>CLIENT_TWO}.merge(@cfg))
41
+ client_three = Client::new({:id=>CLIENT_THREE}.merge(@cfg))
42
+
43
+ response = client_one.multi_diff [rails_diff, stomp_one_diff], [rails_info, stomp_one_info]
44
+ assert_equal [], response
45
+
46
+ response = client_one.multi_diff [stomp_two_diff], [stomp_two_info]
47
+ assert_equal [], response
48
+
49
+ response = client_one.multi_diff [stomp_one_diff], [stomp_one_info]
50
+ assert_equal [], response
51
+
52
+ response = client_three.multi_diff [rails_diff], [rails_info]
53
+ assert_equal [], response
54
+
55
+ client_one.revert rails_info
56
+ client_two.revert rails_info
57
+ client_three.revert rails_info
58
+ @thread.kill
59
+ @thread.join(5)
60
+
61
+ end
62
+
63
+ def test_dev_with_conflicts
64
+ # this needs to get done
65
+ end
66
+
67
+ end
@@ -0,0 +1,82 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one
2
+ # or more contributor license agreements. See the NOTICE file
3
+ # distributed with this work for additional information
4
+ # regarding copyright ownership. The ASF licenses this file
5
+ # to you under the Apache License, Version 2.0 (the
6
+ # "License"); you may not use this file except in compliance
7
+ # with the License. You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
18
+ require 'test/unit'
19
+ require 'conflict'
20
+ include Conflict
21
+
22
+ class RoundTripMultipleActionsTest < Test::Unit::TestCase
23
+ include ConflictConstants
24
+ RESOURCE = CONFLICT_URL + '/test_data.txt'
25
+ DATA_DIR = './test/data/three/'
26
+
27
+ def setup
28
+
29
+ @added = File::new(DATA_DIR + "added.diff.txt").to_s
30
+ @deleted = File::new(DATA_DIR + "deleted.diff.txt").to_s
31
+ @changed = File::new(DATA_DIR + "changed.diff.txt").to_s
32
+ @info = File::new(DATA_DIR + "conflict.info.txt").to_s
33
+
34
+ @first = Event::new(CLIENT_ONE, "added", RESOURCE)
35
+ @second = Event::new(CLIENT_TWO, "deleted", RESOURCE)
36
+ @third = Event::new(CLIENT_THREE, "changed", RESOURCE)
37
+
38
+ @conf = {:port=>83}
39
+
40
+ @thread = Thread.new do
41
+ Server::new(@conf).start
42
+ end
43
+
44
+ end
45
+
46
+ def teardown
47
+ @thread.kill
48
+ @thread.join(5)
49
+ end
50
+
51
+ def test_workflow_using_add_delete_and_change
52
+
53
+ client_one = Client::new({:id=>CLIENT_ONE}.merge(@conf)) # dev start conflict clients
54
+ client_two = Client::new({:id=>CLIENT_TWO}.merge(@conf))
55
+ client_three = Client::new({:id=>CLIENT_THREE}.merge(@conf))
56
+
57
+ response = client_one.diff(@added, @info)
58
+ assert_equal [], response
59
+
60
+ response = client_two.diff(@deleted, @info)
61
+ assert [Conflict::Conflict.new(@second, @first)].eql?(response)
62
+
63
+ response = client_three.diff(@changed, @info)
64
+ assert [Conflict::Conflict.new(@third, @first),Conflict::Conflict.new(@third, @second)].eql?(response)
65
+
66
+ response = client_two.revert @info
67
+ assert_equal [], response
68
+
69
+ response = client_one.diff(@added, @info)
70
+ assert [Conflict::Conflict.new(@first, @third)].eql?(response)
71
+
72
+ response = client_three.diff(@changed, @info)
73
+ assert [Conflict::Conflict.new(@third, @first)].eql?(response)
74
+
75
+ response = client_one.revert @info
76
+ assert_equal [], response
77
+
78
+ response = client_three.revert @info
79
+ assert_equal [], response
80
+ end
81
+
82
+ end
@@ -0,0 +1,79 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one
2
+ # or more contributor license agreements. See the NOTICE file
3
+ # distributed with this work for additional information
4
+ # regarding copyright ownership. The ASF licenses this file
5
+ # to you under the Apache License, Version 2.0 (the
6
+ # "License"); you may not use this file except in compliance
7
+ # with the License. You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+
18
+ require 'test/unit'
19
+ require 'conflict'
20
+ include Conflict
21
+
22
+ class NegativeServerTest < Test::Unit::TestCase
23
+ include ConflictConstants
24
+ DATA_DIR = './test/data/three/'
25
+
26
+ def test_combinations
27
+
28
+ @cfg = {:port=>84}
29
+ @thread = Thread.new do
30
+ Server::new(@cfg).start
31
+ end
32
+
33
+ added = File::new(DATA_DIR + "added.diff.txt").to_s
34
+ deleted = File::new(DATA_DIR + "deleted.diff.txt").to_s
35
+ info = File::new(DATA_DIR + "conflict.info.txt").to_s
36
+
37
+ clients = [{}, {"client"=>""}, {"client"=>" "}, {"client"=>"foo"}]
38
+ diffs = [{}, {"diff"=>""}, {"diff"=>" "}, {"diff"=>added} ]
39
+ infos = [{}, {"info"=>""}, {"info"=>" "}, {"info"=>info} ]
40
+
41
+ # leaving these out until I can figure out how to make multi-params happen w/ ruby 1.8.4
42
+ # {"diff"=>[added,deleted]}
43
+ # {"info"=>[info,info]}
44
+ # [3, 4, 4]
45
+
46
+ # single diff with no changes, single diff w/ no changes,
47
+ # single diff w/ changes, multi-diff with changes
48
+ good = [ [3, 1, 3], [3, 2, 3], [3, 3, 3] ]
49
+
50
+ # tests all mathematical possibilities
51
+ clients.each_index do | i |
52
+ diffs.each_index do | j |
53
+ infos.each_index do | k |
54
+
55
+ body = clients[i].merge(diffs[j]).merge(infos[k])
56
+ code = send body
57
+ point = [i, j, k]
58
+ expected_code = good.index(point) ? 200 : 500
59
+ assert_equal(expected_code.to_s, code, point.to_s + " -> " + body.to_s)
60
+
61
+ end
62
+ end
63
+ end
64
+
65
+ @thread.kill
66
+ @thread.join(5)
67
+
68
+ end
69
+
70
+ def send body
71
+
72
+ req = Net::HTTP::Post.new(Conflict::DIFF_URL)
73
+ req.set_form_data(body)
74
+ http = Net::HTTP.new("127.0.0.1", @cfg[:port])
75
+ res = http.request(req).code
76
+
77
+ end
78
+
79
+ end