.R_LIBS <- function(libp = .libPaths()) { # (>> in utils?)
    libp <- libp[! libp %in% .Library]
    if(length(libp))
        paste(libp, collapse = .Platform$path.sep)
    else "" # character(0) is invalid for Sys.setenv()
}
.libPaths(tail(.libPaths(), 1), include.site=FALSE) # no extra libraries (w/ many pkgs)\n")

Sys.setenv(R_LIBS = .R_LIBS() # for build.pkg() & install.packages()
         , R_BUILD_ENVIRON = "nothing" # avoid ~/.R/build.environ which might set R_LIBS
         , R_ENVIRON = "none"
         , R_PROFILE = "none"
           )
showProc.time <- local({ ## function + 'pct' variable
    pct <- proc.time()
    function(final="\n") { ## CPU elapsed __since last called__
	ot <- pct ; pct <<- proc.time()
	cat('Time elapsed: ',
	    format.default(round((pct - ot)[1:3], digits=3), digits=4),
	    final)
    }
})

## PR 1271  detach("package:base") crashes R.
tools::assertError(detach("package:base"))


## invalid 'lib.loc'
stopifnot(length(installed.packages("mgcv")) == 0)
## gave a low-level error message
showProc.time()



## package.skeleton() with metadata-only code
## work in current (= ./tests/ directory):
tmp <- tempfile()
writeLines(c('setClass("foo", contains="numeric")',
             'setMethod("show", "foo",',
             '          function(object) cat("I am a \\"foo\\"\\n"))'),
           tmp)
if(file.exists("myTst")) unlink("myTst", recursive=TRUE)
package.skeleton("myTst", code_files = tmp)# with a file name warning
file.copy(tmp, (tm2 <- paste(tmp,".R", sep="")))
unlink("myTst", recursive=TRUE)
op <- options(warn=2) # *NO* "invalid file name" warning {failed in 2.7.[01]}:
package.skeleton("myTst", code_files = tm2)
options(op)
##_2_ only a class, no generics/methods:
writeLines(c('setClass("DocLink",',
             'representation(name="character",',
             '               desc="character"))'), tmp)
if(file.exists("myTst2")) unlink("myTst2", recursive=TRUE)
package.skeleton("myTst2", code_files = tmp)
##- end_2_ # failed in R 2.11.0
stopifnot(1 == grep("setClass",
		    readLines(list.files("myTst/R", full.names=TRUE))),
	  c("foo-class.Rd","show-methods.Rd") %in% list.files("myTst/man"))
## failed for several reasons in R < 2.7.0
##
## Part 2: -- build, install, load and "inspect" the package:
build.pkg <- function(dir, destdir = NULL, ignore.stderr = FALSE, no.latex=TRUE) {
    dir <- normalizePath(dir)
    if(length(dir) > 1)
        return(lapply(dir, build.pkg, destdir=destdir,
                      ignore.stderr=ignore.stderr, no.latex=no.latex))
    ## else one 'dir':
    stopifnot(dir.exists(dir), file.exists(DESC <- file.path(dir, "DESCRIPTION")))
    pkgName <- sub("^[A-Za-z]+: ", "", grep("^Package: ", readLines(DESC), value=TRUE))
    patt <- paste(pkgName, ".*tar\\.gz$", sep="_")
    unlink(dir('.', pattern = patt))
    Rcmd <- paste(shQuote(file.path(R.home("bin"), "R")), "CMD")
    r <- system(paste(Rcmd, "build --keep-empty-dirs",
                      if(no.latex) "--no-manual", shQuote(dir)),
                ignore.stderr=ignore.stderr, intern = TRUE)
    ## return name of tar file built {plus the build log} :
    tball <- structure(dir('.', pattern = patt), log3 = r)
    if(is.null(destdir))
        tball
    else {
        file.copy(tball, destdir)
        file.path(destdir, basename(tball))
    }
}
build.pkg("myTst")
## clean up any previous attempt (which might have left a 00LOCK)
unlink("myLib", recursive = TRUE)
dir.create("myLib")
install.packages("myTst", lib = "myLib", repos=NULL, type = "source") # with warnings
print(installed.packages(lib.loc= "myLib", priority= "NA"))## (PR#13332)
stopifnot(require("myTst",lib = "myLib"))
sm <- findMethods(show, where= as.environment("package:myTst"))
stopifnot(sm@names == "foo")
unlink("myTst_*")

## getPackageName()  for "package:foo":
require('methods')
library(tools)
oo <- options(warn=2)
detach("package:tools", unload=TRUE)
options(oo)
## gave warning (-> Error) about creating package name


## More building & installing packages
## NB: tests were added here for 2.11.0.
## NB^2: do not do this in the R sources (but in a build != src directory!)
## and this testdir is not installed.
if(interactive() && Sys.getenv("USER") == "maechler")
    Sys.setenv(SRCDIR = normalizePath("~/R/D/r-devel/R/tests"))
(pkgSrcPath <- file.path(Sys.getenv("SRCDIR"), "Pkgs"))# e.g., -> "../../R/tests/Pkgs"
## SRCDIR not available on windows, so pkgSrcPath won't be populated
## if this happens non-interactively, cleanup and quit gracefully
if(!file_test("-d", pkgSrcPath) && !interactive()) {
    unlink("myTst", recursive=TRUE)
    showProc.time()
    q("no")
}
## else w/o clause:
showProc.time()

do.cleanup <- !nzchar(Sys.getenv("R_TESTS_NO_CLEAN"))
isWIN <- .Platform$OS.type == "windows"
has.symlink <- !isWIN
## Installing "on to" a package existing as symlink in the lib.loc
## -- used to fail with misleading error message (#PR 16725):

if(has.symlink && !unlink("myLib_2", recursive=TRUE) && dir.create("myLib_2") &&
   file.rename("myLib/myTst", "myLib_2/myTst") &&
   file.symlink("../myLib_2/myTst", "myLib/myTst"))
    install.packages("myTst", lib = "myLib", repos=NULL, type = "source")
## In R <= 3.3.2 gave error with *misleading* error message:
## ERROR: ‘myTst’ is not a legal package name

if(isWIN) { # (has no symlinks anyway)
    file.copy(pkgSrcPath, tempdir(), recursive = TRUE)
} else { # above file.copy() not useful as it replaces symlink by copy
    system(paste('cp -R', shQuote(pkgSrcPath), shQuote(tempdir())))
}
pkgPath <- file.path(tempdir(), "Pkgs")
if(!dir.exists(pkgPath))  {
    message("No valid 'pkgPath' (from 'pkgSrcPath') - exit this test")
    if(!interactive()) q("no")
}

## pkgB tests an empty R directory
dir.create(file.path(pkgPath, "pkgB", "R"), recursive = TRUE,
           showWarnings = FALSE)
## (how can this happen reliably more easily?)
##' Copy directory d1 to (new/cleaned directory location) d2
##'     "cp -a d1/ d2/"
dirCopy <- function(d1, d2) {
    stopifnot(exprs = {
        dir.exists(d1)
        dir.exists(dirname(d2))
        !dir.exists(d2) || unlink(d2, recursive=TRUE) == 0
        dir.create(d2)
        file.copy(list.files(d1, full.names = TRUE, recursive = TRUE),
                  d2)
    })
}
##
## pkgB{2,3} := pkgB but with missing/incomplete 'Imports:' entry in DESCRIPTION
              pBp <- file.path(pkgPath, "pkgB")
dirCopy(pBp, pB2p <- file.path(pkgPath, "pkgB2"))
dirCopy(pBp, pB3p <- file.path(pkgPath, "pkgB3"))
if(okB2 <- file.exists(DN <- file.path(pB2p, "DESCRIPTION"))) {
  Dlns <- readLines(DN); i <- grep("^Imports:", Dlns)
  ## drop 'Imports: ' completely (and replace [Pp]kgB by [Pp]kgB2):
  writeLines(gsub("kgB", "kgB2", Dlns[-i]), con = DN)
}
if(okB3 <- file.exists(DN <- file.path(pB3p, "DESCRIPTION"))) {
  Dlns <- readLines(DN); i <- grep("^Imports:", Dlns)
  ## Only keep the first 'Imports: '  (and replace [Pp]kgB by [Pp]kgB2):
  Dlns[i] <- sub(",.*", "", Dlns[i])
  writeLines(gsub("kgB", "kgB3", Dlns), con = DN)
}
p.lis <- c(if("Matrix" %in% row.names(installed.packages(.Library)))
               c("pkgA", "pkgB", if(okB2) "pkgB2", if(okB3) "pkgB3", "pkgC"),
           "PR17501",
           "exNSS4", "exNSS4nil", "exSexpr")
p.lis; (pBlis <- grep("^pkgB", p.lis, value=TRUE))
InstOpts <- list("exSexpr" = "--html")
pkgApath <- file.path(pkgPath, "pkgA")
if("pkgA" %in% p.lis && !dir.exists(d <- pkgApath)) {
    cat("symlink 'pkgA' does not exist as directory ",d,"; copying it\n", sep='')
    file.copy(file.path(pkgPath, "xDir", "pkg"), to = d, recursive=TRUE)
    ## if even the copy failed (NB: pkgB, pkgC depend on pkgA)
    if(!dir.exists(d)) p.lis <- p.lis[!(p.lis %in% c("pkgA", pBlis, "pkgC"))]
}
dir2pkg <- function(dir) sub("^pkgC", "PkgC", dir)
if(is.na(match("myLib", .lP <- .libPaths()))) {
    .libPaths(c("myLib", .lP)) # PkgC needs pkgA from there
    .lP <- .libPaths()
}
Sys.setenv(R_LIBS = .R_LIBS(.lP)) # for build.pkg() & install.packages()
showProc.time()
for(p in p.lis) {
    p. <- dir2pkg(p) # 'p' is sub directory name;  'p.' is package name
    cat("===--===\nFrom pkgPath sub directory", p, " building package", p., "...\n")
    pkgP <- file.path(pkgPath, p)
    r <- build.pkg(pkgP, ignore.stderr = (p != "exSexpr"))
    showProc.time()
    if(!length(r)) # so some sort of failure, show log
        cat(attr(r, "log3"), sep = "\n")
    if(!isTRUE(file.exists(r)))
        stop("R CMD build failed (no tarball) for package ", p.)
    if(p %in% pBlis) { ## R CMD check "dependencies"
        res <- tools:::.check_package_depends(dir=pkgP, force_suggest=FALSE)
        cat("check_package_depends:\n") ; print(res)
        if(length(res)) pres <- capture.output(res)
        switch(p
             , "pkgB" = stopifnot(length(res) == 0)
             , "pkgB2" = stopifnot(exprs = {
                 length(res) == 1
                 identical(res$missing_namespace_depends, c("methods", "pkgA"))
                 grepl("Namespace dependencies .* DESCRIPTION" , pres[1])
                 })
             , "pkgB3" =  stopifnot(exprs = {
                 length(res) == 1
                 identical(res[[1]], "pkgA")
                 grepl("Namespace dependency .* DESCRIPTION" , pres[1])
                 })
               )
        showProc.time()
    }
    ## otherwise install the tar file:
    cat("installing package", p., "using built file", r, "...\n")
    ## "FIXME": want to catch warnings in the "console output" of this,
    ## e.g. exNSS4nil, "S4 exports specified in 'NAMESPACE' but not defined .."
    install.packages(r, lib = "myLib", repos=NULL, type = "source",
                     INSTALL_opts = InstOpts[[p.]])
    stopifnot(require(p., lib = "myLib", character.only=TRUE))
    detach(pos = match(p., sub("^package:","", search())))
    showProc.time()
}
cat("\n-------------------end { for(p in p.lis) }----------------------------\n")
(res <- installed.packages(lib.loc = "myLib", priority = "NA"))
(p.lis <- dir2pkg(p.lis)) # so from now, it contains package names
stopifnot(exprs = {
    identical(res[,"Package"], setNames(, sort(c(p.lis, "myTst"))))
    res[,"LibPath"] == "myLib"
})
### Specific Tests on our "special" packages: ------------------------------

tf <- tempfile("chk_donttest")
## why does this not work (not catch stderr)?  textConnection("checkTxt", open="w")
system.time(status <-
        tools:::run_Rcmd(c("check", "PR17501_1.0.tar.gz", "--no-manual"),
                         out=tf, timeout = 50))# see 5--7 sec; Solaris needed > 30
stopifnot(exprs = {
    status == 1 # an ERROR now
    is.character(exLines <-
                     readLines(file.path("PR17501.Rcheck", "PR17501-Ex.R")))
    { str(exLines); length(exLines) > 20 } # str(): diagnostic in case
    is.integer(i <- grep("^R\\.Version\\( *# missing closing paren", exLines))
    grepl("^## No test", exLines[i-1])
    { str(tlines <- readLines(tf)); length(tlines) > 20 }
    length(iw <- grep("^Warning: parse error", tlines)) == 1
    (lenN <- length(print(iN <- grep("^[1-9][0-9]:", tlines)))) >= 2
    iN - iw == seq_len(lenN) # these (3) lines come immediately after 'Warning',
    ## and "related" to the some 'missing .. paren' above:
    8 <= print(iw - i) & iw - i <= 20 # see ~14
}) ## failed in R <= 4.1.1


## These used to fail because of the sym.link in pkgA
if("pkgA" %in% p.lis && dir.exists(pkgApath)) {
    cat("undoc(pkgA):\n"); print(uA <- tools::undoc(dir = pkgApath))
    cat("codoc(pkgA):\n"); print(cA <- tools::codoc(dir = pkgApath))
    cat("extends(\"classApp\"):\n"); print(ext.cA <- extends("classApp"))
    stopifnot(exprs = {
	identical(uA$`code objects`, c("nil", "search"))
	identical(uA$`data sets`,    "nilData")
	## pkgC's class union is now (after loading pkgC) also visible in the "classApp" subclass
	## (which gave warning). ==> warning "wrong": somehow it *did* get updated:
	"numericA" %in% ext.cA
    })
} else message("'pkgA' not available")
showProc.time()

## - Check conflict message.
## - Find objects which are NULL via "::" -- not to be expected often
##   we have one in our pkgA, but only if Matrix is present.
if(dir.exists(file.path("myLib", "pkgA"))) {
  msgs <- capture.output(require(pkgA, lib="myLib"), type = "message")
  writeLines(msgs)
  stopifnot(length(msgs) > 2,
            length(grep("The following object is masked.*package:base", msgs)) > 0,
            length(grep("\\bsearch\\b", msgs)) > 0)
  data(package = "pkgA") # -> nilData
  stopifnot(is.null( pkgA::  nil),
	    is.null( pkgA::: nil),
	    is.null( pkgA::  nilData)) # <-
  ## R-devel (pre 3.2.0) wrongly errored for NULL lazy data
  ## ::: does not apply to data sets:
  tools::assertError(is.null(pkgA:::nilData))
} else message("'pkgA' not in 'myLib'")
showProc.time()

## Check error from invalid logical field in DESCRIPTION:
(okA <- dir.exists(pkgApath) &&
     file.exists(DN <- file.path(pkgApath, "DESCRIPTION")))
if(okA) {
  Dlns <- readLines(DN); i <- grep("^LazyData:", Dlns)
  Dlns[i] <- paste0(Dlns[i], ",") ## adding a ","
  writeLines(Dlns, con = DN)
  ## do not test installation failure in myLib as previous pkgA would be removed
  ## from there (because no.q=TRUE causes do_exit_on_error() to be called twice)
  ## and if getNamespaceInfo("pkgA", "path") no longer exists,
  ## sessionInfo() fails in the "exSexpr" test below
  instEXPR <- quote(
      tools:::.install_packages(c("--clean", paste0("--library=", tempdir()), pkgApath), no.q = TRUE)
  )   ##      -----------------                                               ----
  if(interactive()) { ## << "FIXME!"  This (sink(.) ..) fails, when run via 'make'.
    ## install.packages() should give "the correct" error but we cannot catch it
    ## One level lower is not much better, needing sink() as capture.output() fails
    ftf <- file(tf <- tempfile("inst_pkg"), open = "wt")
    sink(ftf); sink(ftf, type = "message")# "message" should be sufficient
    eval(instEXPR)
    sink(type="message"); sink()## ; close(ftf); rm(ftf)# end sink()
    writeLines(paste(" ", msgs <- readLines(tf)))
    message(err <- grep("^ERROR:", msgs, value=TRUE))
    stopifnot(exprs = {
        length(err) > 0
        grepl("invalid .*LazyData .*DESCRIPTION", err)
    })
  } else {
      message("non-interactive -- tools:::.install_packages(..) : ")
      try( eval(instEXPR) ) # showing the error message in the *.Rout file
  }
} else message("pkgA/DESCRIPTION  not available")
showProc.time()

## R CMD check should *not* warn about \Sexpr{} built sections in Rd (PR#17479):
msg <- capture.output(
    tools:::.check_package_parseRd(dir=file.path(pkgPath, "exSexpr")))
if(length(msg))
    stop(".check_package_parseRd() gave message\n",msg)
## in R <= 3.5.1, gave
##  "prepare_Rd: foo.Rd:14: Section \\Sexpr is unrecognized and will be dropped"
showProc.time()


if(dir.exists(file.path("myLib", "exNSS4"))) withAutoprint({
  require("exNSS4", lib="myLib")
  validObject(dd <- new("ddiM"))
  print(is(dd))  #  5 of them ..
  writeLines(myGmeth <- capture.output(show(exNSS4:::myGenf)))
  stopifnot(exprs = {
            is(dd, "mM")
      inherits(dd, "mM")
      grepl("showMethods(exNSS4:::myGenf)", myGmeth[length(myGmeth)], fixed=TRUE)
  })
  ## tests here should *NOT* assume recommended packages,
  ## let alone where they are installed
  if(dir.exists(file.path(.Library, "Matrix"))) {
    for(ns in c(rev(p.lis), "Matrix")) unloadNamespace(ns)
    ## Both exNSS4 and Matrix define "atomicVector" *the same*,
    ## but  'exNSS4'  has it extended - and hence *both* are registered in cache -> "conflicts"
    requireNamespace("exNSS4", lib= "myLib")
    ## Found in cache, since there is only one definition.
    ## Might confuse users.
    stopifnot(isVirtualClass(getClass("atomicVector")))
    requireNamespace("Matrix", lib= .Library)
    ## Throws an error, because there is ambiguity in the cache,
    ## and the dynamic search will not find anything, since the packages
    ## are not attached.
    tools::assertCondition(
        acl <- getClass("atomicVector")
        )
    ## Once Matrix is attached, we find a unique definition.
    library(Matrix)
    stopifnot(isVirtualClass(getClass("atomicVector")))
  }
})
showProc.time()


## Part 3: repository construction ---------------------------------------------
## test tools::write_PACKAGES and tools::update_PACKAGES
oldpkgdir <- file.path(tempdir(), "pkgfiles/old")
newpkgdir <- file.path(tempdir(), "pkgfiles/new")
repodir <- file.path(tempdir(), "pkgrepo")
dir.create(oldpkgdir, recursive = TRUE)
dir.create(newpkgdir)
if(file.exists(repodir))
    unlink(repodir, recursive = TRUE)
dir.create(repodir)

ro <- build.pkg(file.path(pkgPath, c("pkgD",   "pkgB")),   oldpkgdir)
rn <- build.pkg(file.path(pkgPath, c("pkgD_2", "pkgD_3")), newpkgdir)
unlist(ro)
unlist(rn)


##' A repo package database in directory 'dir'
mkPkgfiles <- function(dir)
    file.path(dir, c("PACKAGES",
                     "PACKAGES.gz",
                     "PACKAGES.rds"))

##' safe read.dcf()
read.safe.dcf <- function(f) if(file.exists(f)) read.dcf(f) # else NULL

## this will fail with an error if write_PACKAGES
## and update_PACKAGES do not generate the same
## PACKAGE file entries, in the same order, with
## the same field order.
docompare <- function(..., repdir = repodir, strict = TRUE) {
    Pfiles <- mkPkgfiles(repdir)
    backupPfiles <- file.path(tempdir(), basename(Pfiles))
    indfile <- Pfiles[1]
    ##     vvvvvvvvvvvvvvv
    tools::write_PACKAGES(repdir, type = "source", ...)
    wpres <- read.safe.dcf(indfile) # write_P result
    ## reset the PACKAGES files so that update_PACKAGES thinks any deviations are "new"
    if(all(file.exists(backupPfiles)))
        file.copy(backupPfiles, Pfiles, overwrite = TRUE)
    ##     vvvvvvvvvvvvvvv
    tools::update_PACKAGES(repdir, type = "source", strict=strict, ...)
    upres <- read.safe.dcf(indfile) # update_P result
    stopifnot(identical(wpres, upres))
}

Pfiles <- mkPkgfiles(repodir)
backupPfiles <- file.path(tempdir(), basename(Pfiles))
if(all(file.exists(backupPfiles)))
    unlink(backupPfiles)
showProc.time()

## test write_PACKAGES and update_PACKAGES
## on empty dir
## IGNORE_RDIFF_BEGIN
docompare() ## one warning expected, has a temp path in it so ignore diff
## IGNORE_RDIFF_END

oldpfs <- list.files(oldpkgdir, pattern = "\\.tar\\.gz$", recursive = TRUE, full.names = TRUE)
newpfs <- list.files(newpkgdir, pattern = "\\.tar\\.gz$", recursive = TRUE, full.names = TRUE)

## generate and backup "original repo state"
file.copy(oldpfs, to = repodir)
tools::write_PACKAGES(repodir, type = "source")
file.copy(Pfiles, backupPfiles, overwrite = TRUE)
showProc.time()


## test update_PACKAGES with no change
docompare()

## all old files gone, new files present
unlink(file.path(repodir, basename(oldpfs)))
file.copy(newpfs, to = repodir)
docompare()
docompare(strict=FALSE)

## put old ones back
file.copy(oldpfs, to = repodir)
showProc.time()


if(isWIN){
    nrepodir  <- normalizePath(repodir)
    if(grepl("^\\\\", nrepodir)) #\\laptop\whatever
        repourl  <- paste0("file:", gsub("\\\\", "/", nrepodir))
    else #C:\whatever
        repourl  <- paste0("file:///", gsub("\\\\", "/", nrepodir))
} else
    repourl  <- paste0("file://", normalizePath(repodir))

## make sure the ordering is right when
## old and new entries are mixed in final db
##

##' care: stopifnot(nrow(1) == 2) # does *not* trigger
checkMatrix <- function(x, n) stopifnot(is.matrix(x), nrow(x) == n)

docompare(latestOnly = TRUE)
str(ap <- available.packages(repourl, filters = list()))
checkMatrix(ap, 2)

docompare(latestOnly = FALSE)
str(ap <- available.packages(repourl, filters = list()))
checkMatrix(ap, 4)

docompare(latestOnly = TRUE, strict = FALSE)
str(ap <- available.packages(repourl, filters = list()))
checkMatrix(ap, 2)

docompare(latestOnly = FALSE, strict = FALSE)
str(ap <- available.packages(repourl, filters = list()))
checkMatrix(ap, 4)




## clean up
rmL <- c("myLib", if(has.symlink) "myLib_2", "myTst", file.path(pkgPath),
         oldpkgdir, newpkgdir, repodir, backupPfiles)
if(do.cleanup) {
    for(nm in rmL) unlink(nm, recursive = TRUE)
} else {
    cat("Not cleaning, i.e., keeping ", paste(rmL, collapse=", "), "\n")
}

showProc.time()
## And the final:
environment(showProc.time)[["pct"]]
