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

Testing failures #69

Open
gityopr opened this issue Apr 25, 2023 · 6 comments
Open

Testing failures #69

gityopr opened this issue Apr 25, 2023 · 6 comments
Assignees

Comments

@gityopr
Copy link

gityopr commented Apr 25, 2023

When I run through the test process, I get several "Failed asserting that two strings are equal." errors. They're all issues where I customized dir2cast.ini as directed.

I get two errors that seem more significant:

SettingsHandlerTest::test_cli_media_dir_but_no_permissions_404
Failed asserting that exception of type "ExitException" is thrown.

SettingsHandlerTest::test_GET_media_dir_but_no_permissions_404
Failed asserting that 404 matches expected false.

/config/www/test/SettingsHandlerTest.php:340

I think I've addressed any permissions issues by mapping a working temp folder based on the directions in the docker-compose.yml file, but these issues persist. What should I do?

@ben-xo
Copy link
Owner

ben-xo commented May 15, 2023

Sorry for the late reply!

Essentially, don't worry about it - first of all these errors are pretty minor, but second, the test suite is actually supposed to run against the default dir2cast.ini, so the customisations probably would make it fail as you have experienced.

The test suite tests lots of variations of the settings, as diversions from the defaults. (It's not verifying that your specific setup works, so much as proving that there aren't bugs in general for as many scenarios as I could imagine).

To be honest I hadn't considered that someone might change the .ini then try the test suite - I will have a go at making them independent of one another, so that it's not confusing.

On the other hand, if you were to download a fresh copy of dir2cast, and run the suite without modifying the .ini, and if it were to fail, that would be useful for me to know about as it could indicate a bug or something else I need to improve. So, thanks for your feedback all the same!

@ben-xo
Copy link
Owner

ben-xo commented May 15, 2023

Out of interest can you tell me which settings you modified? I'd like to make sure for myself that all is well :)

@ben-xo ben-xo self-assigned this May 16, 2023
@ben-xo
Copy link
Owner

ben-xo commented May 16, 2023

#70 adds a test which will warn you if you are not testing the defaults

@gityopr
Copy link
Author

gityopr commented May 16, 2023

No problem! This is a hobby for me so very much on the backburner.

Here's my dir2cast.ini file:

`; Configuration for dir2cast by Ben XO. http://www.ben-xo.com/dir2cast

; This is an 'ini' file. Lines beginning with ';' are comments.
; All of the settings are commented-out by default. To set them, remove
; the ';' at the beginning of the line.

; dir2cast will look in 2 places for this file. 1st, it will look in
; the same folder as dir2cast.php. 2nd, it will look in the same folder
; as your MP3s.

; If you only have 1 podcast, or your settings apply to every dir2cast
; podcast on your website, then this file should be placed in
; the same folder as dir2cast.php.

; If you have several podcasts being served from one copy of dir2cast,
; then you can make copies of this file with different settings and put
; them in the folders where your MP3s are. Then they will override
; the settings from the site-wide dir2cast.ini.

; N.B. Although most settings do not need double-quotes (" ") around them,
; it is safer to use them anyway. In particular, any setting with an
; ampersand (&) character will probably fail unless you use double-quotes.
; (e.g. a URL with parameters, or the iTunes Society & Culture category.)

; ***** GLOBAL SETTINGS *** usually OK to leave unspecified ******************

; The following 3 settings are not mandatory because dir2cast should be
; able to figure them out for itself. Also, you can only specify them in
; the dir2cast.ini that is in the same folder as dir2cast.php.

; The full filesystem path to the MP3 folder
; Set this if you do not want the folder to be passed in the URL.
; (This defaults to the same folder as the script)
;MP3_DIR = "/home/ben_xo/public_html/my_mp3_folder"

; The base to look for folders if they are specified in the URL
; Set this if you do want the folder passed in the URL, but the passed
; folders are not subfolders of where you installed dir2cast.php.
; (This defaults to the same folder as the script)
;MP3_BASE = "/home/ben_xo/public_html/"

; The URL of the MP3 folder
; This defaults to the directory of the script.
; dir2cast can usually work this out for you, but under some circumstances
; it will fail. If your MP3 URLs are all wrong, try putting this in manually.
;MP3_URL = "[redacted]" [this was an old setting]

; Uncomment this if you want to check in every sub-folder for new files as well.
;RECURSIVE_DIRECTORY_ITERATOR = true

; *** INFORMATION ABOUT YOUR PODCAST - you SHOULD set this how you like it ***

; The copyright notice of the feed
; This defaults to this year (e.g. '2008')
; The string %YEAR% will be replaced with the current year.
COPYRIGHT = [redacted]

; Webmaster of the feed. This must be an email address,
; and it should be in the format 'my@email.address (My Name)'
; This defaults to ITUNES_OWNER_EMAIL (ITUNES_OWNER_NAME)
WEBMASTER = "[redacted]

; Name of the Owner of the podcast for iTunes
; This defaults to empty
;ITUNES_OWNER_NAME = "Ben XO"

; Email of the Author of the podcast for iTunes
; This defaults to empty
;ITUNES_OWNER_EMAIL = "me-dir2cast@ben-xo.com"

; URL of the feed's home page (this is NOT where the MP3s are! It is
; just the link to your "about" page).
; This defaults to the URL of the script or http://www.example.com/
;LINK = "http://www.ben-xo.com/"

; The title of the feed.
; This defaults to the name of the directory you're casting
TITLE = [redacted]

; The Author of the podcast for iTunes
; This defaults to whatever WEBMASTER is set to
;ITUNES_AUTHOR = "Ben XO"

; Categories for iTunes
;
; You may add as many as you like from the category list at
; https://help.apple.com/itc/podcasts_connect/#/itc9267a2f12
;
; Here is an example which means "Both the 'Music' category and
; the 'Gadgets' subcategory of 'Technology'
;
; Please note that the entire setting must have double quotes ("")
; like in the example, otherwise categories with '&' in the name won't work
;ITUNES_CATEGORIES = "Music, Technology > Gadgets"

; Whether or not the feed contains explicit content.
; See https://github.com/simplepie/simplepie-ng/wiki/Spec:-iTunes-Podcast-RSS
; Valid values are "yes", "explicit", "true" or "no", "clean", "false"
;
; If you don't set this, it will not appear in the feed at all, and Apple
; Podcasts may reject your feed!
;ITUNES_EXPLICIT = "no"

; *** INFORMATION ABOUT YOUR PODCAST - the following can be set using text files ***

; Description of the feed
;
; This defaults to empty, or if the file 'description.txt' exists
; in the MP3 dir, or in the same dir as the script, that will be read
; and the contents used
;
; It's usually better to set this in 'description.txt' because you can
; write a whole lot more that way.
DESCRIPTION = "This is a podcast that hopefully now works so we can have cool books and stuff."

; Subtitle of the feed for iTunes
;
; This defaults to DESCRIPTION, or if the file 'itunes_subtitle.txt' exists
; in the MP3 dir, or in the same dir as the script, that will be read
; and the contents used
;ITUNES_SUBTITLE = "LIKE AND SUBSCRIBE AND WEAR A MASK >:("

; Summary of the feed for iTunes
;
; This defaults to DESCRIPTION, or if the file 'itunes_summary.txt' exists
; in the MP3 dir, or in the same dir as the script, that will be read
; and the contents used
;ITUNES_SUMMARY = "i could go on for hours about how amazing this podcast is [...] etc"

; Image for the podcast
;
; This defaults to no image, or if the file 'image.jpg' exists in the MP3
; dir, or in the same dir as the script, then the URL for that will be used.
;
; The image must be no larger than 144 x 400.
IMAGE = [redacted]

; Image for the podcast for iTunes
;
; This defaults to no image, or if the file 'itunes_image.jpg' exists
; in the MP3 dir, or in the same dir as the script, then the URL for that
; will be used.
;
; The image should be large enough to appear high quality in iTunes.
;ITUNES_IMAGE = [redacted]

; Extra text for the 'iTunes Subtitle', which appears next to each episode
;
; Defaults to empty. The text will appear in the iTunes subtitle for each
; item of the podcast. For example, if you put an entire tracklist into the MP3
; comment field, you could set this to ". Click here for tracklist -->", and
; the the subtitle will read ". Click here for tracklist -->"
;
;ITUNES_SUBTITLE_SUFFIX = ""

; Whether to output the itunes:episode and itunes:season tags
;
; Set the itunes:type tag. If you set this to "serial", it will
; use the content of the ID3 "TRCK" and "TPOS" fields (also known as
; "track number", and "part of a set" (or sometimes "disc number"),
; respectively, as content of the itunes:episode and itunes:season tags.
;
; The TRCK and TPOS values should be non-zero positive integers (1, 2, 3, etc)
;
; NOTE: these are NOT used for ordering within the RSS feed. This is
; still done by file date so it's up to you to make the episode order
; and the file date order match by uploading them in season/episode order.
;
; The default value is "episodic", and no itunes:episode or itunes:season
; tags will be output in the feed.
;
; If you don't want itunes:type to appear in the feed at all, set this to ""
;
; Any value that is not "" or "serial" will be treated as "episodic"
;ITUNES_TYPE = "episodic"

; *** CHECK THESE ARE OK. ***

; Language of the feed
; This defaults to en-us (US English). This must be something recognised by
; the RSS standard. Apple Podcasts only supports values from the ISO 639 list
; (two-letter language codes, with some possible modifiers, such as "en-us").
; See https://www.loc.gov/standards/iso639-2/php/code_list.php
;LANGUAGE = "en-us"

; Where to cache RSS feeds (this must be writable by the web server)
; This defaults to a folder called 'temp' alongside the script
;TMP_DIR = "/tmp"

; Number of items to show in the feed
; This defaults to 10
ITEM_COUNT = 40

; Format of the <title> tag for each item. If this is set to 'false',
; then <title> will be set to the 'title' field in your ID3 tag.
; If this is set to 'true', then <title> will be set to
; 'album - artist - title' from your ID3 tag.
;LONG_TITLES = false

; Automatically extract cover images from the files in the feed so they
; can become the episode image. This will never overwrite a file that
; you uploaded manually, but if dir2cast doesn't have write permissions
; in your podcast folder then it will fail. So, then perhaps turn it off.
;AUTO_SAVE_COVER_ART = true

; *** THESE SHOULD BE LEFT AS THEY ARE - unless you have a good reason. ***

; Files must be at least this old to be included in the feed. If they are
; younger than this it might indicate that they are still being uploaded.
;
; Defaults to 30 seconds
;MIN_FILE_AGE = 30

; Number of seconds for which the cache files are guaranteed valid; that is
; to say, if you generate a new feed, and then hit refresh a lot, it will
; not regenerate the feed again for at least this length of time.
;
; You can only specify this in the dir2cast.ini that is in the same folder as
; dir2cast.php.
;
; Defaults to 5 seconds
;MIN_CACHE_TIME = 5

; Time-to-live (Expiry time) of the feed. This appears in the tag, and
; is used by Podcast clients to determine if it is worth refetching the feed.
; Defaults to 1 hour (60 minutes)
;TTL = 60

; The password to use on the 'force=' part of the URL in order to
; force the RSS feed to be regenerated (bypassing and replacing the cached
; copy). If this is empty then this feature is disabled.
FORCE_PASSWORD = [redacted]

; If you want the script to write the RSS to a file instead of to stdout
; you can set OUTPUT_FILE. This is useful if your RSS takes a long time
; to generate and you would not ever want a podcast client to trigger a
; cache refresh. You probably would want to setup dir2cast.php so only
; You run it after adding new files to the directory.
;OUTPUT_FILE =

; If you want to change the type attribute on the atom:link element
; to something other than 'application/rss+xml' you can set it here.
;ATOM_TYPE =

; If you want the tag for an item to come from the summary (auto-
; generated, or from a file with the same name with .txt extension) then
; set this parameter to 'summary'. Otherwise it will get its description from
; comment tag embedded in the file.
;DESCRIPTION_SOURCE = "comment"

; If you want to have HTML in your tag set this parameter.
; Otherwise the content of the description will be escaped with htmlspecialchars()
;DESCRIPTION_HTML =
`

@gityopr
Copy link
Author

gityopr commented May 19, 2023

I built a test version using a modified nginx image. Seems to work well but gives me the two failures so you can check them on your end.

The project folder contains the docker-compose.yml file and two folders duckdns-config and nginx-config. My Dockerfile is in nginx-config/dockerfile.

Here's my docker-compose.yml:

version: "3.8"
services:
  testduckdns:
    image: lscr.io/linuxserver/duckdns
    container_name: testduckdns
    environment:
      - PUID=1000 
      - PGID=1000 
      - SUBDOMAINS=[subdomain] #enter [subdomain].duckdns.org here
      - TOKEN= #enter duckdns token here
      - LOG_FILE=false #optional
    volumes:
      - ./duckdns-config/config:/config 
      - /etc/localtime:/etc/localtime:ro
    restart: unless-stopped

  nginx:
# old image from linuxserver
# image: lscr.io/linuxserver/nginx:latest
    container_name: test-nginx
    build:
      context: ./nginx-config/dockerfile
      dockerfile: Dockerfile
    environment:
      - PUID=1000
      - PGID=1000
    volumes:
      - ./nginx-config:/config
      - /etc/localtime:/etc/localtime:ro
    ports:
      - 8010:80
      - 4439:443
    restart: unless-stopped 

and the nginx Dockerfile:

Dockerfile

# syntax=docker/dockerfile:1

FROM ghcr.io/linuxserver/baseimage-alpine-nginx:3.17

# set version label
ARG BUILD_DATE
ARG VERSION
ARG NGINX_VERSION
LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}"
LABEL maintainer="aptalca"


# install packages
RUN \
  if [ -z ${NGINX_VERSION+x} ]; then \
    NGINX_VERSION=$(curl -sL "http://dl-cdn.alpinelinux.org/alpine/v3.17/main/x86_64/APKINDEX.tar.gz" | tar -xz -C /tmp \
    && awk '/^P:nginx$/,/V:/' /tmp/APKINDEX | sed -n 2p | sed 's/^V://'); \
  fi && \
  apk add --no-cache --upgrade \
    memcached \
    nginx==${NGINX_VERSION} \
    nginx-mod-http-brotli==${NGINX_VERSION} \
    nginx-mod-http-dav-ext==${NGINX_VERSION} \
    nginx-mod-http-echo==${NGINX_VERSION} \
    nginx-mod-http-fancyindex==${NGINX_VERSION} \
    nginx-mod-http-geoip==${NGINX_VERSION} \
    nginx-mod-http-geoip2==${NGINX_VERSION} \
    nginx-mod-http-headers-more==${NGINX_VERSION} \
    nginx-mod-http-image-filter==${NGINX_VERSION} \
    nginx-mod-http-perl==${NGINX_VERSION} \
    nginx-mod-http-redis2==${NGINX_VERSION} \
    nginx-mod-http-set-misc==${NGINX_VERSION} \
    nginx-mod-http-upload-progress==${NGINX_VERSION} \
    nginx-mod-http-xslt-filter==${NGINX_VERSION} \
    nginx-mod-mail==${NGINX_VERSION} \
    nginx-mod-rtmp==${NGINX_VERSION} \
    nginx-mod-stream==${NGINX_VERSION} \
    nginx-mod-stream-geoip==${NGINX_VERSION} \
    nginx-mod-stream-geoip2==${NGINX_VERSION} \
    nginx-vim==${NGINX_VERSION} \
    build-base \   
    php81-bcmath \
    php81-bz2 \
    php81-ctype \
    php81-curl \
    php81-dev \
    php81-dom \
    php81-exif \
    php81-ftp \
    php81-gd \
    php81-gmp \
    php81-iconv \
    php81-imap \
    php81-intl \
    php81-ldap \
    php81-mysqli \
    php81-mysqlnd \
    php81-opcache \
    php81-pdo_mysql \
    php81-pdo_odbc \
    php81-pdo_pgsql \
    php81-pdo_sqlite \
    php81-pear \
    php81-pecl-apcu \
    php81-pecl-mailparse \
    php81-pecl-memcached \
    php81-pecl-redis \
    php81-pgsql \
    php81-phar \
    php81-posix \
    php81-soap \
    php81-sockets \
    php81-sodium \
    php81-sqlite3 \
    php81-tokenizer \
    php81-xmlreader \
    php81-xsl \
    php81-zip && \
  apk add --no-cache \
    --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing \
    php81-pecl-mcrypt \
    php81-pecl-xmlrpc
    
RUN apk add --update linux-headers

RUN pecl config-set php_ini /etc/php81/php.ini

RUN pecl install xdebug

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# ports and volumes
EXPOSE 80 443

VOLUME /config

Then I download dir2cast, extract it, and place the files within in [project folder]/nginx-config/www

To be clear, nginx-config/www is the website /

For a test file, I downloaded The Invisible Man from:

https://librivox.org/invisible-man-by-h-g-wells/

Unzipped it, then copied the first file (invisible_man_01-02_wells_64kb.mp3) into nginx-config/www

I have the relevant ports forwarded through Nginx Proxy Manager running in another container elsewhere, so the test-nginx webserver is accessible on the internet. Thankfully, my ISP's NAT still supports this.

Then I refreshed the page at [subdomain].duckdns.org/dir2cast.php and the rss reads:

<rss version="2.0">
	<channel>
		<title>www</title>
		<link>http://[subdomain].duckdns.org/dir2cast.php</link>
		<description>Podcast</description>
		<lastBuildDate>Fri, 19 May 2023 15:46:09 +0000</lastBuildDate>
		<language>en-us</language>
		<copyright>2023</copyright>
		<generator>
			dir2cast 1.38 by Ben XO (https://github.com/ben-xo/dir2cast/)
		</generator>
		<webMaster/>
		<ttl>60</ttl>
		<atom:link href="http://[subdomain].duckdns.org/dir2cast.php" rel="self" type="application/rss+xml"/>
		<itunes:subtitle>Podcast</itunes:subtitle>
		<itunes:author/>
		<itunes:summary>Podcast</itunes:summary>
		<itunes:type>episodic</itunes:type>
		<item>
			<itunes:author>H.G. Wells</itunes:author>
			<itunes:duration>22:42</itunes:duration>
			<itunes:subtitle>H.G. Wells</itunes:subtitle>
			<title>Invisible Man - Chapters 01-02</title>
			<link>
				http://[subdomain].duckdns.org/invisible_man_01-02_wells_64kb.mp3
			</link>
			<pubDate>Fri, 19 May 2023 15:42:45 +0000</pubDate>
			<description></description>
			<enclosure url="http://[subdomain].duckdns.org/invisible_man_01-02_wells_64kb.mp3" length="10892352" type="audio/mpeg"/>
		</item>
	</channel>
</rss>

This produces a functional podcast that works with Overcast on iOS, at least, by adding https://[subdomain].duckdns.org/dir2cast.php as expected.

To run the test suite you built, I do:

docker exec -it test-nginx bash
cd config/www/test && composer install
./run.sh

Which gives me the following output:

There were 2 failures:

1) SettingsHandlerTest::test_cli_media_dir_but_no_permissions_404
Failed asserting that exception of type "ExitException" is thrown.

2) SettingsHandlerTest::test_GET_media_dir_but_no_permissions_404
Failed asserting that 404 matches expected false.

/config/www/test/SettingsHandlerTest.php:340

FAILURES!
Tests: 1039, Assertions: 2703, Failures: 2.

Hope this helps, I appreciate all the time you put in here and want you to know that your project here has brought my partner and I some joy. :)

@gityopr gityopr closed this as completed May 19, 2023
@gityopr gityopr reopened this May 19, 2023
@ben-xo
Copy link
Owner

ben-xo commented May 19, 2023

You should find that if you look at the branch from pull request #70 that running the tests with a modified config will warn you that the test isn't really testing what was intended, so the failure can be ignored.

the two tests you have which failed are tests for the behaviour when the media dir isn't accessible - which in your case, it definitely is (as you'd expect!)

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

2 participants