xref: /haiku/src/tests/kits/net/service/FileTest.cpp (revision 1deede7388b04dbeec5af85cae7164735ea9e70d)
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 BDataIO {
26 public:
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 
43 private:
44 	BUrlRequest* fRequest;
45 };
46 
47 
48 void
49 FileTest::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
93 FileTest::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