Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: net/test/embedded_test_server/embedded_test_server_unittest.cc

Issue 1893083002: Change scoped_ptr to std::unique_ptr in //net. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: scopedptr-net-all: iwyu Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/test/embedded_test_server/embedded_test_server.h" 5 #include "net/test/embedded_test_server/embedded_test_server.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/memory/ptr_util.h"
10 #include "base/memory/weak_ptr.h" 11 #include "base/memory/weak_ptr.h"
11 #include "base/path_service.h" 12 #include "base/path_service.h"
12 #include "base/run_loop.h" 13 #include "base/run_loop.h"
13 #include "base/single_thread_task_runner.h" 14 #include "base/single_thread_task_runner.h"
14 #include "base/strings/stringprintf.h" 15 #include "base/strings/stringprintf.h"
15 #include "base/synchronization/lock.h" 16 #include "base/synchronization/lock.h"
16 #include "base/threading/thread.h" 17 #include "base/threading/thread.h"
17 #include "crypto/nss_util.h" 18 #include "crypto/nss_util.h"
18 #include "net/base/test_completion_callback.h" 19 #include "net/base/test_completion_callback.h"
19 #include "net/http/http_response_headers.h" 20 #include "net/http/http_response_headers.h"
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 // Waits until the specified number of responses are received. 161 // Waits until the specified number of responses are received.
161 void WaitForResponses(int num_responses) { 162 void WaitForResponses(int num_responses) {
162 num_responses_received_ = 0; 163 num_responses_received_ = 0;
163 num_responses_expected_ = num_responses; 164 num_responses_expected_ = num_responses;
164 // Will be terminated in OnURLFetchComplete(). 165 // Will be terminated in OnURLFetchComplete().
165 base::MessageLoop::current()->Run(); 166 base::MessageLoop::current()->Run();
166 } 167 }
167 168
168 // Handles |request| sent to |path| and returns the response per |content|, 169 // Handles |request| sent to |path| and returns the response per |content|,
169 // |content type|, and |code|. Saves the request URL for verification. 170 // |content type|, and |code|. Saves the request URL for verification.
170 scoped_ptr<HttpResponse> HandleRequest(const std::string& path, 171 std::unique_ptr<HttpResponse> HandleRequest(const std::string& path,
171 const std::string& content, 172 const std::string& content,
172 const std::string& content_type, 173 const std::string& content_type,
173 HttpStatusCode code, 174 HttpStatusCode code,
174 const HttpRequest& request) { 175 const HttpRequest& request) {
175 request_relative_url_ = request.relative_url; 176 request_relative_url_ = request.relative_url;
176 177
177 GURL absolute_url = server_->GetURL(request.relative_url); 178 GURL absolute_url = server_->GetURL(request.relative_url);
178 if (absolute_url.path() == path) { 179 if (absolute_url.path() == path) {
179 scoped_ptr<BasicHttpResponse> http_response(new BasicHttpResponse); 180 std::unique_ptr<BasicHttpResponse> http_response(new BasicHttpResponse);
180 http_response->set_code(code); 181 http_response->set_code(code);
181 http_response->set_content(content); 182 http_response->set_content(content);
182 http_response->set_content_type(content_type); 183 http_response->set_content_type(content_type);
183 return std::move(http_response); 184 return std::move(http_response);
184 } 185 }
185 186
186 return nullptr; 187 return nullptr;
187 } 188 }
188 189
189 protected: 190 protected:
190 int num_responses_received_; 191 int num_responses_received_;
191 int num_responses_expected_; 192 int num_responses_expected_;
192 std::string request_relative_url_; 193 std::string request_relative_url_;
193 base::Thread io_thread_; 194 base::Thread io_thread_;
194 scoped_refptr<TestURLRequestContextGetter> request_context_getter_; 195 scoped_refptr<TestURLRequestContextGetter> request_context_getter_;
195 TestConnectionListener connection_listener_; 196 TestConnectionListener connection_listener_;
196 scoped_ptr<EmbeddedTestServer> server_; 197 std::unique_ptr<EmbeddedTestServer> server_;
197 }; 198 };
198 199
199 TEST_P(EmbeddedTestServerTest, GetBaseURL) { 200 TEST_P(EmbeddedTestServerTest, GetBaseURL) {
200 ASSERT_TRUE(server_->Start()); 201 ASSERT_TRUE(server_->Start());
201 if (GetParam() == EmbeddedTestServer::TYPE_HTTPS) { 202 if (GetParam() == EmbeddedTestServer::TYPE_HTTPS) {
202 EXPECT_EQ(base::StringPrintf("https://127.0.0.1:%u/", server_->port()), 203 EXPECT_EQ(base::StringPrintf("https://127.0.0.1:%u/", server_->port()),
203 server_->base_url().spec()); 204 server_->base_url().spec());
204 } else { 205 } else {
205 EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%u/", server_->port()), 206 EXPECT_EQ(base::StringPrintf("http://127.0.0.1:%u/", server_->port()),
206 server_->base_url().spec()); 207 server_->base_url().spec());
(...skipping 29 matching lines...) Expand all
236 TEST_P(EmbeddedTestServerTest, RegisterRequestHandler) { 237 TEST_P(EmbeddedTestServerTest, RegisterRequestHandler) {
237 server_->RegisterRequestHandler( 238 server_->RegisterRequestHandler(
238 base::Bind(&EmbeddedTestServerTest::HandleRequest, 239 base::Bind(&EmbeddedTestServerTest::HandleRequest,
239 base::Unretained(this), 240 base::Unretained(this),
240 "/test", 241 "/test",
241 "<b>Worked!</b>", 242 "<b>Worked!</b>",
242 "text/html", 243 "text/html",
243 HTTP_OK)); 244 HTTP_OK));
244 ASSERT_TRUE(server_->Start()); 245 ASSERT_TRUE(server_->Start());
245 246
246 scoped_ptr<URLFetcher> fetcher = 247 std::unique_ptr<URLFetcher> fetcher =
247 URLFetcher::Create(server_->GetURL("/test?q=foo"), URLFetcher::GET, this); 248 URLFetcher::Create(server_->GetURL("/test?q=foo"), URLFetcher::GET, this);
248 fetcher->SetRequestContext(request_context_getter_.get()); 249 fetcher->SetRequestContext(request_context_getter_.get());
249 fetcher->Start(); 250 fetcher->Start();
250 WaitForResponses(1); 251 WaitForResponses(1);
251 252
252 EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); 253 EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status());
253 EXPECT_EQ(HTTP_OK, fetcher->GetResponseCode()); 254 EXPECT_EQ(HTTP_OK, fetcher->GetResponseCode());
254 EXPECT_EQ("<b>Worked!</b>", GetContentFromFetcher(*fetcher)); 255 EXPECT_EQ("<b>Worked!</b>", GetContentFromFetcher(*fetcher));
255 EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher)); 256 EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher));
256 257
257 EXPECT_EQ("/test?q=foo", request_relative_url_); 258 EXPECT_EQ("/test?q=foo", request_relative_url_);
258 } 259 }
259 260
260 TEST_P(EmbeddedTestServerTest, ServeFilesFromDirectory) { 261 TEST_P(EmbeddedTestServerTest, ServeFilesFromDirectory) {
261 base::FilePath src_dir; 262 base::FilePath src_dir;
262 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); 263 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir));
263 server_->ServeFilesFromDirectory( 264 server_->ServeFilesFromDirectory(
264 src_dir.AppendASCII("net").AppendASCII("data")); 265 src_dir.AppendASCII("net").AppendASCII("data"));
265 ASSERT_TRUE(server_->Start()); 266 ASSERT_TRUE(server_->Start());
266 267
267 scoped_ptr<URLFetcher> fetcher = 268 std::unique_ptr<URLFetcher> fetcher =
268 URLFetcher::Create(server_->GetURL("/test.html"), URLFetcher::GET, this); 269 URLFetcher::Create(server_->GetURL("/test.html"), URLFetcher::GET, this);
269 fetcher->SetRequestContext(request_context_getter_.get()); 270 fetcher->SetRequestContext(request_context_getter_.get());
270 fetcher->Start(); 271 fetcher->Start();
271 WaitForResponses(1); 272 WaitForResponses(1);
272 273
273 EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); 274 EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status());
274 EXPECT_EQ(HTTP_OK, fetcher->GetResponseCode()); 275 EXPECT_EQ(HTTP_OK, fetcher->GetResponseCode());
275 EXPECT_EQ("<p>Hello World!</p>", GetContentFromFetcher(*fetcher)); 276 EXPECT_EQ("<p>Hello World!</p>", GetContentFromFetcher(*fetcher));
276 EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher)); 277 EXPECT_EQ("text/html", GetContentTypeFromFetcher(*fetcher));
277 } 278 }
278 279
279 TEST_P(EmbeddedTestServerTest, DefaultNotFoundResponse) { 280 TEST_P(EmbeddedTestServerTest, DefaultNotFoundResponse) {
280 ASSERT_TRUE(server_->Start()); 281 ASSERT_TRUE(server_->Start());
281 282
282 scoped_ptr<URLFetcher> fetcher = URLFetcher::Create( 283 std::unique_ptr<URLFetcher> fetcher = URLFetcher::Create(
283 server_->GetURL("/non-existent"), URLFetcher::GET, this); 284 server_->GetURL("/non-existent"), URLFetcher::GET, this);
284 fetcher->SetRequestContext(request_context_getter_.get()); 285 fetcher->SetRequestContext(request_context_getter_.get());
285 286
286 fetcher->Start(); 287 fetcher->Start();
287 WaitForResponses(1); 288 WaitForResponses(1);
288 EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status()); 289 EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher->GetStatus().status());
289 EXPECT_EQ(HTTP_NOT_FOUND, fetcher->GetResponseCode()); 290 EXPECT_EQ(HTTP_NOT_FOUND, fetcher->GetResponseCode());
290 } 291 }
291 292
292 TEST_P(EmbeddedTestServerTest, ConnectionListenerAccept) { 293 TEST_P(EmbeddedTestServerTest, ConnectionListenerAccept) {
293 ASSERT_TRUE(server_->Start()); 294 ASSERT_TRUE(server_->Start());
294 295
295 TestNetLog net_log; 296 TestNetLog net_log;
296 net::AddressList address_list; 297 net::AddressList address_list;
297 EXPECT_TRUE(server_->GetAddressList(&address_list)); 298 EXPECT_TRUE(server_->GetAddressList(&address_list));
298 299
299 scoped_ptr<StreamSocket> socket = 300 std::unique_ptr<StreamSocket> socket =
300 ClientSocketFactory::GetDefaultFactory()->CreateTransportClientSocket( 301 ClientSocketFactory::GetDefaultFactory()->CreateTransportClientSocket(
301 address_list, NULL, &net_log, NetLog::Source()); 302 address_list, NULL, &net_log, NetLog::Source());
302 TestCompletionCallback callback; 303 TestCompletionCallback callback;
303 ASSERT_EQ(OK, callback.GetResult(socket->Connect(callback.callback()))); 304 ASSERT_EQ(OK, callback.GetResult(socket->Connect(callback.callback())));
304 305
305 connection_listener_.WaitUntilFirstConnectionAccepted(); 306 connection_listener_.WaitUntilFirstConnectionAccepted();
306 307
307 EXPECT_EQ(1u, connection_listener_.SocketAcceptedCount()); 308 EXPECT_EQ(1u, connection_listener_.SocketAcceptedCount());
308 EXPECT_FALSE(connection_listener_.DidReadFromSocket()); 309 EXPECT_FALSE(connection_listener_.DidReadFromSocket());
309 } 310 }
310 311
311 TEST_P(EmbeddedTestServerTest, ConnectionListenerRead) { 312 TEST_P(EmbeddedTestServerTest, ConnectionListenerRead) {
312 ASSERT_TRUE(server_->Start()); 313 ASSERT_TRUE(server_->Start());
313 314
314 scoped_ptr<URLFetcher> fetcher = URLFetcher::Create( 315 std::unique_ptr<URLFetcher> fetcher = URLFetcher::Create(
315 server_->GetURL("/non-existent"), URLFetcher::GET, this); 316 server_->GetURL("/non-existent"), URLFetcher::GET, this);
316 fetcher->SetRequestContext(request_context_getter_.get()); 317 fetcher->SetRequestContext(request_context_getter_.get());
317 318
318 fetcher->Start(); 319 fetcher->Start();
319 WaitForResponses(1); 320 WaitForResponses(1);
320 EXPECT_EQ(1u, connection_listener_.SocketAcceptedCount()); 321 EXPECT_EQ(1u, connection_listener_.SocketAcceptedCount());
321 EXPECT_TRUE(connection_listener_.DidReadFromSocket()); 322 EXPECT_TRUE(connection_listener_.DidReadFromSocket());
322 } 323 }
323 324
324 TEST_P(EmbeddedTestServerTest, ConcurrentFetches) { 325 TEST_P(EmbeddedTestServerTest, ConcurrentFetches) {
(...skipping 13 matching lines...) Expand all
338 HTTP_OK)); 339 HTTP_OK));
339 server_->RegisterRequestHandler( 340 server_->RegisterRequestHandler(
340 base::Bind(&EmbeddedTestServerTest::HandleRequest, 341 base::Bind(&EmbeddedTestServerTest::HandleRequest,
341 base::Unretained(this), 342 base::Unretained(this),
342 "/test3", 343 "/test3",
343 "No chocolates", 344 "No chocolates",
344 "text/plain", 345 "text/plain",
345 HTTP_NOT_FOUND)); 346 HTTP_NOT_FOUND));
346 ASSERT_TRUE(server_->Start()); 347 ASSERT_TRUE(server_->Start());
347 348
348 scoped_ptr<URLFetcher> fetcher1 = 349 std::unique_ptr<URLFetcher> fetcher1 =
349 URLFetcher::Create(server_->GetURL("/test1"), URLFetcher::GET, this); 350 URLFetcher::Create(server_->GetURL("/test1"), URLFetcher::GET, this);
350 fetcher1->SetRequestContext(request_context_getter_.get()); 351 fetcher1->SetRequestContext(request_context_getter_.get());
351 scoped_ptr<URLFetcher> fetcher2 = 352 std::unique_ptr<URLFetcher> fetcher2 =
352 URLFetcher::Create(server_->GetURL("/test2"), URLFetcher::GET, this); 353 URLFetcher::Create(server_->GetURL("/test2"), URLFetcher::GET, this);
353 fetcher2->SetRequestContext(request_context_getter_.get()); 354 fetcher2->SetRequestContext(request_context_getter_.get());
354 scoped_ptr<URLFetcher> fetcher3 = 355 std::unique_ptr<URLFetcher> fetcher3 =
355 URLFetcher::Create(server_->GetURL("/test3"), URLFetcher::GET, this); 356 URLFetcher::Create(server_->GetURL("/test3"), URLFetcher::GET, this);
356 fetcher3->SetRequestContext(request_context_getter_.get()); 357 fetcher3->SetRequestContext(request_context_getter_.get());
357 358
358 // Fetch the three URLs concurrently. 359 // Fetch the three URLs concurrently.
359 fetcher1->Start(); 360 fetcher1->Start();
360 fetcher2->Start(); 361 fetcher2->Start();
361 fetcher3->Start(); 362 fetcher3->Start();
362 WaitForResponses(3); 363 WaitForResponses(3);
363 364
364 EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher1->GetStatus().status()); 365 EXPECT_EQ(URLRequestStatus::SUCCESS, fetcher1->GetStatus().status());
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 base::Bind(send, "echo", 417 base::Bind(send, "echo",
417 base::Bind(&InfiniteResponse::SendInfinite, 418 base::Bind(&InfiniteResponse::SendInfinite,
418 weak_ptr_factory_.GetWeakPtr(), send))); 419 weak_ptr_factory_.GetWeakPtr(), send)));
419 } 420 }
420 421
421 base::WeakPtrFactory<InfiniteResponse> weak_ptr_factory_; 422 base::WeakPtrFactory<InfiniteResponse> weak_ptr_factory_;
422 423
423 DISALLOW_COPY_AND_ASSIGN(InfiniteResponse); 424 DISALLOW_COPY_AND_ASSIGN(InfiniteResponse);
424 }; 425 };
425 426
426 scoped_ptr<HttpResponse> HandleInfiniteRequest(const HttpRequest& request) { 427 std::unique_ptr<HttpResponse> HandleInfiniteRequest(
427 return make_scoped_ptr(new InfiniteResponse); 428 const HttpRequest& request) {
429 return base::WrapUnique(new InfiniteResponse);
428 } 430 }
429 } 431 }
430 432
431 // Tests the case the connection is closed while the server is sending a 433 // Tests the case the connection is closed while the server is sending a
432 // response. May non-deterministically end up at one of three paths 434 // response. May non-deterministically end up at one of three paths
433 // (Discover the close event synchronously, asynchronously, or server 435 // (Discover the close event synchronously, asynchronously, or server
434 // shutting down before it is discovered). 436 // shutting down before it is discovered).
435 TEST_P(EmbeddedTestServerTest, CloseDuringWrite) { 437 TEST_P(EmbeddedTestServerTest, CloseDuringWrite) {
436 CancelRequestDelegate cancel_delegate; 438 CancelRequestDelegate cancel_delegate;
437 TestURLRequestContext context; 439 TestURLRequestContext context;
438 cancel_delegate.set_cancel_in_response_started(true); 440 cancel_delegate.set_cancel_in_response_started(true);
439 server_->RegisterRequestHandler(base::Bind( 441 server_->RegisterRequestHandler(base::Bind(
440 &HandlePrefixedRequest, "/infinite", base::Bind(&HandleInfiniteRequest))); 442 &HandlePrefixedRequest, "/infinite", base::Bind(&HandleInfiniteRequest)));
441 ASSERT_TRUE(server_->Start()); 443 ASSERT_TRUE(server_->Start());
442 444
443 scoped_ptr<URLRequest> request = context.CreateRequest( 445 std::unique_ptr<URLRequest> request = context.CreateRequest(
444 server_->GetURL("/infinite"), DEFAULT_PRIORITY, &cancel_delegate); 446 server_->GetURL("/infinite"), DEFAULT_PRIORITY, &cancel_delegate);
445 request->Start(); 447 request->Start();
446 cancel_delegate.WaitUntilDone(); 448 cancel_delegate.WaitUntilDone();
447 } 449 }
448 450
449 struct CertificateValuesEntry { 451 struct CertificateValuesEntry {
450 const EmbeddedTestServer::ServerCertificate server_cert; 452 const EmbeddedTestServer::ServerCertificate server_cert;
451 const bool is_expired; 453 const bool is_expired;
452 const char* common_name; 454 const char* common_name;
453 const char* root; 455 const char* root;
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 529
528 // base::PlatformThread::Delegate: 530 // base::PlatformThread::Delegate:
529 void ThreadMain() override { 531 void ThreadMain() override {
530 scoped_refptr<base::SingleThreadTaskRunner> io_thread_runner; 532 scoped_refptr<base::SingleThreadTaskRunner> io_thread_runner;
531 base::Thread io_thread("io_thread"); 533 base::Thread io_thread("io_thread");
532 base::Thread::Options thread_options; 534 base::Thread::Options thread_options;
533 thread_options.message_loop_type = base::MessageLoop::TYPE_IO; 535 thread_options.message_loop_type = base::MessageLoop::TYPE_IO;
534 ASSERT_TRUE(io_thread.StartWithOptions(thread_options)); 536 ASSERT_TRUE(io_thread.StartWithOptions(thread_options));
535 io_thread_runner = io_thread.task_runner(); 537 io_thread_runner = io_thread.task_runner();
536 538
537 scoped_ptr<base::MessageLoop> loop; 539 std::unique_ptr<base::MessageLoop> loop;
538 if (message_loop_present_on_initialize_) 540 if (message_loop_present_on_initialize_)
539 loop.reset(new base::MessageLoopForIO); 541 loop.reset(new base::MessageLoopForIO);
540 542
541 // Create the test server instance. 543 // Create the test server instance.
542 EmbeddedTestServer server(type_); 544 EmbeddedTestServer server(type_);
543 base::FilePath src_dir; 545 base::FilePath src_dir;
544 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); 546 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir));
545 ASSERT_TRUE(server.Start()); 547 ASSERT_TRUE(server.Start());
546 548
547 // Make a request and wait for the reply. 549 // Make a request and wait for the reply.
548 if (!loop) 550 if (!loop)
549 loop.reset(new base::MessageLoopForIO); 551 loop.reset(new base::MessageLoopForIO);
550 552
551 scoped_ptr<URLFetcher> fetcher = 553 std::unique_ptr<URLFetcher> fetcher =
552 URLFetcher::Create(server.GetURL("/test?q=foo"), URLFetcher::GET, this); 554 URLFetcher::Create(server.GetURL("/test?q=foo"), URLFetcher::GET, this);
553 fetcher->SetRequestContext( 555 fetcher->SetRequestContext(
554 new TestURLRequestContextGetter(loop->task_runner())); 556 new TestURLRequestContextGetter(loop->task_runner()));
555 fetcher->Start(); 557 fetcher->Start();
556 loop->Run(); 558 loop->Run();
557 fetcher.reset(); 559 fetcher.reset();
558 560
559 // Shut down. 561 // Shut down.
560 if (message_loop_present_on_shutdown_) 562 if (message_loop_present_on_shutdown_)
561 loop.reset(); 563 loop.reset();
(...skipping 29 matching lines...) Expand all
591 INSTANTIATE_TEST_CASE_P( 593 INSTANTIATE_TEST_CASE_P(
592 EmbeddedTestServerThreadingTestInstantiation, 594 EmbeddedTestServerThreadingTestInstantiation,
593 EmbeddedTestServerThreadingTest, 595 EmbeddedTestServerThreadingTest,
594 testing::Combine(testing::Bool(), 596 testing::Combine(testing::Bool(),
595 testing::Bool(), 597 testing::Bool(),
596 testing::Values(EmbeddedTestServer::TYPE_HTTP, 598 testing::Values(EmbeddedTestServer::TYPE_HTTP,
597 EmbeddedTestServer::TYPE_HTTPS))); 599 EmbeddedTestServer::TYPE_HTTPS)));
598 600
599 } // namespace test_server 601 } // namespace test_server
600 } // namespace net 602 } // namespace net
OLDNEW
« no previous file with comments | « net/test/embedded_test_server/embedded_test_server.cc ('k') | net/test/embedded_test_server/http_connection.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698