source: subversion/applications/utils/osmapitest/osmapitest.rb @ 29844

Last change on this file since 29844 was 2317, checked in by nickb, 12 years ago

osm api test

File size: 6.0 KB
Line 
1# OSMAPITEST
2
3module OSMAPITEST
4
5require 'test/unit'
6require 'net/http'
7require 'bboxfrompoint'
8include Net
9
10$USERNAME = 
11$PASSWORD = 
12
13class MapTest# < Test::Unit::TestCase
14
15  def initialize(test_name, range, diam_range)
16    @test_name = test_name
17    @range = range
18    @diam_range = diam_range
19  end
20
21  def get_node
22   
23    Net::HTTP.start('www.openstreetmap.org') do |http|
24        req = Net::HTTP::Get.new(@@urlbase+'node/40')
25        req.basic_auth $USERNAME, $PASSWORD
26        response = http.request(req)
27        print response.body
28     end
29  end
30
31  def create_test_dir
32
33    t = Time.now
34
35    `mkdir /tmp/#{@test_name}/` unless File.exists?("/tmp/#{@test_name}")
36
37    raise $?.to_s if $?.nil?
38
39    return "/tmp/#{@test_name}/#{t.strftime("%H-%M-%S-%d-%B-%y")}"
40  end
41
42  def generate_map_request(params)
43
44    lon = params[0]
45    lat = params[1]
46    d = params[2]
47
48    bbox = BboxFromPoint.new.bbox_from_point(x,y,d)
49    outdir = create_test_dir
50    begin
51      `curl -i -u #{$USERNAME}@openstreetmap.org:#{PASSWORD} http://www.openstreetmap.org/api/0.4/#{bbox} > #{outdir}`
52    rescue SystemCallError
53      $stderr.print "Bbox request failed at #{outdir}" + $!
54    end
55
56    return "Bbox request made to #{outdir} - centreX: #{longitude} centreY: #{latitude} diameter: #{d}"
57  end
58
59
60  def get_range
61    xmin = @range[0]
62    longitudemax = @range[1]
63    ymin = @range[2]
64    latitudemax = @range[3]
65    dmin = @diam_range[0]
66    dmax = @diam_range[1]
67    res = [] 
68    res[0] = (rand(longitudemax - xmin)) + xmin
69    res[1] = (rand(latitudemax - ymin)) + ymin
70    res[2] = (rand(dmax - dmin)) + dmin
71   
72    return res
73   end
74
75   def map_test(attempts)
76
77    n = 0
78    if attempts == -1
79        while n < 1
80          generate_map_request(get_range)
81          puts "#{generate_map_request(get_range)}"
82        end
83    else
84        while n < attempts
85          generate_map_request(get_range)
86          n+=1
87        end
88    end
89  end
90end
91
92  class CreateTest
93
94    #Bbox = [xmin, longitudemax, ymin, latitudemax]
95    def initialize(bbox, urlbase, user, pass)
96      @bbox = bbox
97      @urlbase = urlbase
98      @user = user
99      @pass = pass
100    end
101
102    def get_from_api(url_extension)
103
104      Net::HTTP.start(@urlbase) do |http|
105        req = Net::HTTP::Get.new(url_extension)
106        req.basic_auth @user, @pass
107        response = http.request(req)
108        @res =  response.body
109      end
110      return @res
111    end
112
113    def put_to_api(url_extension, xml_to_put)
114
115      Net::HTTP.start(@urlbase) do |http|
116        req = Net::HTTP::Put.new(url_extension)
117        req.basic_auth @user, @pass
118        response = http.request(req, xml_to_put)
119        @res =  response.body
120      end
121      return @res
122    end
123
124    #Returns the xml for a new node
125    def node_to_xml(lon,lat)
126      return "<osm> <node id='0' longitude='#{longitude}' latitude='#{latitude}' /></osm>"
127    end 
128
129    def seg_to_xml(from_node, to_node)
130
131      seg_xml = "<osm version=\"0.4\" generator=\"OpenStreetMap server\">
132                    <segment id=\"0\" from=\"#{from_node}\" to=\"#{to_node}\" visible=\"true\" timestamp=\"#{Time.now}\">
133                    </segment>
134                 </osm>"
135
136    return seg_xml
137    end
138
139    def way_to_xml(seg_id)
140      way_xml_body = ""
141      way_xml_head = "<osm version=\"0.4\" generator=\"OpenStreetMap server\">
142       <way id=\"0\" visible=\"true\" timestamp=\"#{Time.now}\">"
143
144      seg_id.each do |seg|
145        way_xml_body << "\n <seg id=\"#{seg}\"/>"
146      end
147
148      way_tags = "<tag k=\"name\" v=\"foo\"/>
149         <tag k=\"ref\" v=\"bar\"/> "
150
151       way_xml = way_xml_head + way_xml_body + way_tags + "</way></osm>"
152
153       return way_xml
154    end
155 
156    #Creates new nodes and puts them to the server via the API
157    #Retuns an array of new node objects
158    #@@Params: n = number of nodes to create
159    #@@Params: loninc = x incrementation in meters
160    def makenode(n, loninc, latinc)
161      lon = @bbox[0]
162      lat = @bbox[2]
163      nodes = []
164      i = 0
165      api_ext = '/api/0.4/node/create'
166
167      while i < n
168          unless lon > @bbox[1] or lat > @bbox[3]
169            begin
170              node_id =  put_to_api(api_ext, node_to_xml(x,y))
171              puts "Created a node with node id #{node_id}"
172              nodes << [node_id,lon,lat]
173              lon = lon + loninc
174              lat = lat + latinc
175            rescue Net::HTTPServerException
176              $stderr.print "#{Net::HTTPServerException} whilst attempting to PUT #{node_to_xml(lon,lat)} to #{api_ext}" 
177            ensure
178              i+=1
179            end
180         end
181      end
182      return nodes
183    end
184
185    #Creates a new segment object and returns an array of segment ids
186    #@@Params: array of node objects
187    def makeseg(nodes)
188
189    first = true
190    segs = []
191    api_ext = '/api/0.4/segment/create'
192
193    node_a = nodes[0][0]
194    nodes.shift
195    nodes.each do |node|
196        node_b = node[0]
197#        puts "node a is #{node_a} node_b is #{node_b}"
198        begin
199          seg_id = put_to_api(api_ext,seg_to_xml(node_a, node_b)) 
200          puts "Created a segment with id #{seg_id}"
201          segs << [seg_id]
202          raise "SegIdError" if seg_id == 0 or seg_id.nil?
203        rescue Net::HTTPServerException
204            $stderr.print "#{Net::HTTPServerException} whilst attempting to PUT #{seg_to_xml(node_a, node_b)} to #{api_ext}"
205          end
206          node_a = node_b
207        end
208     
209    return segs
210    end
211
212    #Returns a new way object
213    #@@Params: array of segments
214    def makeway(segs)
215
216    api_ext = '/api/0.4/way/create'
217    ways = []
218
219   
220      begin
221        way_id = put_to_api(api_ext,way_to_xml(segs))
222        puts way_to_xml(segs)
223        raise "WayIdError" if way_id == 0 or way_id.nil?
224        puts "Created a way with id #{way_id}"
225        ways << way_id
226      rescue Net::HTTPServerException
227        $stderr.print "#{Net::HTTPServerException} whilst attempting to PUT #{way_to_xml(segs)} to #{api_ext}"
228      rescue Net::HTTPFatalError
229        $stderr.print "#{Net::HTTPFatalError} whilst attempting to PUT #{way_to_xml(segs)} to #{api_ext}"
230      end
231
232    return ways
233     
234
235    end
236end
237end
238
239
Note: See TracBrowser for help on using the repository browser.