1 /* 2 * Copyright 2020, Haiku, Inc. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 #include "FileTest.h" 7 8 #include <stdlib.h> 9 10 #include <File.h> 11 #include <FileRequest.h> 12 #include <Url.h> 13 #include <UrlProtocolRoster.h> 14 #include <UrlProtocolListener.h> 15 16 #include <ThreadedTestCaller.h> 17 #include <TestUtils.h> 18 19 #include "TestServer.h" 20 21 22 using namespace BPrivate::Network; 23 24 25 class StopTestListener : public BUrlProtocolListener { 26 public: 27 StopTestListener() {} 28 29 void DataReceived(BUrlRequest *caller, const char*, off_t, ssize_t) 30 { 31 caller->Stop(); 32 } 33 }; 34 35 36 void 37 FileTest::StopTest() 38 { 39 StopTestListener listener; 40 char tmpl[] = "/tmp/filestoptestXXXXXX"; 41 int fd = mkstemp(tmpl); 42 CHK(fd != -1); 43 close(fd); 44 45 BFile file(tmpl, O_WRONLY | O_CREAT); 46 CHK(file.InitCheck() == B_OK); 47 BString content; 48 /* number chosen to be larger than BFileRequest buffer, adjust as needed */ 49 content.Append('f', 40960); 50 51 CHK(file.WriteExactly(content.String(), content.Length()) == B_OK); 52 53 BUrl url("file://"); 54 url.SetPath(tmpl); 55 BUrlRequest *request = BUrlProtocolRoster::MakeRequest(url, &listener); 56 CHK(request != NULL); 57 58 thread_id thr = request->Run(); 59 status_t dummy; 60 wait_for_thread(thr, &dummy); 61 62 CHK(request->Status() == B_INTERRUPTED); 63 64 delete request; 65 66 request = BUrlProtocolRoster::MakeRequest("file:///", &listener); 67 CHK(request != NULL); 68 69 thr = request->Run(); 70 wait_for_thread(thr, &dummy); 71 72 CHK(request->Status() == B_INTERRUPTED); 73 74 delete request; 75 } 76 77 78 /* static */ void 79 FileTest::AddTests(BTestSuite& parent) 80 { 81 CppUnit::TestSuite *suite = new CppUnit::TestSuite("FileTest"); 82 83 suite->addTest(new CppUnit::TestCaller<FileTest>("FileTest: Stop requests", 84 &FileTest::StopTest)); 85 86 parent.addTest("FileTest", suite); 87 } 88