OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-7.2/] [gdb/] [testsuite/] [gdb.gdb/] [observer.exp] - Blame information for rev 330

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 330 jeremybenn
# Copyright 2003, 2004, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
2
 
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 3 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program.  If not, see .
15
 
16
# This file was written by Joel Brobecker (brobecker@gnat.com), derived
17
# from xfullpath.exp.
18
 
19
if $tracelevel then {
20
    strace $tracelevel
21
}
22
 
23
 
24
# are we on a target board
25
if { [is_remote target] || ![isnative] } then {
26
    return
27
}
28
 
29
proc setup_test { executable } {
30
    global gdb_prompt
31
    global timeout
32
 
33
    # load yourself into the debugger
34
    # This can take a relatively long time, particularly for testing where
35
    # the executable is being accessed over a network, or where gdb does not
36
    # support partial symbols for a particular target and has to load the
37
    # entire symbol table.  Set the timeout to 10 minutes, which should be
38
    # adequate for most environments (it *has* timed out with 5 min on a
39
    # SPARCstation SLC under moderate load, so this isn't unreasonable).
40
    # After gdb is started, set the timeout to 30 seconds for the duration
41
    # of this test, and then back to the original value.
42
 
43
    set oldtimeout $timeout
44
    set timeout 600
45
    verbose "Timeout is now $timeout seconds" 2
46
 
47
    global gdb_file_cmd_debug_info
48
    set gdb_file_cmd_debug_info "unset"
49
 
50
    set result [gdb_load $executable]
51
    set timeout $oldtimeout
52
    verbose "Timeout is now $timeout seconds" 2
53
 
54
    if { $result != 0 } then {
55
        return -1
56
    }
57
 
58
    if { $gdb_file_cmd_debug_info != "debug" } then {
59
        untested "No debug information, skipping testcase."
60
        return -1
61
    }
62
 
63
    # Set a breakpoint at main
64
    gdb_test "break captured_main" \
65
            "Breakpoint.*at.* file.*, line.*" \
66
            "breakpoint in captured_main"
67
 
68
    # run yourself
69
    # It may take a very long time for the inferior gdb to start (lynx),
70
    # so we bump it back up for the duration of this command.
71
    set timeout 600
72
 
73
    set description "run until breakpoint at captured_main"
74
    gdb_test_multiple "run -nw" "$description" {
75
        -re "Starting program.*Breakpoint \[0-9\]+,.*captured_main .data.* at .*main.c:.*$gdb_prompt $" {
76
            pass "$description"
77
        }
78
        -re "Starting program.*Breakpoint \[0-9\]+,.*captured_main .data.*$gdb_prompt $" {
79
            xfail "$description (line numbers scrambled?)"
80
        }
81
        -re "vfork: No more processes.*$gdb_prompt $" {
82
            fail "$description (out of virtual memory)"
83
            set timeout $oldtimeout
84
            verbose "Timeout is now $timeout seconds" 2
85
            return -1
86
        }
87
        -re ".*$gdb_prompt $" {
88
            fail "$description"
89
            set timeout $oldtimeout
90
            verbose "Timeout is now $timeout seconds" 2
91
            return -1
92
        }
93
    }
94
 
95
    set timeout $oldtimeout
96
    verbose "Timeout is now $timeout seconds" 2
97
 
98
    return 0
99
}
100
 
101
proc attach_first_observer { message } {
102
    gdb_test_no_output "set \$first_obs = observer_attach_test_notification (&observer_test_first_notification_function)" \
103
        "$message; attach first observer"
104
}
105
 
106
proc attach_second_observer { message } {
107
    gdb_test_no_output "set \$second_obs = observer_attach_test_notification (&observer_test_second_notification_function)" \
108
        "$message; attach second observer"
109
}
110
 
111
proc attach_third_observer { message } {
112
    gdb_test_no_output "set \$third_obs = observer_attach_test_notification (&observer_test_third_notification_function)" \
113
        "$message; attach third observer"
114
}
115
 
116
proc detach_first_observer { message } {
117
    gdb_test_no_output "call observer_detach_test_notification (\$first_obs)" \
118
        "$message; detach first observer"
119
}
120
 
121
proc detach_second_observer { message } {
122
    gdb_test_no_output "call observer_detach_test_notification (\$second_obs)" \
123
        "$message; detach second observer"
124
}
125
 
126
proc detach_third_observer { message } {
127
    gdb_test_no_output "call observer_detach_test_notification (\$third_obs)" \
128
        "$message; detach third observer"
129
}
130
 
131
proc check_counters { first second third message } {
132
    gdb_test "print observer_test_first_observer" \
133
        ".\[0-9\]+ =.*$first" \
134
        "$message; check first observer counter value"
135
    gdb_test "print observer_test_second_observer" \
136
        ".\[0-9\]+ =.*$second" \
137
        "$message; check second observer counter value"
138
    gdb_test "print observer_test_third_observer" \
139
        ".\[0-9\]+ =.*$third" \
140
        "$message; check third observer counter value"
141
}
142
 
143
proc reset_counters { message } {
144
    gdb_test_no_output "set variable observer_test_first_observer = 0" \
145
        "$message; reset first observer counter"
146
    gdb_test_no_output "set variable observer_test_second_observer = 0" \
147
        "$message; reset second observer counter"
148
    gdb_test_no_output "set variable observer_test_third_observer = 0" \
149
        "$message; reset third observer counter"
150
}
151
 
152
proc test_notifications { first second third message args } {
153
    # Do any initialization
154
    for {set i 0} {$i < [llength $args]} {incr i} {
155
        [lindex $args $i] $message
156
    }
157
    reset_counters $message
158
    # Call observer_notify_test_notification.  Note that this procedure
159
    # takes one argument, but this argument is ignored by the observer
160
    # callbacks we have installed.  So we just pass an arbitrary value.
161
    gdb_test_no_output "call observer_notify_test_notification (0)" \
162
        "$message; sending notification"
163
    check_counters $first $second $third $message
164
}
165
 
166
proc test_observer { executable } {
167
 
168
    set setup_result [setup_test $executable]
169
    if {$setup_result <0} then {
170
        return -1
171
    }
172
 
173
    # First, try sending a notification without any observer attached.
174
    test_notifications 0 0 0 "no observer attached"
175
 
176
    # Now, attach one observer, and send a notification.
177
    test_notifications 0 1 0 "second observer attached" \
178
        attach_second_observer
179
 
180
    # Remove the observer, and send a notification.
181
    test_notifications 0 0 0 "second observer detached" \
182
        detach_second_observer
183
 
184
    # With a new observer.
185
    test_notifications 1 0 0 "1st observer added" \
186
        attach_first_observer
187
 
188
    # With 2 observers.
189
    test_notifications 1 1 0 "2nd observer added" \
190
        attach_second_observer
191
 
192
    # With 3 observers.
193
    test_notifications 1 1 1 "3rd observer added" \
194
        attach_third_observer
195
 
196
    # Remove middle observer.
197
    test_notifications 1 0 1 "2nd observer removed" \
198
        detach_second_observer
199
 
200
    # Remove first observer.
201
    test_notifications 0 0 1 "1st observer removed" \
202
        detach_first_observer
203
 
204
    # Remove last observer.
205
    test_notifications 0 0 0 "3rd observer removed" \
206
        detach_third_observer
207
 
208
    # Go back to 3 observers, and remove them in a different order...
209
    test_notifications 1 1 1 "three observers added" \
210
        attach_first_observer \
211
        attach_second_observer \
212
        attach_third_observer
213
 
214
    # Remove the third observer.
215
    test_notifications 1 1 0 "third observer removed" \
216
        detach_third_observer
217
 
218
    # Remove the second observer.
219
    test_notifications 1 0 0 "second observer removed" \
220
        detach_second_observer
221
 
222
    # Remove the first observer, no more observers.
223
    test_notifications 0 0 0 "first observer removed" \
224
        detach_first_observer
225
 
226
    return 0
227
}
228
 
229
# Find a pathname to a file that we would execute if the shell was asked
230
# to run $arg using the current PATH.
231
 
232
proc find_gdb { arg } {
233
 
234
    # If the arg directly specifies an existing executable file, then
235
    # simply use it.
236
 
237
    if [file executable $arg] then {
238
        return $arg
239
    }
240
 
241
    set result [which $arg]
242
    if [string match "/" [ string range $result 0 0 ]] then {
243
        return $result
244
    }
245
 
246
    # If everything fails, just return the unqualified pathname as default
247
    # and hope for best.
248
 
249
    return $arg
250
}
251
 
252
# Run the test with self.
253
# Copy the file executable file in case this OS doesn't like to edit its own
254
# text space.
255
 
256
set GDB_FULLPATH [find_gdb $GDB]
257
 
258
# Remove any old copy lying around.
259
remote_file host delete x$tool
260
 
261
gdb_start
262
set file [remote_download host $GDB_FULLPATH x$tool]
263
set result [test_observer $file];
264
gdb_exit;
265
catch "remote_file host delete $file";
266
 
267
if {$result <0} then {
268
    warning "Couldn't test self"
269
    return -1
270
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.