Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to get the current root of package structure as a string in golang test?

Tags:

go

I am writing a utility function for my unit tests which is used by unit tests in multiple packages. This utility function must read a particular file (always the same file). Here are three solutions which do not work, to explain what I am looking for and why.

  1. Hardcode the absolute path. This fails because another user who is trying to test the project might have a different prefix on the absolute path.

  2. Hardcode a relative path from the path of the file which defines the utility function. This fails because packages which import and use this function are not necessarily at the same level of the file hierarchy as the file that defines the utility function, and relative paths are interpreted relative to the importer, not the imported.

  3. Pass in the relative path to the file from every caller relative to the caller's package. This actually works but seems to be very verbose because now every caller must be changed to pass one file.

I see a fourth solution, whereby I can hardcode a path in the utility function which is relative to the root directory of the top-level package. However, I have not been able to find a way to get the root directory in code, although I suspect there is one because imports can be resolved from the root.

Thus, how might I get the sought-after root directory?

I've looked over various Go documents but have so far failed to find a solution. I have also seen this question but the solution there is equivalent to #3 above.

like image 229
merlin2011 Avatar asked Aug 07 '15 08:08

merlin2011


1 Answers

You can also use my method without C:

package mypackage  import (     "path/filepath"     "runtime"     "fmt" )  var (     _, b, _, _ = runtime.Caller(0)     basepath   = filepath.Dir(b) )  func PrintMyPath() {     fmt.Println(basepath) } 

https://play.golang.org/p/ifVRIq7Tx0

like image 138
Oleksiy Chechel Avatar answered Sep 22 '22 23:09

Oleksiy Chechel