Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"Unable to create directory" - unable to run test build with mingw provided by qt-installer #197

Open
Florian-Fischer-InMach opened this issue May 17, 2022 · 5 comments

Comments

@Florian-Fischer-InMach
Copy link

Hello,
I want to use approval test for some legacy embedded C code.
Thus my c++/cmake knowledge is very limited.

My Setup:

  • Windows 10
  • ApprovalTests 10.12.2
  • CMake 3.21.1 -- provided by qt-installer
  • MinGw64 11.2.0 -- provided by qt-installer for qt 6.3.0
  • QT Creator 7.0.1

I get the same error message as mentioned in #195
I took his example files and created a new cmake project via QT Creator

__FILE__ == C:/Users/florian.fischer/Documents/inmach/src/approvalTest_problem/path_problem_demo/test.cpp

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
path_problem_demo.exe is a Catch v2.13.9 host application.
Run with -? for options

-------------------------------------------------------------------------------
MyTestCase
-------------------------------------------------------------------------------
C:/Users/florian.fischer/Documents/inmach/src/approvalTest_problem/path_problem_demo/test.cpp:5
...............................................................................

C:/Users/florian.fischer/Documents/inmach/src/approvalTest_problem/path_problem_demo/test.cpp:5: FAILED:
due to unexpected exception with message:
  Unable to create directory: 

===============================================================================
test cases: 1 | 1 failed
assertions: 1 | 1 failed

I "solved" it by modifying

std::string SystemUtils::getDirectorySeparator()
{
    //return isWindowsOs() ? "\\" : "/";
    return "/";
}

But then it fails when i want to use AutoApproveIfMissingReporter because copy does not like the paths with / instead of \

@Florian-Fischer-InMach
Copy link
Author

After Reading issue #196 i tried to change some settings in QT Creator.
By changing the generator from ninja to MinGW Makefiles it works.
This is the interesting part of the working output
__FILE__ == C:\Users\florian.fischer\Documents\inmach\src\approvalTest_problem\path_problem_demo\test.cpp
This time the filename contains backslashes instead of slashes.

@Florian-Fischer-InMach
Copy link
Author

I did some more investigation of this issue
g++ just copy the filname passed on commandline into FILE
when i use this command
g++.exe .//////.\\\\./.\\./foo.cpp
it prints
.//////.\\./.\./foo.cpp

I think you should normalize the Seperators.
It seems you have there something prepared.

Path::normalizeSeparators
Path::removeRedundantDirectorySeparators

But according to the debugger in qt-creator they are never called

@claremacrae
Copy link
Collaborator

Hello @Florian-Fischer-InMach

Many thanks for this clear report.

We've had a lot of trouble with the Ninja generator previously, and believed that we had worked through all the possible causes.

Here's what we wrote up previously about possible workarounds.

https://approvaltestscpp.readthedocs.io/en/latest/generated_docs/TroubleshootingMisconfiguredBuild.html

If none of those help, would you be interested in pairing with me, via screen sharing from your machine, to find a solution?

@Florian-Fischer-InMach
Copy link
Author

Hello @claremacrae
Sry for late answer. Was busy with other stuff.
I have read the workarounds but they do not solve my problem because they are all about getting abolute Paths.
My problem is: Wrong path seperators.
Ninja generates paths with "/".
getDirectorySeparator returns "".
string magic on path fails because of no match

I changed my Hack from the beginning to this:
Florian-Fischer-InMach@84e1a39

It simply calls normalizeSeparators to fix the sepearators in function setFileName

If you want further discussions we can do a screen sharing to improve this fix

@YarikTH
Copy link
Contributor

YarikTH commented Mar 15, 2024

I'm cross-compiling from Linux to windows, using mingw. And I bumped into the same problem. I solved it by patching

    std::string ApprovalTestNamer::getSourceFileName() const
    {
        auto file = getCurrentTest().getFileName();
 +       file = Path(file).toString();
        auto start = file.rfind(SystemUtils::getDirectorySeparator()) + 1;
        auto end = file.rfind('.');
        auto fileName = file.substr(start, end - start);
        return convertToFileName(fileName);
    }
...
    std::string FileUtils::getDirectory(const std::string& filePath)
    {
-        auto end = filePath.rfind(SystemUtils::getDirectorySeparator()) + 1;
-        auto directory = filePath.substr(0, end);
+        auto filePath2 = Path(filePath).toString();
+        auto end = filePath2.rfind(SystemUtils::getDirectorySeparator()) + 1;
+        auto directory = filePath2.substr(0, end);
        return directory;
    }

But in the end, Florian-Fischer-InMach@84e1a39 works as well. Why it is not in the master branch yet? This problem is known for at least 2 years.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants