CLOSED TREE: TraceMonkey merge head. (a=blockers)
[mozilla-central.git] / netwerk / test / TestPerf.cpp
blobe3862e57891a10d7b04ace62e3bb960058113147
1 #include "TestCommon.h"
2 #include <stdio.h>
3 #include "nsCRT.h" /* should be "plstr.h"? */
4 #include "nsNetUtil.h"
5 #include "nsIServiceManager.h"
6 #include "nsIComponentRegistrar.h"
7 #include "nsISupportsArray.h"
9 namespace TestPerf {
11 static nsIIOService *gIOService = nsnull;
13 //-----------------------------------------------------------------------------
15 static PRBool
16 load_sync_1(nsISupports *element, void *data)
18 nsCOMPtr<nsIInputStream> stream;
19 nsCOMPtr<nsIURI> uri( do_QueryInterface(element) );
20 nsCAutoString spec;
21 nsresult rv;
23 rv = NS_OpenURI(getter_AddRefs(stream), uri, gIOService);
24 if (NS_FAILED(rv)) {
25 uri->GetAsciiSpec(spec);
26 fprintf(stderr, "*** failed opening %s [rv=%x]\n", spec.get(), rv);
27 return PR_TRUE;
30 char buf[4096];
31 PRUint32 bytesRead;
33 while (1) {
34 rv = stream->Read(buf, sizeof(buf), &bytesRead);
35 if (NS_FAILED(rv) || bytesRead == 0) {
36 if (NS_FAILED(rv)) {
37 uri->GetAsciiSpec(spec);
38 fprintf(stderr, "*** failed reading %s [rv=%x]\n", spec.get(), rv);
40 break;
44 return PR_TRUE;
47 static nsresult
48 load_sync(nsISupportsArray *urls)
50 urls->EnumerateForwards(load_sync_1, nsnull);
51 return NS_OK;
54 //-----------------------------------------------------------------------------
56 static int gRequestCount = 0;
58 class MyListener : public nsIStreamListener
60 public:
61 NS_DECL_ISUPPORTS
62 NS_DECL_NSIREQUESTOBSERVER
63 NS_DECL_NSISTREAMLISTENER
65 MyListener() { }
66 virtual ~MyListener() {}
69 NS_IMPL_ISUPPORTS2(MyListener, nsIStreamListener, nsIRequestObserver)
71 NS_IMETHODIMP
72 MyListener::OnStartRequest(nsIRequest *req, nsISupports *ctx)
74 return NS_OK;
77 NS_IMETHODIMP
78 MyListener::OnDataAvailable(nsIRequest *req, nsISupports *ctx,
79 nsIInputStream *stream,
80 PRUint32 offset, PRUint32 count)
82 nsresult rv;
83 char buf[4096];
84 PRUint32 n, bytesRead;
85 while (count) {
86 n = PR_MIN(count, sizeof(buf));
87 rv = stream->Read(buf, n, &bytesRead);
88 if (NS_FAILED(rv))
89 break;
90 count -= bytesRead;
91 if (bytesRead == 0)
92 break;
94 return NS_OK;
97 NS_IMETHODIMP
98 MyListener::OnStopRequest(nsIRequest *req, nsISupports *ctx, nsresult status)
100 if (NS_FAILED(status)) {
101 nsCAutoString spec;
102 req->GetName(spec);
103 fprintf(stderr, "*** failed loading %s [reason=%x]\n", spec.get(), status);
105 if (--gRequestCount == 0) {
106 // post shutdown event
107 QuitPumpingEvents();
109 return NS_OK;
112 static PRBool
113 load_async_1(nsISupports *element, void *data)
115 nsCOMPtr<nsIURI> uri( do_QueryInterface(element) );
116 if (!uri)
117 return PR_TRUE;
119 MyListener *listener = new MyListener();
120 if (!listener)
121 return PR_TRUE;
122 NS_ADDREF(listener);
123 nsresult rv = NS_OpenURI(listener, nsnull, uri, gIOService);
124 NS_RELEASE(listener);
125 if (NS_SUCCEEDED(rv))
126 gRequestCount++;
127 else
128 printf(">> NS_OpenURI failed [rv=%x]\n", rv);
129 return PR_TRUE;
132 static nsresult
133 load_async(nsISupportsArray *urls)
135 urls->EnumerateForwards(load_async_1, nsnull);
137 PumpEvents();
138 return NS_OK;
141 //-----------------------------------------------------------------------------
143 static nsresult
144 read_file(const char *fname, nsISupportsArray *urls)
146 FILE *fp = fopen(fname, "r");
147 if (!fp) {
148 printf("failed opening file: %s\n", fname);
149 return NS_ERROR_FAILURE;
152 nsCOMPtr<nsIURI> uri;
153 nsresult rv;
154 char buf[512];
155 while (fgets(buf, sizeof(buf), fp)) {
156 // remove trailing newline
157 buf[strlen(buf) - 1] = 0;
158 rv = NS_NewURI(getter_AddRefs(uri), buf, nsnull, gIOService);
159 if (NS_FAILED(rv))
160 printf("*** ignoring malformed uri: %s\n", buf);
161 else {
162 //nsXPIDLCString spec;
163 //uri->GetSpec(getter_Copies(spec));
164 //printf("read url: %s\n", spec.get());
165 urls->AppendElement(uri);
169 fclose(fp);
170 return NS_OK;
173 //-----------------------------------------------------------------------------
175 static void
176 print_usage()
178 printf("usage: TestPerf [-sync|-async] <file-of-urls>\n");
181 } // namespace
183 using namespace TestPerf;
186 main(int argc, char **argv)
188 if (test_common_init(&argc, &argv) != 0)
189 return -1;
191 nsresult rv;
192 PRBool sync;
194 if (argc < 3) {
195 print_usage();
196 return -1;
199 if (PL_strcasecmp(argv[1], "-sync") == 0)
200 sync = PR_TRUE;
201 else if (PL_strcasecmp(argv[1], "-async") == 0)
202 sync = PR_FALSE;
203 else {
204 print_usage();
205 return -1;
208 nsCOMPtr<nsIServiceManager> servMan;
209 NS_InitXPCOM2(getter_AddRefs(servMan), nsnull, nsnull);
210 nsCOMPtr<nsIComponentRegistrar> registrar = do_QueryInterface(servMan);
211 NS_ASSERTION(registrar, "Null nsIComponentRegistrar");
212 registrar->AutoRegister(nsnull);
214 // cache the io service
216 nsCOMPtr<nsIIOService> ioserv( do_GetIOService() );
217 NS_ADDREF(gIOService = ioserv);
220 nsCOMPtr<nsISupportsArray> urls;
221 rv = NS_NewISupportsArray(getter_AddRefs(urls));
222 if (NS_FAILED(rv)) return -1;
224 rv = read_file(argv[2], urls);
225 if (NS_FAILED(rv)) {
226 printf("failed reading file-of-urls\n");
227 return -1;
230 PRUint32 urlCount;
231 urls->Count(&urlCount);
233 PRIntervalTime start = PR_IntervalNow();
235 if (sync)
236 rv = load_sync(urls);
237 else
238 rv = load_async(urls);
240 if (NS_FAILED(rv)) {
241 printf("load failed\n");
242 return -1;
245 PRIntervalTime end = PR_IntervalNow();
246 fprintf(stderr, "read: %u urls; total time: %u milliseconds\n",
247 urlCount,
248 PR_IntervalToMilliseconds(end - start));
250 NS_RELEASE(gIOService);
251 return 0;