ONO::ToolBox::Test

package ONO::ToolBox::Test;
################################################################################
# COPYRIGHT / LICENSE #
################################################################################
#
# This file is part of the ONO Software Project.
#
# Copyright (C) 2000-2025 Jos KIRPS [ www.kirps.com | jos_AT_kirps_DOT_com ]
# and The Joopita Project [ www.joopita.org | contact_AT_joopita_DOT_com ]
#
# This file, as well as other parts of the ONO Software Project or related
# elements, are FREE SOFTWARE available under the ARTISTIC LICENSE 2.0.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# For the full license, see /ono/osr/license/LICENSE.txt, or write to
# jos_AT_kirps_DOT_com or contact_AT_joopita_DOT_com.
#
################################################################################
# END OF COPYRIGHT / LICENSE, HERE COMES THE CODE ... #
################################################################################


use strict;

use ONO::IO;

use ONO::Lib::Code::RandomID;
use ONO::Lib::PDF::Gen;
use ONO::Lib::PDF::ToolBox;
use ONO::Lib::PDF::Draw;
use ONO::Lib::Image::Magick;
use ONO::Lib::Image::ToolBox;
use ONO::Lib::Video::ToolBox;
use ONO::Render;

#: This module offers some system related test that allow to check and monitor
#: some advanced external features.

###############################################################################
# TEST SUITE
###############################################################################

sub monitor {

my (
$self,
$mode,
$vars_ref,
) = @_;
my %vars = %$vars_ref;
my $BASE = ONO::IO->base();

#: This allows to monitor basic OS features, currently only ImageMagick is
#: being supported.
#:
#: If ImageMagick is running and if it can successfully convert an image,
#: then a green LED is being returned. If the image conversion is failing
#: for any reason, then a red LED ist being returned.

my $HTML;

foreach my $line (ONO::IO->list("etc/softwaretest.conf")) {
$line =~ s~(\n|\r|\t)~~g;
if ($line =~ /^$mode $vars{'export_key'}$/) {

my $ID = ONO::Lib::Code::RandomID->make();
ONO::IO->mkpath("var/tmp/test/$ID");

if ($mode eq "imagemagick") {
my $LED = "red";

eval "use Image::Magick";
if (!$@) {
ONO::Lib::Image::Magick->convert("/ono/osr/test/files/image_640_400.png","/var/tmp/test/$ID/image_test.jpg");
if (ONO::IO->exists("var/tmp/test/$ID/image_test.jpg") && ONO::IO->size("var/tmp/test/$ID/image_test.jpg") > 1) {
$LED = "green";
}
}

my $SERVER = $ENV{'SERVER_NAME'};
if ($SERVER =~ /^(.*?)\.(.*?)\.(.*?)$/) {
$SERVER = $2;
}
$SERVER =~ s~\.(.*)$~~;
$SERVER = substr($SERVER,0,3);

$HTML = qq~<table class="default_table auto">
<tr>
<td><img class="block12" src="$BASE/ono/osr/images/leds/16x16/$LED.png" alt=""></td>
<td class="small">$SERVER</td>
</tr>
</table>
~;
}

foreach my $file (ONO::IO->ls("var/tmp/test/$ID")) {
ONO::IO->rm("var/tmp/test/$ID/$file");
}
ONO::IO->rmdir("var/tmp/test/$ID");

}
}

if (!$HTML) {
$HTML = "no_data, bad_data, or not_configured";
}

if ($vars{'ajax_export_wrapper'} eq "html") {
my $CSSJS = ONO::Render->cssjs($BASE);
$HTML = qq~<html>
<head>
<meta charset="utf-8">
<meta name="robots" content="noindex, nofollow">
<meta http-equiv="refresh" content="300">
$CSSJS
</head>
<body>
$HTML
</body>
</html>
~;
}

return $HTML;

}

sub media_processors {

my $switches = $_[1];

#: This allows to monitor basic ONO and OS features, including ONO::IO,
#: PDF generation, ImageMagick processing, FFMPEG video processing,
#: HTML to IMG or PDF conversion, etc.
#:
#: This is generating a report, which will be displayed on the ONO Admin
#: Info screen for example.
#:
#: -H no HTML (conversion for mail or console for example)

my ($err,$TESTS);
my $ID = ONO::Lib::Code::RandomID->make();

ONO::IO->mkpath("var/tmp/test/$ID");

if (ONO::IO->exists("var/tmp/test/$ID")) {
$TESTS .= qq~test dir has been generated (var/tmp/test/$ID), ~;
} else {
$err++;
$TESTS .= qq~<span class="lightred">test dir could not be generated</span>, ~;
}

eval "use PDF::Reuse";
if (!$@) {
$TESTS .= qq~PDF::Reuse loaded, ~;
ONO::Lib::PDF::Gen->open("var/tmp/test/$ID/pdf_test.pdf",210,297);

# writing on the PDF does NOT seem to work ???

my $canvas = ONO::Lib::PDF::ToolBox->canvas_init(20,20,100,100);
ONO::Lib::PDF::ToolBox->canvas_test($canvas);
ONO::Lib::PDF::Draw->text($canvas,20,20,"This is a test file.");
ONO::Lib::PDF::Gen->close();
my $size = ONO::IO->size("var/tmp/test/$ID/pdf_test.pdf");
if (ONO::IO->exists("var/tmp/test/$ID/pdf_test.pdf")) {
$TESTS .= qq~PDF test file has been generated ($size bytes), ~;
} else {
$err++;
$TESTS .= qq~<span class="lightred">PDF test file could not be generated</span>, ~;
}
} else {
$err++;
$TESTS .= qq~<span class="lightred">PDF::Reuse could not be loaded</span>, ~;
}

eval "use Image::Magick";
if (!$@) {
$TESTS .= qq~Image::Magick loaded, ~;
ONO::Lib::Image::Magick->convert("/ono/osr/test/files/image_640_400.png","/var/tmp/test/$ID/image_test.jpg");
my $size = ONO::IO->size("var/tmp/test/$ID/image_test.jpg");
if (ONO::IO->exists("var/tmp/test/$ID/image_test.jpg")) {
$TESTS .= qq~JPG test file has been generated ($size bytes), ~;
} else {
$err++;
$TESTS .= qq~<span class="lightred">JPG test file could not be generated</span>, ~;
}
} else {
$err++;
$TESTS .= qq~<span class="lightred">Image::Magick could not be loaded</span>, ~;
}

if (ONO::Lib::Image::ToolBox->detect_wkhtmltoimage) {
$TESTS .= qq~wkhtmltoimage found, ~;
} else {
$TESTS .= qq~<span class="lightred">wkhtmltoimage could not be found</span>, ~;
}

if (ONO::Lib::Video::ToolBox->detect_ffmpeg) {
$TESTS .= qq~ffmpeg found, ~;
ONO::IO->cp("ono/osr/test/files/video_1280_720.mkv","var/tmp/test/$ID/video_test.mkv");
ONO::Lib::Video::ToolBox->convert("/var/tmp/test/$ID/video_test.mkv",0,"","iNT");
my $size = ONO::IO->size("var/tmp/test/$ID/video_test.mp4");
if (ONO::IO->exists("var/tmp/test/$ID/video_test.mp4")) {
$TESTS .= qq~MP4 test file has been generated ($size bytes), ~;
} else {
$err++;
$TESTS .= qq~<span class="lightred">MP4 test file could not be generated</span>, ~;
}
} else {
$err++;
$TESTS .= qq~<span class="lightred">ffmpeg is missing</span>, ~;
}

if (ONO::Lib::PDF::ToolBox->detect_pdftk) {
$TESTS .= qq~pdftk found, ~;
} else {
$TESTS .= qq~<span class="lightred">pdftk could not be found</span>, ~;
}

if (ONO::Lib::PDF::ToolBox->detect_wkhtmltopdf) {
$TESTS .= qq~wkhtmltopdf found, ~;
} else {
$TESTS .= qq~<span class="lightred">wkhtmltopdf could not be found</span>, ~;
}

foreach my $file (ONO::IO->ls("var/tmp/test/$ID")) {
ONO::IO->rm("var/tmp/test/$ID/$file");
}
ONO::IO->rmdir("var/tmp/test/$ID");

if (!ONO::IO->exists("var/tmp/test/$ID")) {
$TESTS .= qq~test dir has been removed, ~;
} else {
$err++;
$TESTS .= qq~<span class="lightred">test dir could not be removed</span>, ~;
}

$TESTS =~ s~\, $~\.~;

if ($switches =~ /H/) {
$TESTS =~ s~\<(.*?)\>~~g;
$TESTS =~ s~\, ~\n~g;
$TESTS =~ s~\.$~~g;
}

return ($err,ucfirst $TESTS);

}

###############################################################################
# end of script
###############################################################################

1;

__END__