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 class StopTestListener : public BUrlProtocolListener { 23 public: 24 StopTestListener() {} 25 26 void DataReceived(BUrlRequest *caller, const char*, off_t, ssize_t) 27 { 28 caller->Stop(); 29 } 30 }; 31 32 33 void 34 FileTest::StopTest() 35 { 36 StopTestListener listener; 37 char tmpl[] = "/tmp/filestoptestXXXXXX"; 38 int fd = mkstemp(tmpl); 39 CHK(fd != -1); 40 close(fd); 41 42 BFile file(tmpl, O_WRONLY | O_CREAT); 43 CHK(file.InitCheck() == B_OK); 44 BString content; 45 /* number chosen to be larger than BFileRequest buffer, adjust as needed */ 46 content.Append('f', 40960); 47 48 CHK(file.WriteExactly(content.String(), content.Length()) == B_OK); 49 50 BUrl url("file://"); 51 url.SetPath(tmpl); 52 BUrlRequest *request = BUrlProtocolRoster::MakeRequest(url, &listener); 53 CHK(request != NULL); 54 55 thread_id thr = request->Run(); 56 status_t dummy; 57 wait_for_thread(thr, &dummy); 58 59 CHK(request->Status() == B_INTERRUPTED); 60 61 delete request; 62 63 request = BUrlProtocolRoster::MakeRequest("file:///", &listener); 64 CHK(request != NULL); 65 66 thr = request->Run(); 67 wait_for_thread(thr, &dummy); 68 69 CHK(request->Status() == B_INTERRUPTED); 70 71 delete request; 72 } 73 74 75 /* static */ void 76 FileTest::AddTests(BTestSuite& parent) 77 { 78 CppUnit::TestSuite *suite = new CppUnit::TestSuite("FileTest"); 79 80 suite->addTest(new CppUnit::TestCaller<FileTest>("FileTest: Stop requests", 81 &FileTest::StopTest)); 82 83 parent.addTest("FileTest", suite); 84 } 85