github.com/ethanhsieh/snapd@v0.0.0-20210615102523-3db9b8e4edc5/i18n/i18n_test.go (about)

     1  // -*- Mode: Go; indent-tabs-mode: t -*-
     2  
     3  /*
     4   * Copyright (C) 2014-2015 Canonical Ltd
     5   *
     6   * This program is free software: you can redistribute it and/or modify
     7   * it under the terms of the GNU General Public License version 3 as
     8   * published by the Free Software Foundation.
     9   *
    10   * This program is distributed in the hope that it will be useful,
    11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13   * GNU General Public License for more details.
    14   *
    15   * You should have received a copy of the GNU General Public License
    16   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    17   *
    18   */
    19  
    20  package i18n
    21  
    22  import (
    23  	"io/ioutil"
    24  	"os"
    25  	"os/exec"
    26  	"path/filepath"
    27  	"testing"
    28  
    29  	. "gopkg.in/check.v1"
    30  
    31  	"github.com/snapcore/snapd/dirs"
    32  )
    33  
    34  // Hook up check.v1 into the "go test" runner
    35  func Test(t *testing.T) { TestingT(t) }
    36  
    37  var mockLocalePo = []byte(`
    38  msgid ""
    39  msgstr ""
    40  "Project-Id-Version: snappy-test\n"
    41  "Report-Msgid-Bugs-To: snappy-devel@lists.ubuntu.com\n"
    42  "POT-Creation-Date: 2015-06-16 09:08+0200\n"
    43  "Language: en_DK\n"
    44  "MIME-Version: 1.0\n"
    45  "Content-Type: text/plain; charset=UTF-8\n"
    46  "Content-Transfer-Encoding: 8bit\n"
    47  "Plural-Forms: nplurals=2; plural=n != 1;>\n"
    48  
    49  msgid "plural_1"
    50  msgid_plural "plural_2"
    51  msgstr[0] "translated plural_1"
    52  msgstr[1] "translated plural_2"
    53  
    54  msgid "singular"
    55  msgstr "translated singular"
    56  `)
    57  
    58  func makeMockTranslations(c *C, localeDir string) {
    59  	fullLocaleDir := filepath.Join(localeDir, "en_DK", "LC_MESSAGES")
    60  	err := os.MkdirAll(fullLocaleDir, 0755)
    61  	c.Assert(err, IsNil)
    62  
    63  	po := filepath.Join(fullLocaleDir, "snappy-test.po")
    64  	mo := filepath.Join(fullLocaleDir, "snappy-test.mo")
    65  	err = ioutil.WriteFile(po, mockLocalePo, 0644)
    66  	c.Assert(err, IsNil)
    67  
    68  	cmd := exec.Command("msgfmt", po, "--output-file", mo)
    69  	cmd.Stdout = os.Stdout
    70  	cmd.Stderr = os.Stderr
    71  	err = cmd.Run()
    72  	c.Assert(err, IsNil)
    73  }
    74  
    75  type i18nTestSuite struct {
    76  	origLang       string
    77  	origLcMessages string
    78  }
    79  
    80  var _ = Suite(&i18nTestSuite{})
    81  
    82  func (s *i18nTestSuite) SetUpTest(c *C) {
    83  	// this dir contains a special hand-crafted en_DK/snappy-test.mo
    84  	// file
    85  	localeDir := c.MkDir()
    86  	makeMockTranslations(c, localeDir)
    87  
    88  	// we use a custom test mo file
    89  	TEXTDOMAIN = "snappy-test"
    90  
    91  	s.origLang = os.Getenv("LANG")
    92  	s.origLcMessages = os.Getenv("LC_MESSAGES")
    93  
    94  	bindTextDomain("snappy-test", localeDir)
    95  	os.Setenv("LANG", "en_DK.UTF-8")
    96  	setLocale("")
    97  }
    98  
    99  func (s *i18nTestSuite) TearDownTest(c *C) {
   100  	os.Setenv("LANG", s.origLang)
   101  	os.Setenv("LC_MESSAGES", s.origLcMessages)
   102  }
   103  
   104  func (s *i18nTestSuite) TestTranslatedSingular(c *C) {
   105  	// no G() to avoid adding the test string to snappy-pot
   106  	var Gtest = G
   107  	c.Assert(Gtest("singular"), Equals, "translated singular")
   108  }
   109  
   110  func (s *i18nTestSuite) TestTranslatesPlural(c *C) {
   111  	// no NG() to avoid adding the test string to snappy-pot
   112  	var NGtest = NG
   113  	c.Assert(NGtest("plural_1", "plural_2", 1), Equals, "translated plural_1")
   114  }
   115  
   116  func (s *i18nTestSuite) TestTranslatedMissingLangNoCrash(c *C) {
   117  	setLocale("invalid")
   118  
   119  	// no G() to avoid adding the test string to snappy-pot
   120  	var Gtest = G
   121  	c.Assert(Gtest("singular"), Equals, "singular")
   122  }
   123  
   124  func (s *i18nTestSuite) TestInvalidTextDomainDir(c *C) {
   125  	bindTextDomain("snappy-test", "/random/not/existing/dir")
   126  	setLocale("invalid")
   127  
   128  	// no G() to avoid adding the test string to snappy-pot
   129  	var Gtest = G
   130  	c.Assert(Gtest("singular"), Equals, "singular")
   131  }
   132  
   133  func (s *i18nTestSuite) TestLangpackResolverFromLangpack(c *C) {
   134  	root := c.MkDir()
   135  	localeDir := filepath.Join(root, "/usr/share/locale")
   136  	err := os.MkdirAll(localeDir, 0755)
   137  	c.Assert(err, IsNil)
   138  
   139  	d := filepath.Join(root, "/usr/share/locale-langpack")
   140  	makeMockTranslations(c, d)
   141  	bindTextDomain("snappy-test", localeDir)
   142  	setLocale("")
   143  
   144  	// no G() to avoid adding the test string to snappy-pot
   145  	var Gtest = G
   146  	c.Assert(Gtest("singular"), Equals, "translated singular", Commentf("test with %q failed", d))
   147  }
   148  
   149  func (s *i18nTestSuite) TestLangpackResolverFromCore(c *C) {
   150  	origSnapMountDir := dirs.SnapMountDir
   151  	defer func() { dirs.SnapMountDir = origSnapMountDir }()
   152  	dirs.SnapMountDir = c.MkDir()
   153  
   154  	d := filepath.Join(dirs.SnapMountDir, "/core/current/usr/share/locale")
   155  	makeMockTranslations(c, d)
   156  	bindTextDomain("snappy-test", "/usr/share/locale")
   157  	setLocale("")
   158  
   159  	// no G() to avoid adding the test string to snappy-pot
   160  	var Gtest = G
   161  	c.Assert(Gtest("singular"), Equals, "translated singular", Commentf("test with %q failed", d))
   162  }