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