Skip to content

Commit e68e1e9

Browse files
authored
File: don't retrieve the contents of a file which was requested to be created without retrieving its contents.
2 parents 9db0fee + fcb941d commit e68e1e9

File tree

11 files changed

+118
-85
lines changed

11 files changed

+118
-85
lines changed

src/file/file.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ namespace libOpenCOR {
2323

2424
File::Impl::Impl(const std::string &pFileNameOrUrl, bool pRetrieveContents)
2525
: Logger::Impl()
26+
, mRetrieveContents(pRetrieveContents)
2627
{
2728
// Check whether we are dealing with a local file or a URL.
2829

@@ -140,7 +141,7 @@ UnsignedChars File::Impl::contents()
140141
#ifndef __EMSCRIPTEN__
141142
// Retrieve the contents of the file, if needed.
142143

143-
if (!mContentsRetrieved) {
144+
if (mRetrieveContents && !mContentsRetrieved) {
144145
setContents(fileContents(mFilePath));
145146
}
146147
#endif

src/file/file_p.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class File::Impl: public Logger::Impl
3636
std::filesystem::path mFilePath;
3737
std::string mUrl;
3838

39+
bool mRetrieveContents = true;
3940
bool mContentsRetrieved = false;
4041
UnsignedChars mContents;
4142

src/misc/utils.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,6 @@ std::string pathToString(const std::filesystem::path &pPath)
7676
#endif
7777
}
7878

79-
namespace {
80-
8179
#ifdef BUILDING_USING_MSVC
8280
std::string canonicalFileName(const std::string &pFileName, bool pIsRemoteFile)
8381
#else
@@ -145,8 +143,6 @@ std::string canonicalFileName(const std::string &pFileName)
145143
return res;
146144
}
147145

148-
} // namespace
149-
150146
std::tuple<bool, std::string> retrieveFileInfo(const std::string &pFileNameOrUrl)
151147
{
152148
// Check whether the given file name or URL is a local file name or a URL.

src/misc/utils.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ std::string forwardSlashPath(const std::string &pPath);
7878
std::filesystem::path LIBOPENCOR_UNIT_TESTING_EXPORT stringToPath(const std::string &pString);
7979
std::string LIBOPENCOR_UNIT_TESTING_EXPORT pathToString(const std::filesystem::path &pPath);
8080

81+
#ifdef BUILDING_USING_MSVC
82+
std::string LIBOPENCOR_UNIT_TESTING_EXPORT canonicalFileName(const std::string &pFileName, bool pIsRemoteFile = false);
83+
#else
84+
std::string LIBOPENCOR_UNIT_TESTING_EXPORT canonicalFileName(const std::string &pFileName);
85+
#endif
8186
std::tuple<bool, std::string> retrieveFileInfo(const std::string &pFileNameOrUrl);
8287
std::string relativePath(const std::string &pPath, const std::string &pBasePath);
8388
std::string urlPath(const std::string &pPath);

tests/api/file/basictests.cpp

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ static const libOpenCOR::ExpectedIssues EXPECTED_NO_ISSUES = {};
2323
static const libOpenCOR::ExpectedIssues EXPECTED_NON_EXISTING_FILE_ISSUES = {
2424
{libOpenCOR::Issue::Type::ERROR, "The file does not exist."},
2525
};
26-
static const libOpenCOR::ExpectedIssues EXPECTED_NON_DOWNLOADABLE_FILE_ISSUES = {
27-
{libOpenCOR::Issue::Type::ERROR, "The file could not be downloaded."},
28-
};
2926
static const libOpenCOR::ExpectedIssues EXPECTED_UNKNOWN_FILE_ISSUES = {
3027
{libOpenCOR::Issue::Type::ERROR, "The file is not a CellML file, a SED-ML file, or a COMBINE archive."},
3128
};
@@ -42,7 +39,21 @@ TEST(BasicFileTest, localFile)
4239
EXPECT_EQ_ISSUES(file, EXPECTED_NON_EXISTING_FILE_ISSUES);
4340
}
4441

45-
TEST(BasicFileTest, relativeLocalFile)
42+
TEST(BasicSedTest, existingRelativeLocalFile)
43+
{
44+
auto origDir = std::filesystem::current_path();
45+
46+
std::filesystem::current_path(libOpenCOR::resourcePath());
47+
48+
auto file = libOpenCOR::File::create(libOpenCOR::CELLML_2_FILE);
49+
50+
EXPECT_FALSE(file->contents().empty());
51+
EXPECT_EQ_ISSUES(file, EXPECTED_NO_ISSUES);
52+
53+
std::filesystem::current_path(origDir);
54+
}
55+
56+
TEST(BasicFileTest, nonExistingRelativeLocalFile)
4657
{
4758
#ifdef BUILDING_ON_WINDOWS
4859
auto file = libOpenCOR::File::create(R"(some\.\relative\..\..\path\.\..\dir\file.txt)");
@@ -66,20 +77,6 @@ TEST(BasicFileTest, relativeLocalFile)
6677
EXPECT_EQ_ISSUES(file, EXPECTED_NON_EXISTING_FILE_ISSUES);
6778
}
6879

69-
TEST(BasicSedTest, existingRelativeLocalFile)
70-
{
71-
auto origDir = std::filesystem::current_path();
72-
73-
std::filesystem::current_path(libOpenCOR::resourcePath());
74-
75-
auto file = libOpenCOR::File::create(libOpenCOR::CELLML_2_FILE);
76-
77-
EXPECT_FALSE(file->contents().empty());
78-
EXPECT_EQ_ISSUES(file, EXPECTED_NO_ISSUES);
79-
80-
std::filesystem::current_path(origDir);
81-
}
82-
8380
TEST(BasicFileTest, urlBasedLocalFile)
8481
{
8582
#ifdef BUILDING_ON_WINDOWS
@@ -109,14 +106,14 @@ TEST(BasicFileTest, remoteFile)
109106

110107
TEST(BasicFileTest, localVirtualFile)
111108
{
112-
auto file = libOpenCOR::File::create(libOpenCOR::LOCAL_FILE);
109+
auto file = libOpenCOR::File::create(libOpenCOR::resourcePath(libOpenCOR::UNKNOWN_FILE), false);
113110

114-
EXPECT_EQ(file->type(), libOpenCOR::File::Type::IRRETRIEVABLE_FILE);
115-
EXPECT_EQ(file->fileName(), libOpenCOR::LOCAL_FILE);
111+
EXPECT_EQ(file->type(), libOpenCOR::File::Type::UNKNOWN_FILE);
112+
EXPECT_EQ(file->fileName(), libOpenCOR::resourcePath(libOpenCOR::UNKNOWN_FILE));
116113
EXPECT_EQ(file->url(), "");
117-
EXPECT_EQ(file->path(), libOpenCOR::LOCAL_FILE);
114+
EXPECT_EQ(file->path(), libOpenCOR::resourcePath(libOpenCOR::UNKNOWN_FILE));
118115
EXPECT_TRUE(file->contents().empty());
119-
EXPECT_EQ_ISSUES(file, EXPECTED_NON_EXISTING_FILE_ISSUES);
116+
EXPECT_EQ_ISSUES(file, EXPECTED_UNKNOWN_FILE_ISSUES);
120117

121118
auto someUnknownContents = libOpenCOR::charArrayToUnsignedChars(libOpenCOR::SOME_UNKNOWN_CONTENTS);
122119

@@ -129,14 +126,18 @@ TEST(BasicFileTest, localVirtualFile)
129126

130127
TEST(BasicFileTest, remoteVirtualFile)
131128
{
132-
auto file = libOpenCOR::File::create(libOpenCOR::IRRETRIEVABLE_REMOTE_FILE);
129+
auto file = libOpenCOR::File::create(libOpenCOR::UNKNOWN_REMOTE_FILE, false);
133130

134-
EXPECT_EQ(file->type(), libOpenCOR::File::Type::IRRETRIEVABLE_FILE);
135-
EXPECT_EQ(file->fileName(), "");
136-
EXPECT_EQ(file->url(), libOpenCOR::IRRETRIEVABLE_REMOTE_FILE);
137-
EXPECT_EQ(file->path(), libOpenCOR::IRRETRIEVABLE_REMOTE_FILE);
131+
EXPECT_EQ(file->type(), libOpenCOR::File::Type::UNKNOWN_FILE);
132+
#ifdef BUILDING_USING_MSVC
133+
EXPECT_EQ(file->fileName(), "\\some\\path\\file");
134+
#else
135+
EXPECT_EQ(file->fileName(), "/some/path/file");
136+
#endif
137+
EXPECT_EQ(file->url(), libOpenCOR::UNKNOWN_REMOTE_FILE);
138+
EXPECT_EQ(file->path(), libOpenCOR::UNKNOWN_REMOTE_FILE);
138139
EXPECT_TRUE(file->contents().empty());
139-
EXPECT_EQ_ISSUES(file, EXPECTED_NON_DOWNLOADABLE_FILE_ISSUES);
140+
EXPECT_EQ_ISSUES(file, EXPECTED_UNKNOWN_FILE_ISSUES);
140141

141142
auto someUnknownContents = libOpenCOR::charArrayToUnsignedChars(libOpenCOR::SOME_UNKNOWN_CONTENTS);
142143

tests/api/file/typetests.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,10 @@ TEST(TypeFileTest, combine2Archive)
101101

102102
TEST(TypeFileTest, unknownVirtualFile)
103103
{
104-
auto file = libOpenCOR::File::create(libOpenCOR::LOCAL_FILE);
104+
auto file = libOpenCOR::File::create(libOpenCOR::resourcePath(libOpenCOR::UNKNOWN_FILE), false);
105+
106+
EXPECT_EQ(file->type(), libOpenCOR::File::Type::UNKNOWN_FILE);
107+
EXPECT_EQ(file->contents(), libOpenCOR::UnsignedChars());
105108

106109
file->setContents(libOpenCOR::charArrayToUnsignedChars(libOpenCOR::SOME_UNKNOWN_CONTENTS));
107110

@@ -111,7 +114,10 @@ TEST(TypeFileTest, unknownVirtualFile)
111114

112115
TEST(TypeFileTest, cellmlVirtualFile)
113116
{
114-
auto file = libOpenCOR::File::create(libOpenCOR::LOCAL_FILE);
117+
auto file = libOpenCOR::File::create(libOpenCOR::resourcePath(libOpenCOR::CELLML_2_FILE), false);
118+
119+
EXPECT_EQ(file->type(), libOpenCOR::File::Type::UNKNOWN_FILE);
120+
EXPECT_EQ(file->contents(), libOpenCOR::UnsignedChars());
115121

116122
file->setContents(libOpenCOR::charArrayToUnsignedChars(libOpenCOR::SOME_CELLML_CONTENTS));
117123

@@ -120,7 +126,10 @@ TEST(TypeFileTest, cellmlVirtualFile)
120126

121127
TEST(TypeFileTest, sedmlVirtualFile)
122128
{
123-
auto file = libOpenCOR::File::create(libOpenCOR::LOCAL_FILE);
129+
auto file = libOpenCOR::File::create(libOpenCOR::resourcePath(libOpenCOR::SEDML_2_FILE), false);
130+
131+
EXPECT_EQ(file->type(), libOpenCOR::File::Type::UNKNOWN_FILE);
132+
EXPECT_EQ(file->contents(), libOpenCOR::UnsignedChars());
124133

125134
file->setContents(libOpenCOR::charArrayToUnsignedChars(libOpenCOR::SOME_SEDML_CONTENTS));
126135

@@ -129,7 +138,10 @@ TEST(TypeFileTest, sedmlVirtualFile)
129138

130139
TEST(TypeFileTest, combineVirtualArchive)
131140
{
132-
auto file = libOpenCOR::File::create(libOpenCOR::LOCAL_FILE);
141+
auto file = libOpenCOR::File::create(libOpenCOR::resourcePath(libOpenCOR::COMBINE_2_ARCHIVE), false);
142+
143+
EXPECT_EQ(file->type(), libOpenCOR::File::Type::UNKNOWN_FILE);
144+
EXPECT_EQ(file->contents(), libOpenCOR::UnsignedChars());
133145

134146
file->setContents(libOpenCOR::base64Decode(libOpenCOR::SOME_BASE64_COMBINE_ARCHIVE_CONTENTS));
135147

tests/bindings/python/test_file_basic.py

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@
2424
expected_non_existing_file_issues = [
2525
[oc.Issue.Type.Error, "The file does not exist."],
2626
]
27-
expected_non_downloadable_file_issues = [
28-
[oc.Issue.Type.Error, "The file could not be downloaded."],
29-
]
3027
expected_unknown_file_issues = [
3128
[
3229
oc.Issue.Type.Error,
@@ -46,7 +43,20 @@ def test_local_file():
4643
assert_issues(file, expected_non_existing_file_issues)
4744

4845

49-
def test_relative_local_file():
46+
def test_existing_relative_local_file():
47+
orig_dir = os.getcwd()
48+
49+
os.chdir(utils.resource_path())
50+
51+
file = oc.File(utils.Cellml2File)
52+
53+
assert file.contents != []
54+
assert_issues(file, expected_no_issues)
55+
56+
os.chdir(orig_dir)
57+
58+
59+
def test_non_existing_relative_local_file():
5060
if platform.system() == "Windows":
5161
file = oc.File("some\\.\\relative\\..\\..\\path\\.\\..\\dir\\file.txt")
5262
else:
@@ -70,19 +80,6 @@ def test_relative_local_file():
7080
assert_issues(file, expected_non_existing_file_issues)
7181

7282

73-
def test_existing_relative_local_file():
74-
orig_dir = os.getcwd()
75-
76-
os.chdir(utils.resource_path())
77-
78-
file = oc.File(utils.Cellml2File)
79-
80-
assert file.contents != []
81-
assert_issues(file, expected_no_issues)
82-
83-
os.chdir(orig_dir)
84-
85-
8683
def test_url_based_local_file():
8784
if platform.system() == "Windows":
8885
file = oc.File("file:///P:/some/path/file.txt")
@@ -108,14 +105,14 @@ def test_remote_file():
108105

109106

110107
def test_local_virtual_file():
111-
file = oc.File(utils.LocalFile)
108+
file = oc.File(utils.resource_path(utils.UnknownFile), False)
112109

113-
assert file.type == oc.File.Type.IrretrievableFile
114-
assert file.file_name == utils.LocalFile
110+
assert file.type == oc.File.Type.UnknownFile
111+
assert file.file_name == utils.resource_path(utils.UnknownFile)
115112
assert file.url == ""
116-
assert file.path == utils.LocalFile
113+
assert file.path == utils.resource_path(utils.UnknownFile)
117114
assert file.contents == []
118-
assert_issues(file, expected_non_existing_file_issues)
115+
assert_issues(file, expected_unknown_file_issues)
119116

120117
some_unknown_contents_list = utils.string_to_list(utils.SomeUnknownContents)
121118

@@ -127,14 +124,19 @@ def test_local_virtual_file():
127124

128125

129126
def test_remote_virtual_file():
130-
file = oc.File(utils.IrretrievableRemoteFile)
127+
file = oc.File(utils.UnknownRemoteFile, False)
131128

132-
assert file.type == oc.File.Type.IrretrievableFile
133-
assert file.file_name == ""
134-
assert file.url == utils.IrretrievableRemoteFile
135-
assert file.path == utils.IrretrievableRemoteFile
129+
assert file.type == oc.File.Type.UnknownFile
130+
131+
if platform.system() == "Windows":
132+
assert file.file_name == "\\some\\path\\file"
133+
else:
134+
assert file.file_name == "/some/path/file"
135+
136+
assert file.url == utils.UnknownRemoteFile
137+
assert file.path == utils.UnknownRemoteFile
136138
assert file.contents == []
137-
assert_issues(file, expected_non_downloadable_file_issues)
139+
assert_issues(file, expected_unknown_file_issues)
138140

139141
some_unknown_contents_list = utils.string_to_list(utils.SomeUnknownContents)
140142

tests/bindings/python/test_file_type.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,10 @@ def test_type_combine_2_archive():
9494

9595

9696
def test_type_unknown_virtual_file():
97-
file = oc.File(utils.LocalFile)
97+
file = oc.File(utils.resource_path(utils.UnknownFile), False)
98+
99+
assert file.type == oc.File.Type.UnknownFile
100+
assert file.contents == []
98101

99102
file.contents = utils.string_to_list(utils.SomeUnknownContents)
100103

@@ -103,23 +106,32 @@ def test_type_unknown_virtual_file():
103106

104107

105108
def test_type_cellml_virtual_file():
106-
file = oc.File(utils.LocalFile)
109+
file = oc.File(utils.resource_path(utils.Cellml2File), False)
110+
111+
assert file.type == oc.File.Type.UnknownFile
112+
assert file.contents == []
107113

108114
file.contents = utils.string_to_list(utils.SomeCellmlContents)
109115

110116
assert file.type == oc.File.Type.CellmlFile
111117

112118

113119
def test_type_sedml_virtual_file():
114-
file = oc.File(utils.LocalFile)
120+
file = oc.File(utils.resource_path(utils.Sedml2File), False)
121+
122+
assert file.type == oc.File.Type.UnknownFile
123+
assert file.contents == []
115124

116125
file.contents = utils.string_to_list(utils.SomeSedmlContents)
117126

118127
assert file.type == oc.File.Type.SedmlFile
119128

120129

121130
def test_type_combine_virtual_archive():
122-
file = oc.File(utils.LocalFile)
131+
file = oc.File(utils.resource_path(utils.Combine2Archive), False)
132+
133+
assert file.type == oc.File.Type.UnknownFile
134+
assert file.contents == []
123135

124136
file.contents = utils.binary_to_list(utils.SomeCombineArchiveContents)
125137

tests/bindings/python/utils.py.in

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import base64
1717
import libopencor as oc
18+
import os
1819
import pathlib
1920
import platform
2021
import pytest
@@ -50,6 +51,7 @@ HttpRemoteCombineArchive = (
5051
)
5152
RemoteBasePath = "https://raw.githubusercontent.com/opencor/libopencor/master/tests/res"
5253
RemoteFile = "https://raw.githubusercontent.com/opencor/libopencor/master/tests/res/cellml_2.cellml"
54+
UnknownRemoteFile = "https://raw.githubusercontent.com/opencor/libopencor/master/tests/res/unknown_file.txt"
5355
IrretrievableRemoteFile = "https://some.domain.com/irretrievable_file.txt"
5456

5557

@@ -118,7 +120,7 @@ def assert_values(
118120

119121

120122
def resource_path(relative_path=""):
121-
return ResourceLocation + "/" + relative_path
123+
return os.path.realpath(ResourceLocation + "/" + relative_path)
122124

123125

124126
def string_to_list(string):

0 commit comments

Comments
 (0)